diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-26 15:48:06 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-26 15:48:06 -0500 |
| commit | b0138a6cb7923a997d278b47c176778534d1095b (patch) | |
| tree | 4fcb8822a69631baba568e4e1942847747123887 /arch | |
| parent | 6572d6d7d0f965dda19d02af804ed3ae4b3bf1fc (diff) | |
| parent | 1055a8af093fea7490445bd15cd671020e542035 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6: (78 commits)
[PARISC] Use symbolic last syscall in __NR_Linux_syscalls
[PARISC] Add missing statfs64 and fstatfs64 syscalls
Revert "[PARISC] Optimize TLB flush on SMP systems"
[PARISC] Compat signal fixes for 64-bit parisc
[PARISC] Reorder syscalls to match unistd.h
Revert "[PATCH] make kernel/signal.c:kill_proc_info() static"
[PARISC] fix sys_rt_sigqueueinfo
[PARISC] fix section mismatch warnings in harmony sound driver
[PARISC] do not export get_register/set_register
[PARISC] add ENTRY()/ENDPROC() and simplify assembly of HP/UX emulation code
[PARISC] convert to use CONFIG_64BIT instead of __LP64__
[PARISC] use CONFIG_64BIT instead of __LP64__
[PARISC] add ASM_EXCEPTIONTABLE_ENTRY() macro
[PARISC] more ENTRY(), ENDPROC(), END() conversions
[PARISC] fix ENTRY() and ENDPROC() for 64bit-parisc
[PARISC] Fixes /proc/cpuinfo cache output on B160L
[PARISC] implement standard ENTRY(), END() and ENDPROC()
[PARISC] kill ENTRY_SYS_CPUS
[PARISC] clean up debugging printks in smp.c
[PARISC] factor syscall_restart code out of do_signal
...
Fix conflict in include/linux/sched.h due to kill_proc_info() being made
publicly available to PARISC again.
Diffstat (limited to 'arch')
46 files changed, 957 insertions, 1270 deletions
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 28da4e71c443..3d73545e8c48 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
| @@ -37,6 +37,11 @@ config GENERIC_FIND_NEXT_BIT | |||
| 37 | bool | 37 | bool |
| 38 | default y | 38 | default y |
| 39 | 39 | ||
| 40 | config GENERIC_BUG | ||
| 41 | bool | ||
| 42 | default y | ||
| 43 | depends on BUG | ||
| 44 | |||
| 40 | config GENERIC_HWEIGHT | 45 | config GENERIC_HWEIGHT |
| 41 | bool | 46 | bool |
| 42 | default y | 47 | default y |
| @@ -45,6 +50,10 @@ config GENERIC_CALIBRATE_DELAY | |||
| 45 | bool | 50 | bool |
| 46 | default y | 51 | default y |
| 47 | 52 | ||
| 53 | config GENERIC_TIME | ||
| 54 | bool | ||
| 55 | default y | ||
| 56 | |||
| 48 | config TIME_LOW_RES | 57 | config TIME_LOW_RES |
| 49 | bool | 58 | bool |
| 50 | depends on SMP | 59 | depends on SMP |
diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile index 9b7e42490dd1..760567a9ba16 100644 --- a/arch/parisc/Makefile +++ b/arch/parisc/Makefile | |||
| @@ -35,12 +35,8 @@ FINAL_LD=$(CROSS_COMPILE)ld --warn-common --warn-section-align | |||
| 35 | 35 | ||
| 36 | OBJCOPY_FLAGS =-O binary -R .note -R .comment -S | 36 | OBJCOPY_FLAGS =-O binary -R .note -R .comment -S |
| 37 | 37 | ||
| 38 | GCC_VERSION := $(call cc-version) | 38 | ifneq ($(call cc-ifversion, -lt, 0303, "bad"),) |
| 39 | ifneq ($(shell if [ -z $(GCC_VERSION) ] ; then echo "bad"; fi ;),) | 39 | $(error Sorry, GCC v3.3 or above is required.) |
| 40 | $(error Sorry, couldn't find ($(cc-version)).) | ||
| 41 | endif | ||
| 42 | ifneq ($(shell if [ $(GCC_VERSION) -lt 0303 ] ; then echo "bad"; fi ;),) | ||
| 43 | $(error Sorry, your compiler is too old ($(GCC_VERSION)). GCC v3.3 or above is required.) | ||
| 44 | endif | 40 | endif |
| 45 | 41 | ||
| 46 | cflags-y := -pipe | 42 | cflags-y := -pipe |
diff --git a/arch/parisc/hpux/entry_hpux.S b/arch/parisc/hpux/entry_hpux.S index 31c8cccfba31..d15a413572f0 100644 --- a/arch/parisc/hpux/entry_hpux.S +++ b/arch/parisc/hpux/entry_hpux.S | |||
| @@ -18,17 +18,16 @@ | |||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | */ | 19 | */ |
| 20 | 20 | ||
| 21 | #include <asm/unistd.h> | ||
| 22 | #include <asm/assembly.h> | ||
| 21 | #include <linux/sys.h> | 23 | #include <linux/sys.h> |
| 22 | #include <linux/linkage.h> | 24 | #include <linux/linkage.h> |
| 23 | #include <asm/unistd.h> | ||
| 24 | 25 | ||
| 25 | #define ENTRY_NAME(_name_) .word _name_ | 26 | #define ENTRY_NAME(_name_) ASM_ULONG_INSN _name_ |
| 26 | 27 | ||
| 27 | .section .rodata,"a" | 28 | .section .rodata,"a" |
| 28 | .align 4 | ||
| 29 | .export hpux_call_table | ||
| 30 | .import hpux_unimplemented_wrapper | 29 | .import hpux_unimplemented_wrapper |
| 31 | hpux_call_table: | 30 | ENTRY(hpux_call_table) |
| 32 | ENTRY_NAME(sys_ni_syscall) /* 0 */ | 31 | ENTRY_NAME(sys_ni_syscall) /* 0 */ |
| 33 | ENTRY_NAME(sys_exit) | 32 | ENTRY_NAME(sys_exit) |
| 34 | ENTRY_NAME(hpux_fork_wrapper) | 33 | ENTRY_NAME(hpux_fork_wrapper) |
| @@ -542,5 +541,6 @@ hpux_call_table: | |||
| 542 | ENTRY_NAME(hpux_unimplemented_wrapper) /* 510 */ | 541 | ENTRY_NAME(hpux_unimplemented_wrapper) /* 510 */ |
| 543 | ENTRY_NAME(hpux_unimplemented_wrapper) | 542 | ENTRY_NAME(hpux_unimplemented_wrapper) |
| 544 | ENTRY_NAME(hpux_unimplemented_wrapper) | 543 | ENTRY_NAME(hpux_unimplemented_wrapper) |
| 544 | END(hpux_call_table) | ||
| 545 | .end | 545 | .end |
| 546 | 546 | ||
diff --git a/arch/parisc/hpux/fs.c b/arch/parisc/hpux/fs.c index 4204cd1f3cf9..c7a81a2c014c 100644 --- a/arch/parisc/hpux/fs.c +++ b/arch/parisc/hpux/fs.c | |||
| @@ -35,13 +35,13 @@ int hpux_execve(struct pt_regs *regs) | |||
| 35 | int error; | 35 | int error; |
| 36 | char *filename; | 36 | char *filename; |
| 37 | 37 | ||
| 38 | filename = getname((char *) regs->gr[26]); | 38 | filename = getname((char __user *) regs->gr[26]); |
| 39 | error = PTR_ERR(filename); | 39 | error = PTR_ERR(filename); |
| 40 | if (IS_ERR(filename)) | 40 | if (IS_ERR(filename)) |
| 41 | goto out; | 41 | goto out; |
| 42 | 42 | ||
| 43 | error = do_execve(filename, (char **) regs->gr[25], | 43 | error = do_execve(filename, (char __user * __user *) regs->gr[25], |
| 44 | (char **)regs->gr[24], regs); | 44 | (char __user * __user *) regs->gr[24], regs); |
| 45 | 45 | ||
| 46 | if (error == 0) { | 46 | if (error == 0) { |
| 47 | task_lock(current); | 47 | task_lock(current); |
| @@ -63,19 +63,19 @@ struct hpux_dirent { | |||
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | struct getdents_callback { | 65 | struct getdents_callback { |
| 66 | struct hpux_dirent *current_dir; | 66 | struct hpux_dirent __user *current_dir; |
| 67 | struct hpux_dirent *previous; | 67 | struct hpux_dirent __user *previous; |
| 68 | int count; | 68 | int count; |
| 69 | int error; | 69 | int error; |
| 70 | }; | 70 | }; |
| 71 | 71 | ||
| 72 | #define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de))) | 72 | #define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de))) |
| 73 | #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1)) | 73 | #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1)) |
| 74 | 74 | ||
| 75 | static int filldir(void * __buf, const char * name, int namlen, loff_t offset, | 75 | static int filldir(void * __buf, const char * name, int namlen, loff_t offset, |
| 76 | u64 ino, unsigned d_type) | 76 | u64 ino, unsigned d_type) |
| 77 | { | 77 | { |
| 78 | struct hpux_dirent * dirent; | 78 | struct hpux_dirent __user * dirent; |
| 79 | struct getdents_callback * buf = (struct getdents_callback *) __buf; | 79 | struct getdents_callback * buf = (struct getdents_callback *) __buf; |
| 80 | ino_t d_ino; | 80 | ino_t d_ino; |
| 81 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); | 81 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); |
| @@ -105,10 +105,10 @@ static int filldir(void * __buf, const char * name, int namlen, loff_t offset, | |||
| 105 | #undef NAME_OFFSET | 105 | #undef NAME_OFFSET |
| 106 | #undef ROUND_UP | 106 | #undef ROUND_UP |
| 107 | 107 | ||
| 108 | int hpux_getdents(unsigned int fd, struct hpux_dirent *dirent, unsigned int count) | 108 | int hpux_getdents(unsigned int fd, struct hpux_dirent __user *dirent, unsigned int count) |
| 109 | { | 109 | { |
| 110 | struct file * file; | 110 | struct file * file; |
| 111 | struct hpux_dirent * lastdirent; | 111 | struct hpux_dirent __user * lastdirent; |
| 112 | struct getdents_callback buf; | 112 | struct getdents_callback buf; |
| 113 | int error = -EBADF; | 113 | int error = -EBADF; |
| 114 | 114 | ||
| @@ -143,7 +143,7 @@ int hpux_mount(const char *fs, const char *path, int mflag, | |||
| 143 | return -ENOSYS; | 143 | return -ENOSYS; |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | static int cp_hpux_stat(struct kstat *stat, struct hpux_stat64 *statbuf) | 146 | static int cp_hpux_stat(struct kstat *stat, struct hpux_stat64 __user *statbuf) |
| 147 | { | 147 | { |
| 148 | struct hpux_stat64 tmp; | 148 | struct hpux_stat64 tmp; |
| 149 | 149 | ||
| @@ -169,7 +169,7 @@ static int cp_hpux_stat(struct kstat *stat, struct hpux_stat64 *statbuf) | |||
| 169 | return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; | 169 | return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | long hpux_stat64(char *filename, struct hpux_stat64 *statbuf) | 172 | long hpux_stat64(char __user *filename, struct hpux_stat64 __user *statbuf) |
| 173 | { | 173 | { |
| 174 | struct kstat stat; | 174 | struct kstat stat; |
| 175 | int error = vfs_stat(filename, &stat); | 175 | int error = vfs_stat(filename, &stat); |
| @@ -180,7 +180,7 @@ long hpux_stat64(char *filename, struct hpux_stat64 *statbuf) | |||
| 180 | return error; | 180 | return error; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | long hpux_fstat64(unsigned int fd, struct hpux_stat64 *statbuf) | 183 | long hpux_fstat64(unsigned int fd, struct hpux_stat64 __user *statbuf) |
| 184 | { | 184 | { |
| 185 | struct kstat stat; | 185 | struct kstat stat; |
| 186 | int error = vfs_fstat(fd, &stat); | 186 | int error = vfs_fstat(fd, &stat); |
| @@ -191,7 +191,7 @@ long hpux_fstat64(unsigned int fd, struct hpux_stat64 *statbuf) | |||
| 191 | return error; | 191 | return error; |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | long hpux_lstat64(char *filename, struct hpux_stat64 *statbuf) | 194 | long hpux_lstat64(char __user *filename, struct hpux_stat64 __user *statbuf) |
| 195 | { | 195 | { |
| 196 | struct kstat stat; | 196 | struct kstat stat; |
| 197 | int error = vfs_lstat(filename, &stat); | 197 | int error = vfs_lstat(filename, &stat); |
diff --git a/arch/parisc/hpux/gate.S b/arch/parisc/hpux/gate.S index aaaf3306c05a..0b9d5b1e4b37 100644 --- a/arch/parisc/hpux/gate.S +++ b/arch/parisc/hpux/gate.S | |||
| @@ -12,27 +12,18 @@ | |||
| 12 | #include <asm/asm-offsets.h> | 12 | #include <asm/asm-offsets.h> |
| 13 | #include <asm/unistd.h> | 13 | #include <asm/unistd.h> |
| 14 | #include <asm/errno.h> | 14 | #include <asm/errno.h> |
| 15 | #include <linux/linkage.h> | ||
| 15 | 16 | ||
| 16 | #ifdef __LP64__ | 17 | .level LEVEL |
| 17 | .level 2.0w | ||
| 18 | #else | ||
| 19 | .level 1.1 | ||
| 20 | #endif | ||
| 21 | .text | 18 | .text |
| 22 | 19 | ||
| 23 | #ifdef __LP64__ | ||
| 24 | #define FRAME_SIZE 128 | ||
| 25 | #else | ||
| 26 | #define FRAME_SIZE 64 | ||
| 27 | #endif | ||
| 28 | .import hpux_call_table | 20 | .import hpux_call_table |
| 29 | .import hpux_syscall_exit,code | 21 | .import hpux_syscall_exit,code |
| 30 | .export hpux_gateway_page | ||
| 31 | 22 | ||
| 32 | .align 4096 | 23 | .align 4096 |
| 33 | hpux_gateway_page: | 24 | ENTRY(hpux_gateway_page) |
| 34 | nop | 25 | nop |
| 35 | #ifdef __LP64__ | 26 | #ifdef CONFIG_64BIT |
| 36 | #warning NEEDS WORK for 64-bit | 27 | #warning NEEDS WORK for 64-bit |
| 37 | #endif | 28 | #endif |
| 38 | ldw -64(%r30), %r29 ;! 8th argument | 29 | ldw -64(%r30), %r29 ;! 8th argument |
| @@ -101,7 +92,7 @@ hpux_gateway_page: | |||
| 101 | ldo R%hpux_call_table(%r21), %r21 | 92 | ldo R%hpux_call_table(%r21), %r21 |
| 102 | comiclr,>>= __NR_HPUX_syscalls, %r22, %r0 | 93 | comiclr,>>= __NR_HPUX_syscalls, %r22, %r0 |
| 103 | b,n syscall_nosys | 94 | b,n syscall_nosys |
| 104 | ldwx,s %r22(%r21), %r21 | 95 | LDREGX %r22(%r21), %r21 |
| 105 | ldil L%hpux_syscall_exit,%r2 | 96 | ldil L%hpux_syscall_exit,%r2 |
| 106 | be 0(%sr7,%r21) | 97 | be 0(%sr7,%r21) |
| 107 | ldo R%hpux_syscall_exit(%r2),%r2 | 98 | ldo R%hpux_syscall_exit(%r2),%r2 |
| @@ -110,7 +101,7 @@ syscall_nosys: | |||
| 110 | ldil L%hpux_syscall_exit,%r1 | 101 | ldil L%hpux_syscall_exit,%r1 |
| 111 | be R%hpux_syscall_exit(%sr7,%r1) | 102 | be R%hpux_syscall_exit(%sr7,%r1) |
| 112 | ldo -ENOSYS(%r0),%r28 | 103 | ldo -ENOSYS(%r0),%r28 |
| 104 | ENDPROC(hpux_gateway_page) | ||
| 113 | 105 | ||
| 114 | .align 4096 | 106 | .align 4096 |
| 115 | .export end_hpux_gateway_page | 107 | ENTRY(end_hpux_gateway_page) |
| 116 | end_hpux_gateway_page: | ||
diff --git a/arch/parisc/hpux/sys_hpux.c b/arch/parisc/hpux/sys_hpux.c index 04c2ff444396..3e025df2dc86 100644 --- a/arch/parisc/hpux/sys_hpux.c +++ b/arch/parisc/hpux/sys_hpux.c | |||
| @@ -61,7 +61,7 @@ int hpux_ptrace(void) | |||
| 61 | return -ENOSYS; | 61 | return -ENOSYS; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | int hpux_wait(int *stat_loc) | 64 | int hpux_wait(int __user *stat_loc) |
| 65 | { | 65 | { |
| 66 | return sys_waitpid(-1, stat_loc, 0); | 66 | return sys_waitpid(-1, stat_loc, 0); |
| 67 | } | 67 | } |
| @@ -255,7 +255,7 @@ asmlinkage long hpux_fstatfs(unsigned int fd, struct hpux_statfs __user * buf) | |||
| 255 | /* TODO: Are these put_user calls OK? Should they pass an int? | 255 | /* TODO: Are these put_user calls OK? Should they pass an int? |
| 256 | * (I copied it from sys_i386.c like this.) | 256 | * (I copied it from sys_i386.c like this.) |
| 257 | */ | 257 | */ |
| 258 | static int hpux_uname(struct hpux_utsname *name) | 258 | static int hpux_uname(struct hpux_utsname __user *name) |
| 259 | { | 259 | { |
| 260 | int error; | 260 | int error; |
| 261 | 261 | ||
| @@ -300,14 +300,14 @@ static int hpux_uname(struct hpux_utsname *name) | |||
| 300 | /* Note: HP-UX just uses the old suser() function to check perms | 300 | /* Note: HP-UX just uses the old suser() function to check perms |
| 301 | * in this system call. We'll use capable(CAP_SYS_ADMIN). | 301 | * in this system call. We'll use capable(CAP_SYS_ADMIN). |
| 302 | */ | 302 | */ |
| 303 | int hpux_utssys(char *ubuf, int n, int type) | 303 | int hpux_utssys(char __user *ubuf, int n, int type) |
| 304 | { | 304 | { |
| 305 | int len; | 305 | int len; |
| 306 | int error; | 306 | int error; |
| 307 | switch( type ) { | 307 | switch( type ) { |
| 308 | case 0: | 308 | case 0: |
| 309 | /* uname(): */ | 309 | /* uname(): */ |
| 310 | return( hpux_uname( (struct hpux_utsname *)ubuf ) ); | 310 | return hpux_uname((struct hpux_utsname __user *)ubuf); |
| 311 | break ; | 311 | break ; |
| 312 | case 1: | 312 | case 1: |
| 313 | /* Obsolete (used to be umask().) */ | 313 | /* Obsolete (used to be umask().) */ |
| @@ -315,8 +315,9 @@ int hpux_utssys(char *ubuf, int n, int type) | |||
| 315 | break ; | 315 | break ; |
| 316 | case 2: | 316 | case 2: |
| 317 | /* ustat(): */ | 317 | /* ustat(): */ |
| 318 | return( hpux_ustat(new_decode_dev(n), (struct hpux_ustat *)ubuf) ); | 318 | return hpux_ustat(new_decode_dev(n), |
| 319 | break ; | 319 | (struct hpux_ustat __user *)ubuf); |
| 320 | break; | ||
| 320 | case 3: | 321 | case 3: |
| 321 | /* setuname(): | 322 | /* setuname(): |
| 322 | * | 323 | * |
| @@ -332,7 +333,7 @@ int hpux_utssys(char *ubuf, int n, int type) | |||
| 332 | return -EINVAL ; | 333 | return -EINVAL ; |
| 333 | /* Unlike Linux, HP-UX truncates it if n is too big: */ | 334 | /* Unlike Linux, HP-UX truncates it if n is too big: */ |
| 334 | len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ; | 335 | len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ; |
| 335 | return( sys_sethostname(ubuf, len) ); | 336 | return sys_sethostname(ubuf, len); |
| 336 | break ; | 337 | break ; |
| 337 | case 4: | 338 | case 4: |
| 338 | /* sethostname(): | 339 | /* sethostname(): |
| @@ -346,7 +347,7 @@ int hpux_utssys(char *ubuf, int n, int type) | |||
| 346 | return -EINVAL ; | 347 | return -EINVAL ; |
| 347 | /* Unlike Linux, HP-UX truncates it if n is too big: */ | 348 | /* Unlike Linux, HP-UX truncates it if n is too big: */ |
| 348 | len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ; | 349 | len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ; |
| 349 | return( sys_sethostname(ubuf, len) ); | 350 | return sys_sethostname(ubuf, len); |
| 350 | break ; | 351 | break ; |
| 351 | case 5: | 352 | case 5: |
| 352 | /* gethostname(): | 353 | /* gethostname(): |
| @@ -356,7 +357,7 @@ int hpux_utssys(char *ubuf, int n, int type) | |||
| 356 | /* Unlike Linux, HP-UX returns an error if n==0: */ | 357 | /* Unlike Linux, HP-UX returns an error if n==0: */ |
| 357 | if ( n <= 0 ) | 358 | if ( n <= 0 ) |
| 358 | return -EINVAL ; | 359 | return -EINVAL ; |
| 359 | return( sys_gethostname(ubuf, n) ); | 360 | return sys_gethostname(ubuf, n); |
| 360 | break ; | 361 | break ; |
| 361 | case 6: | 362 | case 6: |
| 362 | /* Supposedly called from setuname() in libc. | 363 | /* Supposedly called from setuname() in libc. |
| @@ -420,7 +421,7 @@ int hpux_utssys(char *ubuf, int n, int type) | |||
| 420 | } | 421 | } |
| 421 | } | 422 | } |
| 422 | 423 | ||
| 423 | int hpux_getdomainname(char *name, int len) | 424 | int hpux_getdomainname(char __user *name, int len) |
| 424 | { | 425 | { |
| 425 | int nlen; | 426 | int nlen; |
| 426 | int err = -EFAULT; | 427 | int err = -EFAULT; |
| @@ -471,17 +472,18 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2) | |||
| 471 | printk(KERN_DEBUG "hpux_sysfs called with arg1='%lx'\n", arg1); | 472 | printk(KERN_DEBUG "hpux_sysfs called with arg1='%lx'\n", arg1); |
| 472 | 473 | ||
| 473 | if ( opcode == 1 ) { /* GETFSIND */ | 474 | if ( opcode == 1 ) { /* GETFSIND */ |
| 474 | len = strlen_user((char *)arg1); | 475 | char __user *user_fsname = (char __user *)arg1; |
| 476 | len = strlen_user(user_fsname); | ||
| 475 | printk(KERN_DEBUG "len of arg1 = %d\n", len); | 477 | printk(KERN_DEBUG "len of arg1 = %d\n", len); |
| 476 | if (len == 0) | 478 | if (len == 0) |
| 477 | return 0; | 479 | return 0; |
| 478 | fsname = kmalloc(len, GFP_KERNEL); | 480 | fsname = kmalloc(len, GFP_KERNEL); |
| 479 | if ( !fsname ) { | 481 | if (!fsname) { |
| 480 | printk(KERN_DEBUG "failed to kmalloc fsname\n"); | 482 | printk(KERN_DEBUG "failed to kmalloc fsname\n"); |
| 481 | return 0; | 483 | return 0; |
| 482 | } | 484 | } |
| 483 | 485 | ||
| 484 | if ( copy_from_user(fsname, (char *)arg1, len) ) { | 486 | if (copy_from_user(fsname, user_fsname, len)) { |
| 485 | printk(KERN_DEBUG "failed to copy_from_user fsname\n"); | 487 | printk(KERN_DEBUG "failed to copy_from_user fsname\n"); |
| 486 | kfree(fsname); | 488 | kfree(fsname); |
| 487 | return 0; | 489 | return 0; |
| @@ -495,7 +497,7 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2) | |||
| 495 | fstype = 0; | 497 | fstype = 0; |
| 496 | } else { | 498 | } else { |
| 497 | fstype = 0; | 499 | fstype = 0; |
| 498 | }; | 500 | } |
| 499 | 501 | ||
| 500 | kfree(fsname); | 502 | kfree(fsname); |
| 501 | 503 | ||
| @@ -509,7 +511,7 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2) | |||
| 509 | 511 | ||
| 510 | 512 | ||
| 511 | /* Table of syscall names and handle for unimplemented routines */ | 513 | /* Table of syscall names and handle for unimplemented routines */ |
| 512 | static const char *syscall_names[] = { | 514 | static const char * const syscall_names[] = { |
| 513 | "nosys", /* 0 */ | 515 | "nosys", /* 0 */ |
| 514 | "exit", | 516 | "exit", |
| 515 | "fork", | 517 | "fork", |
diff --git a/arch/parisc/hpux/wrappers.S b/arch/parisc/hpux/wrappers.S index 0b0c3a66b1be..58c53c879c02 100644 --- a/arch/parisc/hpux/wrappers.S +++ b/arch/parisc/hpux/wrappers.S | |||
| @@ -20,19 +20,16 @@ | |||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | #ifdef __LP64__ | 23 | #ifdef CONFIG_64BIT |
| 24 | #warning PA64 support needs more work...did first cut | 24 | #warning PA64 support needs more work...did first cut |
| 25 | #endif | 25 | #endif |
| 26 | 26 | ||
| 27 | #include <asm/asm-offsets.h> | 27 | #include <asm/asm-offsets.h> |
| 28 | #include <asm/assembly.h> | 28 | #include <asm/assembly.h> |
| 29 | #include <asm/signal.h> | 29 | #include <asm/signal.h> |
| 30 | #include <linux/linkage.h> | ||
| 30 | 31 | ||
| 31 | #ifdef __LP64__ | 32 | .level LEVEL |
| 32 | .level 2.0w | ||
| 33 | #else | ||
| 34 | .level 1.1 | ||
| 35 | #endif | ||
| 36 | .text | 33 | .text |
| 37 | 34 | ||
| 38 | /* These should probably go in a header file somewhere. | 35 | /* These should probably go in a header file somewhere. |
| @@ -41,7 +38,7 @@ | |||
| 41 | * register save/restore macros. | 38 | * register save/restore macros. |
| 42 | */ | 39 | */ |
| 43 | .macro reg_save regs | 40 | .macro reg_save regs |
| 44 | #ifdef __LP64__ | 41 | #ifdef CONFIG_64BIT |
| 45 | #warning NEEDS WORK for 64-bit | 42 | #warning NEEDS WORK for 64-bit |
| 46 | #endif | 43 | #endif |
| 47 | STREG %r3, PT_GR3(\regs) | 44 | STREG %r3, PT_GR3(\regs) |
| @@ -82,11 +79,9 @@ | |||
| 82 | .endm | 79 | .endm |
| 83 | 80 | ||
| 84 | 81 | ||
| 85 | .export hpux_fork_wrapper | ||
| 86 | .export hpux_child_return | ||
| 87 | .import sys_fork | 82 | .import sys_fork |
| 88 | 83 | ||
| 89 | hpux_fork_wrapper: | 84 | ENTRY(hpux_fork_wrapper) |
| 90 | ldo TASK_REGS-TASK_SZ_ALGN-64(%r30),%r1 ;! get pt regs | 85 | ldo TASK_REGS-TASK_SZ_ALGN-64(%r30),%r1 ;! get pt regs |
| 91 | ;! pointer in task | 86 | ;! pointer in task |
| 92 | reg_save %r1 | 87 | reg_save %r1 |
| @@ -128,27 +123,26 @@ fork_return: | |||
| 128 | fork_exit: | 123 | fork_exit: |
| 129 | bv %r0(%r2) | 124 | bv %r0(%r2) |
| 130 | nop | 125 | nop |
| 126 | ENDPROC(hpux_fork_wrapper) | ||
| 131 | 127 | ||
| 132 | /* Set the return value for the child */ | 128 | /* Set the return value for the child */ |
| 133 | 129 | ||
| 134 | hpux_child_return: | 130 | ENTRY(hpux_child_return) |
| 135 | #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) | 131 | #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) |
| 136 | bl schedule_tail, %r2 | 132 | bl,n schedule_tail, %r2 |
| 137 | nop | ||
| 138 | #endif | 133 | #endif |
| 139 | 134 | ||
| 140 | LDREG TASK_PT_GR19-TASK_SZ_ALGN-128(%r30),%r2 | 135 | LDREG TASK_PT_GR19-TASK_SZ_ALGN-128(%r30),%r2 |
| 141 | b fork_return | 136 | b fork_return |
| 142 | copy %r0,%r28 | 137 | copy %r0,%r28 |
| 138 | ENDPROC(hpux_child_return) | ||
| 143 | 139 | ||
| 144 | .export hpux_execve_wrapper | ||
| 145 | .export hpux_execv_wrapper | ||
| 146 | .import hpux_execve | 140 | .import hpux_execve |
| 147 | 141 | ||
| 148 | hpux_execv_wrapper: | 142 | ENTRY(hpux_execv_wrapper) |
| 149 | copy %r0,%r24 /* NULL environment */ | 143 | copy %r0,%r24 /* NULL environment */ |
| 150 | 144 | ||
| 151 | hpux_execve_wrapper: | 145 | ENTRY(hpux_execve_wrapper) |
| 152 | 146 | ||
| 153 | ldo TASK_REGS-TASK_SZ_ALGN-64(%r30),%r1 ;! get pt regs | 147 | ldo TASK_REGS-TASK_SZ_ALGN-64(%r30),%r1 ;! get pt regs |
| 154 | 148 | ||
| @@ -187,13 +181,13 @@ hpux_execve_wrapper: | |||
| 187 | exec_error: | 181 | exec_error: |
| 188 | bv %r0(%r19) | 182 | bv %r0(%r19) |
| 189 | nop | 183 | nop |
| 184 | ENDPROC(hpux_execv_wrapper) | ||
| 190 | 185 | ||
| 191 | .export hpux_pipe_wrapper | ||
| 192 | .import hpux_pipe | 186 | .import hpux_pipe |
| 193 | 187 | ||
| 194 | /* HP-UX expects pipefd's returned in r28 & r29 */ | 188 | /* HP-UX expects pipefd's returned in r28 & r29 */ |
| 195 | 189 | ||
| 196 | hpux_pipe_wrapper: | 190 | ENTRY(hpux_pipe_wrapper) |
| 197 | STREG %r2,-20(%r30) | 191 | STREG %r2,-20(%r30) |
| 198 | ldo 64(%r30),%r30 | 192 | ldo 64(%r30),%r30 |
| 199 | bl hpux_pipe,%r2 | 193 | bl hpux_pipe,%r2 |
| @@ -212,12 +206,11 @@ hpux_pipe_wrapper: | |||
| 212 | pipe_exit: | 206 | pipe_exit: |
| 213 | bv %r0(%r2) | 207 | bv %r0(%r2) |
| 214 | ldo -64(%r30),%r30 | 208 | ldo -64(%r30),%r30 |
| 209 | ENDPROC(hpux_pipe_wrapper) | ||
| 215 | 210 | ||
| 216 | .export hpux_syscall_exit | ||
| 217 | .import syscall_exit | 211 | .import syscall_exit |
| 218 | 212 | ||
| 219 | hpux_syscall_exit: | 213 | ENTRY(hpux_syscall_exit) |
| 220 | |||
| 221 | /* | 214 | /* |
| 222 | * | 215 | * |
| 223 | * HP-UX call return conventions: | 216 | * HP-UX call return conventions: |
| @@ -246,12 +239,12 @@ hpux_syscall_exit: | |||
| 246 | ldo 1(%r0),%r22 | 239 | ldo 1(%r0),%r22 |
| 247 | 240 | ||
| 248 | no_error: | 241 | no_error: |
| 249 | b syscall_exit | 242 | b,n syscall_exit |
| 250 | nop | 243 | ENDPROC(hpux_syscall_exit) |
| 251 | 244 | ||
| 252 | .export hpux_unimplemented_wrapper | ||
| 253 | .import hpux_unimplemented | 245 | .import hpux_unimplemented |
| 254 | 246 | ||
| 255 | hpux_unimplemented_wrapper: | 247 | ENTRY(hpux_unimplemented_wrapper) |
| 256 | b hpux_unimplemented | 248 | b hpux_unimplemented |
| 257 | STREG %r22,-64(%r30) /* overwrite arg8 with syscall number */ | 249 | STREG %r22,-64(%r30) /* overwrite arg8 with syscall number */ |
| 250 | ENDPROC(hpux_unimplemented_wrapper) | ||
diff --git a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c index c11a5bc7c067..54fdb959149c 100644 --- a/arch/parisc/kernel/asm-offsets.c +++ b/arch/parisc/kernel/asm-offsets.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | 44 | ||
| 45 | #define BLANK() asm volatile("\n->" : : ) | 45 | #define BLANK() asm volatile("\n->" : : ) |
| 46 | 46 | ||
| 47 | #ifdef __LP64__ | 47 | #ifdef CONFIG_64BIT |
| 48 | #define FRAME_SIZE 128 | 48 | #define FRAME_SIZE 128 |
| 49 | #else | 49 | #else |
| 50 | #define FRAME_SIZE 64 | 50 | #define FRAME_SIZE 64 |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 0be51e92a2fc..0dc924ccceb5 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
| @@ -68,16 +68,6 @@ flush_cache_all_local(void) | |||
| 68 | } | 68 | } |
| 69 | EXPORT_SYMBOL(flush_cache_all_local); | 69 | EXPORT_SYMBOL(flush_cache_all_local); |
| 70 | 70 | ||
| 71 | /* flushes EVERYTHING (tlb & cache) */ | ||
| 72 | |||
| 73 | void | ||
| 74 | flush_all_caches(void) | ||
| 75 | { | ||
| 76 | flush_cache_all(); | ||
| 77 | flush_tlb_all(); | ||
| 78 | } | ||
| 79 | EXPORT_SYMBOL(flush_all_caches); | ||
| 80 | |||
| 81 | void | 71 | void |
| 82 | update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) | 72 | update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) |
| 83 | { | 73 | { |
| @@ -99,7 +89,7 @@ show_cache_info(struct seq_file *m) | |||
| 99 | 89 | ||
| 100 | seq_printf(m, "I-cache\t\t: %ld KB\n", | 90 | seq_printf(m, "I-cache\t\t: %ld KB\n", |
| 101 | cache_info.ic_size/1024 ); | 91 | cache_info.ic_size/1024 ); |
| 102 | if (cache_info.dc_loop == 1) | 92 | if (cache_info.dc_loop != 1) |
| 103 | snprintf(buf, 32, "%lu-way associative", cache_info.dc_loop); | 93 | snprintf(buf, 32, "%lu-way associative", cache_info.dc_loop); |
| 104 | seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %s)\n", | 94 | seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %s)\n", |
| 105 | cache_info.dc_size/1024, | 95 | cache_info.dc_size/1024, |
| @@ -270,6 +260,83 @@ void disable_sr_hashing(void) | |||
| 270 | panic("SpaceID hashing is still on!\n"); | 260 | panic("SpaceID hashing is still on!\n"); |
| 271 | } | 261 | } |
| 272 | 262 | ||
| 263 | /* Simple function to work out if we have an existing address translation | ||
| 264 | * for a user space vma. */ | ||
| 265 | static inline int translation_exists(struct vm_area_struct *vma, | ||
| 266 | unsigned long addr, unsigned long pfn) | ||
| 267 | { | ||
| 268 | pgd_t *pgd = pgd_offset(vma->vm_mm, addr); | ||
| 269 | pmd_t *pmd; | ||
| 270 | pte_t pte; | ||
| 271 | |||
| 272 | if(pgd_none(*pgd)) | ||
| 273 | return 0; | ||
| 274 | |||
| 275 | pmd = pmd_offset(pgd, addr); | ||
| 276 | if(pmd_none(*pmd) || pmd_bad(*pmd)) | ||
| 277 | return 0; | ||
| 278 | |||
| 279 | /* We cannot take the pte lock here: flush_cache_page is usually | ||
| 280 | * called with pte lock already held. Whereas flush_dcache_page | ||
| 281 | * takes flush_dcache_mmap_lock, which is lower in the hierarchy: | ||
| 282 | * the vma itself is secure, but the pte might come or go racily. | ||
| 283 | */ | ||
| 284 | pte = *pte_offset_map(pmd, addr); | ||
| 285 | /* But pte_unmap() does nothing on this architecture */ | ||
| 286 | |||
| 287 | /* Filter out coincidental file entries and swap entries */ | ||
| 288 | if (!(pte_val(pte) & (_PAGE_FLUSH|_PAGE_PRESENT))) | ||
| 289 | return 0; | ||
| 290 | |||
| 291 | return pte_pfn(pte) == pfn; | ||
| 292 | } | ||
| 293 | |||
| 294 | /* Private function to flush a page from the cache of a non-current | ||
| 295 | * process. cr25 contains the Page Directory of the current user | ||
| 296 | * process; we're going to hijack both it and the user space %sr3 to | ||
| 297 | * temporarily make the non-current process current. We have to do | ||
| 298 | * this because cache flushing may cause a non-access tlb miss which | ||
| 299 | * the handlers have to fill in from the pgd of the non-current | ||
| 300 | * process. */ | ||
| 301 | static inline void | ||
| 302 | flush_user_cache_page_non_current(struct vm_area_struct *vma, | ||
| 303 | unsigned long vmaddr) | ||
| 304 | { | ||
| 305 | /* save the current process space and pgd */ | ||
| 306 | unsigned long space = mfsp(3), pgd = mfctl(25); | ||
| 307 | |||
| 308 | /* we don't mind taking interrups since they may not | ||
| 309 | * do anything with user space, but we can't | ||
| 310 | * be preempted here */ | ||
| 311 | preempt_disable(); | ||
| 312 | |||
| 313 | /* make us current */ | ||
| 314 | mtctl(__pa(vma->vm_mm->pgd), 25); | ||
| 315 | mtsp(vma->vm_mm->context, 3); | ||
| 316 | |||
| 317 | flush_user_dcache_page(vmaddr); | ||
| 318 | if(vma->vm_flags & VM_EXEC) | ||
| 319 | flush_user_icache_page(vmaddr); | ||
| 320 | |||
| 321 | /* put the old current process back */ | ||
| 322 | mtsp(space, 3); | ||
| 323 | mtctl(pgd, 25); | ||
| 324 | preempt_enable(); | ||
| 325 | } | ||
| 326 | |||
| 327 | |||
| 328 | static inline void | ||
| 329 | __flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr) | ||
| 330 | { | ||
| 331 | if (likely(vma->vm_mm->context == mfsp(3))) { | ||
| 332 | flush_user_dcache_page(vmaddr); | ||
| 333 | if (vma->vm_flags & VM_EXEC) | ||
| 334 | flush_user_icache_page(vmaddr); | ||
| 335 | } else { | ||
| 336 | flush_user_cache_page_non_current(vma, vmaddr); | ||
| 337 | } | ||
| 338 | } | ||
| 339 | |||
| 273 | void flush_dcache_page(struct page *page) | 340 | void flush_dcache_page(struct page *page) |
| 274 | { | 341 | { |
| 275 | struct address_space *mapping = page_mapping(page); | 342 | struct address_space *mapping = page_mapping(page); |
| @@ -342,7 +409,7 @@ void clear_user_page_asm(void *page, unsigned long vaddr) | |||
| 342 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ | 409 | #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ |
| 343 | int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD; | 410 | int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD; |
| 344 | 411 | ||
| 345 | void parisc_setup_cache_timing(void) | 412 | void __init parisc_setup_cache_timing(void) |
| 346 | { | 413 | { |
| 347 | unsigned long rangetime, alltime; | 414 | unsigned long rangetime, alltime; |
| 348 | unsigned long size; | 415 | unsigned long size; |
| @@ -366,6 +433,9 @@ void parisc_setup_cache_timing(void) | |||
| 366 | if (!parisc_cache_flush_threshold) | 433 | if (!parisc_cache_flush_threshold) |
| 367 | parisc_cache_flush_threshold = FLUSH_THRESHOLD; | 434 | parisc_cache_flush_threshold = FLUSH_THRESHOLD; |
| 368 | 435 | ||
| 436 | if (parisc_cache_flush_threshold > cache_info.dc_size) | ||
| 437 | parisc_cache_flush_threshold = cache_info.dc_size; | ||
| 438 | |||
| 369 | printk(KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus()); | 439 | printk(KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus()); |
| 370 | } | 440 | } |
| 371 | 441 | ||
| @@ -410,3 +480,97 @@ void kunmap_parisc(void *addr) | |||
| 410 | } | 480 | } |
| 411 | EXPORT_SYMBOL(kunmap_parisc); | 481 | EXPORT_SYMBOL(kunmap_parisc); |
| 412 | #endif | 482 | #endif |
| 483 | |||
| 484 | void __flush_tlb_range(unsigned long sid, unsigned long start, | ||
| 485 | unsigned long end) | ||
| 486 | { | ||
| 487 | unsigned long npages; | ||
| 488 | |||
| 489 | npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
| 490 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ | ||
| 491 | flush_tlb_all(); | ||
| 492 | else { | ||
| 493 | mtsp(sid, 1); | ||
| 494 | purge_tlb_start(); | ||
| 495 | if (split_tlb) { | ||
| 496 | while (npages--) { | ||
| 497 | pdtlb(start); | ||
| 498 | pitlb(start); | ||
| 499 | start += PAGE_SIZE; | ||
| 500 | } | ||
| 501 | } else { | ||
| 502 | while (npages--) { | ||
| 503 | pdtlb(start); | ||
| 504 | start += PAGE_SIZE; | ||
| 505 | } | ||
| 506 | } | ||
| 507 | purge_tlb_end(); | ||
| 508 | } | ||
| 509 | } | ||
| 510 | |||
| 511 | static void cacheflush_h_tmp_function(void *dummy) | ||
| 512 | { | ||
| 513 | flush_cache_all_local(); | ||
| 514 | } | ||
| 515 | |||
| 516 | void flush_cache_all(void) | ||
| 517 | { | ||
| 518 | on_each_cpu(cacheflush_h_tmp_function, NULL, 1, 1); | ||
| 519 | } | ||
| 520 | |||
| 521 | void flush_cache_mm(struct mm_struct *mm) | ||
| 522 | { | ||
| 523 | #ifdef CONFIG_SMP | ||
| 524 | flush_cache_all(); | ||
| 525 | #else | ||
| 526 | flush_cache_all_local(); | ||
| 527 | #endif | ||
| 528 | } | ||
| 529 | |||
| 530 | void | ||
| 531 | flush_user_dcache_range(unsigned long start, unsigned long end) | ||
| 532 | { | ||
| 533 | if ((end - start) < parisc_cache_flush_threshold) | ||
| 534 | flush_user_dcache_range_asm(start,end); | ||
| 535 | else | ||
| 536 | flush_data_cache(); | ||
| 537 | } | ||
| 538 | |||
| 539 | void | ||
| 540 | flush_user_icache_range(unsigned long start, unsigned long end) | ||
| 541 | { | ||
| 542 | if ((end - start) < parisc_cache_flush_threshold) | ||
| 543 | flush_user_icache_range_asm(start,end); | ||
| 544 | else | ||
| 545 | flush_instruction_cache(); | ||
| 546 | } | ||
| 547 | |||
| 548 | |||
| 549 | void flush_cache_range(struct vm_area_struct *vma, | ||
| 550 | unsigned long start, unsigned long end) | ||
| 551 | { | ||
| 552 | int sr3; | ||
| 553 | |||
| 554 | if (!vma->vm_mm->context) { | ||
| 555 | BUG(); | ||
| 556 | return; | ||
| 557 | } | ||
| 558 | |||
| 559 | sr3 = mfsp(3); | ||
| 560 | if (vma->vm_mm->context == sr3) { | ||
| 561 | flush_user_dcache_range(start,end); | ||
| 562 | flush_user_icache_range(start,end); | ||
| 563 | } else { | ||
| 564 | flush_cache_all(); | ||
| 565 | } | ||
| 566 | } | ||
| 567 | |||
| 568 | void | ||
| 569 | flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn) | ||
| 570 | { | ||
| 571 | BUG_ON(!vma->vm_mm->context); | ||
| 572 | |||
| 573 | if (likely(translation_exists(vma, vmaddr, pfn))) | ||
| 574 | __flush_cache_page(vma, vmaddr); | ||
| 575 | |||
| 576 | } | ||
diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index d6c486e9501c..2ca654bd6322 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c | |||
| @@ -562,12 +562,23 @@ pa_dev_attr(rev, id.hversion_rev, "0x%x\n"); | |||
| 562 | pa_dev_attr_id(hversion, "0x%03x\n"); | 562 | pa_dev_attr_id(hversion, "0x%03x\n"); |
| 563 | pa_dev_attr_id(sversion, "0x%05x\n"); | 563 | pa_dev_attr_id(sversion, "0x%05x\n"); |
| 564 | 564 | ||
| 565 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
| 566 | { | ||
| 567 | struct parisc_device *padev = to_parisc_device(dev); | ||
| 568 | struct parisc_device_id *id = &padev->id; | ||
| 569 | |||
| 570 | return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n", | ||
| 571 | (u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev, | ||
| 572 | (u32)id->sversion); | ||
| 573 | } | ||
| 574 | |||
| 565 | static struct device_attribute parisc_device_attrs[] = { | 575 | static struct device_attribute parisc_device_attrs[] = { |
| 566 | __ATTR_RO(irq), | 576 | __ATTR_RO(irq), |
| 567 | __ATTR_RO(hw_type), | 577 | __ATTR_RO(hw_type), |
| 568 | __ATTR_RO(rev), | 578 | __ATTR_RO(rev), |
| 569 | __ATTR_RO(hversion), | 579 | __ATTR_RO(hversion), |
| 570 | __ATTR_RO(sversion), | 580 | __ATTR_RO(sversion), |
| 581 | __ATTR_RO(modalias), | ||
| 571 | __ATTR_NULL, | 582 | __ATTR_NULL, |
| 572 | }; | 583 | }; |
| 573 | 584 | ||
| @@ -689,7 +700,9 @@ parse_tree_node(struct device *parent, int index, struct hardware_path *modpath) | |||
| 689 | .fn = check_parent, | 700 | .fn = check_parent, |
| 690 | }; | 701 | }; |
| 691 | 702 | ||
| 692 | device_for_each_child(parent, &recurse_data, descend_children); | 703 | if (device_for_each_child(parent, &recurse_data, descend_children)) |
| 704 | /* nothing */; | ||
| 705 | |||
| 693 | return d.dev; | 706 | return d.dev; |
| 694 | } | 707 | } |
| 695 | 708 | ||
| @@ -835,8 +848,8 @@ static void print_parisc_device(struct parisc_device *dev) | |||
| 835 | static int count; | 848 | static int count; |
| 836 | 849 | ||
| 837 | print_pa_hwpath(dev, hw_path); | 850 | print_pa_hwpath(dev, hw_path); |
| 838 | printk(KERN_INFO "%d. %s at 0x%lx [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", | 851 | printk(KERN_INFO "%d. %s at 0x%p [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", |
| 839 | ++count, dev->name, dev->hpa.start, hw_path, dev->id.hw_type, | 852 | ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type, |
| 840 | dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); | 853 | dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); |
| 841 | 854 | ||
| 842 | if (dev->num_addrs) { | 855 | if (dev->num_addrs) { |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 340b5e8d67ba..8474f9e5ca10 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
| @@ -37,6 +37,8 @@ | |||
| 37 | #include <asm/unistd.h> | 37 | #include <asm/unistd.h> |
| 38 | #include <asm/thread_info.h> | 38 | #include <asm/thread_info.h> |
| 39 | 39 | ||
| 40 | #include <linux/linkage.h> | ||
| 41 | |||
| 40 | #ifdef CONFIG_64BIT | 42 | #ifdef CONFIG_64BIT |
| 41 | #define CMPIB cmpib,* | 43 | #define CMPIB cmpib,* |
| 42 | #define CMPB cmpb,* | 44 | #define CMPB cmpb,* |
| @@ -648,13 +650,11 @@ | |||
| 648 | * the static part of the kernel address space. | 650 | * the static part of the kernel address space. |
| 649 | */ | 651 | */ |
| 650 | 652 | ||
| 651 | .export fault_vector_20 | ||
| 652 | |||
| 653 | .text | 653 | .text |
| 654 | 654 | ||
| 655 | .align 4096 | 655 | .align 4096 |
| 656 | 656 | ||
| 657 | fault_vector_20: | 657 | ENTRY(fault_vector_20) |
| 658 | /* First vector is invalid (0) */ | 658 | /* First vector is invalid (0) */ |
| 659 | .ascii "cows can fly" | 659 | .ascii "cows can fly" |
| 660 | .byte 0 | 660 | .byte 0 |
| @@ -695,14 +695,13 @@ fault_vector_20: | |||
| 695 | def 29 | 695 | def 29 |
| 696 | def 30 | 696 | def 30 |
| 697 | def 31 | 697 | def 31 |
| 698 | END(fault_vector_20) | ||
| 698 | 699 | ||
| 699 | #ifndef CONFIG_64BIT | 700 | #ifndef CONFIG_64BIT |
| 700 | 701 | ||
| 701 | .export fault_vector_11 | ||
| 702 | |||
| 703 | .align 2048 | 702 | .align 2048 |
| 704 | 703 | ||
| 705 | fault_vector_11: | 704 | ENTRY(fault_vector_11) |
| 706 | /* First vector is invalid (0) */ | 705 | /* First vector is invalid (0) */ |
| 707 | .ascii "cows can fly" | 706 | .ascii "cows can fly" |
| 708 | .byte 0 | 707 | .byte 0 |
| @@ -743,6 +742,7 @@ fault_vector_11: | |||
| 743 | def 29 | 742 | def 29 |
| 744 | def 30 | 743 | def 30 |
| 745 | def 31 | 744 | def 31 |
| 745 | END(fault_vector_11) | ||
| 746 | 746 | ||
| 747 | #endif | 747 | #endif |
| 748 | 748 | ||
| @@ -762,9 +762,8 @@ fault_vector_11: | |||
| 762 | #define CLONE_VM 0x100 /* Must agree with <linux/sched.h> */ | 762 | #define CLONE_VM 0x100 /* Must agree with <linux/sched.h> */ |
| 763 | #define CLONE_UNTRACED 0x00800000 | 763 | #define CLONE_UNTRACED 0x00800000 |
| 764 | 764 | ||
| 765 | .export __kernel_thread, code | ||
| 766 | .import do_fork | 765 | .import do_fork |
| 767 | __kernel_thread: | 766 | ENTRY(__kernel_thread) |
| 768 | STREG %r2, -RP_OFFSET(%r30) | 767 | STREG %r2, -RP_OFFSET(%r30) |
| 769 | 768 | ||
| 770 | copy %r30, %r1 | 769 | copy %r30, %r1 |
| @@ -797,6 +796,7 @@ __kernel_thread: | |||
| 797 | ldo -PT_SZ_ALGN(%r30), %r30 | 796 | ldo -PT_SZ_ALGN(%r30), %r30 |
| 798 | bv %r0(%r2) | 797 | bv %r0(%r2) |
| 799 | nop | 798 | nop |
| 799 | ENDPROC(__kernel_thread) | ||
| 800 | 800 | ||
| 801 | /* | 801 | /* |
| 802 | * Child Returns here | 802 | * Child Returns here |
| @@ -805,8 +805,7 @@ __kernel_thread: | |||
| 805 | * into task save area. | 805 | * into task save area. |
| 806 | */ | 806 | */ |
| 807 | 807 | ||
| 808 | .export ret_from_kernel_thread | 808 | ENTRY(ret_from_kernel_thread) |
| 809 | ret_from_kernel_thread: | ||
| 810 | 809 | ||
| 811 | /* Call schedule_tail first though */ | 810 | /* Call schedule_tail first though */ |
| 812 | BL schedule_tail, %r2 | 811 | BL schedule_tail, %r2 |
| @@ -833,10 +832,10 @@ ret_from_kernel_thread: | |||
| 833 | bv %r0(%r1) | 832 | bv %r0(%r1) |
| 834 | #endif | 833 | #endif |
| 835 | ldi 0, %r26 | 834 | ldi 0, %r26 |
| 835 | ENDPROC(ret_from_kernel_thread) | ||
| 836 | 836 | ||
| 837 | .import sys_execve, code | 837 | .import sys_execve, code |
| 838 | .export __execve, code | 838 | ENTRY(__execve) |
| 839 | __execve: | ||
| 840 | copy %r2, %r15 | 839 | copy %r2, %r15 |
| 841 | copy %r30, %r16 | 840 | copy %r30, %r16 |
| 842 | ldo PT_SZ_ALGN(%r30), %r30 | 841 | ldo PT_SZ_ALGN(%r30), %r30 |
| @@ -856,16 +855,15 @@ __execve: | |||
| 856 | copy %r16, %r30 | 855 | copy %r16, %r30 |
| 857 | bv %r0(%r2) | 856 | bv %r0(%r2) |
| 858 | nop | 857 | nop |
| 858 | ENDPROC(__execve) | ||
| 859 | 859 | ||
| 860 | .align 4 | ||
| 861 | 860 | ||
| 862 | /* | 861 | /* |
| 863 | * struct task_struct *_switch_to(struct task_struct *prev, | 862 | * struct task_struct *_switch_to(struct task_struct *prev, |
| 864 | * struct task_struct *next) | 863 | * struct task_struct *next) |
| 865 | * | 864 | * |
| 866 | * switch kernel stacks and return prev */ | 865 | * switch kernel stacks and return prev */ |
| 867 | .export _switch_to, code | 866 | ENTRY(_switch_to) |
| 868 | _switch_to: | ||
| 869 | STREG %r2, -RP_OFFSET(%r30) | 867 | STREG %r2, -RP_OFFSET(%r30) |
| 870 | 868 | ||
| 871 | callee_save_float | 869 | callee_save_float |
| @@ -890,6 +888,7 @@ _switch_to_ret: | |||
| 890 | LDREG -RP_OFFSET(%r30), %r2 | 888 | LDREG -RP_OFFSET(%r30), %r2 |
| 891 | bv %r0(%r2) | 889 | bv %r0(%r2) |
| 892 | copy %r26, %r28 | 890 | copy %r26, %r28 |
| 891 | ENDPROC(_switch_to) | ||
| 893 | 892 | ||
| 894 | /* | 893 | /* |
| 895 | * Common rfi return path for interruptions, kernel execve, and | 894 | * Common rfi return path for interruptions, kernel execve, and |
| @@ -907,8 +906,7 @@ _switch_to_ret: | |||
| 907 | 906 | ||
| 908 | .align 4096 | 907 | .align 4096 |
| 909 | 908 | ||
| 910 | .export syscall_exit_rfi | 909 | ENTRY(syscall_exit_rfi) |
| 911 | syscall_exit_rfi: | ||
| 912 | mfctl %cr30,%r16 | 910 | mfctl %cr30,%r16 |
| 913 | LDREG TI_TASK(%r16), %r16 /* thread_info -> task_struct */ | 911 | LDREG TI_TASK(%r16), %r16 /* thread_info -> task_struct */ |
| 914 | ldo TASK_REGS(%r16),%r16 | 912 | ldo TASK_REGS(%r16),%r16 |
| @@ -978,11 +976,36 @@ intr_check_resched: | |||
| 978 | LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_NEED_RESCHED */ | 976 | LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_NEED_RESCHED */ |
| 979 | bb,<,n %r19,31-TIF_NEED_RESCHED,intr_do_resched /* forward */ | 977 | bb,<,n %r19,31-TIF_NEED_RESCHED,intr_do_resched /* forward */ |
| 980 | 978 | ||
| 979 | .import do_notify_resume,code | ||
| 981 | intr_check_sig: | 980 | intr_check_sig: |
| 982 | /* As above */ | 981 | /* As above */ |
| 983 | mfctl %cr30,%r1 | 982 | mfctl %cr30,%r1 |
| 984 | LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_SIGPENDING */ | 983 | LDREG TI_FLAGS(%r1),%r19 |
| 985 | bb,<,n %r19, 31-TIF_SIGPENDING, intr_do_signal /* forward */ | 984 | ldi (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK), %r20 |
| 985 | and,COND(<>) %r19, %r20, %r0 | ||
| 986 | b,n intr_restore /* skip past if we've nothing to do */ | ||
| 987 | |||
| 988 | /* This check is critical to having LWS | ||
| 989 | * working. The IASQ is zero on the gateway | ||
| 990 | * page and we cannot deliver any signals until | ||
| 991 | * we get off the gateway page. | ||
| 992 | * | ||
| 993 | * Only do signals if we are returning to user space | ||
| 994 | */ | ||
| 995 | LDREG PT_IASQ0(%r16), %r20 | ||
| 996 | CMPIB=,n 0,%r20,intr_restore /* backward */ | ||
| 997 | LDREG PT_IASQ1(%r16), %r20 | ||
| 998 | CMPIB=,n 0,%r20,intr_restore /* backward */ | ||
| 999 | |||
| 1000 | copy %r0, %r25 /* long in_syscall = 0 */ | ||
| 1001 | #ifdef CONFIG_64BIT | ||
| 1002 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
| 1003 | #endif | ||
| 1004 | |||
| 1005 | BL do_notify_resume,%r2 | ||
| 1006 | copy %r16, %r26 /* struct pt_regs *regs */ | ||
| 1007 | |||
| 1008 | b,n intr_check_sig | ||
| 986 | 1009 | ||
| 987 | intr_restore: | 1010 | intr_restore: |
| 988 | copy %r16,%r29 | 1011 | copy %r16,%r29 |
| @@ -1072,35 +1095,6 @@ intr_do_preempt: | |||
| 1072 | b,n intr_restore /* ssm PSW_SM_I done by intr_restore */ | 1095 | b,n intr_restore /* ssm PSW_SM_I done by intr_restore */ |
| 1073 | #endif /* CONFIG_PREEMPT */ | 1096 | #endif /* CONFIG_PREEMPT */ |
| 1074 | 1097 | ||
| 1075 | .import do_signal,code | ||
| 1076 | intr_do_signal: | ||
| 1077 | /* | ||
| 1078 | This check is critical to having LWS | ||
| 1079 | working. The IASQ is zero on the gateway | ||
| 1080 | page and we cannot deliver any signals until | ||
| 1081 | we get off the gateway page. | ||
| 1082 | |||
| 1083 | Only do signals if we are returning to user space | ||
| 1084 | */ | ||
| 1085 | LDREG PT_IASQ0(%r16), %r20 | ||
| 1086 | CMPIB= 0,%r20,intr_restore /* backward */ | ||
| 1087 | nop | ||
| 1088 | LDREG PT_IASQ1(%r16), %r20 | ||
| 1089 | CMPIB= 0,%r20,intr_restore /* backward */ | ||
| 1090 | nop | ||
| 1091 | |||
| 1092 | copy %r0, %r24 /* unsigned long in_syscall */ | ||
| 1093 | copy %r16, %r25 /* struct pt_regs *regs */ | ||
| 1094 | #ifdef CONFIG_64BIT | ||
| 1095 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
| 1096 | #endif | ||
| 1097 | |||
| 1098 | BL do_signal,%r2 | ||
| 1099 | copy %r0, %r26 /* sigset_t *oldset = NULL */ | ||
| 1100 | |||
| 1101 | b intr_check_sig | ||
| 1102 | nop | ||
| 1103 | |||
| 1104 | /* | 1098 | /* |
| 1105 | * External interrupts. | 1099 | * External interrupts. |
| 1106 | */ | 1100 | */ |
| @@ -1115,11 +1109,7 @@ intr_extint: | |||
| 1115 | mfctl %cr31,%r1 | 1109 | mfctl %cr31,%r1 |
| 1116 | copy %r30,%r17 | 1110 | copy %r30,%r17 |
| 1117 | /* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/ | 1111 | /* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/ |
| 1118 | #ifdef CONFIG_64BIT | 1112 | DEPI 0,31,15,%r17 |
| 1119 | depdi 0,63,15,%r17 | ||
| 1120 | #else | ||
| 1121 | depi 0,31,15,%r17 | ||
| 1122 | #endif | ||
| 1123 | CMPB=,n %r1,%r17,2f | 1113 | CMPB=,n %r1,%r17,2f |
| 1124 | get_stack_use_cr31 | 1114 | get_stack_use_cr31 |
| 1125 | b,n 3f | 1115 | b,n 3f |
| @@ -1148,13 +1138,12 @@ intr_extint: | |||
| 1148 | 1138 | ||
| 1149 | b do_cpu_irq_mask | 1139 | b do_cpu_irq_mask |
| 1150 | ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */ | 1140 | ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */ |
| 1141 | ENDPROC(syscall_exit_rfi) | ||
| 1151 | 1142 | ||
| 1152 | 1143 | ||
| 1153 | /* Generic interruptions (illegal insn, unaligned, page fault, etc) */ | 1144 | /* Generic interruptions (illegal insn, unaligned, page fault, etc) */ |
| 1154 | 1145 | ||
| 1155 | .export intr_save, code /* for os_hpmc */ | 1146 | ENTRY(intr_save) /* for os_hpmc */ |
| 1156 | |||
| 1157 | intr_save: | ||
| 1158 | mfsp %sr7,%r16 | 1147 | mfsp %sr7,%r16 |
| 1159 | CMPIB=,n 0,%r16,1f | 1148 | CMPIB=,n 0,%r16,1f |
| 1160 | get_stack_use_cr30 | 1149 | get_stack_use_cr30 |
| @@ -1229,6 +1218,7 @@ skip_save_ior: | |||
| 1229 | 1218 | ||
| 1230 | b handle_interruption | 1219 | b handle_interruption |
| 1231 | ldo R%intr_check_sig(%r2), %r2 | 1220 | ldo R%intr_check_sig(%r2), %r2 |
| 1221 | ENDPROC(intr_save) | ||
| 1232 | 1222 | ||
| 1233 | 1223 | ||
| 1234 | /* | 1224 | /* |
| @@ -1814,9 +1804,7 @@ dtlb_fault: | |||
| 1814 | LDREG PT_GR18(\regs),%r18 | 1804 | LDREG PT_GR18(\regs),%r18 |
| 1815 | .endm | 1805 | .endm |
| 1816 | 1806 | ||
| 1817 | .export sys_fork_wrapper | 1807 | ENTRY(sys_fork_wrapper) |
| 1818 | .export child_return | ||
| 1819 | sys_fork_wrapper: | ||
| 1820 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 | 1808 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 |
| 1821 | ldo TASK_REGS(%r1),%r1 | 1809 | ldo TASK_REGS(%r1),%r1 |
| 1822 | reg_save %r1 | 1810 | reg_save %r1 |
| @@ -1853,9 +1841,10 @@ wrapper_exit: | |||
| 1853 | ldi __NR_fork,%r20 | 1841 | ldi __NR_fork,%r20 |
| 1854 | bv %r0(%r2) | 1842 | bv %r0(%r2) |
| 1855 | STREG %r20,PT_GR20(%r1) | 1843 | STREG %r20,PT_GR20(%r1) |
| 1844 | ENDPROC(sys_fork_wrapper) | ||
| 1856 | 1845 | ||
| 1857 | /* Set the return value for the child */ | 1846 | /* Set the return value for the child */ |
| 1858 | child_return: | 1847 | ENTRY(child_return) |
| 1859 | BL schedule_tail, %r2 | 1848 | BL schedule_tail, %r2 |
| 1860 | nop | 1849 | nop |
| 1861 | 1850 | ||
| @@ -1863,10 +1852,10 @@ child_return: | |||
| 1863 | LDREG TASK_PT_GR19(%r1),%r2 | 1852 | LDREG TASK_PT_GR19(%r1),%r2 |
| 1864 | b wrapper_exit | 1853 | b wrapper_exit |
| 1865 | copy %r0,%r28 | 1854 | copy %r0,%r28 |
| 1855 | ENDPROC(child_return) | ||
| 1866 | 1856 | ||
| 1867 | 1857 | ||
| 1868 | .export sys_clone_wrapper | 1858 | ENTRY(sys_clone_wrapper) |
| 1869 | sys_clone_wrapper: | ||
| 1870 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | 1859 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
| 1871 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ | 1860 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ |
| 1872 | reg_save %r1 | 1861 | reg_save %r1 |
| @@ -1887,9 +1876,10 @@ sys_clone_wrapper: | |||
| 1887 | 1876 | ||
| 1888 | b wrapper_exit | 1877 | b wrapper_exit |
| 1889 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 | 1878 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 |
| 1879 | ENDPROC(sys_clone_wrapper) | ||
| 1880 | |||
| 1890 | 1881 | ||
| 1891 | .export sys_vfork_wrapper | 1882 | ENTRY(sys_vfork_wrapper) |
| 1892 | sys_vfork_wrapper: | ||
| 1893 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | 1883 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
| 1894 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ | 1884 | ldo TASK_REGS(%r1),%r1 /* get pt regs */ |
| 1895 | reg_save %r1 | 1885 | reg_save %r1 |
| @@ -1910,6 +1900,7 @@ sys_vfork_wrapper: | |||
| 1910 | 1900 | ||
| 1911 | b wrapper_exit | 1901 | b wrapper_exit |
| 1912 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 | 1902 | LDREG -RP_OFFSET-FRAME_SIZE(%r30),%r2 |
| 1903 | ENDPROC(sys_vfork_wrapper) | ||
| 1913 | 1904 | ||
| 1914 | 1905 | ||
| 1915 | .macro execve_wrapper execve | 1906 | .macro execve_wrapper execve |
| @@ -1946,22 +1937,19 @@ error_\execve: | |||
| 1946 | nop | 1937 | nop |
| 1947 | .endm | 1938 | .endm |
| 1948 | 1939 | ||
| 1949 | .export sys_execve_wrapper | ||
| 1950 | .import sys_execve | 1940 | .import sys_execve |
| 1951 | 1941 | ENTRY(sys_execve_wrapper) | |
| 1952 | sys_execve_wrapper: | ||
| 1953 | execve_wrapper sys_execve | 1942 | execve_wrapper sys_execve |
| 1943 | ENDPROC(sys_execve_wrapper) | ||
| 1954 | 1944 | ||
| 1955 | #ifdef CONFIG_64BIT | 1945 | #ifdef CONFIG_64BIT |
| 1956 | .export sys32_execve_wrapper | ||
| 1957 | .import sys32_execve | 1946 | .import sys32_execve |
| 1958 | 1947 | ENTRY(sys32_execve_wrapper) | |
| 1959 | sys32_execve_wrapper: | ||
| 1960 | execve_wrapper sys32_execve | 1948 | execve_wrapper sys32_execve |
| 1949 | ENDPROC(sys32_execve_wrapper) | ||
| 1961 | #endif | 1950 | #endif |
| 1962 | 1951 | ||
| 1963 | .export sys_rt_sigreturn_wrapper | 1952 | ENTRY(sys_rt_sigreturn_wrapper) |
| 1964 | sys_rt_sigreturn_wrapper: | ||
| 1965 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 | 1953 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 |
| 1966 | ldo TASK_REGS(%r26),%r26 /* get pt regs */ | 1954 | ldo TASK_REGS(%r26),%r26 /* get pt regs */ |
| 1967 | /* Don't save regs, we are going to restore them from sigcontext. */ | 1955 | /* Don't save regs, we are going to restore them from sigcontext. */ |
| @@ -1989,9 +1977,9 @@ sys_rt_sigreturn_wrapper: | |||
| 1989 | */ | 1977 | */ |
| 1990 | bv %r0(%r2) | 1978 | bv %r0(%r2) |
| 1991 | LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ | 1979 | LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ |
| 1980 | ENDPROC(sys_rt_sigreturn_wrapper) | ||
| 1992 | 1981 | ||
| 1993 | .export sys_sigaltstack_wrapper | 1982 | ENTRY(sys_sigaltstack_wrapper) |
| 1994 | sys_sigaltstack_wrapper: | ||
| 1995 | /* Get the user stack pointer */ | 1983 | /* Get the user stack pointer */ |
| 1996 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | 1984 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
| 1997 | ldo TASK_REGS(%r1),%r24 /* get pt regs */ | 1985 | ldo TASK_REGS(%r1),%r24 /* get pt regs */ |
| @@ -1999,10 +1987,10 @@ sys_sigaltstack_wrapper: | |||
| 1999 | STREG %r2, -RP_OFFSET(%r30) | 1987 | STREG %r2, -RP_OFFSET(%r30) |
| 2000 | #ifdef CONFIG_64BIT | 1988 | #ifdef CONFIG_64BIT |
| 2001 | ldo FRAME_SIZE(%r30), %r30 | 1989 | ldo FRAME_SIZE(%r30), %r30 |
| 2002 | b,l do_sigaltstack,%r2 | 1990 | BL do_sigaltstack,%r2 |
| 2003 | ldo -16(%r30),%r29 /* Reference param save area */ | 1991 | ldo -16(%r30),%r29 /* Reference param save area */ |
| 2004 | #else | 1992 | #else |
| 2005 | bl do_sigaltstack,%r2 | 1993 | BL do_sigaltstack,%r2 |
| 2006 | ldo FRAME_SIZE(%r30), %r30 | 1994 | ldo FRAME_SIZE(%r30), %r30 |
| 2007 | #endif | 1995 | #endif |
| 2008 | 1996 | ||
| @@ -2010,53 +1998,26 @@ sys_sigaltstack_wrapper: | |||
| 2010 | LDREG -RP_OFFSET(%r30), %r2 | 1998 | LDREG -RP_OFFSET(%r30), %r2 |
| 2011 | bv %r0(%r2) | 1999 | bv %r0(%r2) |
| 2012 | nop | 2000 | nop |
| 2001 | ENDPROC(sys_sigaltstack_wrapper) | ||
| 2013 | 2002 | ||
| 2014 | #ifdef CONFIG_64BIT | 2003 | #ifdef CONFIG_64BIT |
| 2015 | .export sys32_sigaltstack_wrapper | 2004 | ENTRY(sys32_sigaltstack_wrapper) |
| 2016 | sys32_sigaltstack_wrapper: | ||
| 2017 | /* Get the user stack pointer */ | 2005 | /* Get the user stack pointer */ |
| 2018 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24 | 2006 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24 |
| 2019 | LDREG TASK_PT_GR30(%r24),%r24 | 2007 | LDREG TASK_PT_GR30(%r24),%r24 |
| 2020 | STREG %r2, -RP_OFFSET(%r30) | 2008 | STREG %r2, -RP_OFFSET(%r30) |
| 2021 | ldo FRAME_SIZE(%r30), %r30 | 2009 | ldo FRAME_SIZE(%r30), %r30 |
| 2022 | b,l do_sigaltstack32,%r2 | 2010 | BL do_sigaltstack32,%r2 |
| 2023 | ldo -16(%r30),%r29 /* Reference param save area */ | 2011 | ldo -16(%r30),%r29 /* Reference param save area */ |
| 2024 | 2012 | ||
| 2025 | ldo -FRAME_SIZE(%r30), %r30 | 2013 | ldo -FRAME_SIZE(%r30), %r30 |
| 2026 | LDREG -RP_OFFSET(%r30), %r2 | 2014 | LDREG -RP_OFFSET(%r30), %r2 |
| 2027 | bv %r0(%r2) | 2015 | bv %r0(%r2) |
| 2028 | nop | 2016 | nop |
| 2017 | ENDPROC(sys32_sigaltstack_wrapper) | ||
| 2029 | #endif | 2018 | #endif |
| 2030 | 2019 | ||
| 2031 | .export sys_rt_sigsuspend_wrapper | 2020 | ENTRY(syscall_exit) |
| 2032 | sys_rt_sigsuspend_wrapper: | ||
| 2033 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 | ||
| 2034 | ldo TASK_REGS(%r1),%r24 | ||
| 2035 | reg_save %r24 | ||
| 2036 | |||
| 2037 | STREG %r2, -RP_OFFSET(%r30) | ||
| 2038 | #ifdef CONFIG_64BIT | ||
| 2039 | ldo FRAME_SIZE(%r30), %r30 | ||
| 2040 | b,l sys_rt_sigsuspend,%r2 | ||
| 2041 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
| 2042 | #else | ||
| 2043 | bl sys_rt_sigsuspend,%r2 | ||
| 2044 | ldo FRAME_SIZE(%r30), %r30 | ||
| 2045 | #endif | ||
| 2046 | |||
| 2047 | ldo -FRAME_SIZE(%r30), %r30 | ||
| 2048 | LDREG -RP_OFFSET(%r30), %r2 | ||
| 2049 | |||
| 2050 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 | ||
| 2051 | ldo TASK_REGS(%r1),%r1 | ||
| 2052 | reg_restore %r1 | ||
| 2053 | |||
| 2054 | bv %r0(%r2) | ||
| 2055 | nop | ||
| 2056 | |||
| 2057 | .export syscall_exit | ||
| 2058 | syscall_exit: | ||
| 2059 | |||
| 2060 | /* NOTE: HP-UX syscalls also come through here | 2021 | /* NOTE: HP-UX syscalls also come through here |
| 2061 | * after hpux_syscall_exit fixes up return | 2022 | * after hpux_syscall_exit fixes up return |
| 2062 | * values. */ | 2023 | * values. */ |
| @@ -2119,9 +2080,35 @@ syscall_check_resched: | |||
| 2119 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 /* long */ | 2080 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 /* long */ |
| 2120 | bb,<,n %r19, 31-TIF_NEED_RESCHED, syscall_do_resched /* forward */ | 2081 | bb,<,n %r19, 31-TIF_NEED_RESCHED, syscall_do_resched /* forward */ |
| 2121 | 2082 | ||
| 2083 | .import do_signal,code | ||
| 2122 | syscall_check_sig: | 2084 | syscall_check_sig: |
| 2123 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 /* get ti flags */ | 2085 | LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 |
| 2124 | bb,<,n %r19, 31-TIF_SIGPENDING, syscall_do_signal /* forward */ | 2086 | ldi (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK), %r26 |
| 2087 | and,COND(<>) %r19, %r26, %r0 | ||
| 2088 | b,n syscall_restore /* skip past if we've nothing to do */ | ||
| 2089 | |||
| 2090 | syscall_do_signal: | ||
| 2091 | /* Save callee-save registers (for sigcontext). | ||
| 2092 | * FIXME: After this point the process structure should be | ||
| 2093 | * consistent with all the relevant state of the process | ||
| 2094 | * before the syscall. We need to verify this. | ||
| 2095 | */ | ||
| 2096 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
| 2097 | ldo TASK_REGS(%r1), %r26 /* struct pt_regs *regs */ | ||
| 2098 | reg_save %r26 | ||
| 2099 | |||
| 2100 | #ifdef CONFIG_64BIT | ||
| 2101 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
| 2102 | #endif | ||
| 2103 | |||
| 2104 | BL do_notify_resume,%r2 | ||
| 2105 | ldi 1, %r25 /* long in_syscall = 1 */ | ||
| 2106 | |||
| 2107 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
| 2108 | ldo TASK_REGS(%r1), %r20 /* reload pt_regs */ | ||
| 2109 | reg_restore %r20 | ||
| 2110 | |||
| 2111 | b,n syscall_check_sig | ||
| 2125 | 2112 | ||
| 2126 | syscall_restore: | 2113 | syscall_restore: |
| 2127 | /* Are we being ptraced? */ | 2114 | /* Are we being ptraced? */ |
| @@ -2259,31 +2246,10 @@ syscall_do_resched: | |||
| 2259 | #endif | 2246 | #endif |
| 2260 | b syscall_check_bh /* if resched, we start over again */ | 2247 | b syscall_check_bh /* if resched, we start over again */ |
| 2261 | nop | 2248 | nop |
| 2249 | ENDPROC(syscall_exit) | ||
| 2262 | 2250 | ||
| 2263 | .import do_signal,code | ||
| 2264 | syscall_do_signal: | ||
| 2265 | /* Save callee-save registers (for sigcontext). | ||
| 2266 | FIXME: After this point the process structure should be | ||
| 2267 | consistent with all the relevant state of the process | ||
| 2268 | before the syscall. We need to verify this. */ | ||
| 2269 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
| 2270 | ldo TASK_REGS(%r1), %r25 /* struct pt_regs *regs */ | ||
| 2271 | reg_save %r25 | ||
| 2272 | |||
| 2273 | ldi 1, %r24 /* unsigned long in_syscall */ | ||
| 2274 | |||
| 2275 | #ifdef CONFIG_64BIT | ||
| 2276 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
| 2277 | #endif | ||
| 2278 | BL do_signal,%r2 | ||
| 2279 | copy %r0, %r26 /* sigset_t *oldset = NULL */ | ||
| 2280 | |||
| 2281 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
| 2282 | ldo TASK_REGS(%r1), %r20 /* reload pt_regs */ | ||
| 2283 | reg_restore %r20 | ||
| 2284 | |||
| 2285 | b,n syscall_check_sig | ||
| 2286 | 2251 | ||
| 2252 | get_register: | ||
| 2287 | /* | 2253 | /* |
| 2288 | * get_register is used by the non access tlb miss handlers to | 2254 | * get_register is used by the non access tlb miss handlers to |
| 2289 | * copy the value of the general register specified in r8 into | 2255 | * copy the value of the general register specified in r8 into |
| @@ -2294,8 +2260,6 @@ syscall_do_signal: | |||
| 2294 | * a -1 in it, but that is OK, it just means that we will have | 2260 | * a -1 in it, but that is OK, it just means that we will have |
| 2295 | * to use the slow path instead). | 2261 | * to use the slow path instead). |
| 2296 | */ | 2262 | */ |
| 2297 | |||
| 2298 | get_register: | ||
| 2299 | blr %r8,%r0 | 2263 | blr %r8,%r0 |
| 2300 | nop | 2264 | nop |
| 2301 | bv %r0(%r25) /* r0 */ | 2265 | bv %r0(%r25) /* r0 */ |
| @@ -2363,13 +2327,13 @@ get_register: | |||
| 2363 | bv %r0(%r25) /* r31 */ | 2327 | bv %r0(%r25) /* r31 */ |
| 2364 | copy %r31,%r1 | 2328 | copy %r31,%r1 |
| 2365 | 2329 | ||
| 2330 | |||
| 2331 | set_register: | ||
| 2366 | /* | 2332 | /* |
| 2367 | * set_register is used by the non access tlb miss handlers to | 2333 | * set_register is used by the non access tlb miss handlers to |
| 2368 | * copy the value of r1 into the general register specified in | 2334 | * copy the value of r1 into the general register specified in |
| 2369 | * r8. | 2335 | * r8. |
| 2370 | */ | 2336 | */ |
| 2371 | |||
| 2372 | set_register: | ||
| 2373 | blr %r8,%r0 | 2337 | blr %r8,%r0 |
| 2374 | nop | 2338 | nop |
| 2375 | bv %r0(%r25) /* r0 (silly, but it is a place holder) */ | 2339 | bv %r0(%r25) /* r0 (silly, but it is a place holder) */ |
| @@ -2436,3 +2400,4 @@ set_register: | |||
| 2436 | copy %r1,%r30 | 2400 | copy %r1,%r30 |
| 2437 | bv %r0(%r25) /* r31 */ | 2401 | bv %r0(%r25) /* r31 */ |
| 2438 | copy %r1,%r31 | 2402 | copy %r1,%r31 |
| 2403 | |||
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 9158b707c0dd..39dc835bf89e 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c | |||
| @@ -74,7 +74,7 @@ static DEFINE_SPINLOCK(pdc_lock); | |||
| 74 | static unsigned long pdc_result[32] __attribute__ ((aligned (8))); | 74 | static unsigned long pdc_result[32] __attribute__ ((aligned (8))); |
| 75 | static unsigned long pdc_result2[32] __attribute__ ((aligned (8))); | 75 | static unsigned long pdc_result2[32] __attribute__ ((aligned (8))); |
| 76 | 76 | ||
| 77 | #ifdef __LP64__ | 77 | #ifdef CONFIG_64BIT |
| 78 | #define WIDE_FIRMWARE 0x1 | 78 | #define WIDE_FIRMWARE 0x1 |
| 79 | #define NARROW_FIRMWARE 0x2 | 79 | #define NARROW_FIRMWARE 0x2 |
| 80 | 80 | ||
| @@ -94,12 +94,12 @@ int parisc_narrow_firmware __read_mostly = 1; | |||
| 94 | * when running a 64-bit kernel on such boxes (e.g. C200 or C360). | 94 | * when running a 64-bit kernel on such boxes (e.g. C200 or C360). |
| 95 | */ | 95 | */ |
| 96 | 96 | ||
| 97 | #ifdef __LP64__ | 97 | #ifdef CONFIG_64BIT |
| 98 | long real64_call(unsigned long function, ...); | 98 | long real64_call(unsigned long function, ...); |
| 99 | #endif | 99 | #endif |
| 100 | long real32_call(unsigned long function, ...); | 100 | long real32_call(unsigned long function, ...); |
| 101 | 101 | ||
| 102 | #ifdef __LP64__ | 102 | #ifdef CONFIG_64BIT |
| 103 | # define MEM_PDC (unsigned long)(PAGE0->mem_pdc_hi) << 32 | PAGE0->mem_pdc | 103 | # define MEM_PDC (unsigned long)(PAGE0->mem_pdc_hi) << 32 | PAGE0->mem_pdc |
| 104 | # define mem_pdc_call(args...) unlikely(parisc_narrow_firmware) ? real32_call(MEM_PDC, args) : real64_call(MEM_PDC, args) | 104 | # define mem_pdc_call(args...) unlikely(parisc_narrow_firmware) ? real32_call(MEM_PDC, args) : real64_call(MEM_PDC, args) |
| 105 | #else | 105 | #else |
| @@ -117,7 +117,7 @@ long real32_call(unsigned long function, ...); | |||
| 117 | */ | 117 | */ |
| 118 | static unsigned long f_extend(unsigned long address) | 118 | static unsigned long f_extend(unsigned long address) |
| 119 | { | 119 | { |
| 120 | #ifdef __LP64__ | 120 | #ifdef CONFIG_64BIT |
| 121 | if(unlikely(parisc_narrow_firmware)) { | 121 | if(unlikely(parisc_narrow_firmware)) { |
| 122 | if((address & 0xff000000) == 0xf0000000) | 122 | if((address & 0xff000000) == 0xf0000000) |
| 123 | return 0xf0f0f0f000000000UL | (u32)address; | 123 | return 0xf0f0f0f000000000UL | (u32)address; |
| @@ -139,7 +139,7 @@ static unsigned long f_extend(unsigned long address) | |||
| 139 | */ | 139 | */ |
| 140 | static void convert_to_wide(unsigned long *addr) | 140 | static void convert_to_wide(unsigned long *addr) |
| 141 | { | 141 | { |
| 142 | #ifdef __LP64__ | 142 | #ifdef CONFIG_64BIT |
| 143 | int i; | 143 | int i; |
| 144 | unsigned int *p = (unsigned int *)addr; | 144 | unsigned int *p = (unsigned int *)addr; |
| 145 | 145 | ||
| @@ -158,7 +158,7 @@ static void convert_to_wide(unsigned long *addr) | |||
| 158 | */ | 158 | */ |
| 159 | void __init set_firmware_width(void) | 159 | void __init set_firmware_width(void) |
| 160 | { | 160 | { |
| 161 | #ifdef __LP64__ | 161 | #ifdef CONFIG_64BIT |
| 162 | int retval; | 162 | int retval; |
| 163 | unsigned long flags; | 163 | unsigned long flags; |
| 164 | 164 | ||
| @@ -238,7 +238,7 @@ int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_inf | |||
| 238 | * | 238 | * |
| 239 | * Must be correctly formatted or expect system crash | 239 | * Must be correctly formatted or expect system crash |
| 240 | */ | 240 | */ |
| 241 | #ifdef __LP64__ | 241 | #ifdef CONFIG_64BIT |
| 242 | int pdc_pat_chassis_send_log(unsigned long state, unsigned long data) | 242 | int pdc_pat_chassis_send_log(unsigned long state, unsigned long data) |
| 243 | { | 243 | { |
| 244 | int retval = 0; | 244 | int retval = 0; |
| @@ -949,7 +949,7 @@ int pdc_tod_set(unsigned long sec, unsigned long usec) | |||
| 949 | } | 949 | } |
| 950 | EXPORT_SYMBOL(pdc_tod_set); | 950 | EXPORT_SYMBOL(pdc_tod_set); |
| 951 | 951 | ||
| 952 | #ifdef __LP64__ | 952 | #ifdef CONFIG_64BIT |
| 953 | int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr, | 953 | int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr, |
| 954 | struct pdc_memory_table *tbl, unsigned long entries) | 954 | struct pdc_memory_table *tbl, unsigned long entries) |
| 955 | { | 955 | { |
| @@ -965,7 +965,7 @@ int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr, | |||
| 965 | 965 | ||
| 966 | return retval; | 966 | return retval; |
| 967 | } | 967 | } |
| 968 | #endif /* __LP64__ */ | 968 | #endif /* CONFIG_64BIT */ |
| 969 | 969 | ||
| 970 | /* FIXME: Is this pdc used? I could not find type reference to ftc_bitmap | 970 | /* FIXME: Is this pdc used? I could not find type reference to ftc_bitmap |
| 971 | * so I guessed at unsigned long. Someone who knows what this does, can fix | 971 | * so I guessed at unsigned long. Someone who knows what this does, can fix |
| @@ -1204,7 +1204,7 @@ int pdc_sti_call(unsigned long func, unsigned long flags, | |||
| 1204 | } | 1204 | } |
| 1205 | EXPORT_SYMBOL(pdc_sti_call); | 1205 | EXPORT_SYMBOL(pdc_sti_call); |
| 1206 | 1206 | ||
| 1207 | #ifdef __LP64__ | 1207 | #ifdef CONFIG_64BIT |
| 1208 | /** | 1208 | /** |
| 1209 | * pdc_pat_cell_get_number - Returns the cell number. | 1209 | * pdc_pat_cell_get_number - Returns the cell number. |
| 1210 | * @cell_info: The return buffer. | 1210 | * @cell_info: The return buffer. |
| @@ -1387,7 +1387,7 @@ int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val) | |||
| 1387 | 1387 | ||
| 1388 | return retval; | 1388 | return retval; |
| 1389 | } | 1389 | } |
| 1390 | #endif /* __LP64__ */ | 1390 | #endif /* CONFIG_64BIT */ |
| 1391 | 1391 | ||
| 1392 | 1392 | ||
| 1393 | /***************** 32-bit real-mode calls ***********/ | 1393 | /***************** 32-bit real-mode calls ***********/ |
| @@ -1445,7 +1445,7 @@ long real32_call(unsigned long fn, ...) | |||
| 1445 | return real32_call_asm(&real_stack.sp, &real_stack.arg0, fn); | 1445 | return real32_call_asm(&real_stack.sp, &real_stack.arg0, fn); |
| 1446 | } | 1446 | } |
| 1447 | 1447 | ||
| 1448 | #ifdef __LP64__ | 1448 | #ifdef CONFIG_64BIT |
| 1449 | /***************** 64-bit real-mode calls ***********/ | 1449 | /***************** 64-bit real-mode calls ***********/ |
| 1450 | 1450 | ||
| 1451 | struct wide_stack { | 1451 | struct wide_stack { |
| @@ -1496,5 +1496,5 @@ long real64_call(unsigned long fn, ...) | |||
| 1496 | return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn); | 1496 | return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn); |
| 1497 | } | 1497 | } |
| 1498 | 1498 | ||
| 1499 | #endif /* __LP64__ */ | 1499 | #endif /* CONFIG_64BIT */ |
| 1500 | 1500 | ||
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index eaad2328fea1..9676c486bb63 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * License. See the file "COPYING" in the main directory of this archive | 2 | * License. See the file "COPYING" in the main directory of this archive |
| 3 | * for more details. | 3 | * for more details. |
| 4 | * | 4 | * |
| 5 | * Copyright (C) 1999 by Helge Deller | 5 | * Copyright (C) 1999-2007 by Helge Deller <deller@gmx.de> |
| 6 | * Copyright 1999 SuSE GmbH (Philipp Rumpf) | 6 | * Copyright 1999 SuSE GmbH (Philipp Rumpf) |
| 7 | * Copyright 1999 Philipp Rumpf (prumpf@tux.org) | 7 | * Copyright 1999 Philipp Rumpf (prumpf@tux.org) |
| 8 | * Copyright 2000 Hewlett Packard (Paul Bame, bame@puffin.external.hp.com) | 8 | * Copyright 2000 Hewlett Packard (Paul Bame, bame@puffin.external.hp.com) |
| @@ -19,16 +19,17 @@ | |||
| 19 | #include <asm/assembly.h> | 19 | #include <asm/assembly.h> |
| 20 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
| 21 | 21 | ||
| 22 | #include <linux/linkage.h> | ||
| 23 | |||
| 22 | .level LEVEL | 24 | .level LEVEL |
| 23 | 25 | ||
| 24 | .data | 26 | .data |
| 25 | 27 | ENTRY(boot_args) | |
| 26 | .export boot_args | ||
| 27 | boot_args: | ||
| 28 | .word 0 /* arg0 */ | 28 | .word 0 /* arg0 */ |
| 29 | .word 0 /* arg1 */ | 29 | .word 0 /* arg1 */ |
| 30 | .word 0 /* arg2 */ | 30 | .word 0 /* arg2 */ |
| 31 | .word 0 /* arg3 */ | 31 | .word 0 /* arg3 */ |
| 32 | END(boot_args) | ||
| 32 | 33 | ||
| 33 | .text | 34 | .text |
| 34 | .align 4 | 35 | .align 4 |
| @@ -38,10 +39,9 @@ boot_args: | |||
| 38 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ | 39 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ |
| 39 | .import $global$ /* forward declaration */ | 40 | .import $global$ /* forward declaration */ |
| 40 | #endif /*!CONFIG_64BIT*/ | 41 | #endif /*!CONFIG_64BIT*/ |
| 41 | .export stext | ||
| 42 | .export _stext,data /* Kernel want it this way! */ | 42 | .export _stext,data /* Kernel want it this way! */ |
| 43 | _stext: | 43 | _stext: |
| 44 | stext: | 44 | ENTRY(stext) |
| 45 | .proc | 45 | .proc |
| 46 | .callinfo | 46 | .callinfo |
| 47 | 47 | ||
| @@ -343,6 +343,9 @@ smp_slave_stext: | |||
| 343 | 343 | ||
| 344 | .procend | 344 | .procend |
| 345 | #endif /* CONFIG_SMP */ | 345 | #endif /* CONFIG_SMP */ |
| 346 | |||
| 347 | ENDPROC(stext) | ||
| 348 | |||
| 346 | #ifndef CONFIG_64BIT | 349 | #ifndef CONFIG_64BIT |
| 347 | .data | 350 | .data |
| 348 | 351 | ||
diff --git a/arch/parisc/kernel/hpmc.S b/arch/parisc/kernel/hpmc.S index c412c0adc4a9..d8baa158d8a0 100644 --- a/arch/parisc/kernel/hpmc.S +++ b/arch/parisc/kernel/hpmc.S | |||
| @@ -46,6 +46,8 @@ | |||
| 46 | #include <asm/assembly.h> | 46 | #include <asm/assembly.h> |
| 47 | #include <asm/pdc.h> | 47 | #include <asm/pdc.h> |
| 48 | 48 | ||
| 49 | #include <linux/linkage.h> | ||
| 50 | |||
| 49 | /* | 51 | /* |
| 50 | * stack for os_hpmc, the HPMC handler. | 52 | * stack for os_hpmc, the HPMC handler. |
| 51 | * buffer for IODC procedures (for the HPMC handler). | 53 | * buffer for IODC procedures (for the HPMC handler). |
| @@ -69,17 +71,15 @@ hpmc_raddr: | |||
| 69 | 71 | ||
| 70 | #define HPMC_PIM_DATA_SIZE 896 /* Enough to hold all architected 2.0 state */ | 72 | #define HPMC_PIM_DATA_SIZE 896 /* Enough to hold all architected 2.0 state */ |
| 71 | 73 | ||
| 72 | .export hpmc_pim_data, data | ||
| 73 | .align 8 | 74 | .align 8 |
| 74 | hpmc_pim_data: | 75 | ENTRY(hpmc_pim_data) |
| 75 | .block HPMC_PIM_DATA_SIZE | 76 | .block HPMC_PIM_DATA_SIZE |
| 77 | END(hpmc_pim_data) | ||
| 76 | 78 | ||
| 77 | .text | 79 | .text |
| 78 | 80 | ||
| 79 | .export os_hpmc, code | ||
| 80 | .import intr_save, code | 81 | .import intr_save, code |
| 81 | 82 | ENTRY(os_hpmc) | |
| 82 | os_hpmc: | ||
| 83 | 83 | ||
| 84 | /* | 84 | /* |
| 85 | * registers modified: | 85 | * registers modified: |
| @@ -294,11 +294,9 @@ os_hpmc_6: | |||
| 294 | 294 | ||
| 295 | b . | 295 | b . |
| 296 | nop | 296 | nop |
| 297 | ENDPROC(os_hpmc) | ||
| 297 | 298 | ||
| 298 | /* this label used to compute os_hpmc checksum */ | 299 | /* this label used to compute os_hpmc checksum */ |
| 299 | 300 | ENTRY(os_hpmc_end) | |
| 300 | .export os_hpmc_end, code | ||
| 301 | |||
| 302 | os_hpmc_end: | ||
| 303 | 301 | ||
| 304 | nop | 302 | nop |
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index 4e847ba53180..4845a6444633 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c | |||
| @@ -47,7 +47,7 @@ void __init setup_pdc(void) | |||
| 47 | struct pdc_system_map_mod_info module_result; | 47 | struct pdc_system_map_mod_info module_result; |
| 48 | struct pdc_module_path module_path; | 48 | struct pdc_module_path module_path; |
| 49 | struct pdc_model model; | 49 | struct pdc_model model; |
| 50 | #ifdef __LP64__ | 50 | #ifdef CONFIG_64BIT |
| 51 | struct pdc_pat_cell_num cell_info; | 51 | struct pdc_pat_cell_num cell_info; |
| 52 | #endif | 52 | #endif |
| 53 | 53 | ||
| @@ -73,7 +73,7 @@ void __init setup_pdc(void) | |||
| 73 | * clearer message. | 73 | * clearer message. |
| 74 | */ | 74 | */ |
| 75 | 75 | ||
| 76 | #ifdef __LP64__ | 76 | #ifdef CONFIG_64BIT |
| 77 | status = pdc_pat_cell_get_number(&cell_info); | 77 | status = pdc_pat_cell_get_number(&cell_info); |
| 78 | if (status == PDC_OK) { | 78 | if (status == PDC_OK) { |
| 79 | pdc_type = PDC_TYPE_PAT; | 79 | pdc_type = PDC_TYPE_PAT; |
| @@ -152,7 +152,7 @@ static void __init pagezero_memconfig(void) | |||
| 152 | npmem_ranges = 1; | 152 | npmem_ranges = 1; |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | #ifdef __LP64__ | 155 | #ifdef CONFIG_64BIT |
| 156 | 156 | ||
| 157 | /* All of the PDC PAT specific code is 64-bit only */ | 157 | /* All of the PDC PAT specific code is 64-bit only */ |
| 158 | 158 | ||
| @@ -408,13 +408,13 @@ static void __init sprockets_memconfig(void) | |||
| 408 | } | 408 | } |
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | #else /* !__LP64__ */ | 411 | #else /* !CONFIG_64BIT */ |
| 412 | 412 | ||
| 413 | #define pat_inventory() do { } while (0) | 413 | #define pat_inventory() do { } while (0) |
| 414 | #define pat_memconfig() do { } while (0) | 414 | #define pat_memconfig() do { } while (0) |
| 415 | #define sprockets_memconfig() pagezero_memconfig() | 415 | #define sprockets_memconfig() pagezero_memconfig() |
| 416 | 416 | ||
| 417 | #endif /* !__LP64__ */ | 417 | #endif /* !CONFIG_64BIT */ |
| 418 | 418 | ||
| 419 | 419 | ||
| 420 | #ifndef CONFIG_PA20 | 420 | #ifndef CONFIG_PA20 |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index b39c5b9aff46..e9d09b020e86 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
| @@ -336,11 +336,7 @@ unsigned int txn_alloc_data(unsigned int virt_irq) | |||
| 336 | 336 | ||
| 337 | static inline int eirr_to_irq(unsigned long eirr) | 337 | static inline int eirr_to_irq(unsigned long eirr) |
| 338 | { | 338 | { |
| 339 | #ifdef CONFIG_64BIT | 339 | int bit = fls_long(eirr); |
| 340 | int bit = fls64(eirr); | ||
| 341 | #else | ||
| 342 | int bit = fls(eirr); | ||
| 343 | #endif | ||
| 344 | return (BITS_PER_LONG - bit) + TIMER_IRQ; | 340 | return (BITS_PER_LONG - bit) + TIMER_IRQ; |
| 345 | } | 341 | } |
| 346 | 342 | ||
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index f50b982b0834..fdacdd4341c9 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #include <linux/fs.h> | 46 | #include <linux/fs.h> |
| 47 | #include <linux/string.h> | 47 | #include <linux/string.h> |
| 48 | #include <linux/kernel.h> | 48 | #include <linux/kernel.h> |
| 49 | #include <linux/bug.h> | ||
| 49 | 50 | ||
| 50 | #include <asm/unwind.h> | 51 | #include <asm/unwind.h> |
| 51 | 52 | ||
| @@ -96,7 +97,7 @@ static inline int in_local_section(struct module *me, void *loc, void *dot) | |||
| 96 | } | 97 | } |
| 97 | 98 | ||
| 98 | 99 | ||
| 99 | #ifndef __LP64__ | 100 | #ifndef CONFIG_64BIT |
| 100 | struct got_entry { | 101 | struct got_entry { |
| 101 | Elf32_Addr addr; | 102 | Elf32_Addr addr; |
| 102 | }; | 103 | }; |
| @@ -176,7 +177,7 @@ void *module_alloc(unsigned long size) | |||
| 176 | return vmalloc(size); | 177 | return vmalloc(size); |
| 177 | } | 178 | } |
| 178 | 179 | ||
| 179 | #ifndef __LP64__ | 180 | #ifndef CONFIG_64BIT |
| 180 | static inline unsigned long count_gots(const Elf_Rela *rela, unsigned long n) | 181 | static inline unsigned long count_gots(const Elf_Rela *rela, unsigned long n) |
| 181 | { | 182 | { |
| 182 | return 0; | 183 | return 0; |
| @@ -319,7 +320,7 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr, | |||
| 319 | return 0; | 320 | return 0; |
| 320 | } | 321 | } |
| 321 | 322 | ||
| 322 | #ifdef __LP64__ | 323 | #ifdef CONFIG_64BIT |
| 323 | static Elf64_Word get_got(struct module *me, unsigned long value, long addend) | 324 | static Elf64_Word get_got(struct module *me, unsigned long value, long addend) |
| 324 | { | 325 | { |
| 325 | unsigned int i; | 326 | unsigned int i; |
| @@ -342,9 +343,9 @@ static Elf64_Word get_got(struct module *me, unsigned long value, long addend) | |||
| 342 | value); | 343 | value); |
| 343 | return i * sizeof(struct got_entry); | 344 | return i * sizeof(struct got_entry); |
| 344 | } | 345 | } |
| 345 | #endif /* __LP64__ */ | 346 | #endif /* CONFIG_64BIT */ |
| 346 | 347 | ||
| 347 | #ifdef __LP64__ | 348 | #ifdef CONFIG_64BIT |
| 348 | static Elf_Addr get_fdesc(struct module *me, unsigned long value) | 349 | static Elf_Addr get_fdesc(struct module *me, unsigned long value) |
| 349 | { | 350 | { |
| 350 | Elf_Fdesc *fdesc = me->module_core + me->arch.fdesc_offset; | 351 | Elf_Fdesc *fdesc = me->module_core + me->arch.fdesc_offset; |
| @@ -368,7 +369,7 @@ static Elf_Addr get_fdesc(struct module *me, unsigned long value) | |||
| 368 | fdesc->gp = (Elf_Addr)me->module_core + me->arch.got_offset; | 369 | fdesc->gp = (Elf_Addr)me->module_core + me->arch.got_offset; |
| 369 | return (Elf_Addr)fdesc; | 370 | return (Elf_Addr)fdesc; |
| 370 | } | 371 | } |
| 371 | #endif /* __LP64__ */ | 372 | #endif /* CONFIG_64BIT */ |
| 372 | 373 | ||
| 373 | enum elf_stub_type { | 374 | enum elf_stub_type { |
| 374 | ELF_STUB_GOT, | 375 | ELF_STUB_GOT, |
| @@ -394,7 +395,7 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend, | |||
| 394 | i * sizeof(struct stub_entry); | 395 | i * sizeof(struct stub_entry); |
| 395 | } | 396 | } |
| 396 | 397 | ||
| 397 | #ifndef __LP64__ | 398 | #ifndef CONFIG_64BIT |
| 398 | /* for 32-bit the stub looks like this: | 399 | /* for 32-bit the stub looks like this: |
| 399 | * ldil L'XXX,%r1 | 400 | * ldil L'XXX,%r1 |
| 400 | * be,n R'XXX(%sr4,%r1) | 401 | * be,n R'XXX(%sr4,%r1) |
| @@ -472,7 +473,7 @@ int apply_relocate(Elf_Shdr *sechdrs, | |||
| 472 | return -ENOEXEC; | 473 | return -ENOEXEC; |
| 473 | } | 474 | } |
| 474 | 475 | ||
| 475 | #ifndef __LP64__ | 476 | #ifndef CONFIG_64BIT |
| 476 | int apply_relocate_add(Elf_Shdr *sechdrs, | 477 | int apply_relocate_add(Elf_Shdr *sechdrs, |
| 477 | const char *strtab, | 478 | const char *strtab, |
| 478 | unsigned int symindex, | 479 | unsigned int symindex, |
| @@ -822,7 +823,8 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
| 822 | me->name, strtab, symhdr); | 823 | me->name, strtab, symhdr); |
| 823 | 824 | ||
| 824 | if(me->arch.got_count > MAX_GOTS) { | 825 | if(me->arch.got_count > MAX_GOTS) { |
| 825 | printk(KERN_ERR "%s: Global Offset Table overflow (used %ld, allowed %d\n", me->name, me->arch.got_count, MAX_GOTS); | 826 | printk(KERN_ERR "%s: Global Offset Table overflow (used %ld, allowed %d)\n", |
| 827 | me->name, me->arch.got_count, MAX_GOTS); | ||
| 826 | return -EINVAL; | 828 | return -EINVAL; |
| 827 | } | 829 | } |
| 828 | 830 | ||
| @@ -850,10 +852,11 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
| 850 | nsyms = newptr - (Elf_Sym *)symhdr->sh_addr; | 852 | nsyms = newptr - (Elf_Sym *)symhdr->sh_addr; |
| 851 | DEBUGP("NEW num_symtab %lu\n", nsyms); | 853 | DEBUGP("NEW num_symtab %lu\n", nsyms); |
| 852 | symhdr->sh_size = nsyms * sizeof(Elf_Sym); | 854 | symhdr->sh_size = nsyms * sizeof(Elf_Sym); |
| 853 | return 0; | 855 | return module_bug_finalize(hdr, sechdrs, me); |
| 854 | } | 856 | } |
| 855 | 857 | ||
| 856 | void module_arch_cleanup(struct module *mod) | 858 | void module_arch_cleanup(struct module *mod) |
| 857 | { | 859 | { |
| 858 | deregister_unwind_table(mod); | 860 | deregister_unwind_table(mod); |
| 861 | module_bug_cleanup(mod); | ||
| 859 | } | 862 | } |
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S index e81c9937d10a..90b240878520 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
| @@ -27,31 +27,21 @@ | |||
| 27 | */ | 27 | */ |
| 28 | 28 | ||
| 29 | #ifdef CONFIG_64BIT | 29 | #ifdef CONFIG_64BIT |
| 30 | #define ADDIB addib,* | ||
| 31 | #define CMPB cmpb,* | ||
| 32 | #define ANDCM andcm,* | ||
| 33 | |||
| 34 | .level 2.0w | 30 | .level 2.0w |
| 35 | #else | 31 | #else |
| 36 | #define ADDIB addib, | ||
| 37 | #define CMPB cmpb, | ||
| 38 | #define ANDCM andcm | ||
| 39 | |||
| 40 | .level 2.0 | 32 | .level 2.0 |
| 41 | #endif | 33 | #endif |
| 42 | 34 | ||
| 43 | |||
| 44 | #include <asm/psw.h> | 35 | #include <asm/psw.h> |
| 45 | #include <asm/assembly.h> | 36 | #include <asm/assembly.h> |
| 46 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
| 47 | #include <asm/cache.h> | 38 | #include <asm/cache.h> |
| 39 | #include <linux/linkage.h> | ||
| 48 | 40 | ||
| 49 | .text | 41 | .text |
| 50 | .align 128 | 42 | .align 128 |
| 51 | 43 | ||
| 52 | .export flush_tlb_all_local,code | 44 | ENTRY(flush_tlb_all_local) |
| 53 | |||
| 54 | flush_tlb_all_local: | ||
| 55 | .proc | 45 | .proc |
| 56 | .callinfo NO_CALLS | 46 | .callinfo NO_CALLS |
| 57 | .entry | 47 | .entry |
| @@ -200,11 +190,11 @@ fdtdone: | |||
| 200 | 190 | ||
| 201 | .exit | 191 | .exit |
| 202 | .procend | 192 | .procend |
| 193 | ENDPROC(flush_tlb_all_local) | ||
| 203 | 194 | ||
| 204 | .export flush_instruction_cache_local,code | ||
| 205 | .import cache_info,data | 195 | .import cache_info,data |
| 206 | 196 | ||
| 207 | flush_instruction_cache_local: | 197 | ENTRY(flush_instruction_cache_local) |
| 208 | .proc | 198 | .proc |
| 209 | .callinfo NO_CALLS | 199 | .callinfo NO_CALLS |
| 210 | .entry | 200 | .entry |
| @@ -241,11 +231,11 @@ fisync: | |||
| 241 | .exit | 231 | .exit |
| 242 | 232 | ||
| 243 | .procend | 233 | .procend |
| 234 | ENDPROC(flush_instruction_cache_local) | ||
| 244 | 235 | ||
| 245 | .export flush_data_cache_local, code | ||
| 246 | .import cache_info, data | ||
| 247 | 236 | ||
| 248 | flush_data_cache_local: | 237 | .import cache_info, data |
| 238 | ENTRY(flush_data_cache_local) | ||
| 249 | .proc | 239 | .proc |
| 250 | .callinfo NO_CALLS | 240 | .callinfo NO_CALLS |
| 251 | .entry | 241 | .entry |
| @@ -283,11 +273,11 @@ fdsync: | |||
| 283 | .exit | 273 | .exit |
| 284 | 274 | ||
| 285 | .procend | 275 | .procend |
| 276 | ENDPROC(flush_data_cache_local) | ||
| 286 | 277 | ||
| 287 | .export copy_user_page_asm,code | ||
| 288 | .align 16 | 278 | .align 16 |
| 289 | 279 | ||
| 290 | copy_user_page_asm: | 280 | ENTRY(copy_user_page_asm) |
| 291 | .proc | 281 | .proc |
| 292 | .callinfo NO_CALLS | 282 | .callinfo NO_CALLS |
| 293 | .entry | 283 | .entry |
| @@ -409,6 +399,7 @@ copy_user_page_asm: | |||
| 409 | .exit | 399 | .exit |
| 410 | 400 | ||
| 411 | .procend | 401 | .procend |
| 402 | ENDPROC(copy_user_page_asm) | ||
| 412 | 403 | ||
| 413 | /* | 404 | /* |
| 414 | * NOTE: Code in clear_user_page has a hard coded dependency on the | 405 | * NOTE: Code in clear_user_page has a hard coded dependency on the |
| @@ -446,9 +437,7 @@ copy_user_page_asm: | |||
| 446 | * lobby for such a change. | 437 | * lobby for such a change. |
| 447 | */ | 438 | */ |
| 448 | 439 | ||
| 449 | .export copy_user_page_asm,code | 440 | ENTRY(copy_user_page_asm) |
| 450 | |||
| 451 | copy_user_page_asm: | ||
| 452 | .proc | 441 | .proc |
| 453 | .callinfo NO_CALLS | 442 | .callinfo NO_CALLS |
| 454 | .entry | 443 | .entry |
| @@ -534,11 +523,10 @@ copy_user_page_asm: | |||
| 534 | .exit | 523 | .exit |
| 535 | 524 | ||
| 536 | .procend | 525 | .procend |
| 526 | ENDPROC(copy_user_page_asm) | ||
| 537 | #endif | 527 | #endif |
| 538 | 528 | ||
| 539 | .export __clear_user_page_asm,code | 529 | ENTRY(__clear_user_page_asm) |
| 540 | |||
| 541 | __clear_user_page_asm: | ||
| 542 | .proc | 530 | .proc |
| 543 | .callinfo NO_CALLS | 531 | .callinfo NO_CALLS |
| 544 | .entry | 532 | .entry |
| @@ -618,10 +606,9 @@ __clear_user_page_asm: | |||
| 618 | .exit | 606 | .exit |
| 619 | 607 | ||
| 620 | .procend | 608 | .procend |
| 609 | ENDPROC(__clear_user_page_asm) | ||
| 621 | 610 | ||
| 622 | .export flush_kernel_dcache_page_asm | 611 | ENTRY(flush_kernel_dcache_page_asm) |
| 623 | |||
| 624 | flush_kernel_dcache_page_asm: | ||
| 625 | .proc | 612 | .proc |
| 626 | .callinfo NO_CALLS | 613 | .callinfo NO_CALLS |
| 627 | .entry | 614 | .entry |
| @@ -662,10 +649,9 @@ flush_kernel_dcache_page_asm: | |||
| 662 | .exit | 649 | .exit |
| 663 | 650 | ||
| 664 | .procend | 651 | .procend |
| 652 | ENDPROC(flush_kernel_dcache_page_asm) | ||
| 665 | 653 | ||
| 666 | .export flush_user_dcache_page | 654 | ENTRY(flush_user_dcache_page) |
| 667 | |||
| 668 | flush_user_dcache_page: | ||
| 669 | .proc | 655 | .proc |
| 670 | .callinfo NO_CALLS | 656 | .callinfo NO_CALLS |
| 671 | .entry | 657 | .entry |
| @@ -706,10 +692,9 @@ flush_user_dcache_page: | |||
| 706 | .exit | 692 | .exit |
| 707 | 693 | ||
| 708 | .procend | 694 | .procend |
| 695 | ENDPROC(flush_user_dcache_page) | ||
| 709 | 696 | ||
| 710 | .export flush_user_icache_page | 697 | ENTRY(flush_user_icache_page) |
| 711 | |||
| 712 | flush_user_icache_page: | ||
| 713 | .proc | 698 | .proc |
| 714 | .callinfo NO_CALLS | 699 | .callinfo NO_CALLS |
| 715 | .entry | 700 | .entry |
| @@ -750,11 +735,10 @@ flush_user_icache_page: | |||
| 750 | .exit | 735 | .exit |
| 751 | 736 | ||
| 752 | .procend | 737 | .procend |
| 738 | ENDPROC(flush_user_icache_page) | ||
| 753 | 739 | ||
| 754 | 740 | ||
| 755 | .export purge_kernel_dcache_page | 741 | ENTRY(purge_kernel_dcache_page) |
| 756 | |||
| 757 | purge_kernel_dcache_page: | ||
| 758 | .proc | 742 | .proc |
| 759 | .callinfo NO_CALLS | 743 | .callinfo NO_CALLS |
| 760 | .entry | 744 | .entry |
| @@ -794,15 +778,14 @@ purge_kernel_dcache_page: | |||
| 794 | .exit | 778 | .exit |
| 795 | 779 | ||
| 796 | .procend | 780 | .procend |
| 781 | ENDPROC(purge_kernel_dcache_page) | ||
| 797 | 782 | ||
| 798 | #if 0 | 783 | #if 0 |
| 799 | /* Currently not used, but it still is a possible alternate | 784 | /* Currently not used, but it still is a possible alternate |
| 800 | * solution. | 785 | * solution. |
| 801 | */ | 786 | */ |
| 802 | 787 | ||
| 803 | .export flush_alias_page | 788 | ENTRY(flush_alias_page) |
| 804 | |||
| 805 | flush_alias_page: | ||
| 806 | .proc | 789 | .proc |
| 807 | .callinfo NO_CALLS | 790 | .callinfo NO_CALLS |
| 808 | .entry | 791 | .entry |
| @@ -882,10 +865,9 @@ flush_user_dcache_range_asm: | |||
| 882 | .exit | 865 | .exit |
| 883 | 866 | ||
| 884 | .procend | 867 | .procend |
| 868 | ENDPROC(flush_alias_page) | ||
| 885 | 869 | ||
| 886 | .export flush_kernel_dcache_range_asm | 870 | ENTRY(flush_kernel_dcache_range_asm) |
| 887 | |||
| 888 | flush_kernel_dcache_range_asm: | ||
| 889 | .proc | 871 | .proc |
| 890 | .callinfo NO_CALLS | 872 | .callinfo NO_CALLS |
| 891 | .entry | 873 | .entry |
| @@ -905,10 +887,9 @@ flush_kernel_dcache_range_asm: | |||
| 905 | .exit | 887 | .exit |
| 906 | 888 | ||
| 907 | .procend | 889 | .procend |
| 890 | ENDPROC(flush_kernel_dcache_range_asm) | ||
| 908 | 891 | ||
| 909 | .export flush_user_icache_range_asm | 892 | ENTRY(flush_user_icache_range_asm) |
| 910 | |||
| 911 | flush_user_icache_range_asm: | ||
| 912 | .proc | 893 | .proc |
| 913 | .callinfo NO_CALLS | 894 | .callinfo NO_CALLS |
| 914 | .entry | 895 | .entry |
| @@ -927,10 +908,9 @@ flush_user_icache_range_asm: | |||
| 927 | .exit | 908 | .exit |
| 928 | 909 | ||
| 929 | .procend | 910 | .procend |
| 911 | ENDPROC(flush_user_icache_range_asm) | ||
| 930 | 912 | ||
| 931 | .export flush_kernel_icache_page | 913 | ENTRY(flush_kernel_icache_page) |
| 932 | |||
| 933 | flush_kernel_icache_page: | ||
| 934 | .proc | 914 | .proc |
| 935 | .callinfo NO_CALLS | 915 | .callinfo NO_CALLS |
| 936 | .entry | 916 | .entry |
| @@ -971,10 +951,9 @@ flush_kernel_icache_page: | |||
| 971 | .exit | 951 | .exit |
| 972 | 952 | ||
| 973 | .procend | 953 | .procend |
| 954 | ENDPROC(flush_kernel_icache_page) | ||
| 974 | 955 | ||
| 975 | .export flush_kernel_icache_range_asm | 956 | ENTRY(flush_kernel_icache_range_asm) |
| 976 | |||
| 977 | flush_kernel_icache_range_asm: | ||
| 978 | .proc | 957 | .proc |
| 979 | .callinfo NO_CALLS | 958 | .callinfo NO_CALLS |
| 980 | .entry | 959 | .entry |
| @@ -992,14 +971,13 @@ flush_kernel_icache_range_asm: | |||
| 992 | nop | 971 | nop |
| 993 | .exit | 972 | .exit |
| 994 | .procend | 973 | .procend |
| 974 | ENDPROC(flush_kernel_icache_range_asm) | ||
| 995 | 975 | ||
| 996 | /* align should cover use of rfi in disable_sr_hashing_asm and | 976 | /* align should cover use of rfi in disable_sr_hashing_asm and |
| 997 | * srdis_done. | 977 | * srdis_done. |
| 998 | */ | 978 | */ |
| 999 | .align 256 | 979 | .align 256 |
| 1000 | .export disable_sr_hashing_asm,code | 980 | ENTRY(disable_sr_hashing_asm) |
| 1001 | |||
| 1002 | disable_sr_hashing_asm: | ||
| 1003 | .proc | 981 | .proc |
| 1004 | .callinfo NO_CALLS | 982 | .callinfo NO_CALLS |
| 1005 | .entry | 983 | .entry |
| @@ -1088,5 +1066,6 @@ srdis_done: | |||
| 1088 | .exit | 1066 | .exit |
| 1089 | 1067 | ||
| 1090 | .procend | 1068 | .procend |
| 1069 | ENDPROC(disable_sr_hashing_asm) | ||
| 1091 | 1070 | ||
| 1092 | .end | 1071 | .end |
diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c index 8f6a0b312f7a..7aca704e96f0 100644 --- a/arch/parisc/kernel/parisc_ksyms.c +++ b/arch/parisc/kernel/parisc_ksyms.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * Copyright (C) 2001-2003 Grant Grundler <grundler with parisc-linux.org> | 7 | * Copyright (C) 2001-2003 Grant Grundler <grundler with parisc-linux.org> |
| 8 | * Copyright (C) 2002-2003 Matthew Wilcox <willy at parisc-linux.org> | 8 | * Copyright (C) 2002-2003 Matthew Wilcox <willy at parisc-linux.org> |
| 9 | * Copyright (C) 2002 Randolph Chung <tausq at parisc-linux.org> | 9 | * Copyright (C) 2002 Randolph Chung <tausq at parisc-linux.org> |
| 10 | * Copyright (C) 2002-2003 Helge Deller <deller with parisc-linux.org> | 10 | * Copyright (C) 2002-2007 Helge Deller <deller with parisc-linux.org> |
| 11 | * | 11 | * |
| 12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
| 13 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
| @@ -38,7 +38,7 @@ EXPORT_SYMBOL(__cmpxchg_u32); | |||
| 38 | #ifdef CONFIG_SMP | 38 | #ifdef CONFIG_SMP |
| 39 | EXPORT_SYMBOL(__atomic_hash); | 39 | EXPORT_SYMBOL(__atomic_hash); |
| 40 | #endif | 40 | #endif |
| 41 | #ifdef __LP64__ | 41 | #ifdef CONFIG_64BIT |
| 42 | EXPORT_SYMBOL(__xchg64); | 42 | EXPORT_SYMBOL(__xchg64); |
| 43 | EXPORT_SYMBOL(__cmpxchg_u64); | 43 | EXPORT_SYMBOL(__cmpxchg_u64); |
| 44 | #endif | 44 | #endif |
| @@ -58,7 +58,7 @@ EXPORT_SYMBOL(fixup_get_user_skip_2); | |||
| 58 | EXPORT_SYMBOL(fixup_put_user_skip_1); | 58 | EXPORT_SYMBOL(fixup_put_user_skip_1); |
| 59 | EXPORT_SYMBOL(fixup_put_user_skip_2); | 59 | EXPORT_SYMBOL(fixup_put_user_skip_2); |
| 60 | 60 | ||
| 61 | #ifndef __LP64__ | 61 | #ifndef CONFIG_64BIT |
| 62 | /* Needed so insmod can set dp value */ | 62 | /* Needed so insmod can set dp value */ |
| 63 | extern int $global$; | 63 | extern int $global$; |
| 64 | EXPORT_SYMBOL($global$); | 64 | EXPORT_SYMBOL($global$); |
| @@ -135,7 +135,7 @@ EXPORT_SYMBOL(__muldi3); | |||
| 135 | asmlinkage void * __canonicalize_funcptr_for_compare(void *); | 135 | asmlinkage void * __canonicalize_funcptr_for_compare(void *); |
| 136 | EXPORT_SYMBOL(__canonicalize_funcptr_for_compare); | 136 | EXPORT_SYMBOL(__canonicalize_funcptr_for_compare); |
| 137 | 137 | ||
| 138 | #ifdef __LP64__ | 138 | #ifdef CONFIG_64BIT |
| 139 | extern void __divdi3(void); | 139 | extern void __divdi3(void); |
| 140 | extern void __udivdi3(void); | 140 | extern void __udivdi3(void); |
| 141 | extern void __umoddi3(void); | 141 | extern void __umoddi3(void); |
| @@ -147,7 +147,7 @@ EXPORT_SYMBOL(__umoddi3); | |||
| 147 | EXPORT_SYMBOL(__moddi3); | 147 | EXPORT_SYMBOL(__moddi3); |
| 148 | #endif | 148 | #endif |
| 149 | 149 | ||
| 150 | #ifndef __LP64__ | 150 | #ifndef CONFIG_64BIT |
| 151 | extern void $$dyncall(void); | 151 | extern void $$dyncall(void); |
| 152 | EXPORT_SYMBOL($$dyncall); | 152 | EXPORT_SYMBOL($$dyncall); |
| 153 | #endif | 153 | #endif |
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index a6caf1073085..0c3aecb85a5c 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c | |||
| @@ -342,7 +342,7 @@ pcxl_dma_init(void) | |||
| 342 | pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL, | 342 | pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL, |
| 343 | get_order(pcxl_res_size)); | 343 | get_order(pcxl_res_size)); |
| 344 | memset(pcxl_res_map, 0, pcxl_res_size); | 344 | memset(pcxl_res_map, 0, pcxl_res_size); |
| 345 | proc_gsc_root = proc_mkdir("gsc", 0); | 345 | proc_gsc_root = proc_mkdir("gsc", NULL); |
| 346 | if (!proc_gsc_root) | 346 | if (!proc_gsc_root) |
| 347 | printk(KERN_WARNING | 347 | printk(KERN_WARNING |
| 348 | "pcxl_dma_init: Unable to create gsc /proc dir entry\n"); | 348 | "pcxl_dma_init: Unable to create gsc /proc dir entry\n"); |
diff --git a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c index 199887a61c76..563df0072dee 100644 --- a/arch/parisc/kernel/pci.c +++ b/arch/parisc/kernel/pci.c | |||
| @@ -200,8 +200,8 @@ static void | |||
| 200 | pcibios_link_hba_resources( struct resource *hba_res, struct resource *r) | 200 | pcibios_link_hba_resources( struct resource *hba_res, struct resource *r) |
| 201 | { | 201 | { |
| 202 | if (!r->parent) { | 202 | if (!r->parent) { |
| 203 | printk(KERN_EMERG "PCI: resource not parented! [%lx-%lx]\n", | 203 | printk(KERN_EMERG "PCI: resource not parented! [%p-%p]\n", |
| 204 | r->start, r->end); | 204 | (void*) r->start, (void*) r->end); |
| 205 | r->parent = hba_res; | 205 | r->parent = hba_res; |
| 206 | 206 | ||
| 207 | /* reverse link is harder *sigh* */ | 207 | /* reverse link is harder *sigh* */ |
diff --git a/arch/parisc/kernel/perf_asm.S b/arch/parisc/kernel/perf_asm.S index 5e7bb90e7e08..43874ca3ed67 100644 --- a/arch/parisc/kernel/perf_asm.S +++ b/arch/parisc/kernel/perf_asm.S | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include <asm/assembly.h> | 22 | #include <asm/assembly.h> |
| 23 | #include <linux/linkage.h> | ||
| 23 | 24 | ||
| 24 | #ifdef CONFIG_64BIT | 25 | #ifdef CONFIG_64BIT |
| 25 | .level 2.0w | 26 | .level 2.0w |
| @@ -41,10 +42,8 @@ | |||
| 41 | ; starting/stopping the coprocessor with the pmenb/pmdis. | 42 | ; starting/stopping the coprocessor with the pmenb/pmdis. |
| 42 | ; | 43 | ; |
| 43 | .text | 44 | .text |
| 44 | .align 32 | ||
| 45 | 45 | ||
| 46 | .export perf_intrigue_enable_perf_counters,code | 46 | ENTRY(perf_intrigue_enable_perf_counters) |
| 47 | perf_intrigue_enable_perf_counters: | ||
| 48 | .proc | 47 | .proc |
| 49 | .callinfo frame=0,NO_CALLS | 48 | .callinfo frame=0,NO_CALLS |
| 50 | .entry | 49 | .entry |
| @@ -69,9 +68,9 @@ perf_intrigue_enable_perf_counters: | |||
| 69 | nop | 68 | nop |
| 70 | .exit | 69 | .exit |
| 71 | .procend | 70 | .procend |
| 71 | ENDPROC(perf_intrigue_enable_perf_counters) | ||
| 72 | 72 | ||
| 73 | .export perf_intrigue_disable_perf_counters,code | 73 | ENTRY(perf_intrigue_disable_perf_counters) |
| 74 | perf_intrigue_disable_perf_counters: | ||
| 75 | .proc | 74 | .proc |
| 76 | .callinfo frame=0,NO_CALLS | 75 | .callinfo frame=0,NO_CALLS |
| 77 | .entry | 76 | .entry |
| @@ -86,6 +85,7 @@ perf_intrigue_disable_perf_counters: | |||
| 86 | mtctl %r26,ccr ; turn off performance coprocessor | 85 | mtctl %r26,ccr ; turn off performance coprocessor |
| 87 | .exit | 86 | .exit |
| 88 | .procend | 87 | .procend |
| 88 | ENDPROC(perf_intrigue_disable_perf_counters) | ||
| 89 | 89 | ||
| 90 | ;*********************************************************************** | 90 | ;*********************************************************************** |
| 91 | ;* | 91 | ;* |
| @@ -117,8 +117,7 @@ perf_intrigue_disable_perf_counters: | |||
| 117 | ;* | 117 | ;* |
| 118 | ;*********************************************************************** | 118 | ;*********************************************************************** |
| 119 | 119 | ||
| 120 | .export perf_rdr_shift_in_W,code | 120 | ENTRY(perf_rdr_shift_in_W) |
| 121 | perf_rdr_shift_in_W: | ||
| 122 | .proc | 121 | .proc |
| 123 | .callinfo frame=0,NO_CALLS | 122 | .callinfo frame=0,NO_CALLS |
| 124 | .entry | 123 | .entry |
| @@ -550,6 +549,7 @@ perf_rdr_shift_in_W_leave: | |||
| 550 | .exit | 549 | .exit |
| 551 | MTDIAG_2 (24) ; restore DR2 | 550 | MTDIAG_2 (24) ; restore DR2 |
| 552 | .procend | 551 | .procend |
| 552 | ENDPROC(perf_rdr_shift_in_W) | ||
| 553 | 553 | ||
| 554 | 554 | ||
| 555 | ;*********************************************************************** | 555 | ;*********************************************************************** |
| @@ -575,8 +575,7 @@ perf_rdr_shift_in_W_leave: | |||
| 575 | ;* | 575 | ;* |
| 576 | ;*********************************************************************** | 576 | ;*********************************************************************** |
| 577 | 577 | ||
| 578 | .export perf_rdr_shift_out_W,code | 578 | ENTRY(perf_rdr_shift_out_W) |
| 579 | perf_rdr_shift_out_W: | ||
| 580 | .proc | 579 | .proc |
| 581 | .callinfo frame=0,NO_CALLS | 580 | .callinfo frame=0,NO_CALLS |
| 582 | .entry | 581 | .entry |
| @@ -983,6 +982,7 @@ perf_rdr_shift_out_W_leave: | |||
| 983 | .exit | 982 | .exit |
| 984 | MTDIAG_2 (23) ; restore DR2 | 983 | MTDIAG_2 (23) ; restore DR2 |
| 985 | .procend | 984 | .procend |
| 985 | ENDPROC(perf_rdr_shift_out_W) | ||
| 986 | 986 | ||
| 987 | 987 | ||
| 988 | ;*********************************************************************** | 988 | ;*********************************************************************** |
| @@ -1012,8 +1012,7 @@ perf_rdr_shift_out_W_leave: | |||
| 1012 | ;* | 1012 | ;* |
| 1013 | ;*********************************************************************** | 1013 | ;*********************************************************************** |
| 1014 | 1014 | ||
| 1015 | .export perf_rdr_shift_in_U,code | 1015 | ENTRY(perf_rdr_shift_in_U) |
| 1016 | perf_rdr_shift_in_U: | ||
| 1017 | .proc | 1016 | .proc |
| 1018 | .callinfo frame=0,NO_CALLS | 1017 | .callinfo frame=0,NO_CALLS |
| 1019 | .entry | 1018 | .entry |
| @@ -1343,6 +1342,7 @@ perf_rdr_shift_in_U_leave: | |||
| 1343 | .exit | 1342 | .exit |
| 1344 | MTDIAG_2 (24) ; restore DR2 | 1343 | MTDIAG_2 (24) ; restore DR2 |
| 1345 | .procend | 1344 | .procend |
| 1345 | ENDPROC(perf_rdr_shift_in_U) | ||
| 1346 | 1346 | ||
| 1347 | ;*********************************************************************** | 1347 | ;*********************************************************************** |
| 1348 | ;* | 1348 | ;* |
| @@ -1369,8 +1369,7 @@ perf_rdr_shift_in_U_leave: | |||
| 1369 | ;* | 1369 | ;* |
| 1370 | ;*********************************************************************** | 1370 | ;*********************************************************************** |
| 1371 | 1371 | ||
| 1372 | .export perf_rdr_shift_out_U,code | 1372 | ENTRY(perf_rdr_shift_out_U) |
| 1373 | perf_rdr_shift_out_U: | ||
| 1374 | .proc | 1373 | .proc |
| 1375 | .callinfo frame=0,NO_CALLS | 1374 | .callinfo frame=0,NO_CALLS |
| 1376 | .entry | 1375 | .entry |
| @@ -1687,4 +1686,5 @@ perf_rdr_shift_out_U_leave: | |||
| 1687 | .exit | 1686 | .exit |
| 1688 | MTDIAG_2 (23) ; restore DR2 | 1687 | MTDIAG_2 (23) ; restore DR2 |
| 1689 | .procend | 1688 | .procend |
| 1689 | ENDPROC(perf_rdr_shift_out_U) | ||
| 1690 | 1690 | ||
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index 2f9f9dfa66f7..0dd3847f494c 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> | 13 | * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> |
| 14 | * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> | 14 | * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> |
| 15 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> | 15 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> |
| 16 | * Copyright (C) 2001-2002 Helge Deller <deller at parisc-linux.org> | 16 | * Copyright (C) 2001-2007 Helge Deller <deller at parisc-linux.org> |
| 17 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> | 17 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
| 18 | * | 18 | * |
| 19 | * | 19 | * |
| @@ -303,7 +303,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
| 303 | * Copy function and argument to be called from | 303 | * Copy function and argument to be called from |
| 304 | * ret_from_kernel_thread. | 304 | * ret_from_kernel_thread. |
| 305 | */ | 305 | */ |
| 306 | #ifdef __LP64__ | 306 | #ifdef CONFIG_64BIT |
| 307 | cregs->gr[27] = pregs->gr[27]; | 307 | cregs->gr[27] = pregs->gr[27]; |
| 308 | #endif | 308 | #endif |
| 309 | cregs->gr[26] = pregs->gr[26]; | 309 | cregs->gr[26] = pregs->gr[26]; |
| @@ -355,8 +355,8 @@ asmlinkage int sys_execve(struct pt_regs *regs) | |||
| 355 | error = PTR_ERR(filename); | 355 | error = PTR_ERR(filename); |
| 356 | if (IS_ERR(filename)) | 356 | if (IS_ERR(filename)) |
| 357 | goto out; | 357 | goto out; |
| 358 | error = do_execve(filename, (char __user **) regs->gr[25], | 358 | error = do_execve(filename, (char __user * __user *) regs->gr[25], |
| 359 | (char __user **) regs->gr[24], regs); | 359 | (char __user * __user *) regs->gr[24], regs); |
| 360 | if (error == 0) { | 360 | if (error == 0) { |
| 361 | task_lock(current); | 361 | task_lock(current); |
| 362 | current->ptrace &= ~PT_DTRACE; | 362 | current->ptrace &= ~PT_DTRACE; |
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index fb81e5687e7c..7c056dcebf55 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
| @@ -93,7 +93,7 @@ static int __init processor_probe(struct parisc_device *dev) | |||
| 93 | cpuid = boot_cpu_data.cpu_count; | 93 | cpuid = boot_cpu_data.cpu_count; |
| 94 | txn_addr = dev->hpa.start; /* for legacy PDC */ | 94 | txn_addr = dev->hpa.start; /* for legacy PDC */ |
| 95 | 95 | ||
| 96 | #ifdef __LP64__ | 96 | #ifdef CONFIG_64BIT |
| 97 | if (is_pdc_pat()) { | 97 | if (is_pdc_pat()) { |
| 98 | ulong status; | 98 | ulong status; |
| 99 | unsigned long bytecnt; | 99 | unsigned long bytecnt; |
| @@ -153,8 +153,6 @@ static int __init processor_probe(struct parisc_device *dev) | |||
| 153 | p->cpuid = cpuid; /* save CPU id */ | 153 | p->cpuid = cpuid; /* save CPU id */ |
| 154 | p->txn_addr = txn_addr; /* save CPU IRQ address */ | 154 | p->txn_addr = txn_addr; /* save CPU IRQ address */ |
| 155 | #ifdef CONFIG_SMP | 155 | #ifdef CONFIG_SMP |
| 156 | spin_lock_init(&p->lock); | ||
| 157 | |||
| 158 | /* | 156 | /* |
| 159 | ** FIXME: review if any other initialization is clobbered | 157 | ** FIXME: review if any other initialization is clobbered |
| 160 | ** for boot_cpu by the above memset(). | 158 | ** for boot_cpu by the above memset(). |
| @@ -311,11 +309,11 @@ int __init init_per_cpu(int cpunum) | |||
| 311 | } else { | 309 | } else { |
| 312 | printk(KERN_WARNING "WARNING: No FP CoProcessor?!" | 310 | printk(KERN_WARNING "WARNING: No FP CoProcessor?!" |
| 313 | " (coproc_cfg.ccr_functional == 0x%lx, expected 0xc0)\n" | 311 | " (coproc_cfg.ccr_functional == 0x%lx, expected 0xc0)\n" |
| 314 | #ifdef __LP64__ | 312 | #ifdef CONFIG_64BIT |
| 315 | "Halting Machine - FP required\n" | 313 | "Halting Machine - FP required\n" |
| 316 | #endif | 314 | #endif |
| 317 | , coproc_cfg.ccr_functional); | 315 | , coproc_cfg.ccr_functional); |
| 318 | #ifdef __LP64__ | 316 | #ifdef CONFIG_64BIT |
| 319 | mdelay(100); /* previous chars get pushed to console */ | 317 | mdelay(100); /* previous chars get pushed to console */ |
| 320 | panic("FP CoProc not reported"); | 318 | panic("FP CoProc not reported"); |
| 321 | #endif | 319 | #endif |
| @@ -339,9 +337,6 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
| 339 | #ifdef CONFIG_SMP | 337 | #ifdef CONFIG_SMP |
| 340 | if (0 == cpu_data[n].hpa) | 338 | if (0 == cpu_data[n].hpa) |
| 341 | continue; | 339 | continue; |
| 342 | #ifdef ENTRY_SYS_CPUS | ||
| 343 | #error iCOD support wants to show CPU state here | ||
| 344 | #endif | ||
| 345 | #endif | 340 | #endif |
| 346 | seq_printf(m, "processor\t: %d\n" | 341 | seq_printf(m, "processor\t: %d\n" |
| 347 | "cpu family\t: PA-RISC %s\n", | 342 | "cpu family\t: PA-RISC %s\n", |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 3f28de974556..0d0d617b6f21 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | #define DBG(x...) | 36 | #define DBG(x...) |
| 37 | #endif | 37 | #endif |
| 38 | 38 | ||
| 39 | #ifdef __LP64__ | 39 | #ifdef CONFIG_64BIT |
| 40 | 40 | ||
| 41 | /* This function is needed to translate 32 bit pt_regs offsets in to | 41 | /* This function is needed to translate 32 bit pt_regs offsets in to |
| 42 | * 64 bit pt_regs offsets. For example, a 32 bit gdb under a 64 bit kernel | 42 | * 64 bit pt_regs offsets. For example, a 32 bit gdb under a 64 bit kernel |
| @@ -90,7 +90,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 90 | case PTRACE_PEEKDATA: { | 90 | case PTRACE_PEEKDATA: { |
| 91 | int copied; | 91 | int copied; |
| 92 | 92 | ||
| 93 | #ifdef __LP64__ | 93 | #ifdef CONFIG_64BIT |
| 94 | if (__is_compat_task(child)) { | 94 | if (__is_compat_task(child)) { |
| 95 | unsigned int tmp; | 95 | unsigned int tmp; |
| 96 | 96 | ||
| @@ -122,7 +122,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 122 | case PTRACE_POKETEXT: /* write the word at location addr. */ | 122 | case PTRACE_POKETEXT: /* write the word at location addr. */ |
| 123 | case PTRACE_POKEDATA: | 123 | case PTRACE_POKEDATA: |
| 124 | ret = 0; | 124 | ret = 0; |
| 125 | #ifdef __LP64__ | 125 | #ifdef CONFIG_64BIT |
| 126 | if (__is_compat_task(child)) { | 126 | if (__is_compat_task(child)) { |
| 127 | unsigned int tmp = (unsigned int)data; | 127 | unsigned int tmp = (unsigned int)data; |
| 128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", | 128 | DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", |
| @@ -145,7 +145,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 145 | processes, the kernel saves all regs on a syscall. */ | 145 | processes, the kernel saves all regs on a syscall. */ |
| 146 | case PTRACE_PEEKUSR: { | 146 | case PTRACE_PEEKUSR: { |
| 147 | ret = -EIO; | 147 | ret = -EIO; |
| 148 | #ifdef __LP64__ | 148 | #ifdef CONFIG_64BIT |
| 149 | if (__is_compat_task(child)) { | 149 | if (__is_compat_task(child)) { |
| 150 | unsigned int tmp; | 150 | unsigned int tmp; |
| 151 | 151 | ||
| @@ -204,7 +204,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 204 | ret = 0; | 204 | ret = 0; |
| 205 | goto out_tsk; | 205 | goto out_tsk; |
| 206 | } | 206 | } |
| 207 | #ifdef __LP64__ | 207 | #ifdef CONFIG_64BIT |
| 208 | if (__is_compat_task(child)) { | 208 | if (__is_compat_task(child)) { |
| 209 | if (addr & (sizeof(int)-1)) | 209 | if (addr & (sizeof(int)-1)) |
| 210 | goto out_tsk; | 210 | goto out_tsk; |
diff --git a/arch/parisc/kernel/real2.S b/arch/parisc/kernel/real2.S index 789061f6ceb4..7a92695d95a6 100644 --- a/arch/parisc/kernel/real2.S +++ b/arch/parisc/kernel/real2.S | |||
| @@ -11,6 +11,8 @@ | |||
| 11 | #include <asm/psw.h> | 11 | #include <asm/psw.h> |
| 12 | #include <asm/assembly.h> | 12 | #include <asm/assembly.h> |
| 13 | 13 | ||
| 14 | #include <linux/linkage.h> | ||
| 15 | |||
| 14 | .section .bss | 16 | .section .bss |
| 15 | .export real_stack | 17 | .export real_stack |
| 16 | .export real32_stack | 18 | .export real32_stack |
| @@ -39,8 +41,6 @@ save_cr_end: | |||
| 39 | 41 | ||
| 40 | .text | 42 | .text |
| 41 | 43 | ||
| 42 | .export real32_call_asm | ||
| 43 | |||
| 44 | /* unsigned long real32_call_asm(unsigned int *sp, | 44 | /* unsigned long real32_call_asm(unsigned int *sp, |
| 45 | * unsigned int *arg0p, | 45 | * unsigned int *arg0p, |
| 46 | * unsigned int iodc_fn) | 46 | * unsigned int iodc_fn) |
| @@ -49,7 +49,7 @@ save_cr_end: | |||
| 49 | * iodc_fn is the IODC function to call | 49 | * iodc_fn is the IODC function to call |
| 50 | */ | 50 | */ |
| 51 | 51 | ||
| 52 | real32_call_asm: | 52 | ENTRY(real32_call_asm) |
| 53 | STREG %rp, -RP_OFFSET(%sp) /* save RP */ | 53 | STREG %rp, -RP_OFFSET(%sp) /* save RP */ |
| 54 | #ifdef CONFIG_64BIT | 54 | #ifdef CONFIG_64BIT |
| 55 | callee_save | 55 | callee_save |
| @@ -107,6 +107,7 @@ ric_ret: | |||
| 107 | LDREG -RP_OFFSET(%sp), %rp /* restore RP */ | 107 | LDREG -RP_OFFSET(%sp), %rp /* restore RP */ |
| 108 | bv 0(%rp) | 108 | bv 0(%rp) |
| 109 | nop | 109 | nop |
| 110 | ENDPROC(real32_call_asm) | ||
| 110 | 111 | ||
| 111 | 112 | ||
| 112 | # define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) | 113 | # define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where) |
| @@ -218,7 +219,6 @@ rfi_r2v_1: | |||
| 218 | /************************ 64-bit real-mode calls ***********************/ | 219 | /************************ 64-bit real-mode calls ***********************/ |
| 219 | /* This is only usable in wide kernels right now and will probably stay so */ | 220 | /* This is only usable in wide kernels right now and will probably stay so */ |
| 220 | .text | 221 | .text |
| 221 | .export real64_call_asm | ||
| 222 | /* unsigned long real64_call_asm(unsigned long *sp, | 222 | /* unsigned long real64_call_asm(unsigned long *sp, |
| 223 | * unsigned long *arg0p, | 223 | * unsigned long *arg0p, |
| 224 | * unsigned long fn) | 224 | * unsigned long fn) |
| @@ -226,7 +226,7 @@ rfi_r2v_1: | |||
| 226 | * arg0p points to where saved arg values may be found | 226 | * arg0p points to where saved arg values may be found |
| 227 | * iodc_fn is the IODC function to call | 227 | * iodc_fn is the IODC function to call |
| 228 | */ | 228 | */ |
| 229 | real64_call_asm: | 229 | ENTRY(real64_call_asm) |
| 230 | std %rp, -0x10(%sp) /* save RP */ | 230 | std %rp, -0x10(%sp) /* save RP */ |
| 231 | std %sp, -8(%arg0) /* save SP on real-mode stack */ | 231 | std %sp, -8(%arg0) /* save SP on real-mode stack */ |
| 232 | copy %arg0, %sp /* adopt the real-mode SP */ | 232 | copy %arg0, %sp /* adopt the real-mode SP */ |
| @@ -272,19 +272,21 @@ r64_ret: | |||
| 272 | ldd -0x10(%sp), %rp /* restore RP */ | 272 | ldd -0x10(%sp), %rp /* restore RP */ |
| 273 | bv 0(%rp) | 273 | bv 0(%rp) |
| 274 | nop | 274 | nop |
| 275 | ENDPROC(real64_call_asm) | ||
| 275 | 276 | ||
| 276 | #endif | 277 | #endif |
| 277 | 278 | ||
| 278 | .export __canonicalize_funcptr_for_compare | ||
| 279 | .text | 279 | .text |
| 280 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html | 280 | /* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html |
| 281 | ** GCC 3.3 and later has a new function in libgcc.a for | 281 | ** GCC 3.3 and later has a new function in libgcc.a for |
| 282 | ** comparing function pointers. | 282 | ** comparing function pointers. |
| 283 | */ | 283 | */ |
| 284 | __canonicalize_funcptr_for_compare: | 284 | ENTRY(__canonicalize_funcptr_for_compare) |
| 285 | #ifdef CONFIG_64BIT | 285 | #ifdef CONFIG_64BIT |
| 286 | bve (%r2) | 286 | bve (%r2) |
| 287 | #else | 287 | #else |
| 288 | bv %r0(%r2) | 288 | bv %r0(%r2) |
| 289 | #endif | 289 | #endif |
| 290 | copy %r26,%r28 | 290 | copy %r26,%r28 |
| 291 | ENDPROC(__canonicalize_funcptr_for_compare) | ||
| 292 | |||
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 74b3686dd1e0..bd2116e03f34 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c | |||
| @@ -120,13 +120,13 @@ extern void collect_boot_cpu_data(void); | |||
| 120 | 120 | ||
| 121 | void __init setup_arch(char **cmdline_p) | 121 | void __init setup_arch(char **cmdline_p) |
| 122 | { | 122 | { |
| 123 | #ifdef __LP64__ | 123 | #ifdef CONFIG_64BIT |
| 124 | extern int parisc_narrow_firmware; | 124 | extern int parisc_narrow_firmware; |
| 125 | #endif | 125 | #endif |
| 126 | 126 | ||
| 127 | init_per_cpu(smp_processor_id()); /* Set Modes & Enable FP */ | 127 | init_per_cpu(smp_processor_id()); /* Set Modes & Enable FP */ |
| 128 | 128 | ||
| 129 | #ifdef __LP64__ | 129 | #ifdef CONFIG_64BIT |
| 130 | printk(KERN_INFO "The 64-bit Kernel has started...\n"); | 130 | printk(KERN_INFO "The 64-bit Kernel has started...\n"); |
| 131 | #else | 131 | #else |
| 132 | printk(KERN_INFO "The 32-bit Kernel has started...\n"); | 132 | printk(KERN_INFO "The 32-bit Kernel has started...\n"); |
| @@ -134,7 +134,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 134 | 134 | ||
| 135 | pdc_console_init(); | 135 | pdc_console_init(); |
| 136 | 136 | ||
| 137 | #ifdef __LP64__ | 137 | #ifdef CONFIG_64BIT |
| 138 | if(parisc_narrow_firmware) { | 138 | if(parisc_narrow_firmware) { |
| 139 | printk(KERN_INFO "Kernel is using PDC in 32-bit mode.\n"); | 139 | printk(KERN_INFO "Kernel is using PDC in 32-bit mode.\n"); |
| 140 | } | 140 | } |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index ee6653edeb7a..9784e405f849 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -59,58 +59,13 @@ | |||
| 59 | * this. */ | 59 | * this. */ |
| 60 | #define A(__x) ((unsigned long)(__x)) | 60 | #define A(__x) ((unsigned long)(__x)) |
| 61 | 61 | ||
| 62 | int do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall); | ||
| 63 | |||
| 64 | /* | 62 | /* |
| 65 | * Atomically swap in the new signal mask, and wait for a signal. | 63 | * Atomically swap in the new signal mask, and wait for a signal. |
| 66 | */ | 64 | */ |
| 67 | #ifdef __LP64__ | 65 | #ifdef CONFIG_64BIT |
| 68 | #include "sys32.h" | 66 | #include "sys32.h" |
| 69 | #endif | 67 | #endif |
| 70 | 68 | ||
| 71 | asmlinkage int | ||
| 72 | sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *regs) | ||
| 73 | { | ||
| 74 | sigset_t saveset, newset; | ||
| 75 | #ifdef __LP64__ | ||
| 76 | compat_sigset_t newset32; | ||
| 77 | |||
| 78 | if (is_compat_task()) { | ||
| 79 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 80 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 81 | return -EINVAL; | ||
| 82 | if (copy_from_user(&newset32, (compat_sigset_t __user *)unewset, sizeof(newset32))) | ||
| 83 | return -EFAULT; | ||
| 84 | sigset_32to64(&newset,&newset32); | ||
| 85 | |||
| 86 | } else | ||
| 87 | #endif | ||
| 88 | { | ||
| 89 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 90 | if (sigsetsize != sizeof(sigset_t)) | ||
| 91 | return -EINVAL; | ||
| 92 | |||
| 93 | if (copy_from_user(&newset, unewset, sizeof(newset))) | ||
| 94 | return -EFAULT; | ||
| 95 | } | ||
| 96 | |||
| 97 | sigdelsetmask(&newset, ~_BLOCKABLE); | ||
| 98 | |||
| 99 | spin_lock_irq(¤t->sighand->siglock); | ||
| 100 | saveset = current->blocked; | ||
| 101 | current->blocked = newset; | ||
| 102 | recalc_sigpending(); | ||
| 103 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 104 | |||
| 105 | regs->gr[28] = -EINTR; | ||
| 106 | while (1) { | ||
| 107 | current->state = TASK_INTERRUPTIBLE; | ||
| 108 | schedule(); | ||
| 109 | if (do_signal(&saveset, regs, 1)) | ||
| 110 | return -EINTR; | ||
| 111 | } | ||
| 112 | } | ||
| 113 | |||
| 114 | /* | 69 | /* |
| 115 | * Do a signal return - restore sigcontext. | 70 | * Do a signal return - restore sigcontext. |
| 116 | */ | 71 | */ |
| @@ -148,7 +103,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 148 | sigset_t set; | 103 | sigset_t set; |
| 149 | unsigned long usp = (regs->gr[30] & ~(0x01UL)); | 104 | unsigned long usp = (regs->gr[30] & ~(0x01UL)); |
| 150 | unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE; | 105 | unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE; |
| 151 | #ifdef __LP64__ | 106 | #ifdef CONFIG_64BIT |
| 152 | compat_sigset_t compat_set; | 107 | compat_sigset_t compat_set; |
| 153 | struct compat_rt_sigframe __user * compat_frame; | 108 | struct compat_rt_sigframe __user * compat_frame; |
| 154 | 109 | ||
| @@ -162,7 +117,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 162 | (usp - sigframe_size); | 117 | (usp - sigframe_size); |
| 163 | DBG(2,"sys_rt_sigreturn: frame is %p\n", frame); | 118 | DBG(2,"sys_rt_sigreturn: frame is %p\n", frame); |
| 164 | 119 | ||
| 165 | #ifdef __LP64__ | 120 | #ifdef CONFIG_64BIT |
| 166 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 121 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
| 167 | 122 | ||
| 168 | if (is_compat_task()) { | 123 | if (is_compat_task()) { |
| @@ -184,7 +139,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 184 | spin_unlock_irq(¤t->sighand->siglock); | 139 | spin_unlock_irq(¤t->sighand->siglock); |
| 185 | 140 | ||
| 186 | /* Good thing we saved the old gr[30], eh? */ | 141 | /* Good thing we saved the old gr[30], eh? */ |
| 187 | #ifdef __LP64__ | 142 | #ifdef CONFIG_64BIT |
| 188 | if (is_compat_task()) { | 143 | if (is_compat_task()) { |
| 189 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", | 144 | DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n", |
| 190 | &compat_frame->uc.uc_mcontext); | 145 | &compat_frame->uc.uc_mcontext); |
| @@ -296,7 +251,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 296 | unsigned long rp, usp; | 251 | unsigned long rp, usp; |
| 297 | unsigned long haddr, sigframe_size; | 252 | unsigned long haddr, sigframe_size; |
| 298 | int err = 0; | 253 | int err = 0; |
| 299 | #ifdef __LP64__ | 254 | #ifdef CONFIG_64BIT |
| 300 | compat_int_t compat_val; | 255 | compat_int_t compat_val; |
| 301 | struct compat_rt_sigframe __user * compat_frame; | 256 | struct compat_rt_sigframe __user * compat_frame; |
| 302 | compat_sigset_t compat_set; | 257 | compat_sigset_t compat_set; |
| @@ -310,7 +265,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 310 | DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info); | 265 | DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info); |
| 311 | 266 | ||
| 312 | 267 | ||
| 313 | #ifdef __LP64__ | 268 | #ifdef CONFIG_64BIT |
| 314 | 269 | ||
| 315 | compat_frame = (struct compat_rt_sigframe __user *)frame; | 270 | compat_frame = (struct compat_rt_sigframe __user *)frame; |
| 316 | 271 | ||
| @@ -390,7 +345,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 390 | 345 | ||
| 391 | haddr = A(ka->sa.sa_handler); | 346 | haddr = A(ka->sa.sa_handler); |
| 392 | /* The sa_handler may be a pointer to a function descriptor */ | 347 | /* The sa_handler may be a pointer to a function descriptor */ |
| 393 | #ifdef __LP64__ | 348 | #ifdef CONFIG_64BIT |
| 394 | if (is_compat_task()) { | 349 | if (is_compat_task()) { |
| 395 | #endif | 350 | #endif |
| 396 | if (haddr & PA_PLABEL_FDESC) { | 351 | if (haddr & PA_PLABEL_FDESC) { |
| @@ -405,7 +360,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 405 | haddr = fdesc.addr; | 360 | haddr = fdesc.addr; |
| 406 | regs->gr[19] = fdesc.gp; | 361 | regs->gr[19] = fdesc.gp; |
| 407 | } | 362 | } |
| 408 | #ifdef __LP64__ | 363 | #ifdef CONFIG_64BIT |
| 409 | } else { | 364 | } else { |
| 410 | Elf64_Fdesc fdesc; | 365 | Elf64_Fdesc fdesc; |
| 411 | Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3); | 366 | Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3); |
| @@ -425,19 +380,19 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 425 | /* The syscall return path will create IAOQ values from r31. | 380 | /* The syscall return path will create IAOQ values from r31. |
| 426 | */ | 381 | */ |
| 427 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; | 382 | sigframe_size = PARISC_RT_SIGFRAME_SIZE; |
| 428 | #ifdef __LP64__ | 383 | #ifdef CONFIG_64BIT |
| 429 | if (is_compat_task()) | 384 | if (is_compat_task()) |
| 430 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; | 385 | sigframe_size = PARISC_RT_SIGFRAME_SIZE32; |
| 431 | #endif | 386 | #endif |
| 432 | if (in_syscall) { | 387 | if (in_syscall) { |
| 433 | regs->gr[31] = haddr; | 388 | regs->gr[31] = haddr; |
| 434 | #ifdef __LP64__ | 389 | #ifdef CONFIG_64BIT |
| 435 | if (!test_thread_flag(TIF_32BIT)) | 390 | if (!test_thread_flag(TIF_32BIT)) |
| 436 | sigframe_size |= 1; | 391 | sigframe_size |= 1; |
| 437 | #endif | 392 | #endif |
| 438 | } else { | 393 | } else { |
| 439 | unsigned long psw = USER_PSW; | 394 | unsigned long psw = USER_PSW; |
| 440 | #ifdef __LP64__ | 395 | #ifdef CONFIG_64BIT |
| 441 | if (!test_thread_flag(TIF_32BIT)) | 396 | if (!test_thread_flag(TIF_32BIT)) |
| 442 | psw |= PSW_W; | 397 | psw |= PSW_W; |
| 443 | #endif | 398 | #endif |
| @@ -462,7 +417,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 462 | regs->gr[2] = rp; /* userland return pointer */ | 417 | regs->gr[2] = rp; /* userland return pointer */ |
| 463 | regs->gr[26] = sig; /* signal number */ | 418 | regs->gr[26] = sig; /* signal number */ |
| 464 | 419 | ||
| 465 | #ifdef __LP64__ | 420 | #ifdef CONFIG_64BIT |
| 466 | if (is_compat_task()) { | 421 | if (is_compat_task()) { |
| 467 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ | 422 | regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */ |
| 468 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ | 423 | regs->gr[24] = A(&compat_frame->uc); /* ucontext pointer */ |
| @@ -516,6 +471,97 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 516 | return 1; | 471 | return 1; |
| 517 | } | 472 | } |
| 518 | 473 | ||
| 474 | static inline void | ||
| 475 | syscall_restart(struct pt_regs *regs, struct k_sigaction *ka) | ||
| 476 | { | ||
| 477 | /* Check the return code */ | ||
| 478 | switch (regs->gr[28]) { | ||
| 479 | case -ERESTART_RESTARTBLOCK: | ||
| 480 | current_thread_info()->restart_block.fn = | ||
| 481 | do_no_restart_syscall; | ||
| 482 | case -ERESTARTNOHAND: | ||
| 483 | DBG(1,"ERESTARTNOHAND: returning -EINTR\n"); | ||
| 484 | regs->gr[28] = -EINTR; | ||
| 485 | break; | ||
| 486 | |||
| 487 | case -ERESTARTSYS: | ||
| 488 | if (!(ka->sa.sa_flags & SA_RESTART)) { | ||
| 489 | DBG(1,"ERESTARTSYS: putting -EINTR\n"); | ||
| 490 | regs->gr[28] = -EINTR; | ||
| 491 | break; | ||
| 492 | } | ||
| 493 | /* fallthrough */ | ||
| 494 | case -ERESTARTNOINTR: | ||
| 495 | /* A syscall is just a branch, so all | ||
| 496 | * we have to do is fiddle the return pointer. | ||
| 497 | */ | ||
| 498 | regs->gr[31] -= 8; /* delayed branching */ | ||
| 499 | /* Preserve original r28. */ | ||
| 500 | regs->gr[28] = regs->orig_r28; | ||
| 501 | break; | ||
| 502 | } | ||
| 503 | } | ||
| 504 | |||
| 505 | static inline void | ||
| 506 | insert_restart_trampoline(struct pt_regs *regs) | ||
| 507 | { | ||
| 508 | switch(regs->gr[28]) { | ||
| 509 | case -ERESTART_RESTARTBLOCK: { | ||
| 510 | /* Restart the system call - no handlers present */ | ||
| 511 | unsigned int *usp = (unsigned int *)regs->gr[30]; | ||
| 512 | |||
| 513 | /* Setup a trampoline to restart the syscall | ||
| 514 | * with __NR_restart_syscall | ||
| 515 | * | ||
| 516 | * 0: <return address (orig r31)> | ||
| 517 | * 4: <2nd half for 64-bit> | ||
| 518 | * 8: ldw 0(%sp), %r31 | ||
| 519 | * 12: be 0x100(%sr2, %r0) | ||
| 520 | * 16: ldi __NR_restart_syscall, %r20 | ||
| 521 | */ | ||
| 522 | #ifdef CONFIG_64BIT | ||
| 523 | put_user(regs->gr[31] >> 32, &usp[0]); | ||
| 524 | put_user(regs->gr[31] & 0xffffffff, &usp[1]); | ||
| 525 | put_user(0x0fc010df, &usp[2]); | ||
| 526 | #else | ||
| 527 | put_user(regs->gr[31], &usp[0]); | ||
| 528 | put_user(0x0fc0109f, &usp[2]); | ||
| 529 | #endif | ||
| 530 | put_user(0xe0008200, &usp[3]); | ||
| 531 | put_user(0x34140000, &usp[4]); | ||
| 532 | |||
| 533 | /* Stack is 64-byte aligned, and we only need | ||
| 534 | * to flush 1 cache line. | ||
| 535 | * Flushing one cacheline is cheap. | ||
| 536 | * "sync" on bigger (> 4 way) boxes is not. | ||
| 537 | */ | ||
| 538 | flush_icache_range(regs->gr[30], regs->gr[30] + 4); | ||
| 539 | |||
| 540 | regs->gr[31] = regs->gr[30] + 8; | ||
| 541 | /* Preserve original r28. */ | ||
| 542 | regs->gr[28] = regs->orig_r28; | ||
| 543 | |||
| 544 | return; | ||
| 545 | } | ||
| 546 | case -ERESTARTNOHAND: | ||
| 547 | case -ERESTARTSYS: | ||
| 548 | case -ERESTARTNOINTR: { | ||
| 549 | /* Hooray for delayed branching. We don't | ||
| 550 | * have to restore %r20 (the system call | ||
| 551 | * number) because it gets loaded in the delay | ||
| 552 | * slot of the branch external instruction. | ||
| 553 | */ | ||
| 554 | regs->gr[31] -= 8; | ||
| 555 | /* Preserve original r28. */ | ||
| 556 | regs->gr[28] = regs->orig_r28; | ||
| 557 | |||
| 558 | return; | ||
| 559 | } | ||
| 560 | default: | ||
| 561 | break; | ||
| 562 | } | ||
| 563 | } | ||
| 564 | |||
| 519 | /* | 565 | /* |
| 520 | * Note that 'init' is a special process: it doesn't get signals it doesn't | 566 | * Note that 'init' is a special process: it doesn't get signals it doesn't |
| 521 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 567 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
| @@ -527,13 +573,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 527 | * registers). As noted below, the syscall number gets restored for | 573 | * registers). As noted below, the syscall number gets restored for |
| 528 | * us due to the magic of delayed branching. | 574 | * us due to the magic of delayed branching. |
| 529 | */ | 575 | */ |
| 530 | 576 | asmlinkage void | |
| 531 | asmlinkage int | 577 | do_signal(struct pt_regs *regs, long in_syscall) |
| 532 | do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall) | ||
| 533 | { | 578 | { |
| 534 | siginfo_t info; | 579 | siginfo_t info; |
| 535 | struct k_sigaction ka; | 580 | struct k_sigaction ka; |
| 536 | int signr; | 581 | int signr; |
| 582 | sigset_t *oldset; | ||
| 537 | 583 | ||
| 538 | DBG(1,"\ndo_signal: oldset=0x%p, regs=0x%p, sr7 %#lx, in_syscall=%d\n", | 584 | DBG(1,"\ndo_signal: oldset=0x%p, regs=0x%p, sr7 %#lx, in_syscall=%d\n", |
| 539 | oldset, regs, regs->sr[7], in_syscall); | 585 | oldset, regs, regs->sr[7], in_syscall); |
| @@ -543,7 +589,9 @@ do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall) | |||
| 543 | we would be called in that case, but for some reason we | 589 | we would be called in that case, but for some reason we |
| 544 | are. */ | 590 | are. */ |
| 545 | 591 | ||
| 546 | if (!oldset) | 592 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
| 593 | oldset = ¤t->saved_sigmask; | ||
| 594 | else | ||
| 547 | oldset = ¤t->blocked; | 595 | oldset = ¤t->blocked; |
| 548 | 596 | ||
| 549 | DBG(1,"do_signal: oldset %08lx / %08lx\n", | 597 | DBG(1,"do_signal: oldset %08lx / %08lx\n", |
| @@ -560,98 +608,41 @@ do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall) | |||
| 560 | break; | 608 | break; |
| 561 | 609 | ||
| 562 | /* Restart a system call if necessary. */ | 610 | /* Restart a system call if necessary. */ |
| 563 | if (in_syscall) { | 611 | if (in_syscall) |
| 564 | /* Check the return code */ | 612 | syscall_restart(regs, &ka); |
| 565 | switch (regs->gr[28]) { | 613 | |
| 566 | case -ERESTART_RESTARTBLOCK: | ||
| 567 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
| 568 | case -ERESTARTNOHAND: | ||
| 569 | DBG(1,"ERESTARTNOHAND: returning -EINTR\n"); | ||
| 570 | regs->gr[28] = -EINTR; | ||
| 571 | break; | ||
| 572 | |||
| 573 | case -ERESTARTSYS: | ||
| 574 | if (!(ka.sa.sa_flags & SA_RESTART)) { | ||
| 575 | DBG(1,"ERESTARTSYS: putting -EINTR\n"); | ||
| 576 | regs->gr[28] = -EINTR; | ||
| 577 | break; | ||
| 578 | } | ||
| 579 | /* fallthrough */ | ||
| 580 | case -ERESTARTNOINTR: | ||
| 581 | /* A syscall is just a branch, so all | ||
| 582 | we have to do is fiddle the return pointer. */ | ||
| 583 | regs->gr[31] -= 8; /* delayed branching */ | ||
| 584 | /* Preserve original r28. */ | ||
| 585 | regs->gr[28] = regs->orig_r28; | ||
| 586 | break; | ||
| 587 | } | ||
| 588 | } | ||
| 589 | /* Whee! Actually deliver the signal. If the | 614 | /* Whee! Actually deliver the signal. If the |
| 590 | delivery failed, we need to continue to iterate in | 615 | delivery failed, we need to continue to iterate in |
| 591 | this loop so we can deliver the SIGSEGV... */ | 616 | this loop so we can deliver the SIGSEGV... */ |
| 592 | if (handle_signal(signr, &info, &ka, oldset, regs, in_syscall)) { | 617 | if (handle_signal(signr, &info, &ka, oldset, |
| 618 | regs, in_syscall)) { | ||
| 593 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", | 619 | DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", |
| 594 | regs->gr[28]); | 620 | regs->gr[28]); |
| 595 | return 1; | 621 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
| 622 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
| 623 | return; | ||
| 596 | } | 624 | } |
| 597 | } | 625 | } |
| 598 | /* end of while(1) looping forever if we can't force a signal */ | 626 | /* end of while(1) looping forever if we can't force a signal */ |
| 599 | 627 | ||
| 600 | /* Did we come from a system call? */ | 628 | /* Did we come from a system call? */ |
| 601 | if (in_syscall) { | 629 | if (in_syscall) |
| 602 | /* Restart the system call - no handlers present */ | 630 | insert_restart_trampoline(regs); |
| 603 | if (regs->gr[28] == -ERESTART_RESTARTBLOCK) { | ||
| 604 | unsigned int *usp = (unsigned int *)regs->gr[30]; | ||
| 605 | |||
| 606 | /* Setup a trampoline to restart the syscall | ||
| 607 | * with __NR_restart_syscall | ||
| 608 | * | ||
| 609 | * 0: <return address (orig r31)> | ||
| 610 | * 4: <2nd half for 64-bit> | ||
| 611 | * 8: ldw 0(%sp), %r31 | ||
| 612 | * 12: be 0x100(%sr2, %r0) | ||
| 613 | * 16: ldi __NR_restart_syscall, %r20 | ||
| 614 | */ | ||
| 615 | #ifndef __LP64__ | ||
| 616 | put_user(regs->gr[31], &usp[0]); | ||
| 617 | put_user(0x0fc0109f, &usp[2]); | ||
| 618 | #else | ||
| 619 | put_user(regs->gr[31] >> 32, &usp[0]); | ||
| 620 | put_user(regs->gr[31] & 0xffffffff, &usp[1]); | ||
| 621 | put_user(0x0fc010df, &usp[2]); | ||
| 622 | #endif | ||
| 623 | put_user(0xe0008200, &usp[3]); | ||
| 624 | put_user(0x34140000, &usp[4]); | ||
| 625 | |||
| 626 | /* Stack is 64-byte aligned, and we only need | ||
| 627 | * to flush 1 cache line. | ||
| 628 | * Flushing one cacheline is cheap. | ||
| 629 | * "sync" on bigger (> 4 way) boxes is not. | ||
| 630 | */ | ||
| 631 | asm("fdc %%r0(%%sr3, %0)\n" | ||
| 632 | "sync\n" | ||
| 633 | "fic %%r0(%%sr3, %0)\n" | ||
| 634 | "sync\n" | ||
| 635 | : : "r"(regs->gr[30])); | ||
| 636 | |||
| 637 | regs->gr[31] = regs->gr[30] + 8; | ||
| 638 | /* Preserve original r28. */ | ||
| 639 | regs->gr[28] = regs->orig_r28; | ||
| 640 | } else if (regs->gr[28] == -ERESTARTNOHAND || | ||
| 641 | regs->gr[28] == -ERESTARTSYS || | ||
| 642 | regs->gr[28] == -ERESTARTNOINTR) { | ||
| 643 | /* Hooray for delayed branching. We don't | ||
| 644 | have to restore %r20 (the system call | ||
| 645 | number) because it gets loaded in the delay | ||
| 646 | slot of the branch external instruction. */ | ||
| 647 | regs->gr[31] -= 8; | ||
| 648 | /* Preserve original r28. */ | ||
| 649 | regs->gr[28] = regs->orig_r28; | ||
| 650 | } | ||
| 651 | } | ||
| 652 | 631 | ||
| 653 | DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n", | 632 | DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n", |
| 654 | regs->gr[28]); | 633 | regs->gr[28]); |
| 655 | 634 | ||
| 656 | return 0; | 635 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { |
| 636 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
| 637 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
| 638 | } | ||
| 639 | |||
| 640 | return; | ||
| 641 | } | ||
| 642 | |||
| 643 | void do_notify_resume(struct pt_regs *regs, long in_syscall) | ||
| 644 | { | ||
| 645 | if (test_thread_flag(TIF_SIGPENDING) || | ||
| 646 | test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
| 647 | do_signal(regs, in_syscall); | ||
| 657 | } | 648 | } |
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c index a6b4231cafa1..1c1a37f73053 100644 --- a/arch/parisc/kernel/signal32.c +++ b/arch/parisc/kernel/signal32.c | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | /* Signal support for 32-bit kernel builds | 1 | /* Signal support for 32-bit kernel builds |
| 2 | * | 2 | * |
| 3 | * Copyright (C) 2001 Matthew Wilcox <willy at parisc-linux.org> | 3 | * Copyright (C) 2001 Matthew Wilcox <willy at parisc-linux.org> |
| 4 | * Copyright (C) 2006 Kyle McMartin <kyle at parisc-linux.org> | ||
| 5 | * | ||
| 4 | * Code was mostly borrowed from kernel/signal.c. | 6 | * Code was mostly borrowed from kernel/signal.c. |
| 5 | * See kernel/signal.c for additional Copyrights. | 7 | * See kernel/signal.c for additional Copyrights. |
| 6 | * | 8 | * |
| @@ -401,7 +403,7 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __ | |||
| 401 | int | 403 | int |
| 402 | copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) | 404 | copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) |
| 403 | { | 405 | { |
| 404 | unsigned long tmp; | 406 | compat_uptr_t addr; |
| 405 | int err; | 407 | int err; |
| 406 | 408 | ||
| 407 | if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t))) | 409 | if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t))) |
| @@ -424,8 +426,8 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) | |||
| 424 | err |= __get_user(to->si_uid, &from->si_uid); | 426 | err |= __get_user(to->si_uid, &from->si_uid); |
| 425 | break; | 427 | break; |
| 426 | case __SI_FAULT >> 16: | 428 | case __SI_FAULT >> 16: |
| 427 | err |= __get_user(tmp, &from->si_addr); | 429 | err |= __get_user(addr, &from->si_addr); |
| 428 | to->si_addr = (void __user *) tmp; | 430 | to->si_addr = compat_ptr(addr); |
| 429 | break; | 431 | break; |
| 430 | case __SI_POLL >> 16: | 432 | case __SI_POLL >> 16: |
| 431 | err |= __get_user(to->si_band, &from->si_band); | 433 | err |= __get_user(to->si_band, &from->si_band); |
| @@ -445,7 +447,8 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from) | |||
| 445 | int | 447 | int |
| 446 | copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) | 448 | copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) |
| 447 | { | 449 | { |
| 448 | unsigned int addr; | 450 | compat_uptr_t addr; |
| 451 | compat_int_t val; | ||
| 449 | int err; | 452 | int err; |
| 450 | 453 | ||
| 451 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) | 454 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) |
| @@ -474,8 +477,8 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) | |||
| 474 | err |= __put_user(from->si_uid, &to->si_uid); | 477 | err |= __put_user(from->si_uid, &to->si_uid); |
| 475 | break; | 478 | break; |
| 476 | case __SI_FAULT >> 16: | 479 | case __SI_FAULT >> 16: |
| 477 | /* avoid type-checking warnings by copying _pad[0] in lieu of si_addr... */ | 480 | addr = ptr_to_compat(from->si_addr); |
| 478 | err |= __put_user(from->_sifields._pad[0], &to->si_addr); | 481 | err |= __put_user(addr, &to->si_addr); |
| 479 | break; | 482 | break; |
| 480 | case __SI_POLL >> 16: | 483 | case __SI_POLL >> 16: |
| 481 | err |= __put_user(from->si_band, &to->si_band); | 484 | err |= __put_user(from->si_band, &to->si_band); |
| @@ -484,17 +487,36 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) | |||
| 484 | case __SI_TIMER >> 16: | 487 | case __SI_TIMER >> 16: |
| 485 | err |= __put_user(from->si_tid, &to->si_tid); | 488 | err |= __put_user(from->si_tid, &to->si_tid); |
| 486 | err |= __put_user(from->si_overrun, &to->si_overrun); | 489 | err |= __put_user(from->si_overrun, &to->si_overrun); |
| 487 | addr = (unsigned long) from->si_ptr; | 490 | val = (compat_int_t)from->si_int; |
| 488 | err |= __put_user(addr, &to->si_ptr); | 491 | err |= __put_user(val, &to->si_int); |
| 489 | break; | 492 | break; |
| 490 | case __SI_RT >> 16: /* Not generated by the kernel as of now. */ | 493 | case __SI_RT >> 16: /* Not generated by the kernel as of now. */ |
| 491 | case __SI_MESGQ >> 16: | 494 | case __SI_MESGQ >> 16: |
| 492 | err |= __put_user(from->si_uid, &to->si_uid); | 495 | err |= __put_user(from->si_uid, &to->si_uid); |
| 493 | err |= __put_user(from->si_pid, &to->si_pid); | 496 | err |= __put_user(from->si_pid, &to->si_pid); |
| 494 | addr = (unsigned long) from->si_ptr; | 497 | val = (compat_int_t)from->si_int; |
| 495 | err |= __put_user(addr, &to->si_ptr); | 498 | err |= __put_user(val, &to->si_int); |
| 496 | break; | 499 | break; |
| 497 | } | 500 | } |
| 498 | } | 501 | } |
| 499 | return err; | 502 | return err; |
| 500 | } | 503 | } |
| 504 | |||
| 505 | asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig, | ||
| 506 | struct compat_siginfo __user *uinfo) | ||
| 507 | { | ||
| 508 | siginfo_t info; | ||
| 509 | |||
| 510 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
| 511 | return -EFAULT; | ||
| 512 | |||
| 513 | /* Not even root can pretend to send signals from the kernel. | ||
| 514 | Nor can they impersonate a kill(), which adds source info. */ | ||
| 515 | if (info.si_code >= 0) | ||
| 516 | return -EPERM; | ||
| 517 | info.si_signo = sig; | ||
| 518 | |||
| 519 | /* POSIX.1b doesn't mention process groups. */ | ||
| 520 | return kill_proc_info(sig, &info, pid); | ||
| 521 | } | ||
| 522 | |||
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 12cc019307ad..6ba9257fdb7f 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
| @@ -16,9 +16,6 @@ | |||
| 16 | ** the Free Software Foundation; either version 2 of the License, or | 16 | ** the Free Software Foundation; either version 2 of the License, or |
| 17 | ** (at your option) any later version. | 17 | ** (at your option) any later version. |
| 18 | */ | 18 | */ |
| 19 | #undef ENTRY_SYS_CPUS /* syscall support for iCOD-like functionality */ | ||
| 20 | |||
| 21 | |||
| 22 | #include <linux/types.h> | 19 | #include <linux/types.h> |
| 23 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
| 24 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
| @@ -51,7 +48,15 @@ | |||
| 51 | #include <asm/unistd.h> | 48 | #include <asm/unistd.h> |
| 52 | #include <asm/cacheflush.h> | 49 | #include <asm/cacheflush.h> |
| 53 | 50 | ||
| 54 | #define kDEBUG 0 | 51 | #undef DEBUG_SMP |
| 52 | #ifdef DEBUG_SMP | ||
| 53 | static int smp_debug_lvl = 0; | ||
| 54 | #define smp_debug(lvl, printargs...) \ | ||
| 55 | if (lvl >= smp_debug_lvl) \ | ||
| 56 | printk(printargs); | ||
| 57 | #else | ||
| 58 | #define smp_debug(lvl, ...) | ||
| 59 | #endif /* DEBUG_SMP */ | ||
| 55 | 60 | ||
| 56 | DEFINE_SPINLOCK(smp_lock); | 61 | DEFINE_SPINLOCK(smp_lock); |
| 57 | 62 | ||
| @@ -76,6 +81,7 @@ cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; /* Bitmap of Present CP | |||
| 76 | EXPORT_SYMBOL(cpu_online_map); | 81 | EXPORT_SYMBOL(cpu_online_map); |
| 77 | EXPORT_SYMBOL(cpu_possible_map); | 82 | EXPORT_SYMBOL(cpu_possible_map); |
| 78 | 83 | ||
| 84 | DEFINE_PER_CPU(spinlock_t, ipi_lock) = SPIN_LOCK_UNLOCKED; | ||
| 79 | 85 | ||
| 80 | struct smp_call_struct { | 86 | struct smp_call_struct { |
| 81 | void (*func) (void *info); | 87 | void (*func) (void *info); |
| @@ -107,13 +113,6 @@ enum ipi_message_type { | |||
| 107 | static void | 113 | static void |
| 108 | ipi_init(int cpuid) | 114 | ipi_init(int cpuid) |
| 109 | { | 115 | { |
| 110 | |||
| 111 | /* If CPU is present ... */ | ||
| 112 | #ifdef ENTRY_SYS_CPUS | ||
| 113 | /* *and* running (not stopped) ... */ | ||
| 114 | #error iCOD support wants state checked here. | ||
| 115 | #endif | ||
| 116 | |||
| 117 | #error verify IRQ_OFFSET(IPI_IRQ) is ipi_interrupt() in new IRQ region | 116 | #error verify IRQ_OFFSET(IPI_IRQ) is ipi_interrupt() in new IRQ region |
| 118 | 117 | ||
| 119 | if(cpu_online(cpuid) ) | 118 | if(cpu_online(cpuid) ) |
| @@ -133,23 +132,12 @@ ipi_init(int cpuid) | |||
| 133 | static void | 132 | static void |
| 134 | halt_processor(void) | 133 | halt_processor(void) |
| 135 | { | 134 | { |
| 136 | #ifdef ENTRY_SYS_CPUS | ||
| 137 | #error halt_processor() needs rework | ||
| 138 | /* | ||
| 139 | ** o migrate I/O interrupts off this CPU. | ||
| 140 | ** o leave IPI enabled - __cli() will disable IPI. | ||
| 141 | ** o leave CPU in online map - just change the state | ||
| 142 | */ | ||
| 143 | cpu_data[this_cpu].state = STATE_STOPPED; | ||
| 144 | mark_bh(IPI_BH); | ||
| 145 | #else | ||
| 146 | /* REVISIT : redirect I/O Interrupts to another CPU? */ | 135 | /* REVISIT : redirect I/O Interrupts to another CPU? */ |
| 147 | /* REVISIT : does PM *know* this CPU isn't available? */ | 136 | /* REVISIT : does PM *know* this CPU isn't available? */ |
| 148 | cpu_clear(smp_processor_id(), cpu_online_map); | 137 | cpu_clear(smp_processor_id(), cpu_online_map); |
| 149 | local_irq_disable(); | 138 | local_irq_disable(); |
| 150 | for (;;) | 139 | for (;;) |
| 151 | ; | 140 | ; |
| 152 | #endif | ||
| 153 | } | 141 | } |
| 154 | 142 | ||
| 155 | 143 | ||
| @@ -167,10 +155,11 @@ ipi_interrupt(int irq, void *dev_id) | |||
| 167 | mb(); /* Order interrupt and bit testing. */ | 155 | mb(); /* Order interrupt and bit testing. */ |
| 168 | 156 | ||
| 169 | for (;;) { | 157 | for (;;) { |
| 170 | spin_lock_irqsave(&(p->lock),flags); | 158 | spinlock_t *lock = &per_cpu(ipi_lock, this_cpu); |
| 159 | spin_lock_irqsave(lock, flags); | ||
| 171 | ops = p->pending_ipi; | 160 | ops = p->pending_ipi; |
| 172 | p->pending_ipi = 0; | 161 | p->pending_ipi = 0; |
| 173 | spin_unlock_irqrestore(&(p->lock),flags); | 162 | spin_unlock_irqrestore(lock, flags); |
| 174 | 163 | ||
| 175 | mb(); /* Order bit clearing and data access. */ | 164 | mb(); /* Order bit clearing and data access. */ |
| 176 | 165 | ||
| @@ -184,15 +173,11 @@ ipi_interrupt(int irq, void *dev_id) | |||
| 184 | 173 | ||
| 185 | switch (which) { | 174 | switch (which) { |
| 186 | case IPI_NOP: | 175 | case IPI_NOP: |
| 187 | #if (kDEBUG>=100) | 176 | smp_debug(100, KERN_DEBUG "CPU%d IPI_NOP\n", this_cpu); |
| 188 | printk(KERN_DEBUG "CPU%d IPI_NOP\n",this_cpu); | ||
| 189 | #endif /* kDEBUG */ | ||
| 190 | break; | 177 | break; |
| 191 | 178 | ||
| 192 | case IPI_RESCHEDULE: | 179 | case IPI_RESCHEDULE: |
| 193 | #if (kDEBUG>=100) | 180 | smp_debug(100, KERN_DEBUG "CPU%d IPI_RESCHEDULE\n", this_cpu); |
| 194 | printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu); | ||
| 195 | #endif /* kDEBUG */ | ||
| 196 | /* | 181 | /* |
| 197 | * Reschedule callback. Everything to be | 182 | * Reschedule callback. Everything to be |
| 198 | * done is done by the interrupt return path. | 183 | * done is done by the interrupt return path. |
| @@ -200,9 +185,7 @@ ipi_interrupt(int irq, void *dev_id) | |||
| 200 | break; | 185 | break; |
| 201 | 186 | ||
| 202 | case IPI_CALL_FUNC: | 187 | case IPI_CALL_FUNC: |
| 203 | #if (kDEBUG>=100) | 188 | smp_debug(100, KERN_DEBUG "CPU%d IPI_CALL_FUNC\n", this_cpu); |
| 204 | printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu); | ||
| 205 | #endif /* kDEBUG */ | ||
| 206 | { | 189 | { |
| 207 | volatile struct smp_call_struct *data; | 190 | volatile struct smp_call_struct *data; |
| 208 | void (*func)(void *info); | 191 | void (*func)(void *info); |
| @@ -233,28 +216,16 @@ ipi_interrupt(int irq, void *dev_id) | |||
| 233 | break; | 216 | break; |
| 234 | 217 | ||
| 235 | case IPI_CPU_START: | 218 | case IPI_CPU_START: |
| 236 | #if (kDEBUG>=100) | 219 | smp_debug(100, KERN_DEBUG "CPU%d IPI_CPU_START\n", this_cpu); |
| 237 | printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu); | ||
| 238 | #endif /* kDEBUG */ | ||
| 239 | #ifdef ENTRY_SYS_CPUS | ||
| 240 | p->state = STATE_RUNNING; | ||
| 241 | #endif | ||
| 242 | break; | 220 | break; |
| 243 | 221 | ||
| 244 | case IPI_CPU_STOP: | 222 | case IPI_CPU_STOP: |
| 245 | #if (kDEBUG>=100) | 223 | smp_debug(100, KERN_DEBUG "CPU%d IPI_CPU_STOP\n", this_cpu); |
| 246 | printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu); | ||
| 247 | #endif /* kDEBUG */ | ||
| 248 | #ifdef ENTRY_SYS_CPUS | ||
| 249 | #else | ||
| 250 | halt_processor(); | 224 | halt_processor(); |
| 251 | #endif | ||
| 252 | break; | 225 | break; |
| 253 | 226 | ||
| 254 | case IPI_CPU_TEST: | 227 | case IPI_CPU_TEST: |
| 255 | #if (kDEBUG>=100) | 228 | smp_debug(100, KERN_DEBUG "CPU%d is alive!\n", this_cpu); |
| 256 | printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu); | ||
| 257 | #endif /* kDEBUG */ | ||
| 258 | break; | 229 | break; |
| 259 | 230 | ||
| 260 | default: | 231 | default: |
| @@ -275,12 +246,13 @@ static inline void | |||
| 275 | ipi_send(int cpu, enum ipi_message_type op) | 246 | ipi_send(int cpu, enum ipi_message_type op) |
| 276 | { | 247 | { |
| 277 | struct cpuinfo_parisc *p = &cpu_data[cpu]; | 248 | struct cpuinfo_parisc *p = &cpu_data[cpu]; |
| 249 | spinlock_t *lock = &per_cpu(ipi_lock, cpu); | ||
| 278 | unsigned long flags; | 250 | unsigned long flags; |
| 279 | 251 | ||
| 280 | spin_lock_irqsave(&(p->lock),flags); | 252 | spin_lock_irqsave(lock, flags); |
| 281 | p->pending_ipi |= 1 << op; | 253 | p->pending_ipi |= 1 << op; |
| 282 | gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa); | 254 | gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa); |
| 283 | spin_unlock_irqrestore(&(p->lock),flags); | 255 | spin_unlock_irqrestore(lock, flags); |
| 284 | } | 256 | } |
| 285 | 257 | ||
| 286 | 258 | ||
| @@ -560,13 +532,8 @@ int __init smp_boot_one_cpu(int cpuid) | |||
| 560 | 532 | ||
| 561 | alive: | 533 | alive: |
| 562 | /* Remember the Slave data */ | 534 | /* Remember the Slave data */ |
| 563 | #if (kDEBUG>=100) | 535 | smp_debug(100, KERN_DEBUG "SMP: CPU:%d came alive after %ld _us\n", |
| 564 | printk(KERN_DEBUG "SMP: CPU:%d came alive after %ld _us\n", | ||
| 565 | cpuid, timeout * 100); | 536 | cpuid, timeout * 100); |
| 566 | #endif /* kDEBUG */ | ||
| 567 | #ifdef ENTRY_SYS_CPUS | ||
| 568 | cpu_data[cpuid].state = STATE_RUNNING; | ||
| 569 | #endif | ||
| 570 | return 0; | 537 | return 0; |
| 571 | } | 538 | } |
| 572 | 539 | ||
| @@ -574,10 +541,6 @@ void __devinit smp_prepare_boot_cpu(void) | |||
| 574 | { | 541 | { |
| 575 | int bootstrap_processor=cpu_data[0].cpuid; /* CPU ID of BSP */ | 542 | int bootstrap_processor=cpu_data[0].cpuid; /* CPU ID of BSP */ |
| 576 | 543 | ||
| 577 | #ifdef ENTRY_SYS_CPUS | ||
| 578 | cpu_data[0].state = STATE_RUNNING; | ||
| 579 | #endif | ||
| 580 | |||
| 581 | /* Setup BSP mappings */ | 544 | /* Setup BSP mappings */ |
| 582 | printk("SMP: bootstrap CPU ID is %d\n",bootstrap_processor); | 545 | printk("SMP: bootstrap CPU ID is %d\n",bootstrap_processor); |
| 583 | 546 | ||
| @@ -616,101 +579,6 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
| 616 | return cpu_online(cpu) ? 0 : -ENOSYS; | 579 | return cpu_online(cpu) ? 0 : -ENOSYS; |
| 617 | } | 580 | } |
| 618 | 581 | ||
| 619 | |||
| 620 | |||
| 621 | #ifdef ENTRY_SYS_CPUS | ||
| 622 | /* Code goes along with: | ||
| 623 | ** entry.s: ENTRY_NAME(sys_cpus) / * 215, for cpu stat * / | ||
| 624 | */ | ||
| 625 | int sys_cpus(int argc, char **argv) | ||
| 626 | { | ||
| 627 | int i,j=0; | ||
| 628 | extern int current_pid(int cpu); | ||
| 629 | |||
| 630 | if( argc > 2 ) { | ||
| 631 | printk("sys_cpus:Only one argument supported\n"); | ||
| 632 | return (-1); | ||
| 633 | } | ||
| 634 | if ( argc == 1 ){ | ||
| 635 | |||
| 636 | #ifdef DUMP_MORE_STATE | ||
| 637 | for_each_online_cpu(i) { | ||
| 638 | int cpus_per_line = 4; | ||
| 639 | |||
| 640 | if (j++ % cpus_per_line) | ||
| 641 | printk(" %3d",i); | ||
| 642 | else | ||
| 643 | printk("\n %3d",i); | ||
| 644 | } | ||
| 645 | printk("\n"); | ||
| 646 | #else | ||
| 647 | printk("\n 0\n"); | ||
| 648 | #endif | ||
| 649 | } else if((argc==2) && !(strcmp(argv[1],"-l"))) { | ||
| 650 | printk("\nCPUSTATE TASK CPUNUM CPUID HARDCPU(HPA)\n"); | ||
| 651 | #ifdef DUMP_MORE_STATE | ||
| 652 | for_each_online_cpu(i) { | ||
| 653 | if (cpu_data[i].cpuid != NO_PROC_ID) { | ||
| 654 | switch(cpu_data[i].state) { | ||
| 655 | case STATE_RENDEZVOUS: | ||
| 656 | printk("RENDEZVS "); | ||
| 657 | break; | ||
| 658 | case STATE_RUNNING: | ||
| 659 | printk((current_pid(i)!=0) ? "RUNNING " : "IDLING "); | ||
| 660 | break; | ||
| 661 | case STATE_STOPPED: | ||
| 662 | printk("STOPPED "); | ||
| 663 | break; | ||
| 664 | case STATE_HALTED: | ||
| 665 | printk("HALTED "); | ||
| 666 | break; | ||
| 667 | default: | ||
| 668 | printk("%08x?", cpu_data[i].state); | ||
| 669 | break; | ||
| 670 | } | ||
| 671 | if(cpu_online(i)) { | ||
| 672 | printk(" %4d",current_pid(i)); | ||
| 673 | } | ||
| 674 | printk(" %6d",cpu_number_map(i)); | ||
| 675 | printk(" %5d",i); | ||
| 676 | printk(" 0x%lx\n",cpu_data[i].hpa); | ||
| 677 | } | ||
| 678 | } | ||
| 679 | #else | ||
| 680 | printk("\n%s %4d 0 0 --------", | ||
| 681 | (current->pid)?"RUNNING ": "IDLING ",current->pid); | ||
| 682 | #endif | ||
| 683 | } else if ((argc==2) && !(strcmp(argv[1],"-s"))) { | ||
| 684 | #ifdef DUMP_MORE_STATE | ||
| 685 | printk("\nCPUSTATE CPUID\n"); | ||
| 686 | for_each_online_cpu(i) { | ||
| 687 | if (cpu_data[i].cpuid != NO_PROC_ID) { | ||
| 688 | switch(cpu_data[i].state) { | ||
| 689 | case STATE_RENDEZVOUS: | ||
| 690 | printk("RENDEZVS");break; | ||
| 691 | case STATE_RUNNING: | ||
| 692 | printk((current_pid(i)!=0) ? "RUNNING " : "IDLING"); | ||
| 693 | break; | ||
| 694 | case STATE_STOPPED: | ||
| 695 | printk("STOPPED ");break; | ||
| 696 | case STATE_HALTED: | ||
| 697 | printk("HALTED ");break; | ||
| 698 | default: | ||
| 699 | } | ||
| 700 | printk(" %5d\n",i); | ||
| 701 | } | ||
| 702 | } | ||
| 703 | #else | ||
| 704 | printk("\n%s CPU0",(current->pid==0)?"RUNNING ":"IDLING "); | ||
| 705 | #endif | ||
| 706 | } else { | ||
| 707 | printk("sys_cpus:Unknown request\n"); | ||
| 708 | return (-1); | ||
| 709 | } | ||
| 710 | return 0; | ||
| 711 | } | ||
| 712 | #endif /* ENTRY_SYS_CPUS */ | ||
| 713 | |||
| 714 | #ifdef CONFIG_PROC_FS | 582 | #ifdef CONFIG_PROC_FS |
| 715 | int __init | 583 | int __init |
| 716 | setup_profiling_timer(unsigned int multiplier) | 584 | setup_profiling_timer(unsigned int multiplier) |
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index a05800429304..10859f53e94f 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
| @@ -12,27 +12,23 @@ | |||
| 12 | #include <asm/errno.h> | 12 | #include <asm/errno.h> |
| 13 | #include <asm/psw.h> | 13 | #include <asm/psw.h> |
| 14 | #include <asm/thread_info.h> | 14 | #include <asm/thread_info.h> |
| 15 | |||
| 16 | #include <asm/assembly.h> | 15 | #include <asm/assembly.h> |
| 17 | #include <asm/processor.h> | 16 | #include <asm/processor.h> |
| 18 | 17 | ||
| 18 | #include <linux/linkage.h> | ||
| 19 | |||
| 19 | /* We fill the empty parts of the gateway page with | 20 | /* We fill the empty parts of the gateway page with |
| 20 | * something that will kill the kernel or a | 21 | * something that will kill the kernel or a |
| 21 | * userspace application. | 22 | * userspace application. |
| 22 | */ | 23 | */ |
| 23 | #define KILL_INSN break 0,0 | 24 | #define KILL_INSN break 0,0 |
| 24 | 25 | ||
| 25 | #ifdef CONFIG_64BIT | 26 | .level LEVEL |
| 26 | .level 2.0w | ||
| 27 | #else | ||
| 28 | .level 1.1 | ||
| 29 | #endif | ||
| 30 | 27 | ||
| 31 | .text | 28 | .text |
| 32 | 29 | ||
| 33 | .import syscall_exit,code | 30 | .import syscall_exit,code |
| 34 | .import syscall_exit_rfi,code | 31 | .import syscall_exit_rfi,code |
| 35 | .export linux_gateway_page | ||
| 36 | 32 | ||
| 37 | /* Linux gateway page is aliased to virtual page 0 in the kernel | 33 | /* Linux gateway page is aliased to virtual page 0 in the kernel |
| 38 | * address space. Since it is a gateway page it cannot be | 34 | * address space. Since it is a gateway page it cannot be |
| @@ -43,7 +39,7 @@ | |||
| 43 | */ | 39 | */ |
| 44 | 40 | ||
| 45 | .align ASM_PAGE_SIZE | 41 | .align ASM_PAGE_SIZE |
| 46 | linux_gateway_page: | 42 | ENTRY(linux_gateway_page) |
| 47 | 43 | ||
| 48 | /* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */ | 44 | /* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */ |
| 49 | .rept 44 | 45 | .rept 44 |
| @@ -595,73 +591,43 @@ cas_action: | |||
| 595 | the other for the store. Either return -EFAULT. | 591 | the other for the store. Either return -EFAULT. |
| 596 | Each of the entries must be relocated. */ | 592 | Each of the entries must be relocated. */ |
| 597 | .section __ex_table,"aw" | 593 | .section __ex_table,"aw" |
| 598 | #ifdef CONFIG_64BIT | 594 | ASM_ULONG_INSN (1b - linux_gateway_page), (3b - linux_gateway_page) |
| 599 | /* Pad the address calculation */ | 595 | ASM_ULONG_INSN (2b - linux_gateway_page), (3b - linux_gateway_page) |
| 600 | .word 0,(2b - linux_gateway_page) | ||
| 601 | .word 0,(3b - linux_gateway_page) | ||
| 602 | #else | ||
| 603 | .word (2b - linux_gateway_page) | ||
| 604 | .word (3b - linux_gateway_page) | ||
| 605 | #endif | ||
| 606 | .previous | 596 | .previous |
| 607 | 597 | ||
| 608 | .section __ex_table,"aw" | ||
| 609 | #ifdef CONFIG_64BIT | ||
| 610 | /* Pad the address calculation */ | ||
| 611 | .word 0,(1b - linux_gateway_page) | ||
| 612 | .word 0,(3b - linux_gateway_page) | ||
| 613 | #else | ||
| 614 | .word (1b - linux_gateway_page) | ||
| 615 | .word (3b - linux_gateway_page) | ||
| 616 | #endif | ||
| 617 | .previous | ||
| 618 | |||
| 619 | end_compare_and_swap: | ||
| 620 | 598 | ||
| 621 | /* Make sure nothing else is placed on this page */ | 599 | /* Make sure nothing else is placed on this page */ |
| 622 | .align ASM_PAGE_SIZE | 600 | .align ASM_PAGE_SIZE |
| 623 | .export end_linux_gateway_page | 601 | END(linux_gateway_page) |
| 624 | end_linux_gateway_page: | 602 | ENTRY(end_linux_gateway_page) |
| 625 | 603 | ||
| 626 | /* Relocate symbols assuming linux_gateway_page is mapped | 604 | /* Relocate symbols assuming linux_gateway_page is mapped |
| 627 | to virtual address 0x0 */ | 605 | to virtual address 0x0 */ |
| 628 | #ifdef CONFIG_64BIT | 606 | |
| 629 | /* FIXME: The code will always be on the gateay page | 607 | #define LWS_ENTRY(_name_) ASM_ULONG_INSN (lws_##_name_ - linux_gateway_page) |
| 630 | and thus it will be on the first 4k, the | ||
| 631 | assembler seems to think that the final | ||
| 632 | subtraction result is only a word in | ||
| 633 | length, so we pad the value. | ||
| 634 | */ | ||
| 635 | #define LWS_ENTRY(_name_) .word 0,(lws_##_name_ - linux_gateway_page) | ||
| 636 | #else | ||
| 637 | #define LWS_ENTRY(_name_) .word (lws_##_name_ - linux_gateway_page) | ||
| 638 | #endif | ||
| 639 | 608 | ||
| 640 | .section .rodata,"a" | 609 | .section .rodata,"a" |
| 641 | 610 | ||
| 642 | .align ASM_PAGE_SIZE | 611 | .align ASM_PAGE_SIZE |
| 643 | /* Light-weight-syscall table */ | 612 | /* Light-weight-syscall table */ |
| 644 | /* Start of lws table. */ | 613 | /* Start of lws table. */ |
| 645 | .export lws_table | 614 | ENTRY(lws_table) |
| 646 | .Llws_table: | ||
| 647 | lws_table: | ||
| 648 | LWS_ENTRY(compare_and_swap32) /* 0 - ELF32 Atomic compare and swap */ | 615 | LWS_ENTRY(compare_and_swap32) /* 0 - ELF32 Atomic compare and swap */ |
| 649 | LWS_ENTRY(compare_and_swap64) /* 1 - ELF64 Atomic compare and swap */ | 616 | LWS_ENTRY(compare_and_swap64) /* 1 - ELF64 Atomic compare and swap */ |
| 617 | END(lws_table) | ||
| 650 | /* End of lws table */ | 618 | /* End of lws table */ |
| 651 | 619 | ||
| 652 | .align ASM_PAGE_SIZE | 620 | .align ASM_PAGE_SIZE |
| 653 | .export sys_call_table | 621 | ENTRY(sys_call_table) |
| 654 | .Lsys_call_table: | ||
| 655 | sys_call_table: | ||
| 656 | #include "syscall_table.S" | 622 | #include "syscall_table.S" |
| 623 | END(sys_call_table) | ||
| 657 | 624 | ||
| 658 | #ifdef CONFIG_64BIT | 625 | #ifdef CONFIG_64BIT |
| 659 | .align ASM_PAGE_SIZE | 626 | .align ASM_PAGE_SIZE |
| 660 | .export sys_call_table64 | 627 | ENTRY(sys_call_table64) |
| 661 | .Lsys_call_table64: | ||
| 662 | sys_call_table64: | ||
| 663 | #define SYSCALL_TABLE_64BIT | 628 | #define SYSCALL_TABLE_64BIT |
| 664 | #include "syscall_table.S" | 629 | #include "syscall_table.S" |
| 630 | END(sys_call_table64) | ||
| 665 | #endif | 631 | #endif |
| 666 | 632 | ||
| 667 | #ifdef CONFIG_SMP | 633 | #ifdef CONFIG_SMP |
| @@ -671,9 +637,7 @@ sys_call_table64: | |||
| 671 | */ | 637 | */ |
| 672 | .section .data | 638 | .section .data |
| 673 | .align 4096 | 639 | .align 4096 |
| 674 | .export lws_lock_start | 640 | ENTRY(lws_lock_start) |
| 675 | .Llws_lock_start: | ||
| 676 | lws_lock_start: | ||
| 677 | /* lws locks */ | 641 | /* lws locks */ |
| 678 | .align 16 | 642 | .align 16 |
| 679 | .rept 16 | 643 | .rept 16 |
| @@ -683,6 +647,7 @@ lws_lock_start: | |||
| 683 | .word 0 | 647 | .word 0 |
| 684 | .word 0 | 648 | .word 0 |
| 685 | .endr | 649 | .endr |
| 650 | END(lws_lock_start) | ||
| 686 | .previous | 651 | .previous |
| 687 | #endif | 652 | #endif |
| 688 | /* CONFIG_SMP for lws_lock_start */ | 653 | /* CONFIG_SMP for lws_lock_start */ |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index be8eb9a0d24a..8bf87e5d9c37 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * Copyright (C) 2000 Grant Grundler <grundler at parisc-linux.org> | 10 | * Copyright (C) 2000 Grant Grundler <grundler at parisc-linux.org> |
| 11 | * Copyright (C) 2001 Richard Hirst <rhirst with parisc-linux.org> | 11 | * Copyright (C) 2001 Richard Hirst <rhirst with parisc-linux.org> |
| 12 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> | 12 | * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> |
| 13 | * Copyright (C) 2001 Helge Deller <deller at parisc-linux.org> | 13 | * Copyright (C) 2001-2007 Helge Deller <deller at parisc-linux.org> |
| 14 | * Copyright (C) 2000-2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org> | 14 | * Copyright (C) 2000-2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org> |
| 15 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> | 15 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
| 16 | * Copyright (C) 2005-2006 Kyle McMartin <kyle at parisc-linux.org> | 16 | * Copyright (C) 2005-2006 Kyle McMartin <kyle at parisc-linux.org> |
| @@ -282,8 +282,8 @@ | |||
| 282 | * to worry about faulting trying to copy in a larger 64-bit | 282 | * to worry about faulting trying to copy in a larger 64-bit |
| 283 | * struct from a 32-bit user-space app. | 283 | * struct from a 32-bit user-space app. |
| 284 | */ | 284 | */ |
| 285 | ENTRY_SAME(rt_sigqueueinfo) | 285 | ENTRY_COMP(rt_sigqueueinfo) |
| 286 | ENTRY_SAME(rt_sigsuspend_wrapper) /* not really SAME -- see the code */ | 286 | ENTRY_COMP(rt_sigsuspend) |
| 287 | ENTRY_SAME(chown) /* 180 */ | 287 | ENTRY_SAME(chown) /* 180 */ |
| 288 | /* setsockopt() used by iptables: SO_SET_REPLACE/SO_SET_ADD_COUNTERS */ | 288 | /* setsockopt() used by iptables: SO_SET_REPLACE/SO_SET_ADD_COUNTERS */ |
| 289 | ENTRY_COMP(setsockopt) | 289 | ENTRY_COMP(setsockopt) |
| @@ -377,9 +377,9 @@ | |||
| 377 | ENTRY_SAME(inotify_init) | 377 | ENTRY_SAME(inotify_init) |
| 378 | ENTRY_SAME(inotify_add_watch) /* 270 */ | 378 | ENTRY_SAME(inotify_add_watch) /* 270 */ |
| 379 | ENTRY_SAME(inotify_rm_watch) | 379 | ENTRY_SAME(inotify_rm_watch) |
| 380 | ENTRY_SAME(ni_syscall) /* 271 ENTRY_COMP(pselect6) */ | ||
| 381 | ENTRY_SAME(ni_syscall) /* 272 ENTRY_COMP(ppoll) */ | ||
| 382 | ENTRY_SAME(migrate_pages) | 380 | ENTRY_SAME(migrate_pages) |
| 381 | ENTRY_COMP(pselect6) | ||
| 382 | ENTRY_COMP(ppoll) | ||
| 383 | ENTRY_COMP(openat) /* 275 */ | 383 | ENTRY_COMP(openat) /* 275 */ |
| 384 | ENTRY_SAME(mkdirat) | 384 | ENTRY_SAME(mkdirat) |
| 385 | ENTRY_SAME(mknodat) | 385 | ENTRY_SAME(mknodat) |
| @@ -399,5 +399,11 @@ | |||
| 399 | ENTRY_SAME(splice) | 399 | ENTRY_SAME(splice) |
| 400 | ENTRY_OURS(sync_file_range) | 400 | ENTRY_OURS(sync_file_range) |
| 401 | ENTRY_SAME(tee) | 401 | ENTRY_SAME(tee) |
| 402 | ENTRY_COMP(vmsplice) | ||
| 403 | ENTRY_COMP(move_pages) /* 295 */ | ||
| 404 | ENTRY_SAME(getcpu) | ||
| 405 | ENTRY_SAME(epoll_pwait) | ||
| 406 | ENTRY_COMP(statfs64) | ||
| 407 | ENTRY_COMP(fstatfs64) | ||
| 402 | /* Nothing yet */ | 408 | /* Nothing yet */ |
| 403 | 409 | ||
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 5f1b51af06a9..d1db8e518654 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
| 23 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
| 24 | #include <linux/profile.h> | 24 | #include <linux/profile.h> |
| 25 | #include <linux/clocksource.h> | ||
| 25 | 26 | ||
| 26 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
| 27 | #include <asm/io.h> | 28 | #include <asm/io.h> |
| @@ -98,7 +99,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
| 98 | * cycles after the IT fires. But it's arbitrary how much time passes | 99 | * cycles after the IT fires. But it's arbitrary how much time passes |
| 99 | * before we call it "late". I've picked one second. | 100 | * before we call it "late". I've picked one second. |
| 100 | */ | 101 | */ |
| 101 | if (ticks_elapsed > HZ) { | 102 | if (unlikely(ticks_elapsed > HZ)) { |
| 102 | /* Scenario 3: very long delay? bad in any case */ | 103 | /* Scenario 3: very long delay? bad in any case */ |
| 103 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" | 104 | printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!" |
| 104 | " cycles %lX rem %lX " | 105 | " cycles %lX rem %lX " |
| @@ -147,10 +148,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
| 147 | write_sequnlock(&xtime_lock); | 148 | write_sequnlock(&xtime_lock); |
| 148 | } | 149 | } |
| 149 | 150 | ||
| 150 | /* check soft power switch status */ | ||
| 151 | if (cpu == 0 && !atomic_read(&power_tasklet.count)) | ||
| 152 | tasklet_schedule(&power_tasklet); | ||
| 153 | |||
| 154 | return IRQ_HANDLED; | 151 | return IRQ_HANDLED; |
| 155 | } | 152 | } |
| 156 | 153 | ||
| @@ -172,121 +169,41 @@ unsigned long profile_pc(struct pt_regs *regs) | |||
| 172 | EXPORT_SYMBOL(profile_pc); | 169 | EXPORT_SYMBOL(profile_pc); |
| 173 | 170 | ||
| 174 | 171 | ||
| 175 | /* | 172 | /* clock source code */ |
| 176 | * Return the number of micro-seconds that elapsed since the last | ||
| 177 | * update to wall time (aka xtime). The xtime_lock | ||
| 178 | * must be at least read-locked when calling this routine. | ||
| 179 | */ | ||
| 180 | static inline unsigned long gettimeoffset (void) | ||
| 181 | { | ||
| 182 | #ifndef CONFIG_SMP | ||
| 183 | /* | ||
| 184 | * FIXME: This won't work on smp because jiffies are updated by cpu 0. | ||
| 185 | * Once parisc-linux learns the cr16 difference between processors, | ||
| 186 | * this could be made to work. | ||
| 187 | */ | ||
| 188 | unsigned long now; | ||
| 189 | unsigned long prev_tick; | ||
| 190 | unsigned long next_tick; | ||
| 191 | unsigned long elapsed_cycles; | ||
| 192 | unsigned long usec; | ||
| 193 | unsigned long cpuid = smp_processor_id(); | ||
| 194 | unsigned long cpt = clocktick; | ||
| 195 | |||
| 196 | next_tick = cpu_data[cpuid].it_value; | ||
| 197 | now = mfctl(16); /* Read the hardware interval timer. */ | ||
| 198 | 173 | ||
| 199 | prev_tick = next_tick - cpt; | 174 | static cycle_t read_cr16(void) |
| 175 | { | ||
| 176 | return get_cycles(); | ||
| 177 | } | ||
| 200 | 178 | ||
| 201 | /* Assume Scenario 1: "now" is later than prev_tick. */ | 179 | static int cr16_update_callback(void); |
| 202 | elapsed_cycles = now - prev_tick; | ||
| 203 | 180 | ||
| 204 | /* aproximate HZ with shifts. Intended math is "(elapsed/clocktick) > HZ" */ | 181 | static struct clocksource clocksource_cr16 = { |
| 205 | #if HZ == 1000 | 182 | .name = "cr16", |
| 206 | if (elapsed_cycles > (cpt << 10) ) | 183 | .rating = 300, |
| 207 | #elif HZ == 250 | 184 | .read = read_cr16, |
| 208 | if (elapsed_cycles > (cpt << 8) ) | 185 | .mask = CLOCKSOURCE_MASK(BITS_PER_LONG), |
| 209 | #elif HZ == 100 | 186 | .mult = 0, /* to be set */ |
| 210 | if (elapsed_cycles > (cpt << 7) ) | 187 | .shift = 22, |
| 211 | #else | 188 | .update_callback = cr16_update_callback, |
| 212 | #warn WTF is HZ set to anyway? | 189 | .is_continuous = 1, |
| 213 | if (elapsed_cycles > (HZ * cpt) ) | 190 | }; |
| 214 | #endif | ||
| 215 | { | ||
| 216 | /* Scenario 3: clock ticks are missing. */ | ||
| 217 | printk (KERN_CRIT "gettimeoffset(CPU %ld): missing %ld ticks!" | ||
| 218 | " cycles %lX prev/now/next %lX/%lX/%lX clock %lX\n", | ||
| 219 | cpuid, elapsed_cycles / cpt, | ||
| 220 | elapsed_cycles, prev_tick, now, next_tick, cpt); | ||
| 221 | } | ||
| 222 | 191 | ||
| 223 | /* FIXME: Can we improve the precision? Not with PAGE0. */ | 192 | static int cr16_update_callback(void) |
| 224 | usec = (elapsed_cycles * 10000) / PAGE0->mem_10msec; | ||
| 225 | return usec; | ||
| 226 | #else | ||
| 227 | return 0; | ||
| 228 | #endif | ||
| 229 | } | ||
| 230 | |||
| 231 | void | ||
| 232 | do_gettimeofday (struct timeval *tv) | ||
| 233 | { | 193 | { |
| 234 | unsigned long flags, seq, usec, sec; | 194 | int change = 0; |
| 235 | 195 | ||
| 236 | /* Hold xtime_lock and adjust timeval. */ | 196 | /* since the cr16 cycle counters are not syncronized across CPUs, |
| 237 | do { | 197 | we'll check if we should switch to a safe clocksource: */ |
| 238 | seq = read_seqbegin_irqsave(&xtime_lock, flags); | 198 | if (clocksource_cr16.rating != 0 && num_online_cpus() > 1) { |
| 239 | usec = gettimeoffset(); | 199 | clocksource_cr16.rating = 0; |
| 240 | sec = xtime.tv_sec; | 200 | clocksource_reselect(); |
| 241 | usec += (xtime.tv_nsec / 1000); | 201 | change = 1; |
| 242 | } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); | ||
| 243 | |||
| 244 | /* Move adjusted usec's into sec's. */ | ||
| 245 | while (usec >= USEC_PER_SEC) { | ||
| 246 | usec -= USEC_PER_SEC; | ||
| 247 | ++sec; | ||
| 248 | } | 202 | } |
| 249 | 203 | ||
| 250 | /* Return adjusted result. */ | 204 | return change; |
| 251 | tv->tv_sec = sec; | ||
| 252 | tv->tv_usec = usec; | ||
| 253 | } | 205 | } |
| 254 | 206 | ||
| 255 | EXPORT_SYMBOL(do_gettimeofday); | ||
| 256 | |||
| 257 | int | ||
| 258 | do_settimeofday (struct timespec *tv) | ||
| 259 | { | ||
| 260 | time_t wtm_sec, sec = tv->tv_sec; | ||
| 261 | long wtm_nsec, nsec = tv->tv_nsec; | ||
| 262 | |||
| 263 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | ||
| 264 | return -EINVAL; | ||
| 265 | |||
| 266 | write_seqlock_irq(&xtime_lock); | ||
| 267 | { | ||
| 268 | /* | ||
| 269 | * This is revolting. We need to set "xtime" | ||
| 270 | * correctly. However, the value in this location is | ||
| 271 | * the value at the most recent update of wall time. | ||
| 272 | * Discover what correction gettimeofday would have | ||
| 273 | * done, and then undo it! | ||
| 274 | */ | ||
| 275 | nsec -= gettimeoffset() * 1000; | ||
| 276 | |||
| 277 | wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); | ||
| 278 | wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); | ||
| 279 | |||
| 280 | set_normalized_timespec(&xtime, sec, nsec); | ||
| 281 | set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); | ||
| 282 | |||
| 283 | ntp_clear(); | ||
| 284 | } | ||
| 285 | write_sequnlock_irq(&xtime_lock); | ||
| 286 | clock_was_set(); | ||
| 287 | return 0; | ||
| 288 | } | ||
| 289 | EXPORT_SYMBOL(do_settimeofday); | ||
| 290 | 207 | ||
| 291 | void __init start_cpu_itimer(void) | 208 | void __init start_cpu_itimer(void) |
| 292 | { | 209 | { |
| @@ -301,11 +218,18 @@ void __init start_cpu_itimer(void) | |||
| 301 | void __init time_init(void) | 218 | void __init time_init(void) |
| 302 | { | 219 | { |
| 303 | static struct pdc_tod tod_data; | 220 | static struct pdc_tod tod_data; |
| 221 | unsigned long current_cr16_khz; | ||
| 304 | 222 | ||
| 305 | clocktick = (100 * PAGE0->mem_10msec) / HZ; | 223 | clocktick = (100 * PAGE0->mem_10msec) / HZ; |
| 306 | 224 | ||
| 307 | start_cpu_itimer(); /* get CPU 0 started */ | 225 | start_cpu_itimer(); /* get CPU 0 started */ |
| 308 | 226 | ||
| 227 | /* register at clocksource framework */ | ||
| 228 | current_cr16_khz = PAGE0->mem_10msec/10; /* kHz */ | ||
| 229 | clocksource_cr16.mult = clocksource_khz2mult(current_cr16_khz, | ||
| 230 | clocksource_cr16.shift); | ||
| 231 | clocksource_register(&clocksource_cr16); | ||
| 232 | |||
| 309 | if (pdc_tod_read(&tod_data) == 0) { | 233 | if (pdc_tod_read(&tod_data) == 0) { |
| 310 | unsigned long flags; | 234 | unsigned long flags; |
| 311 | 235 | ||
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 65cd6ca32fed..55bc1471967d 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
| 27 | #include <linux/console.h> | 27 | #include <linux/console.h> |
| 28 | #include <linux/kallsyms.h> | 28 | #include <linux/kallsyms.h> |
| 29 | #include <linux/bug.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/assembly.h> | 31 | #include <asm/assembly.h> |
| 31 | #include <asm/system.h> | 32 | #include <asm/system.h> |
| @@ -39,6 +40,8 @@ | |||
| 39 | #include <asm/pdc.h> | 40 | #include <asm/pdc.h> |
| 40 | #include <asm/pdc_chassis.h> | 41 | #include <asm/pdc_chassis.h> |
| 41 | #include <asm/unwind.h> | 42 | #include <asm/unwind.h> |
| 43 | #include <asm/tlbflush.h> | ||
| 44 | #include <asm/cacheflush.h> | ||
| 42 | 45 | ||
| 43 | #include "../math-emu/math-emu.h" /* for handle_fpe() */ | 46 | #include "../math-emu/math-emu.h" /* for handle_fpe() */ |
| 44 | 47 | ||
| @@ -49,7 +52,7 @@ | |||
| 49 | DEFINE_SPINLOCK(pa_dbit_lock); | 52 | DEFINE_SPINLOCK(pa_dbit_lock); |
| 50 | #endif | 53 | #endif |
| 51 | 54 | ||
| 52 | int printbinary(char *buf, unsigned long x, int nbits) | 55 | static int printbinary(char *buf, unsigned long x, int nbits) |
| 53 | { | 56 | { |
| 54 | unsigned long mask = 1UL << (nbits - 1); | 57 | unsigned long mask = 1UL << (nbits - 1); |
| 55 | while (mask != 0) { | 58 | while (mask != 0) { |
| @@ -61,7 +64,7 @@ int printbinary(char *buf, unsigned long x, int nbits) | |||
| 61 | return nbits; | 64 | return nbits; |
| 62 | } | 65 | } |
| 63 | 66 | ||
| 64 | #ifdef __LP64__ | 67 | #ifdef CONFIG_64BIT |
| 65 | #define RFMT "%016lx" | 68 | #define RFMT "%016lx" |
| 66 | #else | 69 | #else |
| 67 | #define RFMT "%08lx" | 70 | #define RFMT "%08lx" |
| @@ -160,13 +163,13 @@ static void do_show_stack(struct unwind_frame_info *info) | |||
| 160 | { | 163 | { |
| 161 | int i = 1; | 164 | int i = 1; |
| 162 | 165 | ||
| 163 | printk("Backtrace:\n"); | 166 | printk(KERN_CRIT "Backtrace:\n"); |
| 164 | while (i <= 16) { | 167 | while (i <= 16) { |
| 165 | if (unwind_once(info) < 0 || info->ip == 0) | 168 | if (unwind_once(info) < 0 || info->ip == 0) |
| 166 | break; | 169 | break; |
| 167 | 170 | ||
| 168 | if (__kernel_text_address(info->ip)) { | 171 | if (__kernel_text_address(info->ip)) { |
| 169 | printk(" [<" RFMT ">] ", info->ip); | 172 | printk("%s [<" RFMT ">] ", (i&0x3)==1 ? KERN_CRIT : "", info->ip); |
| 170 | #ifdef CONFIG_KALLSYMS | 173 | #ifdef CONFIG_KALLSYMS |
| 171 | print_symbol("%s\n", info->ip); | 174 | print_symbol("%s\n", info->ip); |
| 172 | #else | 175 | #else |
| @@ -185,18 +188,19 @@ void show_stack(struct task_struct *task, unsigned long *s) | |||
| 185 | 188 | ||
| 186 | if (!task) { | 189 | if (!task) { |
| 187 | unsigned long sp; | 190 | unsigned long sp; |
| 188 | struct pt_regs *r; | ||
| 189 | 191 | ||
| 190 | HERE: | 192 | HERE: |
| 191 | asm volatile ("copy %%r30, %0" : "=r"(sp)); | 193 | asm volatile ("copy %%r30, %0" : "=r"(sp)); |
| 192 | r = kzalloc(sizeof(struct pt_regs), GFP_KERNEL); | 194 | { |
| 193 | if (!r) | 195 | struct pt_regs r; |
| 194 | return; | 196 | |
| 195 | r->iaoq[0] = (unsigned long)&&HERE; | 197 | memset(&r, 0, sizeof(struct pt_regs)); |
| 196 | r->gr[2] = (unsigned long)__builtin_return_address(0); | 198 | r.iaoq[0] = (unsigned long)&&HERE; |
| 197 | r->gr[30] = sp; | 199 | r.gr[2] = (unsigned long)__builtin_return_address(0); |
| 198 | unwind_frame_init(&info, current, r); | 200 | r.gr[30] = sp; |
| 199 | kfree(r); | 201 | |
| 202 | unwind_frame_init(&info, current, &r); | ||
| 203 | } | ||
| 200 | } else { | 204 | } else { |
| 201 | unwind_frame_init_from_blocked_task(&info, task); | 205 | unwind_frame_init_from_blocked_task(&info, task); |
| 202 | } | 206 | } |
| @@ -204,6 +208,11 @@ HERE: | |||
| 204 | do_show_stack(&info); | 208 | do_show_stack(&info); |
| 205 | } | 209 | } |
| 206 | 210 | ||
| 211 | int is_valid_bugaddr(unsigned long iaoq) | ||
| 212 | { | ||
| 213 | return 1; | ||
| 214 | } | ||
| 215 | |||
| 207 | void die_if_kernel(char *str, struct pt_regs *regs, long err) | 216 | void die_if_kernel(char *str, struct pt_regs *regs, long err) |
| 208 | { | 217 | { |
| 209 | if (user_mode(regs)) { | 218 | if (user_mode(regs)) { |
| @@ -222,15 +231,15 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
| 222 | oops_in_progress = 1; | 231 | oops_in_progress = 1; |
| 223 | 232 | ||
| 224 | /* Amuse the user in a SPARC fashion */ | 233 | /* Amuse the user in a SPARC fashion */ |
| 225 | printk( | 234 | if (err) printk( |
| 226 | " _______________________________ \n" | 235 | KERN_CRIT " _______________________________ \n" |
| 227 | " < Your System ate a SPARC! Gah! >\n" | 236 | KERN_CRIT " < Your System ate a SPARC! Gah! >\n" |
| 228 | " ------------------------------- \n" | 237 | KERN_CRIT " ------------------------------- \n" |
| 229 | " \\ ^__^\n" | 238 | KERN_CRIT " \\ ^__^\n" |
| 230 | " \\ (xx)\\_______\n" | 239 | KERN_CRIT " \\ (xx)\\_______\n" |
| 231 | " (__)\\ )\\/\\\n" | 240 | KERN_CRIT " (__)\\ )\\/\\\n" |
| 232 | " U ||----w |\n" | 241 | KERN_CRIT " U ||----w |\n" |
| 233 | " || ||\n"); | 242 | KERN_CRIT " || ||\n"); |
| 234 | 243 | ||
| 235 | /* unlock the pdc lock if necessary */ | 244 | /* unlock the pdc lock if necessary */ |
| 236 | pdc_emergency_unlock(); | 245 | pdc_emergency_unlock(); |
| @@ -242,9 +251,20 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
| 242 | if (!console_drivers) | 251 | if (!console_drivers) |
| 243 | pdc_console_restart(); | 252 | pdc_console_restart(); |
| 244 | 253 | ||
| 245 | printk(KERN_CRIT "%s (pid %d): %s (code %ld)\n", | 254 | if (err) |
| 246 | current->comm, current->pid, str, err); | 255 | printk(KERN_CRIT "%s (pid %d): %s (code %ld)\n", |
| 256 | current->comm, current->pid, str, err); | ||
| 257 | |||
| 258 | /* Wot's wrong wif bein' racy? */ | ||
| 259 | if (current->thread.flags & PARISC_KERNEL_DEATH) { | ||
| 260 | printk(KERN_CRIT "%s() recursion detected.\n", __FUNCTION__); | ||
| 261 | local_irq_enable(); | ||
| 262 | while (1); | ||
| 263 | } | ||
| 264 | current->thread.flags |= PARISC_KERNEL_DEATH; | ||
| 265 | |||
| 247 | show_regs(regs); | 266 | show_regs(regs); |
| 267 | dump_stack(); | ||
| 248 | 268 | ||
| 249 | if (in_interrupt()) | 269 | if (in_interrupt()) |
| 250 | panic("Fatal exception in interrupt"); | 270 | panic("Fatal exception in interrupt"); |
| @@ -255,14 +275,6 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) | |||
| 255 | panic("Fatal exception"); | 275 | panic("Fatal exception"); |
| 256 | } | 276 | } |
| 257 | 277 | ||
| 258 | /* Wot's wrong wif bein' racy? */ | ||
| 259 | if (current->thread.flags & PARISC_KERNEL_DEATH) { | ||
| 260 | printk(KERN_CRIT "%s() recursion detected.\n", __FUNCTION__); | ||
| 261 | local_irq_enable(); | ||
| 262 | while (1); | ||
| 263 | } | ||
| 264 | |||
| 265 | current->thread.flags |= PARISC_KERNEL_DEATH; | ||
| 266 | do_exit(SIGSEGV); | 278 | do_exit(SIGSEGV); |
| 267 | } | 279 | } |
| 268 | 280 | ||
| @@ -273,61 +285,45 @@ int syscall_ipi(int (*syscall) (struct pt_regs *), struct pt_regs *regs) | |||
| 273 | 285 | ||
| 274 | /* gdb uses break 4,8 */ | 286 | /* gdb uses break 4,8 */ |
| 275 | #define GDB_BREAK_INSN 0x10004 | 287 | #define GDB_BREAK_INSN 0x10004 |
| 276 | void handle_gdb_break(struct pt_regs *regs, int wot) | 288 | static void handle_gdb_break(struct pt_regs *regs, int wot) |
| 277 | { | 289 | { |
| 278 | struct siginfo si; | 290 | struct siginfo si; |
| 279 | 291 | ||
| 280 | si.si_code = wot; | ||
| 281 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | ||
| 282 | si.si_signo = SIGTRAP; | 292 | si.si_signo = SIGTRAP; |
| 283 | si.si_errno = 0; | 293 | si.si_errno = 0; |
| 294 | si.si_code = wot; | ||
| 295 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | ||
| 284 | force_sig_info(SIGTRAP, &si, current); | 296 | force_sig_info(SIGTRAP, &si, current); |
| 285 | } | 297 | } |
| 286 | 298 | ||
| 287 | void handle_break(unsigned iir, struct pt_regs *regs) | 299 | static void handle_break(struct pt_regs *regs) |
| 288 | { | 300 | { |
| 289 | struct siginfo si; | 301 | unsigned iir = regs->iir; |
| 290 | 302 | ||
| 291 | switch(iir) { | 303 | if (unlikely(iir == PARISC_BUG_BREAK_INSN && !user_mode(regs))) { |
| 292 | case 0x00: | 304 | /* check if a BUG() or WARN() trapped here. */ |
| 293 | #ifdef PRINT_USER_FAULTS | 305 | enum bug_trap_type tt; |
| 294 | printk(KERN_DEBUG "break 0,0: pid=%d command='%s'\n", | 306 | tt = report_bug(regs->iaoq[0] & ~3); |
| 295 | current->pid, current->comm); | 307 | if (tt == BUG_TRAP_TYPE_WARN) { |
| 296 | #endif | 308 | regs->iaoq[0] += 4; |
| 297 | die_if_kernel("Breakpoint", regs, 0); | 309 | regs->iaoq[1] += 4; |
| 298 | #ifdef PRINT_USER_FAULTS | 310 | return; /* return to next instruction when WARN_ON(). */ |
| 299 | show_regs(regs); | 311 | } |
| 300 | #endif | 312 | die_if_kernel("Unknown kernel breakpoint", regs, |
| 301 | si.si_code = TRAP_BRKPT; | 313 | (tt == BUG_TRAP_TYPE_NONE) ? 9 : 0); |
| 302 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | 314 | } |
| 303 | si.si_signo = SIGTRAP; | ||
| 304 | force_sig_info(SIGTRAP, &si, current); | ||
| 305 | break; | ||
| 306 | |||
| 307 | case GDB_BREAK_INSN: | ||
| 308 | die_if_kernel("Breakpoint", regs, 0); | ||
| 309 | handle_gdb_break(regs, TRAP_BRKPT); | ||
| 310 | break; | ||
| 311 | 315 | ||
| 312 | default: | ||
| 313 | #ifdef PRINT_USER_FAULTS | 316 | #ifdef PRINT_USER_FAULTS |
| 314 | printk(KERN_DEBUG "break %#08x: pid=%d command='%s'\n", | 317 | if (unlikely(iir != GDB_BREAK_INSN)) { |
| 315 | iir, current->pid, current->comm); | 318 | printk(KERN_DEBUG "break %d,%d: pid=%d command='%s'\n", |
| 319 | iir & 31, (iir>>13) & ((1<<13)-1), | ||
| 320 | current->pid, current->comm); | ||
| 316 | show_regs(regs); | 321 | show_regs(regs); |
| 317 | #endif | ||
| 318 | si.si_signo = SIGTRAP; | ||
| 319 | si.si_code = TRAP_BRKPT; | ||
| 320 | si.si_addr = (void __user *) (regs->iaoq[0] & ~3); | ||
| 321 | force_sig_info(SIGTRAP, &si, current); | ||
| 322 | return; | ||
| 323 | } | 322 | } |
| 324 | } | 323 | #endif |
| 325 | |||
| 326 | 324 | ||
| 327 | int handle_toc(void) | 325 | /* send standard GDB signal */ |
| 328 | { | 326 | handle_gdb_break(regs, TRAP_BRKPT); |
| 329 | printk(KERN_CRIT "TOC call.\n"); | ||
| 330 | return 0; | ||
| 331 | } | 327 | } |
| 332 | 328 | ||
| 333 | static void default_trap(int code, struct pt_regs *regs) | 329 | static void default_trap(int code, struct pt_regs *regs) |
| @@ -336,7 +332,7 @@ static void default_trap(int code, struct pt_regs *regs) | |||
| 336 | show_regs(regs); | 332 | show_regs(regs); |
| 337 | } | 333 | } |
| 338 | 334 | ||
| 339 | void (*cpu_lpmc) (int code, struct pt_regs *regs) = default_trap; | 335 | void (*cpu_lpmc) (int code, struct pt_regs *regs) __read_mostly = default_trap; |
| 340 | 336 | ||
| 341 | 337 | ||
| 342 | void transfer_pim_to_trap_frame(struct pt_regs *regs) | 338 | void transfer_pim_to_trap_frame(struct pt_regs *regs) |
| @@ -554,7 +550,8 @@ void handle_interruption(int code, struct pt_regs *regs) | |||
| 554 | /* Low-priority machine check */ | 550 | /* Low-priority machine check */ |
| 555 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_LPMC); | 551 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_LPMC); |
| 556 | 552 | ||
| 557 | flush_all_caches(); | 553 | flush_cache_all(); |
| 554 | flush_tlb_all(); | ||
| 558 | cpu_lpmc(5, regs); | 555 | cpu_lpmc(5, regs); |
| 559 | return; | 556 | return; |
| 560 | 557 | ||
| @@ -572,7 +569,7 @@ void handle_interruption(int code, struct pt_regs *regs) | |||
| 572 | 569 | ||
| 573 | case 9: | 570 | case 9: |
| 574 | /* Break instruction trap */ | 571 | /* Break instruction trap */ |
| 575 | handle_break(regs->iir,regs); | 572 | handle_break(regs); |
| 576 | return; | 573 | return; |
| 577 | 574 | ||
| 578 | case 10: | 575 | case 10: |
| @@ -840,7 +837,7 @@ int __init check_ivt(void *iva) | |||
| 840 | return 0; | 837 | return 0; |
| 841 | } | 838 | } |
| 842 | 839 | ||
| 843 | #ifndef __LP64__ | 840 | #ifndef CONFIG_64BIT |
| 844 | extern const void fault_vector_11; | 841 | extern const void fault_vector_11; |
| 845 | #endif | 842 | #endif |
| 846 | extern const void fault_vector_20; | 843 | extern const void fault_vector_20; |
| @@ -852,7 +849,7 @@ void __init trap_init(void) | |||
| 852 | if (boot_cpu_data.cpu_type >= pcxu) | 849 | if (boot_cpu_data.cpu_type >= pcxu) |
| 853 | iva = (void *) &fault_vector_20; | 850 | iva = (void *) &fault_vector_20; |
| 854 | else | 851 | else |
| 855 | #ifdef __LP64__ | 852 | #ifdef CONFIG_64BIT |
| 856 | panic("Can't boot 64-bit OS on PA1.1 processor!"); | 853 | panic("Can't boot 64-bit OS on PA1.1 processor!"); |
| 857 | #else | 854 | #else |
| 858 | iva = (void *) &fault_vector_11; | 855 | iva = (void *) &fault_vector_11; |
diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c index bd2230d6a2a6..347bb922e6d0 100644 --- a/arch/parisc/kernel/unaligned.c +++ b/arch/parisc/kernel/unaligned.c | |||
| @@ -20,8 +20,11 @@ | |||
| 20 | * | 20 | * |
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | #include <linux/jiffies.h> | ||
| 23 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
| 26 | #include <linux/sched.h> | ||
| 27 | #include <linux/signal.h> | ||
| 25 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
| 26 | 29 | ||
| 27 | /* #define DEBUG_UNALIGNED 1 */ | 30 | /* #define DEBUG_UNALIGNED 1 */ |
| @@ -32,7 +35,7 @@ | |||
| 32 | #define DPRINTF(fmt, args...) | 35 | #define DPRINTF(fmt, args...) |
| 33 | #endif | 36 | #endif |
| 34 | 37 | ||
| 35 | #ifdef __LP64__ | 38 | #ifdef CONFIG_64BIT |
| 36 | #define RFMT "%016lx" | 39 | #define RFMT "%016lx" |
| 37 | #else | 40 | #else |
| 38 | #define RFMT "%08lx" | 41 | #define RFMT "%08lx" |
| @@ -147,15 +150,8 @@ static int emulate_ldh(struct pt_regs *regs, int toreg) | |||
| 147 | "4: ldi -2, %1\n" | 150 | "4: ldi -2, %1\n" |
| 148 | FIXUP_BRANCH(3b) | 151 | FIXUP_BRANCH(3b) |
| 149 | " .previous\n" | 152 | " .previous\n" |
| 150 | " .section __ex_table,\"aw\"\n" | 153 | ASM_EXCEPTIONTABLE_ENTRY(1b, 4b) |
| 151 | #ifdef __LP64__ | 154 | ASM_EXCEPTIONTABLE_ENTRY(2b, 4b) |
| 152 | " .dword 1b,4b\n" | ||
| 153 | " .dword 2b,4b\n" | ||
| 154 | #else | ||
| 155 | " .word 1b,4b\n" | ||
| 156 | " .word 2b,4b\n" | ||
| 157 | #endif | ||
| 158 | " .previous\n" | ||
| 159 | : "=r" (val), "=r" (ret) | 155 | : "=r" (val), "=r" (ret) |
| 160 | : "0" (val), "r" (saddr), "r" (regs->isr) | 156 | : "0" (val), "r" (saddr), "r" (regs->isr) |
| 161 | : "r20", FIXUP_BRANCH_CLOBBER ); | 157 | : "r20", FIXUP_BRANCH_CLOBBER ); |
| @@ -192,15 +188,8 @@ static int emulate_ldw(struct pt_regs *regs, int toreg, int flop) | |||
| 192 | "4: ldi -2, %1\n" | 188 | "4: ldi -2, %1\n" |
| 193 | FIXUP_BRANCH(3b) | 189 | FIXUP_BRANCH(3b) |
| 194 | " .previous\n" | 190 | " .previous\n" |
| 195 | " .section __ex_table,\"aw\"\n" | 191 | ASM_EXCEPTIONTABLE_ENTRY(1b, 4b) |
| 196 | #ifdef __LP64__ | 192 | ASM_EXCEPTIONTABLE_ENTRY(2b, 4b) |
| 197 | " .dword 1b,4b\n" | ||
| 198 | " .dword 2b,4b\n" | ||
| 199 | #else | ||
| 200 | " .word 1b,4b\n" | ||
| 201 | " .word 2b,4b\n" | ||
| 202 | #endif | ||
| 203 | " .previous\n" | ||
| 204 | : "=r" (val), "=r" (ret) | 193 | : "=r" (val), "=r" (ret) |
| 205 | : "0" (val), "r" (saddr), "r" (regs->isr) | 194 | : "0" (val), "r" (saddr), "r" (regs->isr) |
| 206 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); | 195 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
| @@ -224,7 +213,7 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
| 224 | regs->isr, regs->ior, toreg); | 213 | regs->isr, regs->ior, toreg); |
| 225 | #ifdef CONFIG_PA20 | 214 | #ifdef CONFIG_PA20 |
| 226 | 215 | ||
| 227 | #ifndef __LP64__ | 216 | #ifndef CONFIG_64BIT |
| 228 | if (!flop) | 217 | if (!flop) |
| 229 | return -1; | 218 | return -1; |
| 230 | #endif | 219 | #endif |
| @@ -243,15 +232,8 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
| 243 | "4: ldi -2, %1\n" | 232 | "4: ldi -2, %1\n" |
| 244 | FIXUP_BRANCH(3b) | 233 | FIXUP_BRANCH(3b) |
| 245 | " .previous\n" | 234 | " .previous\n" |
| 246 | " .section __ex_table,\"aw\"\n" | 235 | ASM_EXCEPTIONTABLE_ENTRY(1b,4b) |
| 247 | #ifdef __LP64__ | 236 | ASM_EXCEPTIONTABLE_ENTRY(2b,4b) |
| 248 | " .dword 1b,4b\n" | ||
| 249 | " .dword 2b,4b\n" | ||
| 250 | #else | ||
| 251 | " .word 1b,4b\n" | ||
| 252 | " .word 2b,4b\n" | ||
| 253 | #endif | ||
| 254 | " .previous\n" | ||
| 255 | : "=r" (val), "=r" (ret) | 237 | : "=r" (val), "=r" (ret) |
| 256 | : "0" (val), "r" (saddr), "r" (regs->isr) | 238 | : "0" (val), "r" (saddr), "r" (regs->isr) |
| 257 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); | 239 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
| @@ -275,17 +257,9 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop) | |||
| 275 | "5: ldi -2, %2\n" | 257 | "5: ldi -2, %2\n" |
| 276 | FIXUP_BRANCH(4b) | 258 | FIXUP_BRANCH(4b) |
| 277 | " .previous\n" | 259 | " .previous\n" |
| 278 | " .section __ex_table,\"aw\"\n" | 260 | ASM_EXCEPTIONTABLE_ENTRY(1b,5b) |
| 279 | #ifdef __LP64__ | 261 | ASM_EXCEPTIONTABLE_ENTRY(2b,5b) |
| 280 | " .dword 1b,5b\n" | 262 | ASM_EXCEPTIONTABLE_ENTRY(3b,5b) |
| 281 | " .dword 2b,5b\n" | ||
| 282 | " .dword 3b,5b\n" | ||
| 283 | #else | ||
| 284 | " .word 1b,5b\n" | ||
| 285 | " .word 2b,5b\n" | ||
| 286 | " .word 3b,5b\n" | ||
| 287 | #endif | ||
| 288 | " .previous\n" | ||
| 289 | : "=r" (valh), "=r" (vall), "=r" (ret) | 263 | : "=r" (valh), "=r" (vall), "=r" (ret) |
| 290 | : "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr) | 264 | : "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr) |
| 291 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); | 265 | : "r19", "r20", FIXUP_BRANCH_CLOBBER ); |
| @@ -325,15 +299,8 @@ static int emulate_sth(struct pt_regs *regs, int frreg) | |||
| 325 | "4: ldi -2, %0\n" | 299 | "4: ldi -2, %0\n" |
| 326 | FIXUP_BRANCH(3b) | 300 | FIXUP_BRANCH(3b) |
| 327 | " .previous\n" | 301 | " .previous\n" |
| 328 | " .section __ex_table,\"aw\"\n" | 302 | ASM_EXCEPTIONTABLE_ENTRY(1b,4b) |
| 329 | #ifdef __LP64__ | 303 | ASM_EXCEPTIONTABLE_ENTRY(2b,4b) |
| 330 | " .dword 1b,4b\n" | ||
| 331 | " .dword 2b,4b\n" | ||
| 332 | #else | ||
| 333 | " .word 1b,4b\n" | ||
| 334 | " .word 2b,4b\n" | ||
| 335 | #endif | ||
| 336 | " .previous\n" | ||
| 337 | : "=r" (ret) | 304 | : "=r" (ret) |
| 338 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 305 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
| 339 | : "r19", FIXUP_BRANCH_CLOBBER ); | 306 | : "r19", FIXUP_BRANCH_CLOBBER ); |
| @@ -379,15 +346,8 @@ static int emulate_stw(struct pt_regs *regs, int frreg, int flop) | |||
| 379 | "4: ldi -2, %0\n" | 346 | "4: ldi -2, %0\n" |
| 380 | FIXUP_BRANCH(3b) | 347 | FIXUP_BRANCH(3b) |
| 381 | " .previous\n" | 348 | " .previous\n" |
| 382 | " .section __ex_table,\"aw\"\n" | 349 | ASM_EXCEPTIONTABLE_ENTRY(1b,4b) |
| 383 | #ifdef __LP64__ | 350 | ASM_EXCEPTIONTABLE_ENTRY(2b,4b) |
| 384 | " .dword 1b,4b\n" | ||
| 385 | " .dword 2b,4b\n" | ||
| 386 | #else | ||
| 387 | " .word 1b,4b\n" | ||
| 388 | " .word 2b,4b\n" | ||
| 389 | #endif | ||
| 390 | " .previous\n" | ||
| 391 | : "=r" (ret) | 351 | : "=r" (ret) |
| 392 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 352 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
| 393 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); | 353 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); |
| @@ -410,7 +370,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
| 410 | val, regs->isr, regs->ior); | 370 | val, regs->isr, regs->ior); |
| 411 | 371 | ||
| 412 | #ifdef CONFIG_PA20 | 372 | #ifdef CONFIG_PA20 |
| 413 | #ifndef __LP64__ | 373 | #ifndef CONFIG_64BIT |
| 414 | if (!flop) | 374 | if (!flop) |
| 415 | return -1; | 375 | return -1; |
| 416 | #endif | 376 | #endif |
| @@ -436,19 +396,10 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
| 436 | "6: ldi -2, %0\n" | 396 | "6: ldi -2, %0\n" |
| 437 | FIXUP_BRANCH(5b) | 397 | FIXUP_BRANCH(5b) |
| 438 | " .previous\n" | 398 | " .previous\n" |
| 439 | " .section __ex_table,\"aw\"\n" | 399 | ASM_EXCEPTIONTABLE_ENTRY(1b,6b) |
| 440 | #ifdef __LP64__ | 400 | ASM_EXCEPTIONTABLE_ENTRY(2b,6b) |
| 441 | " .dword 1b,6b\n" | 401 | ASM_EXCEPTIONTABLE_ENTRY(3b,6b) |
| 442 | " .dword 2b,6b\n" | 402 | ASM_EXCEPTIONTABLE_ENTRY(4b,6b) |
| 443 | " .dword 3b,6b\n" | ||
| 444 | " .dword 4b,6b\n" | ||
| 445 | #else | ||
| 446 | " .word 1b,6b\n" | ||
| 447 | " .word 2b,6b\n" | ||
| 448 | " .word 3b,6b\n" | ||
| 449 | " .word 4b,6b\n" | ||
| 450 | #endif | ||
| 451 | " .previous\n" | ||
| 452 | : "=r" (ret) | 403 | : "=r" (ret) |
| 453 | : "r" (val), "r" (regs->ior), "r" (regs->isr) | 404 | : "r" (val), "r" (regs->ior), "r" (regs->isr) |
| 454 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); | 405 | : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER ); |
| @@ -479,21 +430,11 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop) | |||
| 479 | "7: ldi -2, %0\n" | 430 | "7: ldi -2, %0\n" |
| 480 | FIXUP_BRANCH(6b) | 431 | FIXUP_BRANCH(6b) |
| 481 | " .previous\n" | 432 | " .previous\n" |
| 482 | " .section __ex_table,\"aw\"\n" | 433 | ASM_EXCEPTIONTABLE_ENTRY(1b,7b) |
| 483 | #ifdef __LP64__ | 434 | ASM_EXCEPTIONTABLE_ENTRY(2b,7b) |
| 484 | " .dword 1b,7b\n" | 435 | ASM_EXCEPTIONTABLE_ENTRY(3b,7b) |
| 485 | " .dword 2b,7b\n" | 436 | ASM_EXCEPTIONTABLE_ENTRY(4b,7b) |
| 486 | " .dword 3b,7b\n" | 437 | ASM_EXCEPTIONTABLE_ENTRY(5b,7b) |
| 487 | " .dword 4b,7b\n" | ||
| 488 | " .dword 5b,7b\n" | ||
| 489 | #else | ||
| 490 | " .word 1b,7b\n" | ||
| 491 | " .word 2b,7b\n" | ||
| 492 | " .word 3b,7b\n" | ||
| 493 | " .word 4b,7b\n" | ||
| 494 | " .word 5b,7b\n" | ||
| 495 | #endif | ||
| 496 | " .previous\n" | ||
| 497 | : "=r" (ret) | 438 | : "=r" (ret) |
| 498 | : "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr) | 439 | : "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr) |
| 499 | : "r19", "r20", "r21", "r1", FIXUP_BRANCH_CLOBBER ); | 440 | : "r19", "r20", "r21", "r1", FIXUP_BRANCH_CLOBBER ); |
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index c10ab47d81fa..5f75b3e65986 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/sched.h> | ||
| 13 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 14 | #include <linux/kallsyms.h> | 15 | #include <linux/kallsyms.h> |
| 15 | 16 | ||
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 3b78c2794c36..2a8253358c6c 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
| @@ -68,6 +68,8 @@ SECTIONS | |||
| 68 | 68 | ||
| 69 | RODATA | 69 | RODATA |
| 70 | 70 | ||
| 71 | BUG_TABLE | ||
| 72 | |||
| 71 | /* writeable */ | 73 | /* writeable */ |
| 72 | . = ALIGN(ASM_PAGE_SIZE); /* Make sure this is page aligned so | 74 | . = ALIGN(ASM_PAGE_SIZE); /* Make sure this is page aligned so |
| 73 | that we can properly leave these | 75 | that we can properly leave these |
diff --git a/arch/parisc/lib/bitops.c b/arch/parisc/lib/bitops.c index f352666b5b2f..e3eb739fab19 100644 --- a/arch/parisc/lib/bitops.c +++ b/arch/parisc/lib/bitops.c | |||
| @@ -17,7 +17,7 @@ raw_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = { | |||
| 17 | }; | 17 | }; |
| 18 | #endif | 18 | #endif |
| 19 | 19 | ||
| 20 | #ifdef __LP64__ | 20 | #ifdef CONFIG_64BIT |
| 21 | unsigned long __xchg64(unsigned long x, unsigned long *ptr) | 21 | unsigned long __xchg64(unsigned long x, unsigned long *ptr) |
| 22 | { | 22 | { |
| 23 | unsigned long temp, flags; | 23 | unsigned long temp, flags; |
| @@ -56,7 +56,7 @@ unsigned long __xchg8(char x, char *ptr) | |||
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | 58 | ||
| 59 | #ifdef __LP64__ | 59 | #ifdef CONFIG_64BIT |
| 60 | unsigned long __cmpxchg_u64(volatile unsigned long *ptr, unsigned long old, unsigned long new) | 60 | unsigned long __cmpxchg_u64(volatile unsigned long *ptr, unsigned long old, unsigned long new) |
| 61 | { | 61 | { |
| 62 | unsigned long flags; | 62 | unsigned long flags; |
diff --git a/arch/parisc/lib/fixup.S b/arch/parisc/lib/fixup.S index ecce3d35401f..d172d4245cdc 100644 --- a/arch/parisc/lib/fixup.S +++ b/arch/parisc/lib/fixup.S | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <asm/asm-offsets.h> | 22 | #include <asm/asm-offsets.h> |
| 23 | #include <asm/assembly.h> | 23 | #include <asm/assembly.h> |
| 24 | #include <asm/errno.h> | 24 | #include <asm/errno.h> |
| 25 | #include <linux/linkage.h> | ||
| 25 | 26 | ||
| 26 | #ifdef CONFIG_SMP | 27 | #ifdef CONFIG_SMP |
| 27 | .macro get_fault_ip t1 t2 | 28 | .macro get_fault_ip t1 t2 |
| @@ -30,7 +31,7 @@ | |||
| 30 | /* t2 = smp_processor_id() */ | 31 | /* t2 = smp_processor_id() */ |
| 31 | mfctl 30,\t2 | 32 | mfctl 30,\t2 |
| 32 | ldw TI_CPU(\t2),\t2 | 33 | ldw TI_CPU(\t2),\t2 |
| 33 | #ifdef __LP64__ | 34 | #ifdef CONFIG_64BIT |
| 34 | extrd,u \t2,63,32,\t2 | 35 | extrd,u \t2,63,32,\t2 |
| 35 | #endif | 36 | #endif |
| 36 | /* t2 = &__per_cpu_offset[smp_processor_id()]; */ | 37 | /* t2 = &__per_cpu_offset[smp_processor_id()]; */ |
| @@ -58,33 +59,34 @@ | |||
| 58 | .section .fixup, "ax" | 59 | .section .fixup, "ax" |
| 59 | 60 | ||
| 60 | /* get_user() fixups, store -EFAULT in r8, and 0 in r9 */ | 61 | /* get_user() fixups, store -EFAULT in r8, and 0 in r9 */ |
| 61 | .export fixup_get_user_skip_1 | 62 | ENTRY(fixup_get_user_skip_1) |
| 62 | fixup_get_user_skip_1: | ||
| 63 | get_fault_ip %r1,%r8 | 63 | get_fault_ip %r1,%r8 |
| 64 | ldo 4(%r1), %r1 | 64 | ldo 4(%r1), %r1 |
| 65 | ldi -EFAULT, %r8 | 65 | ldi -EFAULT, %r8 |
| 66 | bv %r0(%r1) | 66 | bv %r0(%r1) |
| 67 | copy %r0, %r9 | 67 | copy %r0, %r9 |
| 68 | ENDPROC(fixup_get_user_skip_1) | ||
| 68 | 69 | ||
| 69 | .export fixup_get_user_skip_2 | 70 | ENTRY(fixup_get_user_skip_2) |
| 70 | fixup_get_user_skip_2: | ||
| 71 | get_fault_ip %r1,%r8 | 71 | get_fault_ip %r1,%r8 |
| 72 | ldo 8(%r1), %r1 | 72 | ldo 8(%r1), %r1 |
| 73 | ldi -EFAULT, %r8 | 73 | ldi -EFAULT, %r8 |
| 74 | bv %r0(%r1) | 74 | bv %r0(%r1) |
| 75 | copy %r0, %r9 | 75 | copy %r0, %r9 |
| 76 | ENDPROC(fixup_get_user_skip_2) | ||
| 76 | 77 | ||
| 77 | /* put_user() fixups, store -EFAULT in r8 */ | 78 | /* put_user() fixups, store -EFAULT in r8 */ |
| 78 | .export fixup_put_user_skip_1 | 79 | ENTRY(fixup_put_user_skip_1) |
| 79 | fixup_put_user_skip_1: | ||
| 80 | get_fault_ip %r1,%r8 | 80 | get_fault_ip %r1,%r8 |
| 81 | ldo 4(%r1), %r1 | 81 | ldo 4(%r1), %r1 |
| 82 | bv %r0(%r1) | 82 | bv %r0(%r1) |
| 83 | ldi -EFAULT, %r8 | 83 | ldi -EFAULT, %r8 |
| 84 | ENDPROC(fixup_put_user_skip_1) | ||
| 84 | 85 | ||
| 85 | .export fixup_put_user_skip_2 | 86 | ENTRY(fixup_put_user_skip_2) |
| 86 | fixup_put_user_skip_2: | ||
| 87 | get_fault_ip %r1,%r8 | 87 | get_fault_ip %r1,%r8 |
| 88 | ldo 8(%r1), %r1 | 88 | ldo 8(%r1), %r1 |
| 89 | bv %r0(%r1) | 89 | bv %r0(%r1) |
| 90 | ldi -EFAULT, %r8 | 90 | ldi -EFAULT, %r8 |
| 91 | ENDPROC(fixup_put_user_skip_2) | ||
| 92 | |||
diff --git a/arch/parisc/lib/lusercopy.S b/arch/parisc/lib/lusercopy.S index a0509855c9a7..1bd23ccec17b 100644 --- a/arch/parisc/lib/lusercopy.S +++ b/arch/parisc/lib/lusercopy.S | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | 37 | ||
| 38 | #include <asm/assembly.h> | 38 | #include <asm/assembly.h> |
| 39 | #include <asm/errno.h> | 39 | #include <asm/errno.h> |
| 40 | #include <linux/linkage.h> | ||
| 40 | 41 | ||
| 41 | /* | 42 | /* |
| 42 | * get_sr gets the appropriate space value into | 43 | * get_sr gets the appropriate space value into |
| @@ -67,8 +68,7 @@ | |||
| 67 | * otherwise strlen (i.e. excludes zero byte) | 68 | * otherwise strlen (i.e. excludes zero byte) |
| 68 | */ | 69 | */ |
| 69 | 70 | ||
| 70 | .export lstrncpy_from_user,code | 71 | ENTRY(lstrncpy_from_user) |
| 71 | lstrncpy_from_user: | ||
| 72 | .proc | 72 | .proc |
| 73 | .callinfo NO_CALLS | 73 | .callinfo NO_CALLS |
| 74 | .entry | 74 | .entry |
| @@ -87,6 +87,7 @@ $lsfu_exit: | |||
| 87 | bv %r0(%r2) | 87 | bv %r0(%r2) |
| 88 | nop | 88 | nop |
| 89 | .exit | 89 | .exit |
| 90 | ENDPROC(lstrncpy_from_user) | ||
| 90 | 91 | ||
| 91 | .section .fixup,"ax" | 92 | .section .fixup,"ax" |
| 92 | 3: fixup_branch $lsfu_exit | 93 | 3: fixup_branch $lsfu_exit |
| @@ -94,13 +95,8 @@ $lsfu_exit: | |||
| 94 | .previous | 95 | .previous |
| 95 | 96 | ||
| 96 | .section __ex_table,"aw" | 97 | .section __ex_table,"aw" |
| 97 | #ifdef __LP64__ | 98 | ASM_ULONG_INSN 1b,3b |
| 98 | .dword 1b,3b | 99 | ASM_ULONG_INSN 2b,3b |
| 99 | .dword 2b,3b | ||
| 100 | #else | ||
| 101 | .word 1b,3b | ||
| 102 | .word 2b,3b | ||
| 103 | #endif | ||
| 104 | .previous | 100 | .previous |
| 105 | 101 | ||
| 106 | .procend | 102 | .procend |
| @@ -112,8 +108,7 @@ $lsfu_exit: | |||
| 112 | * otherwise, returns number of bytes not transferred. | 108 | * otherwise, returns number of bytes not transferred. |
| 113 | */ | 109 | */ |
| 114 | 110 | ||
| 115 | .export lclear_user,code | 111 | ENTRY(lclear_user) |
| 116 | lclear_user: | ||
| 117 | .proc | 112 | .proc |
| 118 | .callinfo NO_CALLS | 113 | .callinfo NO_CALLS |
| 119 | .entry | 114 | .entry |
| @@ -127,6 +122,7 @@ $lclu_done: | |||
| 127 | bv %r0(%r2) | 122 | bv %r0(%r2) |
| 128 | copy %r25,%r28 | 123 | copy %r25,%r28 |
| 129 | .exit | 124 | .exit |
| 125 | ENDPROC(lclear_user) | ||
| 130 | 126 | ||
| 131 | .section .fixup,"ax" | 127 | .section .fixup,"ax" |
| 132 | 2: fixup_branch $lclu_done | 128 | 2: fixup_branch $lclu_done |
| @@ -134,11 +130,7 @@ $lclu_done: | |||
| 134 | .previous | 130 | .previous |
| 135 | 131 | ||
| 136 | .section __ex_table,"aw" | 132 | .section __ex_table,"aw" |
| 137 | #ifdef __LP64__ | 133 | ASM_ULONG_INSN 1b,2b |
| 138 | .dword 1b,2b | ||
| 139 | #else | ||
| 140 | .word 1b,2b | ||
| 141 | #endif | ||
| 142 | .previous | 134 | .previous |
| 143 | 135 | ||
| 144 | .procend | 136 | .procend |
| @@ -151,8 +143,7 @@ $lclu_done: | |||
| 151 | * else strlen + 1 (i.e. includes zero byte). | 143 | * else strlen + 1 (i.e. includes zero byte). |
| 152 | */ | 144 | */ |
| 153 | 145 | ||
| 154 | .export lstrnlen_user,code | 146 | ENTRY(lstrnlen_user) |
| 155 | lstrnlen_user: | ||
| 156 | .proc | 147 | .proc |
| 157 | .callinfo NO_CALLS | 148 | .callinfo NO_CALLS |
| 158 | .entry | 149 | .entry |
| @@ -172,6 +163,7 @@ $lslen_done: | |||
| 172 | $lslen_nzero: | 163 | $lslen_nzero: |
| 173 | b $lslen_done | 164 | b $lslen_done |
| 174 | ldo 1(%r26),%r26 /* special case for N == 0 */ | 165 | ldo 1(%r26),%r26 /* special case for N == 0 */ |
| 166 | ENDPROC(lstrnlen_user) | ||
| 175 | 167 | ||
| 176 | .section .fixup,"ax" | 168 | .section .fixup,"ax" |
| 177 | 3: fixup_branch $lslen_done | 169 | 3: fixup_branch $lslen_done |
| @@ -179,13 +171,8 @@ $lslen_nzero: | |||
| 179 | .previous | 171 | .previous |
| 180 | 172 | ||
| 181 | .section __ex_table,"aw" | 173 | .section __ex_table,"aw" |
| 182 | #ifdef __LP64__ | 174 | ASM_ULONG_INSN 1b,3b |
| 183 | .dword 1b,3b | 175 | ASM_ULONG_INSN 2b,3b |
| 184 | .dword 2b,3b | ||
| 185 | #else | ||
| 186 | .word 1b,3b | ||
| 187 | .word 2b,3b | ||
| 188 | #endif | ||
| 189 | .previous | 176 | .previous |
| 190 | 177 | ||
| 191 | .procend | 178 | .procend |
diff --git a/arch/parisc/lib/memcpy.c b/arch/parisc/lib/memcpy.c index 5575e41f9d60..2c43ebe99a9c 100644 --- a/arch/parisc/lib/memcpy.c +++ b/arch/parisc/lib/memcpy.c | |||
| @@ -96,30 +96,18 @@ DECLARE_PER_CPU(struct exception_data, exception_data); | |||
| 96 | #define DPRINTF(fmt, args...) | 96 | #define DPRINTF(fmt, args...) |
| 97 | #endif | 97 | #endif |
| 98 | 98 | ||
| 99 | #ifndef __LP64__ | ||
| 100 | #define EXC_WORD ".word" | ||
| 101 | #else | ||
| 102 | #define EXC_WORD ".dword" | ||
| 103 | #endif | ||
| 104 | |||
| 105 | #define def_load_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e) \ | 99 | #define def_load_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e) \ |
| 106 | __asm__ __volatile__ ( \ | 100 | __asm__ __volatile__ ( \ |
| 107 | "1:\t" #_insn ",ma " #_sz "(" _s ",%1), %0\n" \ | 101 | "1:\t" #_insn ",ma " #_sz "(" _s ",%1), %0\n\t" \ |
| 108 | "\t.section __ex_table,\"aw\"\n" \ | 102 | ASM_EXCEPTIONTABLE_ENTRY(1b,_e) \ |
| 109 | "\t" EXC_WORD "\t1b\n" \ | ||
| 110 | "\t" EXC_WORD "\t" #_e "\n" \ | ||
| 111 | "\t.previous\n" \ | ||
| 112 | : _tt(_t), "+r"(_a) \ | 103 | : _tt(_t), "+r"(_a) \ |
| 113 | : \ | 104 | : \ |
| 114 | : "r8") | 105 | : "r8") |
| 115 | 106 | ||
| 116 | #define def_store_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e) \ | 107 | #define def_store_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e) \ |
| 117 | __asm__ __volatile__ ( \ | 108 | __asm__ __volatile__ ( \ |
| 118 | "1:\t" #_insn ",ma %1, " #_sz "(" _s ",%0)\n" \ | 109 | "1:\t" #_insn ",ma %1, " #_sz "(" _s ",%0)\n\t" \ |
| 119 | "\t.section __ex_table,\"aw\"\n" \ | 110 | ASM_EXCEPTIONTABLE_ENTRY(1b,_e) \ |
| 120 | "\t" EXC_WORD "\t1b\n" \ | ||
| 121 | "\t" EXC_WORD "\t" #_e "\n" \ | ||
| 122 | "\t.previous\n" \ | ||
| 123 | : "+r"(_a) \ | 111 | : "+r"(_a) \ |
| 124 | : _tt(_t) \ | 112 | : _tt(_t) \ |
| 125 | : "r8") | 113 | : "r8") |
| @@ -133,22 +121,16 @@ DECLARE_PER_CPU(struct exception_data, exception_data); | |||
| 133 | 121 | ||
| 134 | #define def_load_insn(_insn,_tt,_s,_o,_a,_t,_e) \ | 122 | #define def_load_insn(_insn,_tt,_s,_o,_a,_t,_e) \ |
| 135 | __asm__ __volatile__ ( \ | 123 | __asm__ __volatile__ ( \ |
| 136 | "1:\t" #_insn " " #_o "(" _s ",%1), %0\n" \ | 124 | "1:\t" #_insn " " #_o "(" _s ",%1), %0\n\t" \ |
| 137 | "\t.section __ex_table,\"aw\"\n" \ | 125 | ASM_EXCEPTIONTABLE_ENTRY(1b,_e) \ |
| 138 | "\t" EXC_WORD "\t1b\n" \ | ||
| 139 | "\t" EXC_WORD "\t" #_e "\n" \ | ||
| 140 | "\t.previous\n" \ | ||
| 141 | : _tt(_t) \ | 126 | : _tt(_t) \ |
| 142 | : "r"(_a) \ | 127 | : "r"(_a) \ |
| 143 | : "r8") | 128 | : "r8") |
| 144 | 129 | ||
| 145 | #define def_store_insn(_insn,_tt,_s,_t,_o,_a,_e) \ | 130 | #define def_store_insn(_insn,_tt,_s,_t,_o,_a,_e) \ |
| 146 | __asm__ __volatile__ ( \ | 131 | __asm__ __volatile__ ( \ |
| 147 | "1:\t" #_insn " %0, " #_o "(" _s ",%1)\n" \ | 132 | "1:\t" #_insn " %0, " #_o "(" _s ",%1)\n\t" \ |
| 148 | "\t.section __ex_table,\"aw\"\n" \ | 133 | ASM_EXCEPTIONTABLE_ENTRY(1b,_e) \ |
| 149 | "\t" EXC_WORD "\t1b\n" \ | ||
| 150 | "\t" EXC_WORD "\t" #_e "\n" \ | ||
| 151 | "\t.previous\n" \ | ||
| 152 | : \ | 134 | : \ |
| 153 | : _tt(_t), "r"(_a) \ | 135 | : _tt(_t), "r"(_a) \ |
| 154 | : "r8") | 136 | : "r8") |
| @@ -167,8 +149,8 @@ extern inline void prefetch_dst(const void *addr) | |||
| 167 | __asm__("ldd 0(" d_space ",%0), %%r0" : : "r" (addr)); | 149 | __asm__("ldd 0(" d_space ",%0), %%r0" : : "r" (addr)); |
| 168 | } | 150 | } |
| 169 | #else | 151 | #else |
| 170 | #define prefetch_src(addr) | 152 | #define prefetch_src(addr) do { } while(0) |
| 171 | #define prefetch_dst(addr) | 153 | #define prefetch_dst(addr) do { } while(0) |
| 172 | #endif | 154 | #endif |
| 173 | 155 | ||
| 174 | /* Copy from a not-aligned src to an aligned dst, using shifts. Handles 4 words | 156 | /* Copy from a not-aligned src to an aligned dst, using shifts. Handles 4 words |
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index 641f9c920eee..f6f67554c623 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
| @@ -24,10 +24,6 @@ | |||
| 24 | /* dumped to the console via printk) */ | 24 | /* dumped to the console via printk) */ |
| 25 | 25 | ||
| 26 | 26 | ||
| 27 | /* Defines for parisc_acctyp() */ | ||
| 28 | #define READ 0 | ||
| 29 | #define WRITE 1 | ||
| 30 | |||
| 31 | /* Various important other fields */ | 27 | /* Various important other fields */ |
| 32 | #define bit22set(x) (x & 0x00000200) | 28 | #define bit22set(x) (x & 0x00000200) |
| 33 | #define bits23_25set(x) (x & 0x000001c0) | 29 | #define bits23_25set(x) (x & 0x000001c0) |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index 12117db0043b..75ea9f2a8a41 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * changed by Philipp Rumpf | 6 | * changed by Philipp Rumpf |
| 7 | * Copyright 1999 Philipp Rumpf (prumpf@tux.org) | 7 | * Copyright 1999 Philipp Rumpf (prumpf@tux.org) |
| 8 | * Copyright 2004 Randolph Chung (tausq@debian.org) | 8 | * Copyright 2004 Randolph Chung (tausq@debian.org) |
| 9 | * Copyright 2006 Helge Deller (deller@gmx.de) | 9 | * Copyright 2006-2007 Helge Deller (deller@gmx.de) |
| 10 | * | 10 | * |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/pagemap.h> /* for release_pages and page_cache_release */ | 24 | #include <linux/pagemap.h> /* for release_pages and page_cache_release */ |
| 25 | 25 | ||
| 26 | #include <asm/pgalloc.h> | 26 | #include <asm/pgalloc.h> |
| 27 | #include <asm/pgtable.h> | ||
| 27 | #include <asm/tlb.h> | 28 | #include <asm/tlb.h> |
| 28 | #include <asm/pdc_chassis.h> | 29 | #include <asm/pdc_chassis.h> |
| 29 | #include <asm/mmzone.h> | 30 | #include <asm/mmzone.h> |
| @@ -65,11 +66,11 @@ static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly; | |||
| 65 | physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES] __read_mostly; | 66 | physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES] __read_mostly; |
| 66 | int npmem_ranges __read_mostly; | 67 | int npmem_ranges __read_mostly; |
| 67 | 68 | ||
| 68 | #ifdef __LP64__ | 69 | #ifdef CONFIG_64BIT |
| 69 | #define MAX_MEM (~0UL) | 70 | #define MAX_MEM (~0UL) |
| 70 | #else /* !__LP64__ */ | 71 | #else /* !CONFIG_64BIT */ |
| 71 | #define MAX_MEM (3584U*1024U*1024U) | 72 | #define MAX_MEM (3584U*1024U*1024U) |
| 72 | #endif /* !__LP64__ */ | 73 | #endif /* !CONFIG_64BIT */ |
| 73 | 74 | ||
| 74 | static unsigned long mem_limit __read_mostly = MAX_MEM; | 75 | static unsigned long mem_limit __read_mostly = MAX_MEM; |
| 75 | 76 | ||
| @@ -452,6 +453,8 @@ unsigned long pcxl_dma_start __read_mostly; | |||
| 452 | 453 | ||
| 453 | void __init mem_init(void) | 454 | void __init mem_init(void) |
| 454 | { | 455 | { |
| 456 | int codesize, reservedpages, datasize, initsize; | ||
| 457 | |||
| 455 | high_memory = __va((max_pfn << PAGE_SHIFT)); | 458 | high_memory = __va((max_pfn << PAGE_SHIFT)); |
| 456 | 459 | ||
| 457 | #ifndef CONFIG_DISCONTIGMEM | 460 | #ifndef CONFIG_DISCONTIGMEM |
| @@ -466,7 +469,32 @@ void __init mem_init(void) | |||
| 466 | } | 469 | } |
| 467 | #endif | 470 | #endif |
| 468 | 471 | ||
| 469 | printk(KERN_INFO "Memory: %luk available\n", num_physpages << (PAGE_SHIFT-10)); | 472 | codesize = (unsigned long)_etext - (unsigned long)_text; |
| 473 | datasize = (unsigned long)_edata - (unsigned long)_etext; | ||
| 474 | initsize = (unsigned long)__init_end - (unsigned long)__init_begin; | ||
| 475 | |||
| 476 | reservedpages = 0; | ||
| 477 | { | ||
| 478 | unsigned long pfn; | ||
| 479 | #ifdef CONFIG_DISCONTIGMEM | ||
| 480 | int i; | ||
| 481 | |||
| 482 | for (i = 0; i < npmem_ranges; i++) { | ||
| 483 | for (pfn = node_start_pfn(i); pfn < node_end_pfn(i); pfn++) { | ||
| 484 | if (PageReserved(pfn_to_page(pfn))) | ||
| 485 | reservedpages++; | ||
| 486 | } | ||
| 487 | } | ||
| 488 | #else /* !CONFIG_DISCONTIGMEM */ | ||
| 489 | for (pfn = 0; pfn < max_pfn; pfn++) { | ||
| 490 | /* | ||
| 491 | * Only count reserved RAM pages | ||
| 492 | */ | ||
| 493 | if (PageReserved(pfn_to_page(pfn))) | ||
| 494 | reservedpages++; | ||
| 495 | } | ||
| 496 | #endif | ||
| 497 | } | ||
| 470 | 498 | ||
| 471 | #ifdef CONFIG_PA11 | 499 | #ifdef CONFIG_PA11 |
| 472 | if (hppa_dma_ops == &pcxl_dma_ops) { | 500 | if (hppa_dma_ops == &pcxl_dma_ops) { |
| @@ -480,6 +508,38 @@ void __init mem_init(void) | |||
| 480 | vmalloc_start = SET_MAP_OFFSET(MAP_START); | 508 | vmalloc_start = SET_MAP_OFFSET(MAP_START); |
| 481 | #endif | 509 | #endif |
| 482 | 510 | ||
| 511 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n", | ||
| 512 | (unsigned long)nr_free_pages() << (PAGE_SHIFT-10), | ||
| 513 | num_physpages << (PAGE_SHIFT-10), | ||
| 514 | codesize >> 10, | ||
| 515 | reservedpages << (PAGE_SHIFT-10), | ||
| 516 | datasize >> 10, | ||
| 517 | initsize >> 10 | ||
| 518 | ); | ||
| 519 | |||
| 520 | #ifdef CONFIG_DEBUG_KERNEL /* double-sanity-check paranoia */ | ||
| 521 | printk("virtual kernel memory layout:\n" | ||
| 522 | " vmalloc : 0x%p - 0x%p (%4ld MB)\n" | ||
| 523 | " memory : 0x%p - 0x%p (%4ld MB)\n" | ||
| 524 | " .init : 0x%p - 0x%p (%4ld kB)\n" | ||
| 525 | " .data : 0x%p - 0x%p (%4ld kB)\n" | ||
| 526 | " .text : 0x%p - 0x%p (%4ld kB)\n", | ||
| 527 | |||
| 528 | (void*)VMALLOC_START, (void*)VMALLOC_END, | ||
| 529 | (VMALLOC_END - VMALLOC_START) >> 20, | ||
| 530 | |||
| 531 | __va(0), high_memory, | ||
| 532 | ((unsigned long)high_memory - (unsigned long)__va(0)) >> 20, | ||
| 533 | |||
| 534 | __init_begin, __init_end, | ||
| 535 | ((unsigned long)__init_end - (unsigned long)__init_begin) >> 10, | ||
| 536 | |||
| 537 | _etext, _edata, | ||
| 538 | ((unsigned long)_edata - (unsigned long)_etext) >> 10, | ||
| 539 | |||
| 540 | _text, _etext, | ||
| 541 | ((unsigned long)_etext - (unsigned long)_text) >> 10); | ||
| 542 | #endif | ||
| 483 | } | 543 | } |
| 484 | 544 | ||
| 485 | unsigned long *empty_zero_page __read_mostly; | 545 | unsigned long *empty_zero_page __read_mostly; |
| @@ -547,7 +607,7 @@ void show_mem(void) | |||
| 547 | 607 | ||
| 548 | printk("Zone list for zone %d on node %d: ", j, i); | 608 | printk("Zone list for zone %d on node %d: ", j, i); |
| 549 | for (k = 0; zl->zones[k] != NULL; k++) | 609 | for (k = 0; zl->zones[k] != NULL; k++) |
| 550 | printk("[%d/%s] ", zone_to_nid(zl->zones[k]), zl->zones[k]->name); | 610 | printk("[%ld/%s] ", zone_to_nid(zl->zones[k]), zl->zones[k]->name); |
| 551 | printk("\n"); | 611 | printk("\n"); |
| 552 | } | 612 | } |
| 553 | } | 613 | } |
diff --git a/arch/parisc/mm/ioremap.c b/arch/parisc/mm/ioremap.c index 44b42c7f639d..92d496ad07c9 100644 --- a/arch/parisc/mm/ioremap.c +++ b/arch/parisc/mm/ioremap.c | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | */ | 26 | */ |
| 27 | void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) | 27 | void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) |
| 28 | { | 28 | { |
| 29 | void *addr; | 29 | void __iomem *addr; |
| 30 | struct vm_struct *area; | 30 | struct vm_struct *area; |
| 31 | unsigned long offset, last_addr; | 31 | unsigned long offset, last_addr; |
| 32 | pgprot_t pgprot; | 32 | pgprot_t pgprot; |
| @@ -80,14 +80,14 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l | |||
| 80 | if (!area) | 80 | if (!area) |
| 81 | return NULL; | 81 | return NULL; |
| 82 | 82 | ||
| 83 | addr = area->addr; | 83 | addr = (void __iomem *) area->addr; |
| 84 | if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size, | 84 | if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size, |
| 85 | phys_addr, pgprot)) { | 85 | phys_addr, pgprot)) { |
| 86 | vfree(addr); | 86 | vfree(addr); |
| 87 | return NULL; | 87 | return NULL; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | return (void __iomem *) (offset + (char *)addr); | 90 | return (void __iomem *) (offset + (char __iomem *)addr); |
| 91 | } | 91 | } |
| 92 | EXPORT_SYMBOL(__ioremap); | 92 | EXPORT_SYMBOL(__ioremap); |
| 93 | 93 | ||
diff --git a/arch/parisc/mm/kmap.c b/arch/parisc/mm/kmap.c deleted file mode 100644 index 1b1acd5e2f6e..000000000000 --- a/arch/parisc/mm/kmap.c +++ /dev/null | |||
| @@ -1,166 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * kmap/page table map and unmap support routines | ||
| 3 | * | ||
| 4 | * Copyright 1999,2000 Hewlett-Packard Company | ||
| 5 | * Copyright 2000 John Marvin <jsm at hp.com> | ||
| 6 | * Copyright 2000 Grant Grundler <grundler at parisc-linux.org> | ||
| 7 | * Copyright 2000 Philipp Rumpf <prumpf@tux.org> | ||
| 8 | * | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation; either version 2 of the License, or | ||
| 13 | * (at your option) any later version. | ||
| 14 | * | ||
| 15 | * This program is distributed in the hope that it will be useful, | ||
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | * GNU General Public License for more details. | ||
| 19 | * | ||
| 20 | * You should have received a copy of the GNU General Public License | ||
| 21 | * along with this program; if not, write to the Free Software | ||
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 23 | */ | ||
| 24 | /* | ||
| 25 | ** Stolen mostly from arch/parisc/kernel/pci-dma.c | ||
| 26 | */ | ||
| 27 | |||
| 28 | #include <linux/types.h> | ||
| 29 | #include <linux/mm.h> | ||
| 30 | #include <linux/string.h> | ||
| 31 | #include <linux/pci.h> | ||
| 32 | |||
| 33 | #include <linux/slab.h> | ||
| 34 | #include <linux/vmalloc.h> | ||
| 35 | |||
| 36 | #include <asm/uaccess.h> | ||
| 37 | #include <asm/pgalloc.h> | ||
| 38 | |||
| 39 | #include <asm/io.h> | ||
| 40 | #include <asm/page.h> /* get_order */ | ||
| 41 | |||
| 42 | #undef flush_cache_all | ||
| 43 | #define flush_cache_all flush_all_caches | ||
| 44 | |||
| 45 | typedef void (*pte_iterator_t) (pte_t * pte, unsigned long arg); | ||
| 46 | |||
| 47 | #if 0 | ||
| 48 | /* XXX This routine could be used with iterate_page() to replace | ||
| 49 | * unmap_uncached_page() and save a little code space but I didn't | ||
| 50 | * do that since I'm not certain whether this is the right path. -PB | ||
| 51 | */ | ||
| 52 | static void unmap_cached_pte(pte_t * pte, unsigned long addr, unsigned long arg) | ||
| 53 | { | ||
| 54 | pte_t page = *pte; | ||
| 55 | pte_clear(&init_mm, addr, pte); | ||
| 56 | if (!pte_none(page)) { | ||
| 57 | if (pte_present(page)) { | ||
| 58 | unsigned long map_nr = pte_pagenr(page); | ||
| 59 | if (map_nr < max_mapnr) | ||
| 60 | __free_page(mem_map + map_nr); | ||
| 61 | } else { | ||
| 62 | printk(KERN_CRIT | ||
| 63 | "Whee.. Swapped out page in kernel page table\n"); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | } | ||
| 67 | #endif | ||
| 68 | |||
| 69 | /* These two routines should probably check a few things... */ | ||
| 70 | static void set_uncached(pte_t * pte, unsigned long arg) | ||
| 71 | { | ||
| 72 | pte_val(*pte) |= _PAGE_NO_CACHE; | ||
| 73 | } | ||
| 74 | |||
| 75 | static void set_cached(pte_t * pte, unsigned long arg) | ||
| 76 | { | ||
| 77 | pte_val(*pte) &= ~_PAGE_NO_CACHE; | ||
| 78 | } | ||
| 79 | |||
| 80 | static inline void iterate_pte(pmd_t * pmd, unsigned long address, | ||
| 81 | unsigned long size, pte_iterator_t op, | ||
| 82 | unsigned long arg) | ||
| 83 | { | ||
| 84 | pte_t *pte; | ||
| 85 | unsigned long end; | ||
| 86 | |||
| 87 | if (pmd_none(*pmd)) | ||
| 88 | return; | ||
| 89 | if (pmd_bad(*pmd)) { | ||
| 90 | pmd_ERROR(*pmd); | ||
| 91 | pmd_clear(pmd); | ||
| 92 | return; | ||
| 93 | } | ||
| 94 | pte = pte_offset(pmd, address); | ||
| 95 | address &= ~PMD_MASK; | ||
| 96 | end = address + size; | ||
| 97 | if (end > PMD_SIZE) | ||
| 98 | end = PMD_SIZE; | ||
| 99 | do { | ||
| 100 | op(pte, arg); | ||
| 101 | address += PAGE_SIZE; | ||
| 102 | pte++; | ||
| 103 | } while (address < end); | ||
| 104 | } | ||
| 105 | |||
| 106 | static inline void iterate_pmd(pgd_t * dir, unsigned long address, | ||
| 107 | unsigned long size, pte_iterator_t op, | ||
| 108 | unsigned long arg) | ||
| 109 | { | ||
| 110 | pmd_t *pmd; | ||
| 111 | unsigned long end; | ||
| 112 | |||
| 113 | if (pgd_none(*dir)) | ||
| 114 | return; | ||
| 115 | if (pgd_bad(*dir)) { | ||
| 116 | pgd_ERROR(*dir); | ||
| 117 | pgd_clear(dir); | ||
| 118 | return; | ||
| 119 | } | ||
| 120 | pmd = pmd_offset(dir, address); | ||
| 121 | address &= ~PGDIR_MASK; | ||
| 122 | end = address + size; | ||
| 123 | if (end > PGDIR_SIZE) | ||
| 124 | end = PGDIR_SIZE; | ||
| 125 | do { | ||
| 126 | iterate_pte(pmd, address, end - address, op, arg); | ||
| 127 | address = (address + PMD_SIZE) & PMD_MASK; | ||
| 128 | pmd++; | ||
| 129 | } while (address < end); | ||
| 130 | } | ||
| 131 | |||
| 132 | static void iterate_pages(unsigned long address, unsigned long size, | ||
| 133 | pte_iterator_t op, unsigned long arg) | ||
| 134 | { | ||
| 135 | pgd_t *dir; | ||
| 136 | unsigned long end = address + size; | ||
| 137 | |||
| 138 | dir = pgd_offset_k(address); | ||
| 139 | flush_cache_all(); | ||
| 140 | do { | ||
| 141 | iterate_pmd(dir, address, end - address, op, arg); | ||
| 142 | address = (address + PGDIR_SIZE) & PGDIR_MASK; | ||
| 143 | dir++; | ||
| 144 | } while (address && (address < end)); | ||
| 145 | flush_tlb_all(); | ||
| 146 | } | ||
| 147 | |||
| 148 | void | ||
| 149 | kernel_set_cachemode(unsigned long vaddr, unsigned long size, int what) | ||
| 150 | { | ||
| 151 | switch (what) { | ||
| 152 | case IOMAP_FULL_CACHING: | ||
| 153 | iterate_pages(vaddr, size, set_cached, 0); | ||
| 154 | flush_tlb_range(NULL, vaddr, size); | ||
| 155 | break; | ||
| 156 | case IOMAP_NOCACHE_SER: | ||
| 157 | iterate_pages(vaddr, size, set_uncached, 0); | ||
| 158 | flush_tlb_range(NULL, vaddr, size); | ||
| 159 | break; | ||
| 160 | default: | ||
| 161 | printk(KERN_CRIT | ||
| 162 | "kernel_set_cachemode mode %d not understood\n", | ||
| 163 | what); | ||
| 164 | break; | ||
| 165 | } | ||
| 166 | } | ||
diff --git a/arch/parisc/oprofile/init.c b/arch/parisc/oprofile/init.c index a5b898c4d0b0..113f5139f551 100644 --- a/arch/parisc/oprofile/init.c +++ b/arch/parisc/oprofile/init.c | |||
| @@ -18,6 +18,6 @@ int __init oprofile_arch_init(struct oprofile_operations * ops) | |||
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | void oprofile_arch_exit() | 21 | void oprofile_arch_exit(void) |
| 22 | { | 22 | { |
| 23 | } | 23 | } |
