diff options
Diffstat (limited to 'include/asm-sh')
30 files changed, 646 insertions, 551 deletions
diff --git a/include/asm-sh/clock.h b/include/asm-sh/clock.h index b550a27a7042..720dfab7b15e 100644 --- a/include/asm-sh/clock.h +++ b/include/asm-sh/clock.h | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/list.h> | 5 | #include <linux/list.h> |
6 | #include <linux/seq_file.h> | 6 | #include <linux/seq_file.h> |
7 | #include <linux/clk.h> | 7 | #include <linux/clk.h> |
8 | #include <linux/err.h> | ||
8 | 9 | ||
9 | struct clk; | 10 | struct clk; |
10 | 11 | ||
@@ -30,6 +31,7 @@ struct clk { | |||
30 | 31 | ||
31 | unsigned long rate; | 32 | unsigned long rate; |
32 | unsigned long flags; | 33 | unsigned long flags; |
34 | unsigned long arch_flags; | ||
33 | }; | 35 | }; |
34 | 36 | ||
35 | #define CLK_ALWAYS_ENABLED (1 << 0) | 37 | #define CLK_ALWAYS_ENABLED (1 << 0) |
@@ -41,14 +43,27 @@ void arch_init_clk_ops(struct clk_ops **, int type); | |||
41 | /* arch/sh/kernel/cpu/clock.c */ | 43 | /* arch/sh/kernel/cpu/clock.c */ |
42 | int clk_init(void); | 44 | int clk_init(void); |
43 | 45 | ||
44 | int __clk_enable(struct clk *); | ||
45 | void __clk_disable(struct clk *); | ||
46 | |||
47 | void clk_recalc_rate(struct clk *); | 46 | void clk_recalc_rate(struct clk *); |
48 | 47 | ||
49 | int clk_register(struct clk *); | 48 | int clk_register(struct clk *); |
50 | void clk_unregister(struct clk *); | 49 | void clk_unregister(struct clk *); |
51 | 50 | ||
51 | static inline int clk_always_enable(const char *id) | ||
52 | { | ||
53 | struct clk *clk; | ||
54 | int ret; | ||
55 | |||
56 | clk = clk_get(NULL, id); | ||
57 | if (IS_ERR(clk)) | ||
58 | return PTR_ERR(clk); | ||
59 | |||
60 | ret = clk_enable(clk); | ||
61 | if (ret) | ||
62 | clk_put(clk); | ||
63 | |||
64 | return ret; | ||
65 | } | ||
66 | |||
52 | /* the exported API, in addition to clk_set_rate */ | 67 | /* the exported API, in addition to clk_set_rate */ |
53 | /** | 68 | /** |
54 | * clk_set_rate_ex - set the clock rate for a clock source, with additional parameter | 69 | * clk_set_rate_ex - set the clock rate for a clock source, with additional parameter |
diff --git a/include/asm-sh/cpu-sh4/cacheflush.h b/include/asm-sh/cpu-sh4/cacheflush.h index 5fd5c89ef86a..065306d376eb 100644 --- a/include/asm-sh/cpu-sh4/cacheflush.h +++ b/include/asm-sh/cpu-sh4/cacheflush.h | |||
@@ -30,7 +30,6 @@ void flush_dcache_page(struct page *pg); | |||
30 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | 30 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) |
31 | 31 | ||
32 | void flush_icache_range(unsigned long start, unsigned long end); | 32 | void flush_icache_range(unsigned long start, unsigned long end); |
33 | void flush_cache_sigtramp(unsigned long addr); | ||
34 | void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, | 33 | void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, |
35 | unsigned long addr, int len); | 34 | unsigned long addr, int len); |
36 | 35 | ||
diff --git a/include/asm-sh/cpu-sh4/freq.h b/include/asm-sh/cpu-sh4/freq.h index da46e67ae26d..c23af81c2e70 100644 --- a/include/asm-sh/cpu-sh4/freq.h +++ b/include/asm-sh/cpu-sh4/freq.h | |||
@@ -12,12 +12,16 @@ | |||
12 | 12 | ||
13 | #if defined(CONFIG_CPU_SUBTYPE_SH7722) || \ | 13 | #if defined(CONFIG_CPU_SUBTYPE_SH7722) || \ |
14 | defined(CONFIG_CPU_SUBTYPE_SH7723) || \ | 14 | defined(CONFIG_CPU_SUBTYPE_SH7723) || \ |
15 | defined(CONFIG_CPU_SUBTYPE_SH7343) || \ | ||
15 | defined(CONFIG_CPU_SUBTYPE_SH7366) | 16 | defined(CONFIG_CPU_SUBTYPE_SH7366) |
16 | #define FRQCR 0xa4150000 | 17 | #define FRQCR 0xa4150000 |
17 | #define VCLKCR 0xa4150004 | 18 | #define VCLKCR 0xa4150004 |
18 | #define SCLKACR 0xa4150008 | 19 | #define SCLKACR 0xa4150008 |
19 | #define SCLKBCR 0xa415000c | 20 | #define SCLKBCR 0xa415000c |
20 | #define IrDACLKCR 0xa4150010 | 21 | #define IrDACLKCR 0xa4150010 |
22 | #define MSTPCR0 0xa4150030 | ||
23 | #define MSTPCR1 0xa4150034 | ||
24 | #define MSTPCR2 0xa4150038 | ||
21 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) || \ | 25 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) || \ |
22 | defined(CONFIG_CPU_SUBTYPE_SH7780) | 26 | defined(CONFIG_CPU_SUBTYPE_SH7780) |
23 | #define FRQCR 0xffc80000 | 27 | #define FRQCR 0xffc80000 |
diff --git a/include/asm-sh/device.h b/include/asm-sh/device.h index d8f9872b0e2d..efd511d0803a 100644 --- a/include/asm-sh/device.h +++ b/include/asm-sh/device.h | |||
@@ -5,3 +5,8 @@ | |||
5 | */ | 5 | */ |
6 | #include <asm-generic/device.h> | 6 | #include <asm-generic/device.h> |
7 | 7 | ||
8 | struct platform_device; | ||
9 | /* allocate contiguous memory chunk and fill in struct resource */ | ||
10 | int platform_resource_setup_memory(struct platform_device *pdev, | ||
11 | char *name, unsigned long memsize); | ||
12 | |||
diff --git a/include/asm-sh/elf.h b/include/asm-sh/elf.h index 05092da1aa59..f01449a8d378 100644 --- a/include/asm-sh/elf.h +++ b/include/asm-sh/elf.h | |||
@@ -1,10 +1,15 @@ | |||
1 | #ifndef __ASM_SH_ELF_H | 1 | #ifndef __ASM_SH_ELF_H |
2 | #define __ASM_SH_ELF_H | 2 | #define __ASM_SH_ELF_H |
3 | 3 | ||
4 | #include <linux/utsname.h> | ||
4 | #include <asm/auxvec.h> | 5 | #include <asm/auxvec.h> |
5 | #include <asm/ptrace.h> | 6 | #include <asm/ptrace.h> |
6 | #include <asm/user.h> | 7 | #include <asm/user.h> |
7 | 8 | ||
9 | /* ELF header e_flags defines */ | ||
10 | #define EF_SH_PIC 0x100 /* -fpic */ | ||
11 | #define EF_SH_FDPIC 0x8000 /* -mfdpic */ | ||
12 | |||
8 | /* SH (particularly SHcompact) relocation types */ | 13 | /* SH (particularly SHcompact) relocation types */ |
9 | #define R_SH_NONE 0 | 14 | #define R_SH_NONE 0 |
10 | #define R_SH_DIR32 1 | 15 | #define R_SH_DIR32 1 |
@@ -43,6 +48,28 @@ | |||
43 | #define R_SH_RELATIVE 165 | 48 | #define R_SH_RELATIVE 165 |
44 | #define R_SH_GOTOFF 166 | 49 | #define R_SH_GOTOFF 166 |
45 | #define R_SH_GOTPC 167 | 50 | #define R_SH_GOTPC 167 |
51 | |||
52 | /* FDPIC relocs */ | ||
53 | #define R_SH_GOT20 70 | ||
54 | #define R_SH_GOTOFF20 71 | ||
55 | #define R_SH_GOTFUNCDESC 72 | ||
56 | #define R_SH_GOTFUNCDESC20 73 | ||
57 | #define R_SH_GOTOFFFUNCDESC 74 | ||
58 | #define R_SH_GOTOFFFUNCDESC20 75 | ||
59 | #define R_SH_FUNCDESC 76 | ||
60 | #define R_SH_FUNCDESC_VALUE 77 | ||
61 | |||
62 | #if 0 /* XXX - later .. */ | ||
63 | #define R_SH_GOT20 198 | ||
64 | #define R_SH_GOTOFF20 199 | ||
65 | #define R_SH_GOTFUNCDESC 200 | ||
66 | #define R_SH_GOTFUNCDESC20 201 | ||
67 | #define R_SH_GOTOFFFUNCDESC 202 | ||
68 | #define R_SH_GOTOFFFUNCDESC20 203 | ||
69 | #define R_SH_FUNCDESC 204 | ||
70 | #define R_SH_FUNCDESC_VALUE 205 | ||
71 | #endif | ||
72 | |||
46 | /* SHmedia relocs */ | 73 | /* SHmedia relocs */ |
47 | #define R_SH_IMM_LOW16 246 | 74 | #define R_SH_IMM_LOW16 246 |
48 | #define R_SH_IMM_LOW16_PCREL 247 | 75 | #define R_SH_IMM_LOW16_PCREL 247 |
@@ -77,9 +104,12 @@ typedef struct user_fpu_struct elf_fpregset_t; | |||
77 | /* | 104 | /* |
78 | * This is used to ensure we don't load something for the wrong architecture. | 105 | * This is used to ensure we don't load something for the wrong architecture. |
79 | */ | 106 | */ |
80 | #define elf_check_arch(x) ( (x)->e_machine == EM_SH ) | 107 | #define elf_check_arch(x) ((x)->e_machine == EM_SH) |
108 | #define elf_check_fdpic(x) ((x)->e_flags & EF_SH_FDPIC) | ||
109 | #define elf_check_const_displacement(x) ((x)->e_flags & EF_SH_PIC) | ||
81 | 110 | ||
82 | #define USE_ELF_CORE_DUMP | 111 | #define USE_ELF_CORE_DUMP |
112 | #define ELF_FDPIC_CORE_EFLAGS EF_SH_FDPIC | ||
83 | #define ELF_EXEC_PAGESIZE PAGE_SIZE | 113 | #define ELF_EXEC_PAGESIZE PAGE_SIZE |
84 | 114 | ||
85 | /* This is the location that an ET_DYN program is loaded if exec'ed. Typical | 115 | /* This is the location that an ET_DYN program is loaded if exec'ed. Typical |
@@ -136,6 +166,27 @@ typedef struct user_fpu_struct elf_fpregset_t; | |||
136 | _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \ | 166 | _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \ |
137 | _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \ | 167 | _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \ |
138 | _r->sr = SR_FD; } while (0) | 168 | _r->sr = SR_FD; } while (0) |
169 | |||
170 | #define ELF_FDPIC_PLAT_INIT(_r, _exec_map_addr, _interp_map_addr, \ | ||
171 | _dynamic_addr) \ | ||
172 | do { \ | ||
173 | _r->regs[0] = 0; \ | ||
174 | _r->regs[1] = 0; \ | ||
175 | _r->regs[2] = 0; \ | ||
176 | _r->regs[3] = 0; \ | ||
177 | _r->regs[4] = 0; \ | ||
178 | _r->regs[5] = 0; \ | ||
179 | _r->regs[6] = 0; \ | ||
180 | _r->regs[7] = 0; \ | ||
181 | _r->regs[8] = _exec_map_addr; \ | ||
182 | _r->regs[9] = _interp_map_addr; \ | ||
183 | _r->regs[10] = _dynamic_addr; \ | ||
184 | _r->regs[11] = 0; \ | ||
185 | _r->regs[12] = 0; \ | ||
186 | _r->regs[13] = 0; \ | ||
187 | _r->regs[14] = 0; \ | ||
188 | _r->sr = SR_FD; \ | ||
189 | } while (0) | ||
139 | #endif | 190 | #endif |
140 | 191 | ||
141 | #define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX_32BIT) | 192 | #define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX_32BIT) |
diff --git a/include/asm-sh/hw_irq.h b/include/asm-sh/hw_irq.h index 7438d1e21bc9..d557b00111bf 100644 --- a/include/asm-sh/hw_irq.h +++ b/include/asm-sh/hw_irq.h | |||
@@ -79,7 +79,7 @@ struct intc_desc { | |||
79 | struct intc_sense_reg *sense_regs; | 79 | struct intc_sense_reg *sense_regs; |
80 | unsigned int nr_sense_regs; | 80 | unsigned int nr_sense_regs; |
81 | char *name; | 81 | char *name; |
82 | #ifdef CONFIG_CPU_SH3 | 82 | #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) |
83 | struct intc_mask_reg *ack_regs; | 83 | struct intc_mask_reg *ack_regs; |
84 | unsigned int nr_ack_regs; | 84 | unsigned int nr_ack_regs; |
85 | #endif | 85 | #endif |
@@ -95,7 +95,7 @@ struct intc_desc symbol __initdata = { \ | |||
95 | chipname, \ | 95 | chipname, \ |
96 | } | 96 | } |
97 | 97 | ||
98 | #ifdef CONFIG_CPU_SH3 | 98 | #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) |
99 | #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ | 99 | #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ |
100 | mask_regs, prio_regs, sense_regs, ack_regs) \ | 100 | mask_regs, prio_regs, sense_regs, ack_regs) \ |
101 | struct intc_desc symbol __initdata = { \ | 101 | struct intc_desc symbol __initdata = { \ |
diff --git a/include/asm-sh/migor.h b/include/asm-sh/migor.h index 2329363afdc3..10016e0f4a4e 100644 --- a/include/asm-sh/migor.h +++ b/include/asm-sh/migor.h | |||
@@ -16,10 +16,6 @@ | |||
16 | #include <asm/addrspace.h> | 16 | #include <asm/addrspace.h> |
17 | 17 | ||
18 | /* GPIO */ | 18 | /* GPIO */ |
19 | #define MSTPCR0 0xa4150030 | ||
20 | #define MSTPCR1 0xa4150034 | ||
21 | #define MSTPCR2 0xa4150038 | ||
22 | |||
23 | #define PORT_PACR 0xa4050100 | 19 | #define PORT_PACR 0xa4050100 |
24 | #define PORT_PDCR 0xa4050106 | 20 | #define PORT_PDCR 0xa4050106 |
25 | #define PORT_PECR 0xa4050108 | 21 | #define PORT_PECR 0xa4050108 |
@@ -29,11 +25,16 @@ | |||
29 | #define PORT_PLCR 0xa4050114 | 25 | #define PORT_PLCR 0xa4050114 |
30 | #define PORT_PMCR 0xa4050116 | 26 | #define PORT_PMCR 0xa4050116 |
31 | #define PORT_PRCR 0xa405011c | 27 | #define PORT_PRCR 0xa405011c |
28 | #define PORT_PTCR 0xa4050140 | ||
29 | #define PORT_PUCR 0xa4050142 | ||
30 | #define PORT_PVCR 0xa4050144 | ||
32 | #define PORT_PWCR 0xa4050146 | 31 | #define PORT_PWCR 0xa4050146 |
33 | #define PORT_PXCR 0xa4050148 | 32 | #define PORT_PXCR 0xa4050148 |
34 | #define PORT_PYCR 0xa405014a | 33 | #define PORT_PYCR 0xa405014a |
35 | #define PORT_PZCR 0xa405014c | 34 | #define PORT_PZCR 0xa405014c |
36 | #define PORT_PADR 0xa4050120 | 35 | #define PORT_PADR 0xa4050120 |
36 | #define PORT_PHDR 0xa405012e | ||
37 | #define PORT_PTDR 0xa4050160 | ||
37 | #define PORT_PWDR 0xa4050166 | 38 | #define PORT_PWDR 0xa4050166 |
38 | 39 | ||
39 | #define PORT_HIZCRA 0xa4050158 | 40 | #define PORT_HIZCRA 0xa4050158 |
@@ -48,6 +49,7 @@ | |||
48 | #define PORT_PSELB 0xa4050150 | 49 | #define PORT_PSELB 0xa4050150 |
49 | #define PORT_PSELC 0xa4050152 | 50 | #define PORT_PSELC 0xa4050152 |
50 | #define PORT_PSELD 0xa4050154 | 51 | #define PORT_PSELD 0xa4050154 |
52 | #define PORT_PSELE 0xa4050156 | ||
51 | 53 | ||
52 | #define PORT_HIZCRA 0xa4050158 | 54 | #define PORT_HIZCRA 0xa4050158 |
53 | #define PORT_HIZCRB 0xa405015a | 55 | #define PORT_HIZCRB 0xa405015a |
@@ -55,4 +57,9 @@ | |||
55 | 57 | ||
56 | #define BSC_CS6ABCR 0xfec1001c | 58 | #define BSC_CS6ABCR 0xfec1001c |
57 | 59 | ||
60 | #include <asm/sh_mobile_lcdc.h> | ||
61 | |||
62 | int migor_lcd_qvga_setup(void *board_data, void *sys_ops_handle, | ||
63 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); | ||
64 | |||
58 | #endif /* __ASM_SH_MIGOR_H */ | 65 | #endif /* __ASM_SH_MIGOR_H */ |
diff --git a/include/asm-sh/mmu.h b/include/asm-sh/mmu.h index eb0358c097d0..fdcb93bc6d11 100644 --- a/include/asm-sh/mmu.h +++ b/include/asm-sh/mmu.h | |||
@@ -12,6 +12,10 @@ typedef struct { | |||
12 | struct vm_list_struct *vmlist; | 12 | struct vm_list_struct *vmlist; |
13 | unsigned long end_brk; | 13 | unsigned long end_brk; |
14 | #endif | 14 | #endif |
15 | #ifdef CONFIG_BINFMT_ELF_FDPIC | ||
16 | unsigned long exec_fdpic_loadmap; | ||
17 | unsigned long interp_fdpic_loadmap; | ||
18 | #endif | ||
15 | } mm_context_t; | 19 | } mm_context_t; |
16 | 20 | ||
17 | /* | 21 | /* |
diff --git a/include/asm-sh/mmu_context.h b/include/asm-sh/mmu_context.h index 87e812f68bb0..8589a50febd0 100644 --- a/include/asm-sh/mmu_context.h +++ b/include/asm-sh/mmu_context.h | |||
@@ -27,8 +27,9 @@ | |||
27 | /* ASID is 8-bit value, so it can't be 0x100 */ | 27 | /* ASID is 8-bit value, so it can't be 0x100 */ |
28 | #define MMU_NO_ASID 0x100 | 28 | #define MMU_NO_ASID 0x100 |
29 | 29 | ||
30 | #ifdef CONFIG_MMU | ||
31 | #define asid_cache(cpu) (cpu_data[cpu].asid_cache) | 30 | #define asid_cache(cpu) (cpu_data[cpu].asid_cache) |
31 | |||
32 | #ifdef CONFIG_MMU | ||
32 | #define cpu_context(cpu, mm) ((mm)->context.id[cpu]) | 33 | #define cpu_context(cpu, mm) ((mm)->context.id[cpu]) |
33 | 34 | ||
34 | #define cpu_asid(cpu, mm) \ | 35 | #define cpu_asid(cpu, mm) \ |
diff --git a/include/asm-sh/page.h b/include/asm-sh/page.h index 5dc01d2fcc4c..77fb8bf02e4e 100644 --- a/include/asm-sh/page.h +++ b/include/asm-sh/page.h | |||
@@ -12,6 +12,8 @@ | |||
12 | # define PAGE_SHIFT 12 | 12 | # define PAGE_SHIFT 12 |
13 | #elif defined(CONFIG_PAGE_SIZE_8KB) | 13 | #elif defined(CONFIG_PAGE_SIZE_8KB) |
14 | # define PAGE_SHIFT 13 | 14 | # define PAGE_SHIFT 13 |
15 | #elif defined(CONFIG_PAGE_SIZE_16KB) | ||
16 | # define PAGE_SHIFT 14 | ||
15 | #elif defined(CONFIG_PAGE_SIZE_64KB) | 17 | #elif defined(CONFIG_PAGE_SIZE_64KB) |
16 | # define PAGE_SHIFT 16 | 18 | # define PAGE_SHIFT 16 |
17 | #else | 19 | #else |
diff --git a/include/asm-sh/pgtable_32.h b/include/asm-sh/pgtable_32.h index cbc731d35c25..72ea209195bd 100644 --- a/include/asm-sh/pgtable_32.h +++ b/include/asm-sh/pgtable_32.h | |||
@@ -102,7 +102,9 @@ | |||
102 | #define _PAGE_FLAGS_HARDWARE_MASK (PHYS_ADDR_MASK & ~(_PAGE_CLEAR_FLAGS)) | 102 | #define _PAGE_FLAGS_HARDWARE_MASK (PHYS_ADDR_MASK & ~(_PAGE_CLEAR_FLAGS)) |
103 | 103 | ||
104 | /* Hardware flags, page size encoding */ | 104 | /* Hardware flags, page size encoding */ |
105 | #if defined(CONFIG_X2TLB) | 105 | #if !defined(CONFIG_MMU) |
106 | # define _PAGE_FLAGS_HARD 0ULL | ||
107 | #elif defined(CONFIG_X2TLB) | ||
106 | # if defined(CONFIG_PAGE_SIZE_4KB) | 108 | # if defined(CONFIG_PAGE_SIZE_4KB) |
107 | # define _PAGE_FLAGS_HARD _PAGE_EXT(_PAGE_EXT_ESZ0) | 109 | # define _PAGE_FLAGS_HARD _PAGE_EXT(_PAGE_EXT_ESZ0) |
108 | # elif defined(CONFIG_PAGE_SIZE_8KB) | 110 | # elif defined(CONFIG_PAGE_SIZE_8KB) |
diff --git a/include/asm-sh/processor.h b/include/asm-sh/processor.h index b7c7ce80f03e..15d9f92ca383 100644 --- a/include/asm-sh/processor.h +++ b/include/asm-sh/processor.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __ASM_SH_PROCESSOR_H | 2 | #define __ASM_SH_PROCESSOR_H |
3 | 3 | ||
4 | #include <asm/cpu-features.h> | 4 | #include <asm/cpu-features.h> |
5 | #include <asm/segment.h> | ||
5 | 6 | ||
6 | #ifndef __ASSEMBLY__ | 7 | #ifndef __ASSEMBLY__ |
7 | /* | 8 | /* |
diff --git a/include/asm-sh/processor_32.h b/include/asm-sh/processor_32.h index c09305d6a9d9..c6583f267071 100644 --- a/include/asm-sh/processor_32.h +++ b/include/asm-sh/processor_32.h | |||
@@ -28,6 +28,7 @@ | |||
28 | 28 | ||
29 | struct sh_cpuinfo { | 29 | struct sh_cpuinfo { |
30 | unsigned int type; | 30 | unsigned int type; |
31 | int cut_major, cut_minor; | ||
31 | unsigned long loops_per_jiffy; | 32 | unsigned long loops_per_jiffy; |
32 | unsigned long asid_cache; | 33 | unsigned long asid_cache; |
33 | 34 | ||
@@ -113,10 +114,6 @@ struct thread_struct { | |||
113 | union sh_fpu_union fpu; | 114 | union sh_fpu_union fpu; |
114 | }; | 115 | }; |
115 | 116 | ||
116 | typedef struct { | ||
117 | unsigned long seg; | ||
118 | } mm_segment_t; | ||
119 | |||
120 | /* Count of active tasks with UBC settings */ | 117 | /* Count of active tasks with UBC settings */ |
121 | extern int ubc_usercnt; | 118 | extern int ubc_usercnt; |
122 | 119 | ||
diff --git a/include/asm-sh/processor_64.h b/include/asm-sh/processor_64.h index 88a2edf8fa5d..fc7fc685ba27 100644 --- a/include/asm-sh/processor_64.h +++ b/include/asm-sh/processor_64.h | |||
@@ -166,10 +166,6 @@ struct thread_struct { | |||
166 | union sh_fpu_union fpu; | 166 | union sh_fpu_union fpu; |
167 | }; | 167 | }; |
168 | 168 | ||
169 | typedef struct { | ||
170 | unsigned long seg; | ||
171 | } mm_segment_t; | ||
172 | |||
173 | #define INIT_MMAP \ | 169 | #define INIT_MMAP \ |
174 | { &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL } | 170 | { &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL } |
175 | 171 | ||
diff --git a/include/asm-sh/ptrace.h b/include/asm-sh/ptrace.h index 7d36dc3bee69..643ab5a7cf3b 100644 --- a/include/asm-sh/ptrace.h +++ b/include/asm-sh/ptrace.h | |||
@@ -87,6 +87,11 @@ struct pt_dspregs { | |||
87 | unsigned long mod; | 87 | unsigned long mod; |
88 | }; | 88 | }; |
89 | 89 | ||
90 | #define PTRACE_GETFDPIC 31 /* get the ELF fdpic loadmap address */ | ||
91 | |||
92 | #define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */ | ||
93 | #define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */ | ||
94 | |||
90 | #define PTRACE_GETDSPREGS 55 | 95 | #define PTRACE_GETDSPREGS 55 |
91 | #define PTRACE_SETDSPREGS 56 | 96 | #define PTRACE_SETDSPREGS 56 |
92 | #endif | 97 | #endif |
diff --git a/include/asm-sh/se.h b/include/asm-sh/se.h index bd2596c014a9..eb23000e1bbe 100644 --- a/include/asm-sh/se.h +++ b/include/asm-sh/se.h | |||
@@ -76,6 +76,23 @@ | |||
76 | #define IRQ_CFCARD 7 | 76 | #define IRQ_CFCARD 7 |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | /* SH Ether support (SH7710/SH7712) */ | ||
80 | /* Base address */ | ||
81 | #define SH_ETH0_BASE 0xA7000000 | ||
82 | #define SH_ETH1_BASE 0xA7000400 | ||
83 | /* PHY ID */ | ||
84 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) | ||
85 | # define PHY_ID 0x00 | ||
86 | #elif defined(CONFIG_CPU_SUBTYPE_SH7712) | ||
87 | # define PHY_ID 0x01 | ||
88 | #endif | ||
89 | /* Ether IRQ */ | ||
90 | #define SH_ETH0_IRQ 80 | ||
91 | #define SH_ETH1_IRQ 81 | ||
92 | #define SH_TSU_IRQ 82 | ||
93 | |||
94 | void init_se_IRQ(void); | ||
95 | |||
79 | #define __IO_PREFIX se | 96 | #define __IO_PREFIX se |
80 | #include <asm/io_generic.h> | 97 | #include <asm/io_generic.h> |
81 | 98 | ||
diff --git a/include/asm-sh/se7343.h b/include/asm-sh/se7343.h index e7914a54aa96..98458460e632 100644 --- a/include/asm-sh/se7343.h +++ b/include/asm-sh/se7343.h | |||
@@ -59,24 +59,91 @@ | |||
59 | #define PA_LCD1 0xb8000000 | 59 | #define PA_LCD1 0xb8000000 |
60 | #define PA_LCD2 0xb8800000 | 60 | #define PA_LCD2 0xb8800000 |
61 | 61 | ||
62 | #define PORT_PACR 0xA4050100 | ||
63 | #define PORT_PBCR 0xA4050102 | ||
64 | #define PORT_PCCR 0xA4050104 | ||
65 | #define PORT_PDCR 0xA4050106 | ||
66 | #define PORT_PECR 0xA4050108 | ||
67 | #define PORT_PFCR 0xA405010A | ||
68 | #define PORT_PGCR 0xA405010C | ||
69 | #define PORT_PHCR 0xA405010E | ||
70 | #define PORT_PJCR 0xA4050110 | ||
71 | #define PORT_PKCR 0xA4050112 | ||
72 | #define PORT_PLCR 0xA4050114 | ||
73 | #define PORT_PMCR 0xA4050116 | ||
74 | #define PORT_PNCR 0xA4050118 | ||
75 | #define PORT_PQCR 0xA405011A | ||
76 | #define PORT_PRCR 0xA405011C | ||
77 | #define PORT_PSCR 0xA405011E | ||
78 | #define PORT_PTCR 0xA4050140 | ||
79 | #define PORT_PUCR 0xA4050142 | ||
80 | #define PORT_PVCR 0xA4050144 | ||
81 | #define PORT_PWCR 0xA4050146 | ||
82 | #define PORT_PYCR 0xA4050148 | ||
83 | #define PORT_PZCR 0xA405014A | ||
84 | |||
85 | #define PORT_PSELA 0xA405014C | ||
86 | #define PORT_PSELB 0xA405014E | ||
87 | #define PORT_PSELC 0xA4050150 | ||
88 | #define PORT_PSELD 0xA4050152 | ||
89 | #define PORT_PSELE 0xA4050154 | ||
90 | |||
91 | #define PORT_HIZCRA 0xA4050156 | ||
92 | #define PORT_HIZCRB 0xA4050158 | ||
93 | #define PORT_HIZCRC 0xA405015C | ||
94 | |||
95 | #define PORT_DRVCR 0xA4050180 | ||
96 | |||
97 | #define PORT_PADR 0xA4050120 | ||
98 | #define PORT_PBDR 0xA4050122 | ||
99 | #define PORT_PCDR 0xA4050124 | ||
100 | #define PORT_PDDR 0xA4050126 | ||
101 | #define PORT_PEDR 0xA4050128 | ||
102 | #define PORT_PFDR 0xA405012A | ||
103 | #define PORT_PGDR 0xA405012C | ||
104 | #define PORT_PHDR 0xA405012E | ||
105 | #define PORT_PJDR 0xA4050130 | ||
106 | #define PORT_PKDR 0xA4050132 | ||
107 | #define PORT_PLDR 0xA4050134 | ||
108 | #define PORT_PMDR 0xA4050136 | ||
109 | #define PORT_PNDR 0xA4050138 | ||
110 | #define PORT_PQDR 0xA405013A | ||
111 | #define PORT_PRDR 0xA405013C | ||
112 | #define PORT_PTDR 0xA4050160 | ||
113 | #define PORT_PUDR 0xA4050162 | ||
114 | #define PORT_PVDR 0xA4050164 | ||
115 | #define PORT_PWDR 0xA4050166 | ||
116 | #define PORT_PYDR 0xA4050168 | ||
117 | |||
118 | #define FPGA_IN 0xb1400000 | ||
119 | #define FPGA_OUT 0xb1400002 | ||
120 | |||
62 | #define __IO_PREFIX sh7343se | 121 | #define __IO_PREFIX sh7343se |
63 | #include <asm/io_generic.h> | 122 | #include <asm/io_generic.h> |
64 | 123 | ||
65 | /* External Multiplexed interrupts */ | 124 | #define IRQ0_IRQ 32 |
66 | #define PC_IRQ0 OFFCHIP_IRQ_BASE | 125 | #define IRQ1_IRQ 33 |
67 | #define PC_IRQ1 (PC_IRQ0 + 1) | 126 | #define IRQ4_IRQ 36 |
68 | #define PC_IRQ2 (PC_IRQ1 + 1) | 127 | #define IRQ5_IRQ 37 |
69 | #define PC_IRQ3 (PC_IRQ2 + 1) | 128 | |
129 | #define SE7343_FPGA_IRQ_MRSHPC0 0 | ||
130 | #define SE7343_FPGA_IRQ_MRSHPC1 1 | ||
131 | #define SE7343_FPGA_IRQ_MRSHPC2 2 | ||
132 | #define SE7343_FPGA_IRQ_MRSHPC3 3 | ||
133 | #define SE7343_FPGA_IRQ_SMC 6 /* EXT_IRQ2 */ | ||
134 | #define SE7343_FPGA_IRQ_USB 8 | ||
70 | 135 | ||
71 | #define EXT_IRQ0 (PC_IRQ3 + 1) | 136 | #define SE7343_FPGA_IRQ_NR 11 |
72 | #define EXT_IRQ1 (EXT_IRQ0 + 1) | 137 | #define SE7343_FPGA_IRQ_BASE 120 |
73 | #define EXT_IRQ2 (EXT_IRQ1 + 1) | ||
74 | #define EXT_IRQ3 (EXT_IRQ2 + 1) | ||
75 | 138 | ||
76 | #define USB_IRQ0 (EXT_IRQ3 + 1) | 139 | #define MRSHPC_IRQ3 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC3) |
77 | #define USB_IRQ1 (USB_IRQ0 + 1) | 140 | #define MRSHPC_IRQ2 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC2) |
141 | #define MRSHPC_IRQ1 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC1) | ||
142 | #define MRSHPC_IRQ0 (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_MRSHPC0) | ||
143 | #define SMC_IRQ (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_SMC) | ||
144 | #define USB_IRQ (SE7343_FPGA_IRQ_BASE + SE7343_FPGA_IRQ_USB) | ||
78 | 145 | ||
79 | #define UART_IRQ0 (USB_IRQ1 + 1) | 146 | /* arch/sh/boards/se/7343/irq.c */ |
80 | #define UART_IRQ1 (UART_IRQ0 + 1) | 147 | void init_7343se_IRQ(void); |
81 | 148 | ||
82 | #endif /* __ASM_SH_HITACHI_SE7343_H */ | 149 | #endif /* __ASM_SH_HITACHI_SE7343_H */ |
diff --git a/include/asm-sh/se7722.h b/include/asm-sh/se7722.h index 3690fe5857a4..e971d9a82f4a 100644 --- a/include/asm-sh/se7722.h +++ b/include/asm-sh/se7722.h | |||
@@ -55,10 +55,6 @@ | |||
55 | 55 | ||
56 | #define PA_LAN (PA_AREA6_IO + 0) /* SMC LAN91C111 */ | 56 | #define PA_LAN (PA_AREA6_IO + 0) /* SMC LAN91C111 */ |
57 | /* GPIO */ | 57 | /* GPIO */ |
58 | #define MSTPCR0 0xA4150030UL | ||
59 | #define MSTPCR1 0xA4150034UL | ||
60 | #define MSTPCR2 0xA4150038UL | ||
61 | |||
62 | #define FPGA_IN 0xb1840000UL | 58 | #define FPGA_IN 0xb1840000UL |
63 | #define FPGA_OUT 0xb1840004UL | 59 | #define FPGA_OUT 0xb1840004UL |
64 | 60 | ||
diff --git a/include/asm-sh/segment.h b/include/asm-sh/segment.h index e417eab4c7d7..5e2725f4ac49 100644 --- a/include/asm-sh/segment.h +++ b/include/asm-sh/segment.h | |||
@@ -1,6 +1,34 @@ | |||
1 | #ifndef __ASM_SH_SEGMENT_H | 1 | #ifndef __ASM_SH_SEGMENT_H |
2 | #define __ASM_SH_SEGMENT_H | 2 | #define __ASM_SH_SEGMENT_H |
3 | 3 | ||
4 | /* Only here because we have some old header files that expect it.. */ | 4 | #ifndef __ASSEMBLY__ |
5 | 5 | ||
6 | typedef struct { | ||
7 | unsigned long seg; | ||
8 | } mm_segment_t; | ||
9 | |||
10 | #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) | ||
11 | |||
12 | /* | ||
13 | * The fs value determines whether argument validity checking should be | ||
14 | * performed or not. If get_fs() == USER_DS, checking is performed, with | ||
15 | * get_fs() == KERNEL_DS, checking is bypassed. | ||
16 | * | ||
17 | * For historical reasons, these macros are grossly misnamed. | ||
18 | */ | ||
19 | #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFFUL) | ||
20 | #ifdef CONFIG_MMU | ||
21 | #define USER_DS MAKE_MM_SEG(PAGE_OFFSET) | ||
22 | #else | ||
23 | #define USER_DS KERNEL_DS | ||
24 | #endif | ||
25 | |||
26 | #define segment_eq(a,b) ((a).seg == (b).seg) | ||
27 | |||
28 | #define get_ds() (KERNEL_DS) | ||
29 | |||
30 | #define get_fs() (current_thread_info()->addr_limit) | ||
31 | #define set_fs(x) (current_thread_info()->addr_limit = (x)) | ||
32 | |||
33 | #endif /* __ASSEMBLY__ */ | ||
6 | #endif /* __ASM_SH_SEGMENT_H */ | 34 | #endif /* __ASM_SH_SEGMENT_H */ |
diff --git a/include/asm-sh/sh7763rdp.h b/include/asm-sh/sh7763rdp.h new file mode 100644 index 000000000000..8750cc852977 --- /dev/null +++ b/include/asm-sh/sh7763rdp.h | |||
@@ -0,0 +1,54 @@ | |||
1 | #ifndef __ASM_SH_SH7763RDP_H | ||
2 | #define __ASM_SH_SH7763RDP_H | ||
3 | |||
4 | /* | ||
5 | * linux/include/asm-sh/sh7763drp.h | ||
6 | * | ||
7 | * Copyright (C) 2008 Renesas Solutions | ||
8 | * Copyright (C) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | ||
11 | * License. See the file "COPYING" in the main directory of this archive | ||
12 | * for more details. | ||
13 | * | ||
14 | */ | ||
15 | #include <asm/addrspace.h> | ||
16 | |||
17 | /* clock control */ | ||
18 | #define MSTPCR1 0xFFC80038 | ||
19 | |||
20 | /* PORT */ | ||
21 | #define PORT_PSEL0 0xFFEF0070 | ||
22 | #define PORT_PSEL1 0xFFEF0072 | ||
23 | #define PORT_PSEL2 0xFFEF0074 | ||
24 | #define PORT_PSEL3 0xFFEF0076 | ||
25 | #define PORT_PSEL4 0xFFEF0078 | ||
26 | |||
27 | #define PORT_PACR 0xFFEF0000 | ||
28 | #define PORT_PCCR 0xFFEF0004 | ||
29 | #define PORT_PFCR 0xFFEF000A | ||
30 | #define PORT_PGCR 0xFFEF000C | ||
31 | #define PORT_PHCR 0xFFEF000E | ||
32 | #define PORT_PICR 0xFFEF0010 | ||
33 | #define PORT_PJCR 0xFFEF0012 | ||
34 | #define PORT_PKCR 0xFFEF0014 | ||
35 | #define PORT_PLCR 0xFFEF0016 | ||
36 | #define PORT_PMCR 0xFFEF0018 | ||
37 | #define PORT_PNCR 0xFFEF001A | ||
38 | |||
39 | /* FPGA */ | ||
40 | #define CPLD_BOARD_ID_ERV_REG 0xB1000000 | ||
41 | #define CPLD_CPLD_CMD_REG 0xB1000006 | ||
42 | |||
43 | /* | ||
44 | * USB SH7763RDP board can use Host only. | ||
45 | */ | ||
46 | #define USB_USBHSC 0xFFEC80f0 | ||
47 | |||
48 | /* arch/sh/boards/renesas/sh7763rdp/irq.c */ | ||
49 | void init_sh7763rdp_IRQ(void); | ||
50 | int sh7763rdp_irq_demux(int irq); | ||
51 | #define __IO_PREFIX sh7763rdp | ||
52 | #include <asm/io_generic.h> | ||
53 | |||
54 | #endif /* __ASM_SH_SH7763RDP_H */ | ||
diff --git a/include/asm-sh/sh7785lcr.h b/include/asm-sh/sh7785lcr.h new file mode 100644 index 000000000000..1ce27d5c7491 --- /dev/null +++ b/include/asm-sh/sh7785lcr.h | |||
@@ -0,0 +1,55 @@ | |||
1 | #ifndef __ASM_SH_RENESAS_SH7785LCR_H | ||
2 | #define __ASM_SH_RENESAS_SH7785LCR_H | ||
3 | |||
4 | /* | ||
5 | * This board has 2 physical memory maps. | ||
6 | * It can be changed with DIP switch(S2-5). | ||
7 | * | ||
8 | * phys address | S2-5 = OFF | S2-5 = ON | ||
9 | * -----------------------------+---------------+--------------- | ||
10 | * 0x00000000 - 0x03ffffff(CS0) | NOR Flash | NOR Flash | ||
11 | * 0x04000000 - 0x05ffffff(CS1) | PLD | PLD | ||
12 | * 0x06000000 - 0x07ffffff(CS1) | reserved | I2C | ||
13 | * 0x08000000 - 0x0bffffff(CS2) | USB | DDR SDRAM | ||
14 | * 0x0c000000 - 0x0fffffff(CS3) | SD | DDR SDRAM | ||
15 | * 0x10000000 - 0x13ffffff(CS4) | SM107 | SM107 | ||
16 | * 0x14000000 - 0x17ffffff(CS5) | I2C | USB | ||
17 | * 0x18000000 - 0x1bffffff(CS6) | reserved | SD | ||
18 | * 0x40000000 - 0x5fffffff | DDR SDRAM | (cannot use) | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #define NOR_FLASH_ADDR 0x00000000 | ||
23 | #define NOR_FLASH_SIZE 0x04000000 | ||
24 | |||
25 | #define PLD_BASE_ADDR 0x04000000 | ||
26 | #define PLD_PCICR (PLD_BASE_ADDR + 0x00) | ||
27 | #define PLD_LCD_BK_CONTR (PLD_BASE_ADDR + 0x02) | ||
28 | #define PLD_LOCALCR (PLD_BASE_ADDR + 0x04) | ||
29 | #define PLD_POFCR (PLD_BASE_ADDR + 0x06) | ||
30 | #define PLD_LEDCR (PLD_BASE_ADDR + 0x08) | ||
31 | #define PLD_SWSR (PLD_BASE_ADDR + 0x0a) | ||
32 | #define PLD_VERSR (PLD_BASE_ADDR + 0x0c) | ||
33 | #define PLD_MMSR (PLD_BASE_ADDR + 0x0e) | ||
34 | |||
35 | #define SM107_MEM_ADDR 0x10000000 | ||
36 | #define SM107_MEM_SIZE 0x00e00000 | ||
37 | #define SM107_REG_ADDR 0x13e00000 | ||
38 | #define SM107_REG_SIZE 0x00200000 | ||
39 | |||
40 | #if defined(CONFIG_SH_SH7785LCR_29BIT_PHYSMAPS) | ||
41 | #define R8A66597_ADDR 0x14000000 /* USB */ | ||
42 | #define CG200_ADDR 0x18000000 /* SD */ | ||
43 | #define PCA9564_ADDR 0x06000000 /* I2C */ | ||
44 | #else | ||
45 | #define R8A66597_ADDR 0x08000000 | ||
46 | #define CG200_ADDR 0x0c000000 | ||
47 | #define PCA9564_ADDR 0x14000000 | ||
48 | #endif | ||
49 | |||
50 | #define R8A66597_SIZE 0x00000100 | ||
51 | #define CG200_SIZE 0x00010000 | ||
52 | #define PCA9564_SIZE 0x00000100 | ||
53 | |||
54 | #endif /* __ASM_SH_RENESAS_SH7785LCR_H */ | ||
55 | |||
diff --git a/include/asm-sh/system.h b/include/asm-sh/system.h index e65b6b822cb3..056d68cd2108 100644 --- a/include/asm-sh/system.h +++ b/include/asm-sh/system.h | |||
@@ -148,14 +148,6 @@ extern unsigned long cached_to_uncached; | |||
148 | 148 | ||
149 | extern struct dentry *sh_debugfs_root; | 149 | extern struct dentry *sh_debugfs_root; |
150 | 150 | ||
151 | /* XXX | ||
152 | * disable hlt during certain critical i/o operations | ||
153 | */ | ||
154 | #define HAVE_DISABLE_HLT | ||
155 | void disable_hlt(void); | ||
156 | void enable_hlt(void); | ||
157 | |||
158 | void default_idle(void); | ||
159 | void per_cpu_trap_init(void); | 151 | void per_cpu_trap_init(void); |
160 | 152 | ||
161 | asmlinkage void break_point_trap(void); | 153 | asmlinkage void break_point_trap(void); |
diff --git a/include/asm-sh/thread_info.h b/include/asm-sh/thread_info.h index 5131e3907525..eeb4c747119e 100644 --- a/include/asm-sh/thread_info.h +++ b/include/asm-sh/thread_info.h | |||
@@ -38,6 +38,8 @@ struct thread_info { | |||
38 | #define THREAD_SIZE_ORDER (1) | 38 | #define THREAD_SIZE_ORDER (1) |
39 | #elif defined(CONFIG_PAGE_SIZE_8KB) | 39 | #elif defined(CONFIG_PAGE_SIZE_8KB) |
40 | #define THREAD_SIZE_ORDER (1) | 40 | #define THREAD_SIZE_ORDER (1) |
41 | #elif defined(CONFIG_PAGE_SIZE_16KB) | ||
42 | #define THREAD_SIZE_ORDER (0) | ||
41 | #elif defined(CONFIG_PAGE_SIZE_64KB) | 43 | #elif defined(CONFIG_PAGE_SIZE_64KB) |
42 | #define THREAD_SIZE_ORDER (0) | 44 | #define THREAD_SIZE_ORDER (0) |
43 | #else | 45 | #else |
diff --git a/include/asm-sh/timer.h b/include/asm-sh/timer.h index 701ba84c7049..327f7eb8976a 100644 --- a/include/asm-sh/timer.h +++ b/include/asm-sh/timer.h | |||
@@ -40,6 +40,5 @@ struct sys_timer *get_sys_timer(void); | |||
40 | /* arch/sh/kernel/time.c */ | 40 | /* arch/sh/kernel/time.c */ |
41 | void handle_timer_tick(void); | 41 | void handle_timer_tick(void); |
42 | extern unsigned long sh_hpt_frequency; | 42 | extern unsigned long sh_hpt_frequency; |
43 | extern struct clocksource clocksource_sh; | ||
44 | 43 | ||
45 | #endif /* __ASM_SH_TIMER_H */ | 44 | #endif /* __ASM_SH_TIMER_H */ |
diff --git a/include/asm-sh/uaccess.h b/include/asm-sh/uaccess.h index b3440c305b5d..45c2c9b2993d 100644 --- a/include/asm-sh/uaccess.h +++ b/include/asm-sh/uaccess.h | |||
@@ -1,12 +1,171 @@ | |||
1 | #ifndef __ASM_SH_UACCESS_H | 1 | #ifndef __ASM_SH_UACCESS_H |
2 | #define __ASM_SH_UACCESS_H | 2 | #define __ASM_SH_UACCESS_H |
3 | 3 | ||
4 | #include <linux/errno.h> | ||
5 | #include <linux/sched.h> | ||
6 | #include <asm/segment.h> | ||
7 | |||
8 | #define VERIFY_READ 0 | ||
9 | #define VERIFY_WRITE 1 | ||
10 | |||
11 | #define __addr_ok(addr) \ | ||
12 | ((unsigned long __force)(addr) < current_thread_info()->addr_limit.seg) | ||
13 | |||
14 | /* | ||
15 | * __access_ok: Check if address with size is OK or not. | ||
16 | * | ||
17 | * Uhhuh, this needs 33-bit arithmetic. We have a carry.. | ||
18 | * | ||
19 | * sum := addr + size; carry? --> flag = true; | ||
20 | * if (sum >= addr_limit) flag = true; | ||
21 | */ | ||
22 | #define __access_ok(addr, size) \ | ||
23 | (__addr_ok((addr) + (size))) | ||
24 | #define access_ok(type, addr, size) \ | ||
25 | (__chk_user_ptr(addr), \ | ||
26 | __access_ok((unsigned long __force)(addr), (size))) | ||
27 | |||
28 | /* | ||
29 | * Uh, these should become the main single-value transfer routines ... | ||
30 | * They automatically use the right size if we just have the right | ||
31 | * pointer type ... | ||
32 | * | ||
33 | * As SuperH uses the same address space for kernel and user data, we | ||
34 | * can just do these as direct assignments. | ||
35 | * | ||
36 | * Careful to not | ||
37 | * (a) re-use the arguments for side effects (sizeof is ok) | ||
38 | * (b) require any knowledge of processes at this stage | ||
39 | */ | ||
40 | #define put_user(x,ptr) __put_user_check((x), (ptr), sizeof(*(ptr))) | ||
41 | #define get_user(x,ptr) __get_user_check((x), (ptr), sizeof(*(ptr))) | ||
42 | |||
43 | /* | ||
44 | * The "__xxx" versions do not do address space checking, useful when | ||
45 | * doing multiple accesses to the same area (the user has to do the | ||
46 | * checks by hand with "access_ok()") | ||
47 | */ | ||
48 | #define __put_user(x,ptr) __put_user_nocheck((x), (ptr), sizeof(*(ptr))) | ||
49 | #define __get_user(x,ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr))) | ||
50 | |||
51 | struct __large_struct { unsigned long buf[100]; }; | ||
52 | #define __m(x) (*(struct __large_struct __user *)(x)) | ||
53 | |||
54 | #define __get_user_nocheck(x,ptr,size) \ | ||
55 | ({ \ | ||
56 | long __gu_err; \ | ||
57 | unsigned long __gu_val; \ | ||
58 | const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ | ||
59 | __chk_user_ptr(ptr); \ | ||
60 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ | ||
61 | (x) = (__typeof__(*(ptr)))__gu_val; \ | ||
62 | __gu_err; \ | ||
63 | }) | ||
64 | |||
65 | #define __get_user_check(x,ptr,size) \ | ||
66 | ({ \ | ||
67 | long __gu_err = -EFAULT; \ | ||
68 | unsigned long __gu_val = 0; \ | ||
69 | const __typeof__(*(ptr)) *__gu_addr = (ptr); \ | ||
70 | if (likely(access_ok(VERIFY_READ, __gu_addr, (size)))) \ | ||
71 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ | ||
72 | (x) = (__typeof__(*(ptr)))__gu_val; \ | ||
73 | __gu_err; \ | ||
74 | }) | ||
75 | |||
76 | #define __put_user_nocheck(x,ptr,size) \ | ||
77 | ({ \ | ||
78 | long __pu_err; \ | ||
79 | __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ | ||
80 | __chk_user_ptr(ptr); \ | ||
81 | __put_user_size((x), __pu_addr, (size), __pu_err); \ | ||
82 | __pu_err; \ | ||
83 | }) | ||
84 | |||
85 | #define __put_user_check(x,ptr,size) \ | ||
86 | ({ \ | ||
87 | long __pu_err = -EFAULT; \ | ||
88 | __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ | ||
89 | if (likely(access_ok(VERIFY_WRITE, __pu_addr, size))) \ | ||
90 | __put_user_size((x), __pu_addr, (size), \ | ||
91 | __pu_err); \ | ||
92 | __pu_err; \ | ||
93 | }) | ||
94 | |||
4 | #ifdef CONFIG_SUPERH32 | 95 | #ifdef CONFIG_SUPERH32 |
5 | # include "uaccess_32.h" | 96 | # include "uaccess_32.h" |
6 | #else | 97 | #else |
7 | # include "uaccess_64.h" | 98 | # include "uaccess_64.h" |
8 | #endif | 99 | #endif |
9 | 100 | ||
101 | /* Generic arbitrary sized copy. */ | ||
102 | /* Return the number of bytes NOT copied */ | ||
103 | __kernel_size_t __copy_user(void *to, const void *from, __kernel_size_t n); | ||
104 | |||
105 | static __always_inline unsigned long | ||
106 | __copy_from_user(void *to, const void __user *from, unsigned long n) | ||
107 | { | ||
108 | return __copy_user(to, (__force void *)from, n); | ||
109 | } | ||
110 | |||
111 | static __always_inline unsigned long __must_check | ||
112 | __copy_to_user(void __user *to, const void *from, unsigned long n) | ||
113 | { | ||
114 | return __copy_user((__force void *)to, from, n); | ||
115 | } | ||
116 | |||
117 | #define __copy_to_user_inatomic __copy_to_user | ||
118 | #define __copy_from_user_inatomic __copy_from_user | ||
119 | |||
120 | /* | ||
121 | * Clear the area and return remaining number of bytes | ||
122 | * (on failure. Usually it's 0.) | ||
123 | */ | ||
124 | __kernel_size_t __clear_user(void *addr, __kernel_size_t size); | ||
125 | |||
126 | #define clear_user(addr,n) \ | ||
127 | ({ \ | ||
128 | void __user * __cl_addr = (addr); \ | ||
129 | unsigned long __cl_size = (n); \ | ||
130 | \ | ||
131 | if (__cl_size && access_ok(VERIFY_WRITE, \ | ||
132 | ((unsigned long)(__cl_addr)), __cl_size)) \ | ||
133 | __cl_size = __clear_user(__cl_addr, __cl_size); \ | ||
134 | \ | ||
135 | __cl_size; \ | ||
136 | }) | ||
137 | |||
138 | /** | ||
139 | * strncpy_from_user: - Copy a NUL terminated string from userspace. | ||
140 | * @dst: Destination address, in kernel space. This buffer must be at | ||
141 | * least @count bytes long. | ||
142 | * @src: Source address, in user space. | ||
143 | * @count: Maximum number of bytes to copy, including the trailing NUL. | ||
144 | * | ||
145 | * Copies a NUL-terminated string from userspace to kernel space. | ||
146 | * | ||
147 | * On success, returns the length of the string (not including the trailing | ||
148 | * NUL). | ||
149 | * | ||
150 | * If access to userspace fails, returns -EFAULT (some data may have been | ||
151 | * copied). | ||
152 | * | ||
153 | * If @count is smaller than the length of the string, copies @count bytes | ||
154 | * and returns @count. | ||
155 | */ | ||
156 | #define strncpy_from_user(dest,src,count) \ | ||
157 | ({ \ | ||
158 | unsigned long __sfu_src = (unsigned long)(src); \ | ||
159 | int __sfu_count = (int)(count); \ | ||
160 | long __sfu_res = -EFAULT; \ | ||
161 | \ | ||
162 | if (__access_ok(__sfu_src, __sfu_count)) \ | ||
163 | __sfu_res = __strncpy_from_user((unsigned long)(dest), \ | ||
164 | __sfu_src, __sfu_count); \ | ||
165 | \ | ||
166 | __sfu_res; \ | ||
167 | }) | ||
168 | |||
10 | static inline unsigned long | 169 | static inline unsigned long |
11 | copy_from_user(void *to, const void __user *from, unsigned long n) | 170 | copy_from_user(void *to, const void __user *from, unsigned long n) |
12 | { | 171 | { |
@@ -31,4 +190,67 @@ copy_to_user(void __user *to, const void *from, unsigned long n) | |||
31 | return __copy_size; | 190 | return __copy_size; |
32 | } | 191 | } |
33 | 192 | ||
193 | /** | ||
194 | * strnlen_user: - Get the size of a string in user space. | ||
195 | * @s: The string to measure. | ||
196 | * @n: The maximum valid length | ||
197 | * | ||
198 | * Context: User context only. This function may sleep. | ||
199 | * | ||
200 | * Get the size of a NUL-terminated string in user space. | ||
201 | * | ||
202 | * Returns the size of the string INCLUDING the terminating NUL. | ||
203 | * On exception, returns 0. | ||
204 | * If the string is too long, returns a value greater than @n. | ||
205 | */ | ||
206 | static inline long strnlen_user(const char __user *s, long n) | ||
207 | { | ||
208 | if (!__addr_ok(s)) | ||
209 | return 0; | ||
210 | else | ||
211 | return __strnlen_user(s, n); | ||
212 | } | ||
213 | |||
214 | /** | ||
215 | * strlen_user: - Get the size of a string in user space. | ||
216 | * @str: The string to measure. | ||
217 | * | ||
218 | * Context: User context only. This function may sleep. | ||
219 | * | ||
220 | * Get the size of a NUL-terminated string in user space. | ||
221 | * | ||
222 | * Returns the size of the string INCLUDING the terminating NUL. | ||
223 | * On exception, returns 0. | ||
224 | * | ||
225 | * If there is a limit on the length of a valid string, you may wish to | ||
226 | * consider using strnlen_user() instead. | ||
227 | */ | ||
228 | #define strlen_user(str) strnlen_user(str, ~0UL >> 1) | ||
229 | |||
230 | /* | ||
231 | * The exception table consists of pairs of addresses: the first is the | ||
232 | * address of an instruction that is allowed to fault, and the second is | ||
233 | * the address at which the program should continue. No registers are | ||
234 | * modified, so it is entirely up to the continuation code to figure out | ||
235 | * what to do. | ||
236 | * | ||
237 | * All the routines below use bits of fixup code that are out of line | ||
238 | * with the main instruction path. This means when everything is well, | ||
239 | * we don't even have to jump over them. Further, they do not intrude | ||
240 | * on our cache or tlb entries. | ||
241 | */ | ||
242 | struct exception_table_entry { | ||
243 | unsigned long insn, fixup; | ||
244 | }; | ||
245 | |||
246 | #if defined(CONFIG_SUPERH64) && defined(CONFIG_MMU) | ||
247 | #define ARCH_HAS_SEARCH_EXTABLE | ||
248 | #endif | ||
249 | |||
250 | int fixup_exception(struct pt_regs *regs); | ||
251 | /* Returns 0 if exception not found and fixup.unit otherwise. */ | ||
252 | unsigned long search_exception_table(unsigned long addr); | ||
253 | const struct exception_table_entry *search_exception_tables(unsigned long addr); | ||
254 | |||
255 | |||
34 | #endif /* __ASM_SH_UACCESS_H */ | 256 | #endif /* __ASM_SH_UACCESS_H */ |
diff --git a/include/asm-sh/uaccess_32.h b/include/asm-sh/uaccess_32.h index 1e41fda74bd3..892fd6dea9db 100644 --- a/include/asm-sh/uaccess_32.h +++ b/include/asm-sh/uaccess_32.h | |||
@@ -1,9 +1,8 @@ | |||
1 | /* $Id: uaccess.h,v 1.11 2003/10/13 07:21:20 lethal Exp $ | 1 | /* |
2 | * | ||
3 | * User space memory access functions | 2 | * User space memory access functions |
4 | * | 3 | * |
5 | * Copyright (C) 1999, 2002 Niibe Yutaka | 4 | * Copyright (C) 1999, 2002 Niibe Yutaka |
6 | * Copyright (C) 2003 Paul Mundt | 5 | * Copyright (C) 2003 - 2008 Paul Mundt |
7 | * | 6 | * |
8 | * Based on: | 7 | * Based on: |
9 | * MIPS implementation version 1.15 by | 8 | * MIPS implementation version 1.15 by |
@@ -13,115 +12,6 @@ | |||
13 | #ifndef __ASM_SH_UACCESS_32_H | 12 | #ifndef __ASM_SH_UACCESS_32_H |
14 | #define __ASM_SH_UACCESS_32_H | 13 | #define __ASM_SH_UACCESS_32_H |
15 | 14 | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/sched.h> | ||
18 | |||
19 | #define VERIFY_READ 0 | ||
20 | #define VERIFY_WRITE 1 | ||
21 | |||
22 | /* | ||
23 | * The fs value determines whether argument validity checking should be | ||
24 | * performed or not. If get_fs() == USER_DS, checking is performed, with | ||
25 | * get_fs() == KERNEL_DS, checking is bypassed. | ||
26 | * | ||
27 | * For historical reasons (Data Segment Register?), these macros are misnamed. | ||
28 | */ | ||
29 | |||
30 | #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) | ||
31 | |||
32 | #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFFUL) | ||
33 | #define USER_DS MAKE_MM_SEG(PAGE_OFFSET) | ||
34 | |||
35 | #define segment_eq(a,b) ((a).seg == (b).seg) | ||
36 | |||
37 | #define get_ds() (KERNEL_DS) | ||
38 | |||
39 | #if !defined(CONFIG_MMU) | ||
40 | /* NOMMU is always true */ | ||
41 | #define __addr_ok(addr) (1) | ||
42 | |||
43 | static inline mm_segment_t get_fs(void) | ||
44 | { | ||
45 | return USER_DS; | ||
46 | } | ||
47 | |||
48 | static inline void set_fs(mm_segment_t s) | ||
49 | { | ||
50 | } | ||
51 | |||
52 | /* | ||
53 | * __access_ok: Check if address with size is OK or not. | ||
54 | * | ||
55 | * If we don't have an MMU (or if its disabled) the only thing we really have | ||
56 | * to look out for is if the address resides somewhere outside of what | ||
57 | * available RAM we have. | ||
58 | */ | ||
59 | static inline int __access_ok(unsigned long addr, unsigned long size) | ||
60 | { | ||
61 | return 1; | ||
62 | } | ||
63 | #else /* CONFIG_MMU */ | ||
64 | #define __addr_ok(addr) \ | ||
65 | ((unsigned long)(addr) < (current_thread_info()->addr_limit.seg)) | ||
66 | |||
67 | #define get_fs() (current_thread_info()->addr_limit) | ||
68 | #define set_fs(x) (current_thread_info()->addr_limit = (x)) | ||
69 | |||
70 | /* | ||
71 | * __access_ok: Check if address with size is OK or not. | ||
72 | * | ||
73 | * Uhhuh, this needs 33-bit arithmetic. We have a carry.. | ||
74 | * | ||
75 | * sum := addr + size; carry? --> flag = true; | ||
76 | * if (sum >= addr_limit) flag = true; | ||
77 | */ | ||
78 | static inline int __access_ok(unsigned long addr, unsigned long size) | ||
79 | { | ||
80 | unsigned long flag, sum; | ||
81 | |||
82 | __asm__("clrt\n\t" | ||
83 | "addc %3, %1\n\t" | ||
84 | "movt %0\n\t" | ||
85 | "cmp/hi %4, %1\n\t" | ||
86 | "rotcl %0" | ||
87 | :"=&r" (flag), "=r" (sum) | ||
88 | :"1" (addr), "r" (size), | ||
89 | "r" (current_thread_info()->addr_limit.seg) | ||
90 | :"t"); | ||
91 | return flag == 0; | ||
92 | } | ||
93 | #endif /* CONFIG_MMU */ | ||
94 | |||
95 | #define access_ok(type, addr, size) \ | ||
96 | (__chk_user_ptr(addr), \ | ||
97 | __access_ok((unsigned long __force)(addr), (size))) | ||
98 | |||
99 | /* | ||
100 | * Uh, these should become the main single-value transfer routines ... | ||
101 | * They automatically use the right size if we just have the right | ||
102 | * pointer type ... | ||
103 | * | ||
104 | * As SuperH uses the same address space for kernel and user data, we | ||
105 | * can just do these as direct assignments. | ||
106 | * | ||
107 | * Careful to not | ||
108 | * (a) re-use the arguments for side effects (sizeof is ok) | ||
109 | * (b) require any knowledge of processes at this stage | ||
110 | */ | ||
111 | #define put_user(x,ptr) __put_user_check((x), (ptr), sizeof(*(ptr))) | ||
112 | #define get_user(x,ptr) __get_user_check((x), (ptr), sizeof(*(ptr))) | ||
113 | |||
114 | /* | ||
115 | * The "__xxx" versions do not do address space checking, useful when | ||
116 | * doing multiple accesses to the same area (the user has to do the | ||
117 | * checks by hand with "access_ok()") | ||
118 | */ | ||
119 | #define __put_user(x,ptr) __put_user_nocheck((x), (ptr), sizeof(*(ptr))) | ||
120 | #define __get_user(x,ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr))) | ||
121 | |||
122 | struct __large_struct { unsigned long buf[100]; }; | ||
123 | #define __m(x) (*(struct __large_struct __user *)(x)) | ||
124 | |||
125 | #define __get_user_size(x,ptr,size,retval) \ | 15 | #define __get_user_size(x,ptr,size,retval) \ |
126 | do { \ | 16 | do { \ |
127 | retval = 0; \ | 17 | retval = 0; \ |
@@ -141,28 +31,7 @@ do { \ | |||
141 | } \ | 31 | } \ |
142 | } while (0) | 32 | } while (0) |
143 | 33 | ||
144 | #define __get_user_nocheck(x,ptr,size) \ | 34 | #ifdef CONFIG_MMU |
145 | ({ \ | ||
146 | long __gu_err; \ | ||
147 | unsigned long __gu_val; \ | ||
148 | const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ | ||
149 | __chk_user_ptr(ptr); \ | ||
150 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ | ||
151 | (x) = (__typeof__(*(ptr)))__gu_val; \ | ||
152 | __gu_err; \ | ||
153 | }) | ||
154 | |||
155 | #define __get_user_check(x,ptr,size) \ | ||
156 | ({ \ | ||
157 | long __gu_err = -EFAULT; \ | ||
158 | unsigned long __gu_val = 0; \ | ||
159 | const __typeof__(*(ptr)) *__gu_addr = (ptr); \ | ||
160 | if (likely(access_ok(VERIFY_READ, __gu_addr, (size)))) \ | ||
161 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ | ||
162 | (x) = (__typeof__(*(ptr)))__gu_val; \ | ||
163 | __gu_err; \ | ||
164 | }) | ||
165 | |||
166 | #define __get_user_asm(x, addr, err, insn) \ | 35 | #define __get_user_asm(x, addr, err, insn) \ |
167 | ({ \ | 36 | ({ \ |
168 | __asm__ __volatile__( \ | 37 | __asm__ __volatile__( \ |
@@ -183,6 +52,16 @@ __asm__ __volatile__( \ | |||
183 | ".previous" \ | 52 | ".previous" \ |
184 | :"=&r" (err), "=&r" (x) \ | 53 | :"=&r" (err), "=&r" (x) \ |
185 | :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) | 54 | :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) |
55 | #else | ||
56 | #define __get_user_asm(x, addr, err, insn) \ | ||
57 | do { \ | ||
58 | __asm__ __volatile__ ( \ | ||
59 | "mov." insn " %1, %0\n\t" \ | ||
60 | : "=&r" (x) \ | ||
61 | : "m" (__m(addr)) \ | ||
62 | ); \ | ||
63 | } while (0) | ||
64 | #endif /* CONFIG_MMU */ | ||
186 | 65 | ||
187 | extern void __get_user_unknown(void); | 66 | extern void __get_user_unknown(void); |
188 | 67 | ||
@@ -197,7 +76,8 @@ do { \ | |||
197 | __put_user_asm(x, ptr, retval, "w"); \ | 76 | __put_user_asm(x, ptr, retval, "w"); \ |
198 | break; \ | 77 | break; \ |
199 | case 4: \ | 78 | case 4: \ |
200 | __put_user_asm(x, ptr, retval, "l"); \ | 79 | __put_user_asm((u32)x, ptr, \ |
80 | retval, "l"); \ | ||
201 | break; \ | 81 | break; \ |
202 | case 8: \ | 82 | case 8: \ |
203 | __put_user_u64(x, ptr, retval); \ | 83 | __put_user_u64(x, ptr, retval); \ |
@@ -207,45 +87,41 @@ do { \ | |||
207 | } \ | 87 | } \ |
208 | } while (0) | 88 | } while (0) |
209 | 89 | ||
210 | #define __put_user_nocheck(x,ptr,size) \ | 90 | #ifdef CONFIG_MMU |
211 | ({ \ | 91 | #define __put_user_asm(x, addr, err, insn) \ |
212 | long __pu_err; \ | 92 | do { \ |
213 | __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ | 93 | __asm__ __volatile__ ( \ |
214 | __chk_user_ptr(ptr); \ | 94 | "1:\n\t" \ |
215 | __put_user_size((x), __pu_addr, (size), __pu_err); \ | 95 | "mov." insn " %1, %2\n\t" \ |
216 | __pu_err; \ | 96 | "2:\n" \ |
217 | }) | 97 | ".section .fixup,\"ax\"\n" \ |
218 | 98 | "3:\n\t" \ | |
219 | #define __put_user_check(x,ptr,size) \ | 99 | "mov.l 4f, %0\n\t" \ |
220 | ({ \ | 100 | "jmp @%0\n\t" \ |
221 | long __pu_err = -EFAULT; \ | 101 | " mov %3, %0\n\t" \ |
222 | __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ | 102 | ".balign 4\n" \ |
223 | if (likely(access_ok(VERIFY_WRITE, __pu_addr, size))) \ | 103 | "4: .long 2b\n\t" \ |
224 | __put_user_size((x), __pu_addr, (size), \ | 104 | ".previous\n" \ |
225 | __pu_err); \ | 105 | ".section __ex_table,\"a\"\n\t" \ |
226 | __pu_err; \ | 106 | ".long 1b, 3b\n\t" \ |
227 | }) | 107 | ".previous" \ |
228 | 108 | : "=&r" (err) \ | |
229 | #define __put_user_asm(x, addr, err, insn) \ | 109 | : "r" (x), "m" (__m(addr)), "i" (-EFAULT), \ |
230 | ({ \ | 110 | "0" (err) \ |
231 | __asm__ __volatile__( \ | 111 | : "memory" \ |
232 | "1:\n\t" \ | 112 | ); \ |
233 | "mov." insn " %1, %2\n\t" \ | 113 | } while (0) |
234 | "2:\n" \ | 114 | #else |
235 | ".section .fixup,\"ax\"\n" \ | 115 | #define __put_user_asm(x, addr, err, insn) \ |
236 | "3:\n\t" \ | 116 | do { \ |
237 | "mov.l 4f, %0\n\t" \ | 117 | __asm__ __volatile__ ( \ |
238 | "jmp @%0\n\t" \ | 118 | "mov." insn " %0, %1\n\t" \ |
239 | " mov %3, %0\n\t" \ | 119 | : /* no outputs */ \ |
240 | ".balign 4\n" \ | 120 | : "r" (x), "m" (__m(addr)) \ |
241 | "4: .long 2b\n\t" \ | 121 | : "memory" \ |
242 | ".previous\n" \ | 122 | ); \ |
243 | ".section __ex_table,\"a\"\n\t" \ | 123 | } while (0) |
244 | ".long 1b, 3b\n\t" \ | 124 | #endif /* CONFIG_MMU */ |
245 | ".previous" \ | ||
246 | :"=&r" (err) \ | ||
247 | :"r" (x), "m" (__m(addr)), "i" (-EFAULT), "0" (err) \ | ||
248 | :"memory"); }) | ||
249 | 125 | ||
250 | #if defined(CONFIG_CPU_LITTLE_ENDIAN) | 126 | #if defined(CONFIG_CPU_LITTLE_ENDIAN) |
251 | #define __put_user_u64(val,addr,retval) \ | 127 | #define __put_user_u64(val,addr,retval) \ |
@@ -295,40 +171,7 @@ __asm__ __volatile__( \ | |||
295 | 171 | ||
296 | extern void __put_user_unknown(void); | 172 | extern void __put_user_unknown(void); |
297 | 173 | ||
298 | /* Generic arbitrary sized copy. */ | 174 | static inline int |
299 | /* Return the number of bytes NOT copied */ | ||
300 | __kernel_size_t __copy_user(void *to, const void *from, __kernel_size_t n); | ||
301 | |||
302 | |||
303 | static __always_inline unsigned long | ||
304 | __copy_from_user(void *to, const void __user *from, unsigned long n) | ||
305 | { | ||
306 | return __copy_user(to, (__force void *)from, n); | ||
307 | } | ||
308 | |||
309 | static __always_inline unsigned long __must_check | ||
310 | __copy_to_user(void __user *to, const void *from, unsigned long n) | ||
311 | { | ||
312 | return __copy_user((__force void *)to, from, n); | ||
313 | } | ||
314 | |||
315 | #define __copy_to_user_inatomic __copy_to_user | ||
316 | #define __copy_from_user_inatomic __copy_from_user | ||
317 | |||
318 | /* | ||
319 | * Clear the area and return remaining number of bytes | ||
320 | * (on failure. Usually it's 0.) | ||
321 | */ | ||
322 | extern __kernel_size_t __clear_user(void *addr, __kernel_size_t size); | ||
323 | |||
324 | #define clear_user(addr,n) ({ \ | ||
325 | void * __cl_addr = (addr); \ | ||
326 | unsigned long __cl_size = (n); \ | ||
327 | if (__cl_size && __access_ok(((unsigned long)(__cl_addr)), __cl_size)) \ | ||
328 | __cl_size = __clear_user(__cl_addr, __cl_size); \ | ||
329 | __cl_size; }) | ||
330 | |||
331 | static __inline__ int | ||
332 | __strncpy_from_user(unsigned long __dest, unsigned long __user __src, int __count) | 175 | __strncpy_from_user(unsigned long __dest, unsigned long __user __src, int __count) |
333 | { | 176 | { |
334 | __kernel_size_t res; | 177 | __kernel_size_t res; |
@@ -367,37 +210,11 @@ __strncpy_from_user(unsigned long __dest, unsigned long __user __src, int __coun | |||
367 | return res; | 210 | return res; |
368 | } | 211 | } |
369 | 212 | ||
370 | /** | ||
371 | * strncpy_from_user: - Copy a NUL terminated string from userspace. | ||
372 | * @dst: Destination address, in kernel space. This buffer must be at | ||
373 | * least @count bytes long. | ||
374 | * @src: Source address, in user space. | ||
375 | * @count: Maximum number of bytes to copy, including the trailing NUL. | ||
376 | * | ||
377 | * Copies a NUL-terminated string from userspace to kernel space. | ||
378 | * | ||
379 | * On success, returns the length of the string (not including the trailing | ||
380 | * NUL). | ||
381 | * | ||
382 | * If access to userspace fails, returns -EFAULT (some data may have been | ||
383 | * copied). | ||
384 | * | ||
385 | * If @count is smaller than the length of the string, copies @count bytes | ||
386 | * and returns @count. | ||
387 | */ | ||
388 | #define strncpy_from_user(dest,src,count) ({ \ | ||
389 | unsigned long __sfu_src = (unsigned long) (src); \ | ||
390 | int __sfu_count = (int) (count); \ | ||
391 | long __sfu_res = -EFAULT; \ | ||
392 | if(__access_ok(__sfu_src, __sfu_count)) { \ | ||
393 | __sfu_res = __strncpy_from_user((unsigned long) (dest), __sfu_src, __sfu_count); \ | ||
394 | } __sfu_res; }) | ||
395 | |||
396 | /* | 213 | /* |
397 | * Return the size of a string (including the ending 0 even when we have | 214 | * Return the size of a string (including the ending 0 even when we have |
398 | * exceeded the maximum string length). | 215 | * exceeded the maximum string length). |
399 | */ | 216 | */ |
400 | static __inline__ long __strnlen_user(const char __user *__s, long __n) | 217 | static inline long __strnlen_user(const char __user *__s, long __n) |
401 | { | 218 | { |
402 | unsigned long res; | 219 | unsigned long res; |
403 | unsigned long __dummy; | 220 | unsigned long __dummy; |
@@ -429,61 +246,4 @@ static __inline__ long __strnlen_user(const char __user *__s, long __n) | |||
429 | return res; | 246 | return res; |
430 | } | 247 | } |
431 | 248 | ||
432 | /** | ||
433 | * strnlen_user: - Get the size of a string in user space. | ||
434 | * @s: The string to measure. | ||
435 | * @n: The maximum valid length | ||
436 | * | ||
437 | * Context: User context only. This function may sleep. | ||
438 | * | ||
439 | * Get the size of a NUL-terminated string in user space. | ||
440 | * | ||
441 | * Returns the size of the string INCLUDING the terminating NUL. | ||
442 | * On exception, returns 0. | ||
443 | * If the string is too long, returns a value greater than @n. | ||
444 | */ | ||
445 | static __inline__ long strnlen_user(const char __user *s, long n) | ||
446 | { | ||
447 | if (!__addr_ok(s)) | ||
448 | return 0; | ||
449 | else | ||
450 | return __strnlen_user(s, n); | ||
451 | } | ||
452 | |||
453 | /** | ||
454 | * strlen_user: - Get the size of a string in user space. | ||
455 | * @str: The string to measure. | ||
456 | * | ||
457 | * Context: User context only. This function may sleep. | ||
458 | * | ||
459 | * Get the size of a NUL-terminated string in user space. | ||
460 | * | ||
461 | * Returns the size of the string INCLUDING the terminating NUL. | ||
462 | * On exception, returns 0. | ||
463 | * | ||
464 | * If there is a limit on the length of a valid string, you may wish to | ||
465 | * consider using strnlen_user() instead. | ||
466 | */ | ||
467 | #define strlen_user(str) strnlen_user(str, ~0UL >> 1) | ||
468 | |||
469 | /* | ||
470 | * The exception table consists of pairs of addresses: the first is the | ||
471 | * address of an instruction that is allowed to fault, and the second is | ||
472 | * the address at which the program should continue. No registers are | ||
473 | * modified, so it is entirely up to the continuation code to figure out | ||
474 | * what to do. | ||
475 | * | ||
476 | * All the routines below use bits of fixup code that are out of line | ||
477 | * with the main instruction path. This means when everything is well, | ||
478 | * we don't even have to jump over them. Further, they do not intrude | ||
479 | * on our cache or tlb entries. | ||
480 | */ | ||
481 | |||
482 | struct exception_table_entry | ||
483 | { | ||
484 | unsigned long insn, fixup; | ||
485 | }; | ||
486 | |||
487 | extern int fixup_exception(struct pt_regs *regs); | ||
488 | |||
489 | #endif /* __ASM_SH_UACCESS_32_H */ | 249 | #endif /* __ASM_SH_UACCESS_32_H */ |
diff --git a/include/asm-sh/uaccess_64.h b/include/asm-sh/uaccess_64.h index a9b68d094844..81b3d515fcb3 100644 --- a/include/asm-sh/uaccess_64.h +++ b/include/asm-sh/uaccess_64.h | |||
@@ -20,87 +20,6 @@ | |||
20 | * License. See the file "COPYING" in the main directory of this archive | 20 | * License. See the file "COPYING" in the main directory of this archive |
21 | * for more details. | 21 | * for more details. |
22 | */ | 22 | */ |
23 | #include <linux/errno.h> | ||
24 | #include <linux/sched.h> | ||
25 | |||
26 | #define VERIFY_READ 0 | ||
27 | #define VERIFY_WRITE 1 | ||
28 | |||
29 | /* | ||
30 | * The fs value determines whether argument validity checking should be | ||
31 | * performed or not. If get_fs() == USER_DS, checking is performed, with | ||
32 | * get_fs() == KERNEL_DS, checking is bypassed. | ||
33 | * | ||
34 | * For historical reasons (Data Segment Register?), these macros are misnamed. | ||
35 | */ | ||
36 | |||
37 | #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) | ||
38 | |||
39 | #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF) | ||
40 | #define USER_DS MAKE_MM_SEG(0x80000000) | ||
41 | |||
42 | #define get_ds() (KERNEL_DS) | ||
43 | #define get_fs() (current_thread_info()->addr_limit) | ||
44 | #define set_fs(x) (current_thread_info()->addr_limit=(x)) | ||
45 | |||
46 | #define segment_eq(a,b) ((a).seg == (b).seg) | ||
47 | |||
48 | #define __addr_ok(addr) ((unsigned long)(addr) < (current_thread_info()->addr_limit.seg)) | ||
49 | |||
50 | /* | ||
51 | * Uhhuh, this needs 33-bit arithmetic. We have a carry.. | ||
52 | * | ||
53 | * sum := addr + size; carry? --> flag = true; | ||
54 | * if (sum >= addr_limit) flag = true; | ||
55 | */ | ||
56 | #define __range_ok(addr,size) (((unsigned long) (addr) + (size) < (current_thread_info()->addr_limit.seg)) ? 0 : 1) | ||
57 | |||
58 | #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) | ||
59 | #define __access_ok(addr,size) (__range_ok(addr,size) == 0) | ||
60 | |||
61 | /* | ||
62 | * Uh, these should become the main single-value transfer routines ... | ||
63 | * They automatically use the right size if we just have the right | ||
64 | * pointer type ... | ||
65 | * | ||
66 | * As MIPS uses the same address space for kernel and user data, we | ||
67 | * can just do these as direct assignments. | ||
68 | * | ||
69 | * Careful to not | ||
70 | * (a) re-use the arguments for side effects (sizeof is ok) | ||
71 | * (b) require any knowledge of processes at this stage | ||
72 | */ | ||
73 | #define put_user(x,ptr) __put_user_check((x),(ptr),sizeof(*(ptr))) | ||
74 | #define get_user(x,ptr) __get_user_check((x),(ptr),sizeof(*(ptr))) | ||
75 | |||
76 | /* | ||
77 | * The "__xxx" versions do not do address space checking, useful when | ||
78 | * doing multiple accesses to the same area (the user has to do the | ||
79 | * checks by hand with "access_ok()") | ||
80 | */ | ||
81 | #define __put_user(x,ptr) __put_user_nocheck((x),(ptr),sizeof(*(ptr))) | ||
82 | #define __get_user(x,ptr) __get_user_nocheck((x),(ptr),sizeof(*(ptr))) | ||
83 | |||
84 | /* | ||
85 | * The "xxx_ret" versions return constant specified in third argument, if | ||
86 | * something bad happens. These macros can be optimized for the | ||
87 | * case of just returning from the function xxx_ret is used. | ||
88 | */ | ||
89 | |||
90 | #define put_user_ret(x,ptr,ret) ({ \ | ||
91 | if (put_user(x,ptr)) return ret; }) | ||
92 | |||
93 | #define get_user_ret(x,ptr,ret) ({ \ | ||
94 | if (get_user(x,ptr)) return ret; }) | ||
95 | |||
96 | #define __put_user_ret(x,ptr,ret) ({ \ | ||
97 | if (__put_user(x,ptr)) return ret; }) | ||
98 | |||
99 | #define __get_user_ret(x,ptr,ret) ({ \ | ||
100 | if (__get_user(x,ptr)) return ret; }) | ||
101 | |||
102 | struct __large_struct { unsigned long buf[100]; }; | ||
103 | #define __m(x) (*(struct __large_struct *)(x)) | ||
104 | 23 | ||
105 | #define __get_user_size(x,ptr,size,retval) \ | 24 | #define __get_user_size(x,ptr,size,retval) \ |
106 | do { \ | 25 | do { \ |
@@ -124,26 +43,6 @@ do { \ | |||
124 | } \ | 43 | } \ |
125 | } while (0) | 44 | } while (0) |
126 | 45 | ||
127 | #define __get_user_nocheck(x,ptr,size) \ | ||
128 | ({ \ | ||
129 | long __gu_err, __gu_val; \ | ||
130 | __get_user_size((void *)&__gu_val, (long)(ptr), \ | ||
131 | (size), __gu_err); \ | ||
132 | (x) = (__typeof__(*(ptr)))__gu_val; \ | ||
133 | __gu_err; \ | ||
134 | }) | ||
135 | |||
136 | #define __get_user_check(x,ptr,size) \ | ||
137 | ({ \ | ||
138 | long __gu_addr = (long)(ptr); \ | ||
139 | long __gu_err = -EFAULT, __gu_val; \ | ||
140 | if (__access_ok(__gu_addr, (size))) \ | ||
141 | __get_user_size((void *)&__gu_val, __gu_addr, \ | ||
142 | (size), __gu_err); \ | ||
143 | (x) = (__typeof__(*(ptr))) __gu_val; \ | ||
144 | __gu_err; \ | ||
145 | }) | ||
146 | |||
147 | extern long __get_user_asm_b(void *, long); | 46 | extern long __get_user_asm_b(void *, long); |
148 | extern long __get_user_asm_w(void *, long); | 47 | extern long __get_user_asm_w(void *, long); |
149 | extern long __get_user_asm_l(void *, long); | 48 | extern long __get_user_asm_l(void *, long); |
@@ -171,115 +70,10 @@ do { \ | |||
171 | } \ | 70 | } \ |
172 | } while (0) | 71 | } while (0) |
173 | 72 | ||
174 | #define __put_user_nocheck(x,ptr,size) \ | ||
175 | ({ \ | ||
176 | long __pu_err; \ | ||
177 | __typeof__(*(ptr)) __pu_val = (x); \ | ||
178 | __put_user_size((void *)&__pu_val, (long)(ptr), (size), __pu_err); \ | ||
179 | __pu_err; \ | ||
180 | }) | ||
181 | |||
182 | #define __put_user_check(x,ptr,size) \ | ||
183 | ({ \ | ||
184 | long __pu_err = -EFAULT; \ | ||
185 | long __pu_addr = (long)(ptr); \ | ||
186 | __typeof__(*(ptr)) __pu_val = (x); \ | ||
187 | \ | ||
188 | if (__access_ok(__pu_addr, (size))) \ | ||
189 | __put_user_size((void *)&__pu_val, __pu_addr, (size), __pu_err);\ | ||
190 | __pu_err; \ | ||
191 | }) | ||
192 | |||
193 | extern long __put_user_asm_b(void *, long); | 73 | extern long __put_user_asm_b(void *, long); |
194 | extern long __put_user_asm_w(void *, long); | 74 | extern long __put_user_asm_w(void *, long); |
195 | extern long __put_user_asm_l(void *, long); | 75 | extern long __put_user_asm_l(void *, long); |
196 | extern long __put_user_asm_q(void *, long); | 76 | extern long __put_user_asm_q(void *, long); |
197 | extern void __put_user_unknown(void); | 77 | extern void __put_user_unknown(void); |
198 | 78 | ||
199 | |||
200 | /* Generic arbitrary sized copy. */ | ||
201 | /* Return the number of bytes NOT copied */ | ||
202 | /* XXX: should be such that: 4byte and the rest. */ | ||
203 | extern __kernel_size_t __copy_user(void *__to, const void *__from, __kernel_size_t __n); | ||
204 | |||
205 | #define copy_to_user_ret(to,from,n,retval) ({ \ | ||
206 | if (copy_to_user(to,from,n)) \ | ||
207 | return retval; \ | ||
208 | }) | ||
209 | |||
210 | #define __copy_to_user(to,from,n) \ | ||
211 | __copy_user((void *)(to), \ | ||
212 | (void *)(from), n) | ||
213 | |||
214 | #define __copy_to_user_ret(to,from,n,retval) ({ \ | ||
215 | if (__copy_to_user(to,from,n)) \ | ||
216 | return retval; \ | ||
217 | }) | ||
218 | |||
219 | #define copy_from_user_ret(to,from,n,retval) ({ \ | ||
220 | if (copy_from_user(to,from,n)) \ | ||
221 | return retval; \ | ||
222 | }) | ||
223 | |||
224 | #define __copy_from_user(to,from,n) \ | ||
225 | __copy_user((void *)(to), \ | ||
226 | (void *)(from), n) | ||
227 | |||
228 | #define __copy_from_user_ret(to,from,n,retval) ({ \ | ||
229 | if (__copy_from_user(to,from,n)) \ | ||
230 | return retval; \ | ||
231 | }) | ||
232 | |||
233 | #define __copy_to_user_inatomic __copy_to_user | ||
234 | #define __copy_from_user_inatomic __copy_from_user | ||
235 | |||
236 | /* XXX: Not sure it works well.. | ||
237 | should be such that: 4byte clear and the rest. */ | ||
238 | extern __kernel_size_t __clear_user(void *addr, __kernel_size_t size); | ||
239 | |||
240 | #define clear_user(addr,n) ({ \ | ||
241 | void * __cl_addr = (addr); \ | ||
242 | unsigned long __cl_size = (n); \ | ||
243 | if (__cl_size && __access_ok(((unsigned long)(__cl_addr)), __cl_size)) \ | ||
244 | __cl_size = __clear_user(__cl_addr, __cl_size); \ | ||
245 | __cl_size; }) | ||
246 | |||
247 | extern int __strncpy_from_user(unsigned long __dest, unsigned long __src, int __count); | ||
248 | |||
249 | #define strncpy_from_user(dest,src,count) ({ \ | ||
250 | unsigned long __sfu_src = (unsigned long) (src); \ | ||
251 | int __sfu_count = (int) (count); \ | ||
252 | long __sfu_res = -EFAULT; \ | ||
253 | if(__access_ok(__sfu_src, __sfu_count)) { \ | ||
254 | __sfu_res = __strncpy_from_user((unsigned long) (dest), __sfu_src, __sfu_count); \ | ||
255 | } __sfu_res; }) | ||
256 | |||
257 | #define strlen_user(str) strnlen_user(str, ~0UL >> 1) | ||
258 | |||
259 | /* | ||
260 | * Return the size of a string (including the ending 0!) | ||
261 | */ | ||
262 | extern long __strnlen_user(const char *__s, long __n); | ||
263 | |||
264 | static inline long strnlen_user(const char *s, long n) | ||
265 | { | ||
266 | if (!__addr_ok(s)) | ||
267 | return 0; | ||
268 | else | ||
269 | return __strnlen_user(s, n); | ||
270 | } | ||
271 | |||
272 | struct exception_table_entry | ||
273 | { | ||
274 | unsigned long insn, fixup; | ||
275 | }; | ||
276 | |||
277 | #ifdef CONFIG_MMU | ||
278 | #define ARCH_HAS_SEARCH_EXTABLE | ||
279 | #endif | ||
280 | |||
281 | /* Returns 0 if exception not found and fixup.unit otherwise. */ | ||
282 | extern unsigned long search_exception_table(unsigned long addr); | ||
283 | extern const struct exception_table_entry *search_exception_tables (unsigned long addr); | ||
284 | |||
285 | #endif /* __ASM_SH_UACCESS_64_H */ | 79 | #endif /* __ASM_SH_UACCESS_64_H */ |
diff --git a/include/asm-sh/unistd.h b/include/asm-sh/unistd.h index 4b21f369c28c..65be656ead7d 100644 --- a/include/asm-sh/unistd.h +++ b/include/asm-sh/unistd.h | |||
@@ -1,5 +1,13 @@ | |||
1 | #ifdef CONFIG_SUPERH32 | 1 | #ifdef __KERNEL__ |
2 | # include "unistd_32.h" | 2 | # ifdef CONFIG_SUPERH32 |
3 | # include "unistd_32.h" | ||
4 | # else | ||
5 | # include "unistd_64.h" | ||
6 | # endif | ||
3 | #else | 7 | #else |
4 | # include "unistd_64.h" | 8 | # ifdef __SH5__ |
9 | # include "unistd_64.h" | ||
10 | # else | ||
11 | # include "unistd_32.h" | ||
12 | # endif | ||
5 | #endif | 13 | #endif |
diff --git a/include/asm-sh/unistd_32.h b/include/asm-sh/unistd_32.h index 0b07212ec659..d52c000cf924 100644 --- a/include/asm-sh/unistd_32.h +++ b/include/asm-sh/unistd_32.h | |||
@@ -335,8 +335,14 @@ | |||
335 | #define __NR_fallocate 324 | 335 | #define __NR_fallocate 324 |
336 | #define __NR_timerfd_settime 325 | 336 | #define __NR_timerfd_settime 325 |
337 | #define __NR_timerfd_gettime 326 | 337 | #define __NR_timerfd_gettime 326 |
338 | #define __NR_signalfd4 327 | ||
339 | #define __NR_eventfd2 328 | ||
340 | #define __NR_epoll_create1 329 | ||
341 | #define __NR_dup3 330 | ||
342 | #define __NR_pipe2 331 | ||
343 | #define __NR_inotify_init1 332 | ||
338 | 344 | ||
339 | #define NR_syscalls 327 | 345 | #define NR_syscalls 333 |
340 | 346 | ||
341 | #ifdef __KERNEL__ | 347 | #ifdef __KERNEL__ |
342 | 348 | ||
diff --git a/include/asm-sh/unistd_64.h b/include/asm-sh/unistd_64.h index 9d21eab52427..7c54e91753c1 100644 --- a/include/asm-sh/unistd_64.h +++ b/include/asm-sh/unistd_64.h | |||
@@ -375,10 +375,16 @@ | |||
375 | #define __NR_fallocate 352 | 375 | #define __NR_fallocate 352 |
376 | #define __NR_timerfd_settime 353 | 376 | #define __NR_timerfd_settime 353 |
377 | #define __NR_timerfd_gettime 354 | 377 | #define __NR_timerfd_gettime 354 |
378 | #define __NR_signalfd4 355 | ||
379 | #define __NR_eventfd2 356 | ||
380 | #define __NR_epoll_create1 357 | ||
381 | #define __NR_dup3 358 | ||
382 | #define __NR_pipe2 359 | ||
383 | #define __NR_inotify_init1 360 | ||
378 | 384 | ||
379 | #ifdef __KERNEL__ | 385 | #ifdef __KERNEL__ |
380 | 386 | ||
381 | #define NR_syscalls 353 | 387 | #define NR_syscalls 361 |
382 | 388 | ||
383 | #define __ARCH_WANT_IPC_PARSE_VERSION | 389 | #define __ARCH_WANT_IPC_PARSE_VERSION |
384 | #define __ARCH_WANT_OLD_READDIR | 390 | #define __ARCH_WANT_OLD_READDIR |