aboutsummaryrefslogtreecommitdiffstats
path: root/arch/parisc/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 00:13:26 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 00:13:26 -0500
commit5f32ed140dac726e880d292988ba20d16f545bda (patch)
treef08589f9489a05eb7a0b7f855ab96c57b0561cde /arch/parisc/include
parentc68fea3464cbe4f3e1382f9f74a7c04cdbfb92ad (diff)
parent1dda59b4f3d03fa28d86f3ea235655f0f96aab3e (diff)
Merge branch 'parisc-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc updates from Helge Deller. The bulk of this is optimized page coping/clearing and cache flushing (virtual caches are lovely) by John David Anglin. * 'parisc-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: (31 commits) arch/parisc/include/asm: use ARRAY_SIZE macro in mmzone.h parisc: remove empty lines and unnecessary #ifdef coding in include/asm/signal.h parisc: sendfile and sendfile64 syscall cleanups parisc: switch to available compat_sched_rr_get_interval implementation parisc: fix fallocate syscall parisc: fix error return codes for rt_sigaction and rt_sigprocmask parisc: convert msgrcv and msgsnd syscalls to use compat layer parisc: correctly wire up mq_* functions for CONFIG_COMPAT case parisc: fix personality on 32bit kernel parisc: wire up process_vm_readv, process_vm_writev, kcmp and finit_module syscalls parisc: led driver requires CONFIG_VM_EVENT_COUNTERS parisc: remove unused compat_rt_sigframe.h header parisc/mm/fault.c: Port OOM changes to do_page_fault parisc: space register variables need to be in native length (unsigned long) parisc: fix ptrace breakage parisc: always detect multiple physical ranges parisc: ensure that mmapped shared pages are aligned at SHMLBA addresses parisc: disable preemption while flushing D- or I-caches through TMPALIAS region parisc: remove IRQF_DISABLED parisc: fixes and cleanups in page cache flushing (4/4) ...
Diffstat (limited to 'arch/parisc/include')
-rw-r--r--arch/parisc/include/asm/cacheflush.h2
-rw-r--r--arch/parisc/include/asm/compat.h61
-rw-r--r--arch/parisc/include/asm/compat_rt_sigframe.h50
-rw-r--r--arch/parisc/include/asm/elf.h2
-rw-r--r--arch/parisc/include/asm/floppy.h4
-rw-r--r--arch/parisc/include/asm/mmzone.h7
-rw-r--r--arch/parisc/include/asm/page.h20
-rw-r--r--arch/parisc/include/asm/pgtable.h13
-rw-r--r--arch/parisc/include/asm/signal.h4
-rw-r--r--arch/parisc/include/asm/unistd.h2
-rw-r--r--arch/parisc/include/uapi/asm/unistd.h6
11 files changed, 102 insertions, 69 deletions
diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h
index 9f21ab0c02e3..79f694f3ad9b 100644
--- a/arch/parisc/include/asm/cacheflush.h
+++ b/arch/parisc/include/asm/cacheflush.h
@@ -115,7 +115,9 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma
115{ 115{
116 if (PageAnon(page)) { 116 if (PageAnon(page)) {
117 flush_tlb_page(vma, vmaddr); 117 flush_tlb_page(vma, vmaddr);
118 preempt_disable();
118 flush_dcache_page_asm(page_to_phys(page), vmaddr); 119 flush_dcache_page_asm(page_to_phys(page), vmaddr);
120 preempt_enable();
119 } 121 }
120} 122}
121 123
diff --git a/arch/parisc/include/asm/compat.h b/arch/parisc/include/asm/compat.h
index db7a662691a8..94710cfc1ce8 100644
--- a/arch/parisc/include/asm/compat.h
+++ b/arch/parisc/include/asm/compat.h
@@ -28,6 +28,7 @@ typedef u16 compat_nlink_t;
28typedef u16 compat_ipc_pid_t; 28typedef u16 compat_ipc_pid_t;
29typedef s32 compat_daddr_t; 29typedef s32 compat_daddr_t;
30typedef u32 compat_caddr_t; 30typedef u32 compat_caddr_t;
31typedef s32 compat_key_t;
31typedef s32 compat_timer_t; 32typedef s32 compat_timer_t;
32 33
33typedef s32 compat_int_t; 34typedef s32 compat_int_t;
@@ -188,6 +189,66 @@ typedef struct compat_siginfo {
188#define COMPAT_OFF_T_MAX 0x7fffffff 189#define COMPAT_OFF_T_MAX 0x7fffffff
189#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 190#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL
190 191
192struct compat_ipc64_perm {
193 compat_key_t key;
194 __compat_uid_t uid;
195 __compat_gid_t gid;
196 __compat_uid_t cuid;
197 __compat_gid_t cgid;
198 unsigned short int __pad1;
199 compat_mode_t mode;
200 unsigned short int __pad2;
201 unsigned short int seq;
202 unsigned int __pad3;
203 unsigned long __unused1; /* yes they really are 64bit pads */
204 unsigned long __unused2;
205};
206
207struct compat_semid64_ds {
208 struct compat_ipc64_perm sem_perm;
209 compat_time_t sem_otime;
210 unsigned int __unused1;
211 compat_time_t sem_ctime;
212 unsigned int __unused2;
213 compat_ulong_t sem_nsems;
214 compat_ulong_t __unused3;
215 compat_ulong_t __unused4;
216};
217
218struct compat_msqid64_ds {
219 struct compat_ipc64_perm msg_perm;
220 unsigned int __unused1;
221 compat_time_t msg_stime;
222 unsigned int __unused2;
223 compat_time_t msg_rtime;
224 unsigned int __unused3;
225 compat_time_t msg_ctime;
226 compat_ulong_t msg_cbytes;
227 compat_ulong_t msg_qnum;
228 compat_ulong_t msg_qbytes;
229 compat_pid_t msg_lspid;
230 compat_pid_t msg_lrpid;
231 compat_ulong_t __unused4;
232 compat_ulong_t __unused5;
233};
234
235struct compat_shmid64_ds {
236 struct compat_ipc64_perm shm_perm;
237 unsigned int __unused1;
238 compat_time_t shm_atime;
239 unsigned int __unused2;
240 compat_time_t shm_dtime;
241 unsigned int __unused3;
242 compat_time_t shm_ctime;
243 unsigned int __unused4;
244 compat_size_t shm_segsz;
245 compat_pid_t shm_cpid;
246 compat_pid_t shm_lpid;
247 compat_ulong_t shm_nattch;
248 compat_ulong_t __unused5;
249 compat_ulong_t __unused6;
250};
251
191/* 252/*
192 * A pointer passed in from user mode. This should not 253 * A pointer passed in from user mode. This should not
193 * be used for syscall parameters, just declare them 254 * be used for syscall parameters, just declare them
diff --git a/arch/parisc/include/asm/compat_rt_sigframe.h b/arch/parisc/include/asm/compat_rt_sigframe.h
deleted file mode 100644
index b3f95a7f18b4..000000000000
--- a/arch/parisc/include/asm/compat_rt_sigframe.h
+++ /dev/null
@@ -1,50 +0,0 @@
1#include <linux/compat.h>
2#include <linux/compat_siginfo.h>
3#include <asm/compat_ucontext.h>
4
5#ifndef _ASM_PARISC_COMPAT_RT_SIGFRAME_H
6#define _ASM_PARISC_COMPAT_RT_SIGFRAME_H
7
8/* In a deft move of uber-hackery, we decide to carry the top half of all
9 * 64-bit registers in a non-portable, non-ABI, hidden structure.
10 * Userspace can read the hidden structure if it *wants* but is never
11 * guaranteed to be in the same place. Infact the uc_sigmask from the
12 * ucontext_t structure may push the hidden register file downards
13 */
14struct compat_regfile {
15 /* Upper half of all the 64-bit registers that were truncated
16 on a copy to a 32-bit userspace */
17 compat_int_t rf_gr[32];
18 compat_int_t rf_iasq[2];
19 compat_int_t rf_iaoq[2];
20 compat_int_t rf_sar;
21};
22
23#define COMPAT_SIGRETURN_TRAMP 4
24#define COMPAT_SIGRESTARTBLOCK_TRAMP 5
25#define COMPAT_TRAMP_SIZE (COMPAT_SIGRETURN_TRAMP + COMPAT_SIGRESTARTBLOCK_TRAMP)
26
27struct compat_rt_sigframe {
28 /* XXX: Must match trampoline size in arch/parisc/kernel/signal.c
29 Secondary to that it must protect the ERESTART_RESTARTBLOCK
30 trampoline we left on the stack (we were bad and didn't
31 change sp so we could run really fast.) */
32 compat_uint_t tramp[COMPAT_TRAMP_SIZE];
33 compat_siginfo_t info;
34 struct compat_ucontext uc;
35 /* Hidden location of truncated registers, *must* be last. */
36 struct compat_regfile regs;
37};
38
39/*
40 * The 32-bit ABI wants at least 48 bytes for a function call frame:
41 * 16 bytes for arg0-arg3, and 32 bytes for magic (the only part of
42 * which Linux/parisc uses is sp-20 for the saved return pointer...)
43 * Then, the stack pointer must be rounded to a cache line (64 bytes).
44 */
45#define SIGFRAME32 64
46#define FUNCTIONCALLFRAME32 48
47#define PARISC_RT_SIGFRAME_SIZE32 \
48 (((sizeof(struct compat_rt_sigframe) + FUNCTIONCALLFRAME32) + SIGFRAME32) & -SIGFRAME32)
49
50#endif
diff --git a/arch/parisc/include/asm/elf.h b/arch/parisc/include/asm/elf.h
index 19f6cb1a4a1c..ad2b50397894 100644
--- a/arch/parisc/include/asm/elf.h
+++ b/arch/parisc/include/asm/elf.h
@@ -247,7 +247,7 @@ typedef unsigned long elf_greg_t;
247#define ELF_PLATFORM ("PARISC\0") 247#define ELF_PLATFORM ("PARISC\0")
248 248
249#define SET_PERSONALITY(ex) \ 249#define SET_PERSONALITY(ex) \
250 current->personality = PER_LINUX; \ 250 set_personality((current->personality & ~PER_MASK) | PER_LINUX); \
251 current->thread.map_base = DEFAULT_MAP_BASE; \ 251 current->thread.map_base = DEFAULT_MAP_BASE; \
252 current->thread.task_size = DEFAULT_TASK_SIZE \ 252 current->thread.task_size = DEFAULT_TASK_SIZE \
253 253
diff --git a/arch/parisc/include/asm/floppy.h b/arch/parisc/include/asm/floppy.h
index 4ca69f558fae..f84ff12574b7 100644
--- a/arch/parisc/include/asm/floppy.h
+++ b/arch/parisc/include/asm/floppy.h
@@ -157,10 +157,10 @@ static int fd_request_irq(void)
157{ 157{
158 if(can_use_virtual_dma) 158 if(can_use_virtual_dma)
159 return request_irq(FLOPPY_IRQ, floppy_hardint, 159 return request_irq(FLOPPY_IRQ, floppy_hardint,
160 IRQF_DISABLED, "floppy", NULL); 160 0, "floppy", NULL);
161 else 161 else
162 return request_irq(FLOPPY_IRQ, floppy_interrupt, 162 return request_irq(FLOPPY_IRQ, floppy_interrupt,
163 IRQF_DISABLED, "floppy", NULL); 163 0, "floppy", NULL);
164} 164}
165 165
166static unsigned long dma_mem_alloc(unsigned long size) 166static unsigned long dma_mem_alloc(unsigned long size)
diff --git a/arch/parisc/include/asm/mmzone.h b/arch/parisc/include/asm/mmzone.h
index e67eb9c3d1bf..0e625ab9aaec 100644
--- a/arch/parisc/include/asm/mmzone.h
+++ b/arch/parisc/include/asm/mmzone.h
@@ -1,9 +1,10 @@
1#ifndef _PARISC_MMZONE_H 1#ifndef _PARISC_MMZONE_H
2#define _PARISC_MMZONE_H 2#define _PARISC_MMZONE_H
3 3
4#define MAX_PHYSMEM_RANGES 8 /* Fix the size for now (current known max is 3) */
5
4#ifdef CONFIG_DISCONTIGMEM 6#ifdef CONFIG_DISCONTIGMEM
5 7
6#define MAX_PHYSMEM_RANGES 8 /* Fix the size for now (current known max is 3) */
7extern int npmem_ranges; 8extern int npmem_ranges;
8 9
9struct node_map_data { 10struct node_map_data {
@@ -44,7 +45,7 @@ static inline int pfn_to_nid(unsigned long pfn)
44 return 0; 45 return 0;
45 46
46 i = pfn >> PFNNID_SHIFT; 47 i = pfn >> PFNNID_SHIFT;
47 BUG_ON(i >= sizeof(pfnnid_map) / sizeof(pfnnid_map[0])); 48 BUG_ON(i >= ARRAY_SIZE(pfnnid_map));
48 r = pfnnid_map[i]; 49 r = pfnnid_map[i];
49 BUG_ON(r == 0xff); 50 BUG_ON(r == 0xff);
50 51
@@ -60,7 +61,5 @@ static inline int pfn_valid(int pfn)
60 return 0; 61 return 0;
61} 62}
62 63
63#else /* !CONFIG_DISCONTIGMEM */
64#define MAX_PHYSMEM_RANGES 1
65#endif 64#endif
66#endif /* _PARISC_MMZONE_H */ 65#endif /* _PARISC_MMZONE_H */
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
index 4e0e7dbf0f3f..b7adb2ac049c 100644
--- a/arch/parisc/include/asm/page.h
+++ b/arch/parisc/include/asm/page.h
@@ -21,15 +21,27 @@
21#include <asm/types.h> 21#include <asm/types.h>
22#include <asm/cache.h> 22#include <asm/cache.h>
23 23
24#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 24#define clear_page(page) clear_page_asm((void *)(page))
25#define copy_page(to,from) copy_user_page_asm((void *)(to), (void *)(from)) 25#define copy_page(to, from) copy_page_asm((void *)(to), (void *)(from))
26 26
27struct page; 27struct page;
28 28
29void copy_user_page_asm(void *to, void *from); 29void clear_page_asm(void *page);
30void copy_page_asm(void *to, void *from);
31void clear_user_page(void *vto, unsigned long vaddr, struct page *pg);
30void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, 32void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
31 struct page *pg); 33 struct page *pg);
32void clear_user_page(void *page, unsigned long vaddr, struct page *pg); 34
35/* #define CONFIG_PARISC_TMPALIAS */
36
37#ifdef CONFIG_PARISC_TMPALIAS
38void clear_user_highpage(struct page *page, unsigned long vaddr);
39#define clear_user_highpage clear_user_highpage
40struct vm_area_struct;
41void copy_user_highpage(struct page *to, struct page *from,
42 unsigned long vaddr, struct vm_area_struct *vma);
43#define __HAVE_ARCH_COPY_USER_HIGHPAGE
44#endif
33 45
34/* 46/*
35 * These are used to make use of C type-checking.. 47 * These are used to make use of C type-checking..
diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h
index ee99f2339356..7df49fad29f9 100644
--- a/arch/parisc/include/asm/pgtable.h
+++ b/arch/parisc/include/asm/pgtable.h
@@ -12,11 +12,10 @@
12 12
13#include <linux/bitops.h> 13#include <linux/bitops.h>
14#include <linux/spinlock.h> 14#include <linux/spinlock.h>
15#include <linux/mm_types.h>
15#include <asm/processor.h> 16#include <asm/processor.h>
16#include <asm/cache.h> 17#include <asm/cache.h>
17 18
18struct vm_area_struct;
19
20/* 19/*
21 * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel 20 * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel
22 * memory. For the return value to be meaningful, ADDR must be >= 21 * memory. For the return value to be meaningful, ADDR must be >=
@@ -40,7 +39,14 @@ struct vm_area_struct;
40 do{ \ 39 do{ \
41 *(pteptr) = (pteval); \ 40 *(pteptr) = (pteval); \
42 } while(0) 41 } while(0)
43#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) 42
43extern void purge_tlb_entries(struct mm_struct *, unsigned long);
44
45#define set_pte_at(mm, addr, ptep, pteval) \
46 do { \
47 set_pte(ptep, pteval); \
48 purge_tlb_entries(mm, addr); \
49 } while (0)
44 50
45#endif /* !__ASSEMBLY__ */ 51#endif /* !__ASSEMBLY__ */
46 52
@@ -466,6 +472,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
466 old = pte_val(*ptep); 472 old = pte_val(*ptep);
467 new = pte_val(pte_wrprotect(__pte (old))); 473 new = pte_val(pte_wrprotect(__pte (old)));
468 } while (cmpxchg((unsigned long *) ptep, old, new) != old); 474 } while (cmpxchg((unsigned long *) ptep, old, new) != old);
475 purge_tlb_entries(mm, addr);
469#else 476#else
470 pte_t old_pte = *ptep; 477 pte_t old_pte = *ptep;
471 set_pte_at(mm, addr, ptep, pte_wrprotect(old_pte)); 478 set_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
diff --git a/arch/parisc/include/asm/signal.h b/arch/parisc/include/asm/signal.h
index 0fdb3c835952..b1a7c4c4a53a 100644
--- a/arch/parisc/include/asm/signal.h
+++ b/arch/parisc/include/asm/signal.h
@@ -3,16 +3,12 @@
3 3
4#include <uapi/asm/signal.h> 4#include <uapi/asm/signal.h>
5 5
6
7#define _NSIG 64 6#define _NSIG 64
8/* bits-per-word, where word apparently means 'long' not 'int' */ 7/* bits-per-word, where word apparently means 'long' not 'int' */
9#define _NSIG_BPW BITS_PER_LONG 8#define _NSIG_BPW BITS_PER_LONG
10#define _NSIG_WORDS (_NSIG / _NSIG_BPW) 9#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
11 10
12# ifndef __ASSEMBLY__ 11# ifndef __ASSEMBLY__
13#ifdef CONFIG_64BIT
14#else
15#endif
16 12
17/* Most things should be clean enough to redefine this at will, if care 13/* Most things should be clean enough to redefine this at will, if care
18 is taken to make libc match. */ 14 is taken to make libc match. */
diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h
index 3043194547cd..74f801ebbe77 100644
--- a/arch/parisc/include/asm/unistd.h
+++ b/arch/parisc/include/asm/unistd.h
@@ -149,6 +149,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
149#define __ARCH_WANT_SYS_SIGNAL 149#define __ARCH_WANT_SYS_SIGNAL
150#define __ARCH_WANT_SYS_TIME 150#define __ARCH_WANT_SYS_TIME
151#define __ARCH_WANT_COMPAT_SYS_TIME 151#define __ARCH_WANT_COMPAT_SYS_TIME
152#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
152#define __ARCH_WANT_SYS_UTIME 153#define __ARCH_WANT_SYS_UTIME
153#define __ARCH_WANT_SYS_WAITPID 154#define __ARCH_WANT_SYS_WAITPID
154#define __ARCH_WANT_SYS_SOCKETCALL 155#define __ARCH_WANT_SYS_SOCKETCALL
@@ -166,6 +167,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
166#define __ARCH_WANT_SYS_FORK 167#define __ARCH_WANT_SYS_FORK
167#define __ARCH_WANT_SYS_VFORK 168#define __ARCH_WANT_SYS_VFORK
168#define __ARCH_WANT_SYS_CLONE 169#define __ARCH_WANT_SYS_CLONE
170#define __ARCH_WANT_COMPAT_SYS_SENDFILE
169 171
170#endif /* __ASSEMBLY__ */ 172#endif /* __ASSEMBLY__ */
171 173
diff --git a/arch/parisc/include/uapi/asm/unistd.h b/arch/parisc/include/uapi/asm/unistd.h
index e178f30f2ccc..2c8b9bde18eb 100644
--- a/arch/parisc/include/uapi/asm/unistd.h
+++ b/arch/parisc/include/uapi/asm/unistd.h
@@ -822,8 +822,12 @@
822#define __NR_syncfs (__NR_Linux + 327) 822#define __NR_syncfs (__NR_Linux + 327)
823#define __NR_setns (__NR_Linux + 328) 823#define __NR_setns (__NR_Linux + 328)
824#define __NR_sendmmsg (__NR_Linux + 329) 824#define __NR_sendmmsg (__NR_Linux + 329)
825#define __NR_process_vm_readv (__NR_Linux + 330)
826#define __NR_process_vm_writev (__NR_Linux + 331)
827#define __NR_kcmp (__NR_Linux + 332)
828#define __NR_finit_module (__NR_Linux + 333)
825 829
826#define __NR_Linux_syscalls (__NR_sendmmsg + 1) 830#define __NR_Linux_syscalls (__NR_finit_module + 1)
827 831
828 832
829#define __IGNORE_select /* newselect */ 833#define __IGNORE_select /* newselect */