Skip to content

Commit

Permalink
sh: Isolate uncached mapping support.
Browse files Browse the repository at this point in the history
This splits out the uncached mapping support under its own config option,
presently only used by 29-bit mode and 32-bit + PMB. This will make it
possible to optionally add an uncached mapping on sh64 as well as booting
without an uncached mapping for 32-bit.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Feb 12, 2010
1 parent a4dad4c commit b0f3ae0
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 10 deletions.
19 changes: 13 additions & 6 deletions arch/sh/include/asm/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,15 @@ struct pt_dspregs {
#define PTRACE_GETDSPREGS 55 /* DSP registers */
#define PTRACE_SETDSPREGS 56

#define PT_TEXT_END_ADDR 240
#define PT_TEXT_ADDR 244 /* &(struct user)->start_code */
#define PT_DATA_ADDR 248 /* &(struct user)->start_data */
#define PT_TEXT_END_ADDR 240
#define PT_TEXT_ADDR 244 /* &(struct user)->start_code */
#define PT_DATA_ADDR 248 /* &(struct user)->start_data */
#define PT_TEXT_LEN 252

#ifdef __KERNEL__
#include <asm/addrspace.h>
#include <asm/page.h>
#include <asm/system.h>

#define user_mode(regs) (((regs)->sr & 0x40000000)==0)
#define instruction_pointer(regs) ((unsigned long)(regs)->pc)
Expand Down Expand Up @@ -137,9 +139,14 @@ static inline unsigned long profile_pc(struct pt_regs *regs)
{
unsigned long pc = instruction_pointer(regs);

#ifdef P2SEG
if (pc >= P2SEG && pc < P3SEG)
pc -= 0x20000000;
#ifdef CONFIG_UNCACHED_MAPPING
/*
* If PC points in to the uncached mapping, fix it up and hand
* back the cached equivalent.
*/
if ((pc >= (memory_start + cached_to_uncached)) &&
(pc < (memory_start + cached_to_uncached + uncached_size)))
pc -= cached_to_uncached;
#endif

return pc;
Expand Down
3 changes: 2 additions & 1 deletion arch/sh/include/asm/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
#include <linux/compiler.h>
#include <linux/linkage.h>
#include <asm/types.h>
#include <asm/ptrace.h>

#define AT_VECTOR_SIZE_ARCH 5 /* entries in ARCH_DLINFO */

Expand Down Expand Up @@ -114,6 +113,8 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old,
(unsigned long)_n_, sizeof(*(ptr))); \
})

struct pt_regs;

extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn));
void free_initmem(void);
void free_initrd_mem(unsigned long start, unsigned long end);
Expand Down
1 change: 1 addition & 0 deletions arch/sh/include/asm/system_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
/*
* switch_to() should switch tasks to task nr n, first
*/
struct thread_struct;
struct task_struct *sh64_switch_to(struct task_struct *prev,
struct thread_struct *prev_thread,
struct task_struct *next,
Expand Down
5 changes: 5 additions & 0 deletions arch/sh/mm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ config MEMORY_SIZE
config 29BIT
def_bool !32BIT
depends on SUPERH32
select UNCACHED_MAPPING

config 32BIT
bool
Expand All @@ -84,6 +85,7 @@ config PMB
bool "Support 32-bit physical addressing through PMB"
depends on MMU && EXPERIMENTAL && CPU_SH4A && !CPU_SH4AL_DSP
select 32BIT
select UNCACHED_MAPPING
help
If you say Y here, physical addressing will be extended to
32-bits through the SH-4A PMB. If this is not set, legacy
Expand Down Expand Up @@ -173,6 +175,9 @@ config IOREMAP_FIXED
def_bool y
depends on X2TLB || SUPERH64

config UNCACHED_MAPPING
bool

choice
prompt "Kernel page size"
default PAGE_SIZE_4KB
Expand Down
11 changes: 8 additions & 3 deletions arch/sh/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@
#include <asm/cacheflush.h>
#include <asm/sections.h>
#include <asm/cache.h>
#include <asm/sizes.h>

DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
pgd_t swapper_pg_dir[PTRS_PER_PGD];

#ifdef CONFIG_SUPERH32
#ifdef CONFIG_UNCACHED_MAPPING
/*
* This is the offset of the uncached section from its cached alias.
*
Expand All @@ -36,8 +37,8 @@ pgd_t swapper_pg_dir[PTRS_PER_PGD];
* Default value only valid in 29 bit mode, in 32bit mode this will be
* updated by the early PMB initialization code.
*/
unsigned long cached_to_uncached = P2SEG - P1SEG;
unsigned long uncached_size = 0x20000000;
unsigned long cached_to_uncached = 0x20000000;
unsigned long uncached_size = SZ_512M;
#endif

#ifdef CONFIG_MMU
Expand Down Expand Up @@ -281,7 +282,9 @@ void __init mem_init(void)
#endif
" vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n"
" lowmem : 0x%08lx - 0x%08lx (%4ld MB) (cached)\n"
#ifdef CONFIG_UNCACHED_MAPPING
" : 0x%08lx - 0x%08lx (%4ld MB) (uncached)\n"
#endif
" .init : 0x%08lx - 0x%08lx (%4ld kB)\n"
" .data : 0x%08lx - 0x%08lx (%4ld kB)\n"
" .text : 0x%08lx - 0x%08lx (%4ld kB)\n",
Expand All @@ -299,9 +302,11 @@ void __init mem_init(void)
(unsigned long)memory_start, (unsigned long)high_memory,
((unsigned long)high_memory - (unsigned long)memory_start) >> 20,

#ifdef CONFIG_UNCACHED_MAPPING
(unsigned long)memory_start + cached_to_uncached,
(unsigned long)memory_start + cached_to_uncached + uncached_size,
uncached_size >> 20,
#endif

(unsigned long)&__init_begin, (unsigned long)&__init_end,
((unsigned long)&__init_end -
Expand Down

0 comments on commit b0f3ae0

Please sign in to comment.