diff options
Diffstat (limited to 'arch/sparc/kernel')
-rw-r--r-- | arch/sparc/kernel/ioport.c | 6 | ||||
-rw-r--r-- | arch/sparc/kernel/setup.c | 39 | ||||
-rw-r--r-- | arch/sparc/kernel/sparc_ksyms.c | 10 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_solaris.c | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/sys_sunos.c | 32 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls.S | 6 | ||||
-rw-r--r-- | arch/sparc/kernel/unaligned.c | 40 |
7 files changed, 57 insertions, 77 deletions
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index e9b506e10..b1ed3c2af 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -1,4 +1,4 @@ -/* $Id: ioport.c,v 1.35 2000/02/27 08:16:25 davem Exp $ +/* $Id: ioport.c,v 1.36 2000/03/16 08:22:53 anton Exp $ * ioport.c: Simple io mapping allocator. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -745,6 +745,10 @@ void ioport_init(void) halt(); }; +} + +void register_proc_sparc_ioport(void) +{ #ifdef CONFIG_PROC_FS create_proc_read_entry("io_map",0,0,_sparc_io_get_info,&sparc_iomap); create_proc_read_entry("dvma_map",0,0,_sparc_io_get_info,&_sparc_dvma); diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c index d4ac34932..5966e04d7 100644 --- a/arch/sparc/kernel/setup.c +++ b/arch/sparc/kernel/setup.c @@ -1,4 +1,4 @@ -/* $Id: setup.c,v 1.115 2000/02/26 04:24:31 davem Exp $ +/* $Id: setup.c,v 1.116 2000/03/15 23:26:22 anton Exp $ * linux/arch/sparc/kernel/setup.c * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -268,8 +268,6 @@ extern void sun_serial_setup(void); extern unsigned short root_flags; extern unsigned short root_dev; extern unsigned short ram_flags; -extern unsigned sparc_ramdisk_image; -extern unsigned sparc_ramdisk_size; #define RAMDISK_IMAGE_START_MASK 0x07FF #define RAMDISK_PROMPT_FLAG 0x8000 #define RAMDISK_LOAD_FLAG 0x4000 @@ -382,42 +380,9 @@ void __init setup_arch(char **cmdline_p) rd_prompt = ((ram_flags & RAMDISK_PROMPT_FLAG) != 0); rd_doload = ((ram_flags & RAMDISK_LOAD_FLAG) != 0); #endif -#ifdef CONFIG_BLK_DEV_INITRD -// FIXME needs to do the new bootmem alloc stuff - if (sparc_ramdisk_image) { - initrd_start = sparc_ramdisk_image; - if (initrd_start < KERNBASE) initrd_start += KERNBASE; - initrd_end = initrd_start + sparc_ramdisk_size; - if (initrd_end > *memory_end_p) { - printk(KERN_CRIT "initrd extends beyond end of memory " - "(0x%08lx > 0x%08lx)\ndisabling initrd\n", - initrd_end,*memory_end_p); - initrd_start = 0; - } - if (initrd_start >= *memory_start_p && initrd_start < *memory_start_p + 2 * PAGE_SIZE) { - initrd_below_start_ok = 1; - *memory_start_p = PAGE_ALIGN (initrd_end); - } else if (initrd_start && sparc_ramdisk_image < KERNBASE) { - switch (sparc_cpu_model) { - case sun4m: - case sun4d: - initrd_start -= KERNBASE; - initrd_end -= KERNBASE; - break; - default: - break; - } - } - } -#endif + prom_setsync(prom_sync_me); -#ifdef CONFIG_SUN_SERIAL -#if 0 - /* XXX We can't do this until the bootmem allocator is working. */ - sun_serial_setup(); /* set this up ASAP */ -#endif -#endif { #if !CONFIG_SUN_SERIAL serial_console = 0; diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c index e0bb41045..7b7a0eb61 100644 --- a/arch/sparc/kernel/sparc_ksyms.c +++ b/arch/sparc/kernel/sparc_ksyms.c @@ -1,4 +1,4 @@ -/* $Id: sparc_ksyms.c,v 1.94 2000/02/28 04:00:53 anton Exp $ +/* $Id: sparc_ksyms.c,v 1.96 2000/03/16 09:12:49 jj Exp $ * arch/sparc/kernel/ksyms.c: Sparc specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -68,6 +68,8 @@ extern void bcopy (const char *, char *, int); extern int __ashrdi3(int, int); extern int __ashldi3(int, int); extern int __lshrdi3(int, int); +extern int __muldi3(int, int); +extern int __divdi3(int, int); extern void dump_thread(struct pt_regs *, struct user *); @@ -85,10 +87,10 @@ extern int __sparc_dot_ ## sym (int) __asm__("." #sym); \ __EXPORT_SYMBOL(__sparc_dot_ ## sym, "." #sym) #define EXPORT_SYMBOL_PRIVATE(sym) \ -extern int __sparc_priv_ ## sym (int) __asm__("__" ## #sym); \ +extern int __sparc_priv_ ## sym (int) __asm__("__" #sym); \ const struct module_symbol __export_priv_##sym \ __attribute__((section("__ksymtab"))) = \ -{ (unsigned long) &__sparc_priv_ ## sym, "__" ## #sym } +{ (unsigned long) &__sparc_priv_ ## sym, "__" #sym } /* used by various drivers */ EXPORT_SYMBOL(sparc_cpu_model); @@ -273,6 +275,8 @@ EXPORT_SYMBOL_NOVERS(memmove); EXPORT_SYMBOL_NOVERS(__ashrdi3); EXPORT_SYMBOL_NOVERS(__ashldi3); EXPORT_SYMBOL_NOVERS(__lshrdi3); +EXPORT_SYMBOL_NOVERS(__muldi3); +EXPORT_SYMBOL_NOVERS(__divdi3); EXPORT_SYMBOL_DOT(rem); EXPORT_SYMBOL_DOT(urem); diff --git a/arch/sparc/kernel/sys_solaris.c b/arch/sparc/kernel/sys_solaris.c index 8a9d54913..eb79c344c 100644 --- a/arch/sparc/kernel/sys_solaris.c +++ b/arch/sparc/kernel/sys_solaris.c @@ -14,6 +14,7 @@ #include <linux/mm.h> #include <linux/smp.h> #include <linux/smp_lock.h> +#include <linux/module.h> /* CHECKME: this stuff looks rather bogus */ asmlinkage int diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c index 262f6afdd..0a8a5827c 100644 --- a/arch/sparc/kernel/sys_sunos.c +++ b/arch/sparc/kernel/sys_sunos.c @@ -1,4 +1,4 @@ -/* $Id: sys_sunos.c,v 1.115 2000/03/13 21:57:23 davem Exp $ +/* $Id: sys_sunos.c,v 1.117 2000/03/15 02:43:32 davem Exp $ * sys_sunos.c: SunOS specific syscall compatibility support. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -267,35 +267,6 @@ asmlinkage void sunos_vadvise(unsigned long strategy) unlock_kernel(); } -/* Same as vadvise, and just as bogus, but for a range of virtual - * process address space. - */ -#define MADV_NORMAL 0 /* Nothing special... */ -#define MADV_RANDOM 1 /* I am emacs... */ -#define MADV_SEQUENTIAL 2 /* I am researcher code... */ -#define MADV_WILLNEED 3 /* Pages in this range will be needed */ -#define MADV_DONTNEED 4 /* Pages in this range won't be needed */ - -static char *mstrings[] = { - "MADV_NORMAL", - "MADV_RANDOM", - "MADV_SEQUENTIAL", - "MADV_WILLNEED", - "MADV_DONTNEED", -}; - -asmlinkage void sunos_madvise(unsigned long address, unsigned long len, - unsigned long strategy) -{ - /* I wanna see who uses this... */ - lock_kernel(); - printk("%s: Advises us to use %s paging strategy for addr<%08lx> len<%08lx>\n", - current->comm, - strategy <= 4 ? mstrings[strategy] : "BOGUS", - address, len); - unlock_kernel(); -} - /* This just wants the soft limit (ie. rlim_cur element) of the RLIMIT_NOFILE * resource limit and is for backwards compatibility with older sunos * revs. @@ -733,7 +704,6 @@ static int get_default (int value, int def_value) asmlinkage int sunos_nfs_mount(char *dir_name, int linux_flags, void *data) { - int ret = -ENODEV; int server_fd; char *the_name; struct nfs_mount_data linux_nfs_mount; diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index 42c072164..431f03daf 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S @@ -1,4 +1,4 @@ -/* $Id: systbls.S,v 1.95 2000/03/13 21:57:23 davem Exp $ +/* $Id: systbls.S,v 1.96 2000/03/15 02:43:32 davem Exp $ * systbls.S: System call entry point tables for OS compatibility. * The native Linux system call table lives here also. * @@ -33,7 +33,7 @@ sys_call_table: /*60*/ .long sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize /*65*/ .long sys_msync, sys_vfork, sys_pread, sys_pwrite, sys_geteuid /*70*/ .long sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect -/*75*/ .long sys_nis_syscall, sys_vhangup, sys_truncate64, sys_mincore, sys_getgroups16 +/*75*/ .long sys_madvise, sys_vhangup, sys_truncate64, sys_mincore, sys_getgroups16 /*80*/ .long sys_setgroups16, sys_getpgrp, sys_setgroups, sys_setitimer, sys_ftruncate64 /*85*/ .long sys_swapon, sys_getitimer, sys_setuid, sys_sethostname, sys_setgid /*90*/ .long sys_dup2, sys_setfsuid, sys_fcntl, sys_select, sys_setfsgid @@ -103,7 +103,7 @@ sunos_sys_table: .long sys_msync, sys_vfork, sunos_nosys .long sunos_nosys, sunos_sbrk, sunos_sstk .long sunos_mmap, sunos_vadvise, sys_munmap - .long sys_mprotect, sunos_madvise, sys_vhangup + .long sys_mprotect, sys_madvise, sys_vhangup .long sunos_nosys, sys_mincore, sys_getgroups16 .long sys_setgroups16, sys_getpgrp, sunos_setpgrp .long sys_setitimer, sunos_nosys, sys_swapon diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c index 592a2a4c0..2f051a6aa 100644 --- a/arch/sparc/kernel/unaligned.c +++ b/arch/sparc/kernel/unaligned.c @@ -1,4 +1,4 @@ -/* $Id: unaligned.c,v 1.20 2000/01/21 11:38:42 jj Exp $ +/* $Id: unaligned.c,v 1.21 2000/03/15 08:50:16 anton Exp $ * unaligned.c: Unaligned load/store trap handling with special * cases for the kernel to do them more quickly. * @@ -106,6 +106,26 @@ static inline unsigned long fetch_reg(unsigned int reg, struct pt_regs *regs) return win->locals[reg - 16]; /* yes, I know what this does... */ } +static inline unsigned long safe_fetch_reg(unsigned int reg, struct pt_regs *regs) +{ + struct reg_window *win; + unsigned long ret; + + if(reg < 16) + return (!reg ? 0 : regs->u_regs[reg]); + + /* Ho hum, the slightly complicated case. */ + win = (struct reg_window *) regs->u_regs[UREG_FP]; + + if ((unsigned long)win & 3) + return -1; + + if (get_user(ret, &win->locals[reg - 16])) + return -1; + + return ret; +} + static inline unsigned long *fetch_reg_addr(unsigned int reg, struct pt_regs *regs) { struct reg_window *win; @@ -132,6 +152,22 @@ static inline unsigned long compute_effective_address(struct pt_regs *regs, } } +static inline unsigned long safe_compute_effective_address(struct pt_regs *regs, + unsigned int insn) +{ + unsigned int rs1 = (insn >> 14) & 0x1f; + unsigned int rs2 = insn & 0x1f; + unsigned int rd = (insn >> 25) & 0x1f; + + if(insn & 0x2000) { + maybe_flush_windows(rs1, 0, rd); + return (safe_fetch_reg(rs1, regs) + sign_extend_imm13(insn)); + } else { + maybe_flush_windows(rs1, rs2, rd); + return (safe_fetch_reg(rs1, regs) + safe_fetch_reg(rs2, regs)); + } +} + /* This is just to make gcc think panic does return... */ static void unaligned_panic(char *str) { @@ -427,7 +463,7 @@ void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRALN; - info.si_addr = (void *)compute_effective_address(regs, insn); + info.si_addr = (void *)safe_compute_effective_address(regs, insn); info.si_trapno = 0; send_sig_info(SIGBUS, &info, current); } |