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 |
