diff -u --recursive --new-file v2.1.105/linux/Documentation/Configure.help linux/Documentation/Configure.help --- v2.1.105/linux/Documentation/Configure.help Tue Jun 9 11:57:28 1998 +++ linux/Documentation/Configure.help Tue Jun 9 01:27:12 1998 @@ -4941,6 +4941,20 @@ module, say M here and read Documentation/modules.txt as well as Documentation/networking/net-modules.txt. +PCI NE2000 Support +CONFIG_NE2K_PCI + This driver is for NE2000 compatible PCI cards. It will not work + with ISA NE2000 cards. If you have a network (Ethernet) card of + this type, say Y and read the Ethernet-HOWTO, available via FTP + (user: anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. + + This driver is also available as a module ( = code which can be + inserted in and removed from the running kernel whenever you want). + The module will be called ne2k-pci.o. If you want to compile it as a + module, say M here and read Documentation/modules.txt as well as + Documentation/networking/net-modules.txt. + + TI ThunderLAN support (EXPERIMENTAL) CONFIG_TLAN If you have a TLAN based network card which is supported by this diff -u --recursive --new-file v2.1.105/linux/Documentation/MultiSound linux/Documentation/MultiSound --- v2.1.105/linux/Documentation/MultiSound Wed Dec 31 16:00:00 1969 +++ linux/Documentation/MultiSound Tue Jun 9 01:21:49 1998 @@ -0,0 +1,4 @@ +Turtle Beach Multisound support is not yet integrated. If you'd like +to test it or help out in finishing the module please see + + http://www.rpi.edu/~veliaa/pinlinux.html diff -u --recursive --new-file v2.1.105/linux/Makefile linux/Makefile --- v2.1.105/linux/Makefile Tue Jun 9 11:57:28 1998 +++ linux/Makefile Sun Jun 7 19:23:27 1998 @@ -1,6 +1,6 @@ VERSION = 2 PATCHLEVEL = 1 -SUBLEVEL = 105 +SUBLEVEL = 106 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/) diff -u --recursive --new-file v2.1.105/linux/Rules.make linux/Rules.make --- v2.1.105/linux/Rules.make Tue Jun 9 11:57:28 1998 +++ linux/Rules.make Tue Jun 9 01:40:49 1998 @@ -189,9 +189,14 @@ endif $(MODINCL)/%.ver: %.c - $(CC) $(CFLAGS) -E -D__GENKSYMS__ $<\ - | $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp - mv $@.tmp $@ + @if [ ! -r $(MODINCL)/$*.stamp -o $(MODINCL)/$*.stamp -ot $< ]; then \ + echo '$(CC) $(CFLAGS) -E -D__GENKSYMS__ $<'; \ + echo '| $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp'; \ + $(CC) $(CFLAGS) -E -D__GENKSYMS__ $< \ + | $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp; \ + if [ -r $@ ] && cmp -s $@ $@.tmp; then echo $@ is unchanged; rm -f $@.tmp; \ + else echo mv $@.tmp $@; mv -f $@.tmp $@; fi; \ + fi; touch $(MODINCL)/$*.stamp $(addprefix $(MODINCL)/,$(SYMTAB_OBJS:.o=.ver)): $(TOPDIR)/include/linux/autoconf.h diff -u --recursive --new-file v2.1.105/linux/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S --- v2.1.105/linux/arch/alpha/kernel/entry.S Sun Jun 7 11:16:26 1998 +++ linux/arch/alpha/kernel/entry.S Tue Jun 9 13:34:01 1998 @@ -924,7 +924,7 @@ .quad alpha_ni_syscall .quad alpha_ni_syscall /* 110 */ .quad sys_sigsuspend - .quad sys_ni_syscall + .quad osf_sigstack .quad sys_recvmsg .quad sys_sendmsg .quad alpha_ni_syscall /* 115 */ @@ -1047,7 +1047,7 @@ .quad alpha_ni_syscall .quad sys_getpgid .quad sys_getsid - .quad alpha_ni_syscall /* 235 */ + .quad sys_sigaltstack /* 235 */ .quad alpha_ni_syscall .quad alpha_ni_syscall .quad alpha_ni_syscall @@ -1181,5 +1181,6 @@ .quad sys_wait4 /* 365 */ .quad sys_adjtimex .quad sys_getcwd - .quad sys_ni_syscall - .quad sys_ni_syscall /* 369 */ + .quad sys_capget + .quad sys_capset + .quad sys_ni_syscall /* 370 */ diff -u --recursive --new-file v2.1.105/linux/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c --- v2.1.105/linux/arch/alpha/kernel/osf_sys.c Tue Mar 10 10:03:30 1998 +++ linux/arch/alpha/kernel/osf_sys.c Tue Jun 9 00:55:09 1998 @@ -743,6 +743,50 @@ return error; } +asmlinkage int osf_sigstack(struct sigstack *uss, struct sigstack *uoss) +{ + unsigned long usp = rdusp(); + unsigned long oss_sp, oss_os; + int error; + + if (uoss) { + oss_sp = current->sas_ss_sp + current->sas_ss_size; + oss_os = on_sig_stack(usp); + } + + if (uss) { + unsigned long ss_sp; + + error = -EFAULT; + if (get_user(ss_sp, &uss->ss_sp)) + goto out; + + /* If the current stack was set with sigaltstack, don't + swap stacks while we are on it. */ + error = -EPERM; + if (current->sas_ss_sp && on_sig_stack(usp)) + goto out; + + /* Since we don't know the extent of the stack, and we don't + track onstack-ness, but rather calculate it, we must + presume a size. Ho hum this interface is lossy. */ + current->sas_ss_sp = ss_sp - SIGSTKSZ; + current->sas_ss_size = SIGSTKSZ; + } + + if (uoss) { + error = -EFAULT; + if (! access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)) + || __put_user(oss_sp, &uoss->ss_sp) + || __put_user(oss_os, &uoss->ss_onstack)) + goto out; + } + + error = 0; +out: + return error; +} + /* * The Linux kernel isn't good at returning values that look * like negative longs (they are mistaken as error values). diff -u --recursive --new-file v2.1.105/linux/arch/alpha/kernel/signal.c linux/arch/alpha/kernel/signal.c --- v2.1.105/linux/arch/alpha/kernel/signal.c Fri Jan 30 11:28:05 1998 +++ linux/arch/alpha/kernel/signal.c Tue Jun 9 13:34:01 1998 @@ -203,6 +203,12 @@ } } +asmlinkage int +sys_sigaltstack(const stack_t *uss, stack_t *uoss) +{ + return do_sigaltstack(uss, uoss, rdusp()); +} + /* * Do a signal return; undo the signal stack. */ @@ -225,67 +231,65 @@ #define INSN_LDI_R0 0x201f0000 #define INSN_CALLSYS 0x00000083 - -static void +static long restore_sigcontext(struct sigcontext *sc, struct pt_regs *regs, struct switch_stack *sw) { unsigned long usp; - int i; + long i, err = 0; - __get_user(regs->pc, &sc->sc_pc); + err |= __get_user(regs->pc, &sc->sc_pc); sw->r26 = (unsigned long) ret_from_sys_call; - __get_user(regs->r0, sc->sc_regs+0); - __get_user(regs->r1, sc->sc_regs+1); - __get_user(regs->r2, sc->sc_regs+2); - __get_user(regs->r3, sc->sc_regs+3); - __get_user(regs->r4, sc->sc_regs+4); - __get_user(regs->r5, sc->sc_regs+5); - __get_user(regs->r6, sc->sc_regs+6); - __get_user(regs->r7, sc->sc_regs+7); - __get_user(regs->r8, sc->sc_regs+8); - __get_user(sw->r9, sc->sc_regs+9); - __get_user(sw->r10, sc->sc_regs+10); - __get_user(sw->r11, sc->sc_regs+11); - __get_user(sw->r12, sc->sc_regs+12); - __get_user(sw->r13, sc->sc_regs+13); - __get_user(sw->r14, sc->sc_regs+14); - __get_user(sw->r15, sc->sc_regs+15); - __get_user(regs->r16, sc->sc_regs+16); - __get_user(regs->r17, sc->sc_regs+17); - __get_user(regs->r18, sc->sc_regs+18); - __get_user(regs->r19, sc->sc_regs+19); - __get_user(regs->r20, sc->sc_regs+20); - __get_user(regs->r21, sc->sc_regs+21); - __get_user(regs->r22, sc->sc_regs+22); - __get_user(regs->r23, sc->sc_regs+23); - __get_user(regs->r24, sc->sc_regs+24); - __get_user(regs->r25, sc->sc_regs+25); - __get_user(regs->r26, sc->sc_regs+26); - __get_user(regs->r27, sc->sc_regs+27); - __get_user(regs->r28, sc->sc_regs+28); - __get_user(regs->gp, sc->sc_regs+29); - __get_user(usp, sc->sc_regs+30); + err |= __get_user(regs->r0, sc->sc_regs+0); + err |= __get_user(regs->r1, sc->sc_regs+1); + err |= __get_user(regs->r2, sc->sc_regs+2); + err |= __get_user(regs->r3, sc->sc_regs+3); + err |= __get_user(regs->r4, sc->sc_regs+4); + err |= __get_user(regs->r5, sc->sc_regs+5); + err |= __get_user(regs->r6, sc->sc_regs+6); + err |= __get_user(regs->r7, sc->sc_regs+7); + err |= __get_user(regs->r8, sc->sc_regs+8); + err |= __get_user(sw->r9, sc->sc_regs+9); + err |= __get_user(sw->r10, sc->sc_regs+10); + err |= __get_user(sw->r11, sc->sc_regs+11); + err |= __get_user(sw->r12, sc->sc_regs+12); + err |= __get_user(sw->r13, sc->sc_regs+13); + err |= __get_user(sw->r14, sc->sc_regs+14); + err |= __get_user(sw->r15, sc->sc_regs+15); + err |= __get_user(regs->r16, sc->sc_regs+16); + err |= __get_user(regs->r17, sc->sc_regs+17); + err |= __get_user(regs->r18, sc->sc_regs+18); + err |= __get_user(regs->r19, sc->sc_regs+19); + err |= __get_user(regs->r20, sc->sc_regs+20); + err |= __get_user(regs->r21, sc->sc_regs+21); + err |= __get_user(regs->r22, sc->sc_regs+22); + err |= __get_user(regs->r23, sc->sc_regs+23); + err |= __get_user(regs->r24, sc->sc_regs+24); + err |= __get_user(regs->r25, sc->sc_regs+25); + err |= __get_user(regs->r26, sc->sc_regs+26); + err |= __get_user(regs->r27, sc->sc_regs+27); + err |= __get_user(regs->r28, sc->sc_regs+28); + err |= __get_user(regs->gp, sc->sc_regs+29); + err |= __get_user(usp, sc->sc_regs+30); wrusp(usp); for (i = 0; i < 31; i++) - __get_user(sw->fp[i], sc->sc_fpregs+i); - __get_user(sw->fp[31], &sc->sc_fpcr); + err |= __get_user(sw->fp[i], sc->sc_fpregs+i); + err |= __get_user(sw->fp[31], &sc->sc_fpcr); + + return err; } asmlinkage void do_sigreturn(struct sigframe *frame, struct pt_regs *regs, struct switch_stack *sw) { - unsigned long ps; sigset_t set; /* Verify that it's a good sigcontext before using it */ if (verify_area(VERIFY_READ, frame, sizeof(*frame))) goto give_sigsegv; - if (__get_user(ps, &frame->sc.sc_ps) || ps != 8) - goto give_sigsegv; if (__get_user(set.sig[0], &frame->sc.sc_mask) || (_NSIG_WORDS > 1 && __copy_from_user(&set.sig[1], &frame->extramask, @@ -298,7 +302,8 @@ recalc_sigpending(current); spin_unlock_irq(¤t->sigmask_lock); - restore_sigcontext(&frame->sc, regs, sw); + if (restore_sigcontext(&frame->sc, regs, sw)) + goto give_sigsegv; /* Send SIGTRAP if we're single-stepping: */ if (ptrace_cancel_bpt (current)) @@ -306,22 +311,19 @@ return; give_sigsegv: - lock_kernel(); - do_exit(SIGSEGV); + force_sig(SIGSEGV, current); } asmlinkage void do_rt_sigreturn(struct rt_sigframe *frame, struct pt_regs *regs, struct switch_stack *sw) { - unsigned long ps; sigset_t set; + stack_t st; /* Verify that it's a good sigcontext before using it */ if (verify_area(VERIFY_READ, frame, sizeof(*frame))) goto give_sigsegv; - if (__get_user(ps, &frame->uc.uc_mcontext.sc_ps) || ps != 8) - goto give_sigsegv; if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) goto give_sigsegv; @@ -331,7 +333,14 @@ recalc_sigpending(current); spin_unlock_irq(¤t->sigmask_lock); - restore_sigcontext(&frame->uc.uc_mcontext, regs, sw); + if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) + goto give_sigsegv; + + if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) + goto give_sigsegv; + /* It is more difficult to avoid calling this function than to + call it and ignore errors. */ + do_sigaltstack(&st, NULL, rdusp()); /* Send SIGTRAP if we're single-stepping: */ if (ptrace_cancel_bpt (current)) @@ -339,8 +348,7 @@ return; give_sigsegv: - lock_kernel(); - do_exit(SIGSEGV); + force_sig(SIGSEGV, current); } @@ -348,99 +356,113 @@ * Set up a signal frame. */ -static void +static inline void * +get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) +{ + if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp)) + sp = current->sas_ss_sp + current->sas_ss_size; + + return (void *)((sp - frame_size) & -32ul); +} + +static long setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, struct switch_stack *sw, unsigned long mask, unsigned long sp) { - long i; + long i, err = 0; - __put_user(0, &sc->sc_onstack); - __put_user(mask, &sc->sc_mask); - __put_user(regs->pc, &sc->sc_pc); - __put_user(8, &sc->sc_ps); - - __put_user(regs->r0 , sc->sc_regs+0); - __put_user(regs->r1 , sc->sc_regs+1); - __put_user(regs->r2 , sc->sc_regs+2); - __put_user(regs->r3 , sc->sc_regs+3); - __put_user(regs->r4 , sc->sc_regs+4); - __put_user(regs->r5 , sc->sc_regs+5); - __put_user(regs->r6 , sc->sc_regs+6); - __put_user(regs->r7 , sc->sc_regs+7); - __put_user(regs->r8 , sc->sc_regs+8); - __put_user(sw->r9 , sc->sc_regs+9); - __put_user(sw->r10 , sc->sc_regs+10); - __put_user(sw->r11 , sc->sc_regs+11); - __put_user(sw->r12 , sc->sc_regs+12); - __put_user(sw->r13 , sc->sc_regs+13); - __put_user(sw->r14 , sc->sc_regs+14); - __put_user(sw->r15 , sc->sc_regs+15); - __put_user(regs->r16, sc->sc_regs+16); - __put_user(regs->r17, sc->sc_regs+17); - __put_user(regs->r18, sc->sc_regs+18); - __put_user(regs->r19, sc->sc_regs+19); - __put_user(regs->r20, sc->sc_regs+20); - __put_user(regs->r21, sc->sc_regs+21); - __put_user(regs->r22, sc->sc_regs+22); - __put_user(regs->r23, sc->sc_regs+23); - __put_user(regs->r24, sc->sc_regs+24); - __put_user(regs->r25, sc->sc_regs+25); - __put_user(regs->r26, sc->sc_regs+26); - __put_user(regs->r27, sc->sc_regs+27); - __put_user(regs->r28, sc->sc_regs+28); - __put_user(regs->gp , sc->sc_regs+29); - __put_user(sp, sc->sc_regs+30); - __put_user(0, sc->sc_regs+31); + err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack); + err |= __put_user(mask, &sc->sc_mask); + err |= __put_user(regs->pc, &sc->sc_pc); + err |= __put_user(8, &sc->sc_ps); + + err |= __put_user(regs->r0 , sc->sc_regs+0); + err |= __put_user(regs->r1 , sc->sc_regs+1); + err |= __put_user(regs->r2 , sc->sc_regs+2); + err |= __put_user(regs->r3 , sc->sc_regs+3); + err |= __put_user(regs->r4 , sc->sc_regs+4); + err |= __put_user(regs->r5 , sc->sc_regs+5); + err |= __put_user(regs->r6 , sc->sc_regs+6); + err |= __put_user(regs->r7 , sc->sc_regs+7); + err |= __put_user(regs->r8 , sc->sc_regs+8); + err |= __put_user(sw->r9 , sc->sc_regs+9); + err |= __put_user(sw->r10 , sc->sc_regs+10); + err |= __put_user(sw->r11 , sc->sc_regs+11); + err |= __put_user(sw->r12 , sc->sc_regs+12); + err |= __put_user(sw->r13 , sc->sc_regs+13); + err |= __put_user(sw->r14 , sc->sc_regs+14); + err |= __put_user(sw->r15 , sc->sc_regs+15); + err |= __put_user(regs->r16, sc->sc_regs+16); + err |= __put_user(regs->r17, sc->sc_regs+17); + err |= __put_user(regs->r18, sc->sc_regs+18); + err |= __put_user(regs->r19, sc->sc_regs+19); + err |= __put_user(regs->r20, sc->sc_regs+20); + err |= __put_user(regs->r21, sc->sc_regs+21); + err |= __put_user(regs->r22, sc->sc_regs+22); + err |= __put_user(regs->r23, sc->sc_regs+23); + err |= __put_user(regs->r24, sc->sc_regs+24); + err |= __put_user(regs->r25, sc->sc_regs+25); + err |= __put_user(regs->r26, sc->sc_regs+26); + err |= __put_user(regs->r27, sc->sc_regs+27); + err |= __put_user(regs->r28, sc->sc_regs+28); + err |= __put_user(regs->gp , sc->sc_regs+29); + err |= __put_user(sp, sc->sc_regs+30); + err |= __put_user(0, sc->sc_regs+31); for (i = 0; i < 31; i++) - __put_user(sw->fp[i], sc->sc_fpregs+i); - __put_user(0, sc->sc_fpregs+31); - __put_user(sw->fp[31], &sc->sc_fpcr); - - __put_user(regs->trap_a0, &sc->sc_traparg_a0); - __put_user(regs->trap_a1, &sc->sc_traparg_a1); - __put_user(regs->trap_a2, &sc->sc_traparg_a2); + err |= __put_user(sw->fp[i], sc->sc_fpregs+i); + err |= __put_user(0, sc->sc_fpregs+31); + err |= __put_user(sw->fp[31], &sc->sc_fpcr); + + err |= __put_user(regs->trap_a0, &sc->sc_traparg_a0); + err |= __put_user(regs->trap_a1, &sc->sc_traparg_a1); + err |= __put_user(regs->trap_a2, &sc->sc_traparg_a2); + + return err; } static void setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs, struct switch_stack * sw) { - unsigned long oldsp; + unsigned long oldsp, r26, err = 0; struct sigframe *frame; oldsp = rdusp(); - frame = (struct sigframe *)((oldsp - sizeof(*frame)) & -32); - - /* XXX: Check here if we would need to switch stacks.. */ + frame = get_sigframe(ka, oldsp, sizeof(*frame)); if (verify_area(VERIFY_WRITE, frame, sizeof(*frame))) goto give_sigsegv; - setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp); + err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp); if (_NSIG_WORDS > 1) { - __copy_to_user(frame->extramask, &set->sig[1], - sizeof(frame->extramask)); + err |= __copy_to_user(frame->extramask, &set->sig[1], + sizeof(frame->extramask)); } /* Set up to return from userspace. If provided, use a stub already in userspace. */ if (ka->ka_restorer) { - regs->r26 = (unsigned long) ka->ka_restorer; + r26 = (unsigned long) ka->ka_restorer; } else { - __put_user(INSN_MOV_R30_R16, frame->retcode+0); - __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1); - __put_user(INSN_CALLSYS, frame->retcode+2); + err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); + err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1); + err |= __put_user(INSN_CALLSYS, frame->retcode+2); imb(); - regs->r26 = (unsigned long) frame->retcode; + r26 = (unsigned long) frame->retcode; } + /* Check that everything was written properly. */ + if (err) + goto give_sigsegv; + /* "Return" to the handler */ + regs->r26 = r26; regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; regs->r16 = sig; /* a0: signal number */ regs->r17 = 0; /* a1: exception code */ regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */ wrusp((unsigned long) frame); - + #if DEBUG_SIG printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n", current->comm, current->pid, frame, regs->pc, regs->r26); @@ -449,47 +471,54 @@ return; give_sigsegv: - lock_kernel(); - do_exit(SIGSEGV); + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); } static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs, struct switch_stack * sw) { - unsigned long oldsp; + unsigned long oldsp, r26, err = 0; struct rt_sigframe *frame; oldsp = rdusp(); - frame = (struct rt_sigframe *)((oldsp - sizeof(*frame)) & -32); - - /* XXX: Check here if we would need to switch stacks.. */ + frame = get_sigframe(ka, oldsp, sizeof(*frame)); if (verify_area(VERIFY_WRITE, frame, sizeof(*frame))) goto give_sigsegv; - __copy_to_user(&frame->info, info, sizeof(siginfo_t)); + err |= __copy_to_user(&frame->info, info, sizeof(siginfo_t)); - /* Zero all bits of the ucontext besides the sigcontext. */ - __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); - - /* Copy in the bits we actually use. */ - __put_user(set->sig[0], &frame->uc.uc_osf_sigmask); - setup_sigcontext(&frame->uc.uc_mcontext, regs, sw, set->sig[0], oldsp); - __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); + /* Create the ucontext. */ + err |= __put_user(0, &frame->uc.uc_flags); + err |= __put_user(0, &frame->uc.uc_link); + err |= __put_user(set->sig[0], &frame->uc.uc_osf_sigmask); + err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); + err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags); + err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); + err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, sw, + set->sig[0], oldsp); + err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); /* Set up to return from userspace. If provided, use a stub already in userspace. */ if (ka->ka_restorer) { - regs->r26 = (unsigned long) ka->ka_restorer; + r26 = (unsigned long) ka->ka_restorer; } else { - __put_user(INSN_MOV_R30_R16, frame->retcode+0); - __put_user(INSN_LDI_R0+__NR_rt_sigreturn, frame->retcode+1); - __put_user(INSN_CALLSYS, frame->retcode+2); + err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); + err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn, + frame->retcode+1); + err |= __put_user(INSN_CALLSYS, frame->retcode+2); imb(); - regs->r26 = (unsigned long) frame->retcode; + r26 = (unsigned long) frame->retcode; } + if (err) + goto give_sigsegv; + /* "Return" to the handler */ + regs->r26 = r26; regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; regs->r16 = sig; /* a0: signal number */ regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */ @@ -504,8 +533,9 @@ return; give_sigsegv: - lock_kernel(); - do_exit(SIGSEGV); + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); } diff -u --recursive --new-file v2.1.105/linux/arch/alpha/mm/fault.c linux/arch/alpha/mm/fault.c --- v2.1.105/linux/arch/alpha/mm/fault.c Wed Apr 1 20:11:47 1998 +++ linux/arch/alpha/mm/fault.c Tue Jun 9 13:34:23 1998 @@ -114,8 +114,8 @@ (or is suppressed by the PALcode). Support that for older cpu's by ignoring such an instruction. */ if (cause == 0) { - /* No need for get_user.. we know the insn is there. */ - unsigned int insn = *(unsigned int *)regs->pc; + unsigned int insn; + __get_user(insn, (unsigned int *)regs->pc); if ((insn >> 21 & 0x1f) == 0x1f && /* ldq ldl ldt lds ldg ldf ldwu ldbu */ (1ul << (insn >> 26) & 0x30f00001400ul)) { @@ -124,8 +124,8 @@ } } - lock_kernel(); down(&mm->mmap_sem); + lock_kernel(); vma = find_vma(mm, address); if (!vma) goto bad_area; diff -u --recursive --new-file v2.1.105/linux/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S --- v2.1.105/linux/arch/i386/kernel/entry.S Thu May 14 19:47:38 1998 +++ linux/arch/i386/kernel/entry.S Tue Jun 9 00:55:09 1998 @@ -546,7 +546,8 @@ .long SYMBOL_NAME(sys_getcwd) .long SYMBOL_NAME(sys_capget) .long SYMBOL_NAME(sys_capset) /* 185 */ + .long SYMBOL_NAME(sys_sigaltstack) - .rept NR_syscalls-185 + .rept NR_syscalls-186 .long SYMBOL_NAME(sys_ni_syscall) .endr diff -u --recursive --new-file v2.1.105/linux/arch/i386/kernel/signal.c linux/arch/i386/kernel/signal.c --- v2.1.105/linux/arch/i386/kernel/signal.c Wed Apr 1 20:11:47 1998 +++ linux/arch/i386/kernel/signal.c Tue Jun 9 13:34:01 1998 @@ -116,6 +116,13 @@ return ret; } +asmlinkage int +sys_sigaltstack(const stack_t *uss, stack_t *uoss) +{ + struct pt_regs *regs = (struct pt_regs *) &uss; + return do_sigaltstack(uss, uoss, regs->esp); +} + /* * Do a signal return; undo the signal stack. @@ -144,7 +151,7 @@ }; -static inline void restore_i387_hard(struct _fpstate *buf) +static inline int restore_i387_hard(struct _fpstate *buf) { #ifdef __SMP__ if (current->flags & PF_USEDFPU) { @@ -157,31 +164,33 @@ } #endif current->flags &= ~PF_USEDFPU; - __copy_from_user(¤t->tss.i387.hard, buf, sizeof(*buf)); + return __copy_from_user(¤t->tss.i387.hard, buf, sizeof(*buf)); } -static inline void restore_i387(struct _fpstate *buf) +static inline int restore_i387(struct _fpstate *buf) { + int err; #ifndef CONFIG_MATH_EMULATION - restore_i387_hard(buf); + err = restore_i387_hard(buf); #else if (boot_cpu_data.hard_math) - restore_i387_hard(buf); + err = restore_i387_hard(buf); else - restore_i387_soft(¤t->tss.i387.soft, buf); + err = restore_i387_soft(¤t->tss.i387.soft, buf); #endif current->used_math = 1; + return err; } static int -restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) +restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *peax) { - unsigned int tmp; + unsigned int tmp, err = 0; -#define COPY(x) __get_user(regs->x, &sc->x) +#define COPY(x) err |= __get_user(regs->x, &sc->x) #define COPY_SEG(seg) \ - { __get_user(tmp, &sc->seg); \ + { err |= __get_user(tmp, &sc->seg); \ if ((tmp & 0xfffc) /* not a NULL selectors */ \ && (tmp & 0x4) != 0x4 /* not a LDT selector */ \ && (tmp & 3) != 3) /* not a RPL3 GDT selector */ \ @@ -189,12 +198,12 @@ regs->x##seg = tmp; } #define COPY_SEG_STRICT(seg) \ - { __get_user(tmp, &sc->seg); \ + { err |= __get_user(tmp, &sc->seg); \ if ((tmp & 0xfffc) && (tmp & 3) != 3) goto badframe; \ regs->x##seg = tmp; } #define GET_SEG(seg) \ - { __get_user(tmp, &sc->seg); \ + { err |= __get_user(tmp, &sc->seg); \ if ((tmp & 0xfffc) /* not a NULL selectors */ \ && (tmp & 0x4) != 0x4 /* not a LDT selector */ \ && (tmp & 3) != 3) /* not a RPL3 GDT selector */ \ @@ -216,24 +225,23 @@ COPY_SEG_STRICT(cs); COPY_SEG_STRICT(ss); - __get_user(tmp, &sc->eflags); + err |= __get_user(tmp, &sc->eflags); regs->eflags = (regs->eflags & ~0x40DD5) | (tmp & 0x40DD5); regs->orig_eax = -1; /* disable syscall checks */ - __get_user(tmp, (unsigned long *)&sc->fpstate); + err |= __get_user(tmp, (unsigned long *)&sc->fpstate); if (tmp) { struct _fpstate * buf = (struct _fpstate *) tmp; if (verify_area(VERIFY_READ, buf, sizeof(*buf))) goto badframe; - restore_i387(buf); + err |= restore_i387(buf); } - __get_user(tmp, &sc->eax); - return tmp; + err |= __get_user(*peax, &sc->eax); + return err; badframe: - lock_kernel(); - do_exit(SIGSEGV); + return 1; } asmlinkage int sys_sigreturn(unsigned long __unused) @@ -241,6 +249,7 @@ struct pt_regs *regs = (struct pt_regs *) &__unused; struct sigframe *frame = (struct sigframe *)(regs->esp - 8); sigset_t set; + int eax; if (verify_area(VERIFY_READ, frame, sizeof(*frame))) goto badframe; @@ -256,11 +265,13 @@ recalc_sigpending(current); spin_unlock_irq(¤t->sigmask_lock); - return restore_sigcontext(regs, &frame->sc); + if (restore_sigcontext(regs, &frame->sc, &eax)) + goto badframe; + return eax; badframe: - lock_kernel(); - do_exit(SIGSEGV); + force_sig(SIGSEGV, current); + return 0; } asmlinkage int sys_rt_sigreturn(unsigned long __unused) @@ -268,6 +279,8 @@ struct pt_regs *regs = (struct pt_regs *) &__unused; struct rt_sigframe *frame = (struct rt_sigframe *)(regs->esp - 4); sigset_t set; + stack_t st; + int eax; if (verify_area(VERIFY_READ, frame, sizeof(*frame))) goto badframe; @@ -280,18 +293,27 @@ recalc_sigpending(current); spin_unlock_irq(¤t->sigmask_lock); - return restore_sigcontext(regs, &frame->uc.uc_mcontext); + if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &eax)) + goto badframe; + + if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) + goto badframe; + /* It is more difficult to avoid calling this function than to + call it and ignore errors. */ + do_sigaltstack(&st, NULL, regs->esp); + + return eax; badframe: - lock_kernel(); - do_exit(SIGSEGV); + force_sig(SIGSEGV, current); + return 0; } /* * Set up a signal frame. */ -static inline struct _fpstate * save_i387_hard(struct _fpstate * buf) +static inline int save_i387_hard(struct _fpstate * buf) { #ifdef __SMP__ if (current->flags & PF_USEDFPU) { @@ -308,14 +330,15 @@ } #endif current->tss.i387.hard.status = current->tss.i387.hard.swd; - copy_to_user(buf, ¤t->tss.i387.hard, sizeof(*buf)); - return buf; + if (__copy_to_user(buf, ¤t->tss.i387.hard, sizeof(*buf))) + return -1; + return 1; } -static struct _fpstate * save_i387(struct _fpstate *buf) +static int save_i387(struct _fpstate *buf) { if (!current->used_math) - return NULL; + return 0; /* This will cause a "finit" to be triggered by the next attempted FPU operation by the 'current' process. @@ -330,98 +353,116 @@ #endif } -static void +static int setup_sigcontext(struct sigcontext *sc, struct _fpstate *fpstate, struct pt_regs *regs, unsigned long mask) { - unsigned int tmp; + int tmp, err = 0; tmp = 0; __asm__("movl %%gs,%w0" : "=r"(tmp): "0"(tmp)); - __put_user(tmp, (unsigned int *)&sc->gs); + err |= __put_user(tmp, (unsigned int *)&sc->gs); __asm__("movl %%fs,%w0" : "=r"(tmp): "0"(tmp)); - __put_user(tmp, (unsigned int *)&sc->fs); + err |= __put_user(tmp, (unsigned int *)&sc->fs); - __put_user(regs->xes, (unsigned int *)&sc->es); - __put_user(regs->xds, (unsigned int *)&sc->ds); - __put_user(regs->edi, &sc->edi); - __put_user(regs->esi, &sc->esi); - __put_user(regs->ebp, &sc->ebp); - __put_user(regs->esp, &sc->esp); - __put_user(regs->ebx, &sc->ebx); - __put_user(regs->edx, &sc->edx); - __put_user(regs->ecx, &sc->ecx); - __put_user(regs->eax, &sc->eax); - __put_user(current->tss.trap_no, &sc->trapno); - __put_user(current->tss.error_code, &sc->err); - __put_user(regs->eip, &sc->eip); - __put_user(regs->xcs, (unsigned int *)&sc->cs); - __put_user(regs->eflags, &sc->eflags); - __put_user(regs->esp, &sc->esp_at_signal); - __put_user(regs->xss, (unsigned int *)&sc->ss); - - __put_user(save_i387(fpstate), &sc->fpstate); + err |= __put_user(regs->xes, (unsigned int *)&sc->es); + err |= __put_user(regs->xds, (unsigned int *)&sc->ds); + err |= __put_user(regs->edi, &sc->edi); + err |= __put_user(regs->esi, &sc->esi); + err |= __put_user(regs->ebp, &sc->ebp); + err |= __put_user(regs->esp, &sc->esp); + err |= __put_user(regs->ebx, &sc->ebx); + err |= __put_user(regs->edx, &sc->edx); + err |= __put_user(regs->ecx, &sc->ecx); + err |= __put_user(regs->eax, &sc->eax); + err |= __put_user(current->tss.trap_no, &sc->trapno); + err |= __put_user(current->tss.error_code, &sc->err); + err |= __put_user(regs->eip, &sc->eip); + err |= __put_user(regs->xcs, (unsigned int *)&sc->cs); + err |= __put_user(regs->eflags, &sc->eflags); + err |= __put_user(regs->esp, &sc->esp_at_signal); + err |= __put_user(regs->xss, (unsigned int *)&sc->ss); + + tmp = save_i387(fpstate); + if (tmp < 0) + err = 1; + else + err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate); /* non-iBCS2 extensions.. */ - __put_user(mask, &sc->oldmask); - __put_user(current->tss.cr2, &sc->cr2); + err |= __put_user(mask, &sc->oldmask); + err |= __put_user(current->tss.cr2, &sc->cr2); + + return err; } /* * Determine which stack to use.. */ -static inline unsigned long sigstack_esp(struct k_sigaction *ka, struct pt_regs * regs) +static inline void * +get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) { unsigned long esp; /* Default to using normal stack */ esp = regs->esp; + /* This is the X/Open sanctioned signal stack switching. */ + if (ka->sa.sa_flags & SA_ONSTACK) { + if (! on_sig_stack(esp)) + esp = current->sas_ss_sp + current->sas_ss_size; + } + /* This is the legacy signal stack switching. */ - if ((regs->xss & 0xffff) != __USER_DS && - !(ka->sa.sa_flags & SA_RESTORER) && - ka->sa.sa_restorer) + else if ((regs->xss & 0xffff) != __USER_DS && + !(ka->sa.sa_flags & SA_RESTORER) && + ka->sa.sa_restorer) { esp = (unsigned long) ka->sa.sa_restorer; + } - return esp; + return (void *)((esp - frame_size) & -8ul); } static void setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs * regs) { struct sigframe *frame; + int err = 0; - frame = (struct sigframe *)((sigstack_esp(ka, regs) - sizeof(*frame)) & -8); + frame = get_sigframe(ka, regs, sizeof(*frame)); if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) - goto segv_and_exit; + goto give_sigsegv; - __put_user((current->exec_domain - && current->exec_domain->signal_invmap - && sig < 32 - ? current->exec_domain->signal_invmap[sig] - : sig), - &frame->sig); + err |= __put_user((current->exec_domain + && current->exec_domain->signal_invmap + && sig < 32 + ? current->exec_domain->signal_invmap[sig] + : sig), + &frame->sig); - setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]); + err |= setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]); if (_NSIG_WORDS > 1) { - __copy_to_user(frame->extramask, &set->sig[1], - sizeof(frame->extramask)); + err |= __copy_to_user(frame->extramask, &set->sig[1], + sizeof(frame->extramask)); } /* Set up to return from userspace. If provided, use a stub already in userspace. */ if (ka->sa.sa_flags & SA_RESTORER) { - __put_user(ka->sa.sa_restorer, &frame->pretcode); + err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); } else { - __put_user(frame->retcode, &frame->pretcode); + err |= __put_user(frame->retcode, &frame->pretcode); /* This is popl %eax ; movl $,%eax ; int $0x80 */ - __put_user(0xb858, (short *)(frame->retcode+0)); - __put_user(__NR_sigreturn, (int *)(frame->retcode+2)); - __put_user(0x80cd, (short *)(frame->retcode+6)); + err |= __put_user(0xb858, (short *)(frame->retcode+0)); + err |= __put_user(__NR_sigreturn, (int *)(frame->retcode+2)); + err |= __put_user(0x80cd, (short *)(frame->retcode+6)); } + if (err) + goto give_sigsegv; + /* Set up registers for signal handler */ regs->esp = (unsigned long) frame; regs->eip = (unsigned long) ka->sa.sa_handler; @@ -443,50 +484,59 @@ return; -segv_and_exit: - lock_kernel(); - do_exit(SIGSEGV); +give_sigsegv: + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); } static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs * regs) { struct rt_sigframe *frame; + int err = 0; - frame = (struct rt_sigframe *)((sigstack_esp(ka, regs) - sizeof(*frame)) & -8); + frame = get_sigframe(ka, regs, sizeof(*frame)); if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) - goto segv_and_exit; + goto give_sigsegv; - __put_user((current->exec_domain - && current->exec_domain->signal_invmap - && sig < 32 - ? current->exec_domain->signal_invmap[sig] - : sig), - &frame->sig); - __put_user(&frame->info, &frame->pinfo); - __put_user(&frame->uc, &frame->puc); - __copy_to_user(&frame->info, info, sizeof(*info)); - - /* Clear all the bits of the ucontext we don't use. */ - __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); - - setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate, - regs, set->sig[0]); - __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); + err |= __put_user((current->exec_domain + && current->exec_domain->signal_invmap + && sig < 32 + ? current->exec_domain->signal_invmap[sig] + : sig), + &frame->sig); + err |= __put_user(&frame->info, &frame->pinfo); + err |= __put_user(&frame->uc, &frame->puc); + err |= __copy_to_user(&frame->info, info, sizeof(*info)); + + /* Create the ucontext. */ + err |= __put_user(0, &frame->uc.uc_flags); + err |= __put_user(0, &frame->uc.uc_link); + err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); + err |= __put_user(sas_ss_flags(regs->esp), + &frame->uc.uc_stack.ss_flags); + err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); + err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate, + regs, set->sig[0]); + err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); /* Set up to return from userspace. If provided, use a stub already in userspace. */ if (ka->sa.sa_flags & SA_RESTORER) { - __put_user(ka->sa.sa_restorer, &frame->pretcode); + err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); } else { - __put_user(frame->retcode, &frame->pretcode); + err |= __put_user(frame->retcode, &frame->pretcode); /* This is movl $,%eax ; int $0x80 */ - __put_user(0xb8, (char *)(frame->retcode+0)); - __put_user(__NR_rt_sigreturn, (int *)(frame->retcode+1)); - __put_user(0x80cd, (short *)(frame->retcode+5)); + err |= __put_user(0xb8, (char *)(frame->retcode+0)); + err |= __put_user(__NR_rt_sigreturn, (int *)(frame->retcode+1)); + err |= __put_user(0x80cd, (short *)(frame->retcode+5)); } + if (err) + goto give_sigsegv; + /* Set up registers for signal handler */ regs->esp = (unsigned long) frame; regs->eip = (unsigned long) ka->sa.sa_handler; @@ -508,9 +558,10 @@ return; -segv_and_exit: - lock_kernel(); - do_exit(SIGSEGV); +give_sigsegv: + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); } /* diff -u --recursive --new-file v2.1.105/linux/arch/i386/kernel/sys_i386.c linux/arch/i386/kernel/sys_i386.c --- v2.1.105/linux/arch/i386/kernel/sys_i386.c Tue Mar 10 10:03:30 1998 +++ linux/arch/i386/kernel/sys_i386.c Tue Jun 9 10:32:33 1998 @@ -63,6 +63,7 @@ struct file * file = NULL; struct mmap_arg_struct a; + down(¤t->mm->mmap_sem); lock_kernel(); if (copy_from_user(&a, arg, sizeof(a))) goto out; @@ -73,11 +74,13 @@ goto out; } a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); + error = do_mmap(file, a.addr, a.len, a.prot, a.flags, a.offset); if (file) fput(file); out: unlock_kernel(); + up(¤t->mm->mmap_sem); return error; } diff -u --recursive --new-file v2.1.105/linux/arch/i386/math-emu/fpu_entry.c linux/arch/i386/math-emu/fpu_entry.c --- v2.1.105/linux/arch/i386/math-emu/fpu_entry.c Fri Jan 30 11:28:06 1998 +++ linux/arch/i386/math-emu/fpu_entry.c Tue Jun 9 00:55:09 1998 @@ -677,14 +677,15 @@ #define sstatus_word() \ ((S387->swd & ~SW_Top & 0xffff) | ((S387->ftop << SW_Top_Shift) & SW_Top)) -void restore_i387_soft(void *s387, struct _fpstate *buf) +int restore_i387_soft(void *s387, struct _fpstate *buf) { u_char *d = (u_char *)buf; int offset, other, i, tags, regnr, tag, newtop; RE_ENTRANT_CHECK_OFF; FPU_verify_area(VERIFY_READ, d, 7*4 + 8*10); - __copy_from_user(&S387->cwd, d, 7*4); + if (__copy_from_user(&S387->cwd, d, 7*4)) + return -1; RE_ENTRANT_CHECK_ON; d += 7*4; @@ -695,9 +696,11 @@ RE_ENTRANT_CHECK_OFF; /* Copy all registers in stack order. */ - __copy_from_user(((u_char *)&S387->st_space)+offset, d, other); + if (__copy_from_user(((u_char *)&S387->st_space)+offset, d, other)) + return -1; if ( offset ) - __copy_from_user((u_char *)&S387->st_space, d+other, offset); + if (__copy_from_user((u_char *)&S387->st_space, d+other, offset)) + return -1; RE_ENTRANT_CHECK_ON; /* The tags may need to be corrected now. */ @@ -716,10 +719,11 @@ } S387->twd = tags; + return 0; } -struct _fpstate * save_i387_soft(void *s387, struct _fpstate * buf) +int save_i387_soft(void *s387, struct _fpstate * buf) { u_char *d = (u_char *)buf; int offset = (S387->ftop & 7) * 10, other = 80 - offset; @@ -742,10 +746,12 @@ RE_ENTRANT_CHECK_OFF; /* Copy all registers in stack order. */ - __copy_to_user(d, ((u_char *)&S387->st_space)+offset, other); + if (__copy_to_user(d, ((u_char *)&S387->st_space)+offset, other)) + return -1; if ( offset ) - __copy_to_user(d+other, (u_char *)&S387->st_space, offset); + if (__copy_to_user(d+other, (u_char *)&S387->st_space, offset)) + return -1 RE_ENTRANT_CHECK_ON; - return buf; + return 1; } diff -u --recursive --new-file v2.1.105/linux/arch/i386/mm/fault.c linux/arch/i386/mm/fault.c --- v2.1.105/linux/arch/i386/mm/fault.c Tue Jan 20 12:52:09 1998 +++ linux/arch/i386/mm/fault.c Tue Jun 9 16:02:42 1998 @@ -102,11 +102,11 @@ if (local_irq_count[smp_processor_id()]) die_if_kernel("page fault from irq handler",regs,error_code); - lock_kernel(); tsk = current; mm = tsk->mm; down(&mm->mmap_sem); + vma = find_vma(mm, address); if (!vma) goto bad_area; @@ -151,7 +151,7 @@ goto bad_area; } handle_mm_fault(tsk, vma, address, write); - up(&mm->mmap_sem); + /* * Did it hit the DOS screen memory VA from vm86 mode? */ @@ -160,7 +160,8 @@ if (bit < 32) tsk->tss.screen_bitmap |= 1 << bit; } - goto out; + up(&mm->mmap_sem); + return; /* * Something tried to access memory that isn't in our memory map.. @@ -175,7 +176,7 @@ tsk->tss.error_code = error_code; tsk->tss.trap_no = 14; force_sig(SIGSEGV, tsk); - goto out; + return; } /* @@ -187,7 +188,6 @@ nr = (address - (unsigned long) idt) >> 3; if (nr == 6) { - unlock_kernel(); do_invalid_op(regs, 0); return; } @@ -196,7 +196,7 @@ /* Are we prepared to handle this kernel fault? */ if ((fixup = search_exception_table(regs->eip)) != 0) { regs->eip = fixup; - goto out; + return; } /* @@ -215,7 +215,7 @@ * CPU state on certain buggy processors. */ printk("Ok"); - goto out; + return; } if (address < PAGE_SIZE) @@ -234,8 +234,8 @@ page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; printk(KERN_ALERT "*pte = %08lx\n", page); } + lock_kernel(); die_if_kernel("Oops", regs, error_code); do_exit(SIGKILL); -out: unlock_kernel(); } diff -u --recursive --new-file v2.1.105/linux/arch/m68k/amiga/Makefile linux/arch/m68k/amiga/Makefile --- v2.1.105/linux/arch/m68k/amiga/Makefile Tue Feb 17 13:12:44 1998 +++ linux/arch/m68k/amiga/Makefile Mon Jun 8 11:03:49 1998 @@ -8,7 +8,7 @@ # Note 2! The CFLAGS definitions are now in the main makefile... O_TARGET := amiga.o -O_OBJS := config.o amiints.o cia.o chipram.o amisound.o zorro.o +O_OBJS := config.o amiints.o cia.o chipram.o amisound.o OX_OBJS := amiga_ksyms.o include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.1.105/linux/arch/m68k/amiga/zorro.c linux/arch/m68k/amiga/zorro.c --- v2.1.105/linux/arch/m68k/amiga/zorro.c Thu Mar 26 15:57:02 1998 +++ linux/arch/m68k/amiga/zorro.c Wed Dec 31 16:00:00 1969 @@ -1,1234 +0,0 @@ -/* - * linux/arch/m68k/amiga/zorro.c - * - * Copyright (C) 1995 Geert Uytterhoeven - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive - * for more details. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include - - -#ifdef CONFIG_ZORRO - - /* - * Zorro Expansion Device Manufacturers and Products - */ - -struct Manufacturer { - const char *Name; - u_short Manuf; - u_short NumProd; - const struct Product *Products; -}; - -struct Product { - const char *Name; - u_char Class; - u_char Prod; -}; - -struct GVP_Product { - const char *Name; - u_char Class; - u_char EPC; -}; - - - /* - * Macro's to make life easier - */ - -#define ARRAYSIZE(x) (sizeof(x)/sizeof(*(x))) - -#define BEGIN_PROD(id) \ - static struct Product Prod_##id[] = { -#define PROD(name, class, id) \ - { name, ZORRO_CLASS_##class, ZORRO_PROD(ZORRO_PROD_##id) }, - -#define BEGIN_GVP_PROD \ - static struct GVP_Product Ext_Prod_GVP[] = { -#define GVP_PROD(name, class, id) \ - { name, ZORRO_CLASS_##class, ZORRO_EPC(ZORRO_PROD_##id) }, - -#define BEGIN_MANUF \ - static struct Manufacturer Manufacturers[] = { -#define MANUF(name, id) \ - { name, ZORRO_MANUF_##id, ARRAYSIZE(Prod_##id), Prod_##id }, - -#define END \ - }; - - - /* - * Recognized Zorro Expansion Devices - */ - -BEGIN_PROD(PACIFIC_PERIPHERALS) - PROD("SE 2000 A500", HD, PACIFIC_PERIPHERALS_SE_2000_A500) - PROD(NULL, SCSI, PACIFIC_PERIPHERALS_SCSI) -END - -BEGIN_PROD(MACROSYSTEMS_USA_2) - PROD("Warp Engine", TURBO_SCSI_RAM, MACROSYSTEMS_WARP_ENGINE) -END - -BEGIN_PROD(KUPKE_1) - PROD("Golem RAM Box 2MB", RAM, KUPKE_GOLEM_RAM_BOX_2MB) -END - -BEGIN_PROD(MEMPHIS) - PROD("Stormbringer", TURBO, MEMPHIS_STORMBRINGER) -END - -BEGIN_PROD(3_STATE) - PROD("Megamix 2000", RAM, 3_STATE_MEGAMIX_2000) -END - -BEGIN_PROD(COMMODORE_BRAUNSCHWEIG) - PROD("A2088 XT/A2286 AT", BRIDGE, CBM_A2088_A2286) - PROD("A2286 AT", BRIDGE, CBM_A2286) - PROD("A4091", SCSI, CBM_A4091_1) - PROD("A2386-SX", BRIDGE, CBM_A2386SX_1) -END - -BEGIN_PROD(COMMODORE_WEST_CHESTER_1) - PROD("A2090/A2090A", SCSI, CBM_A2090A) - PROD("A590/A2091", SCSI, CBM_A590_A2091_1) - PROD("A590/A2091", SCSI, CBM_A590_A2091_2) - PROD("A2090B 2090 Autoboot", SCSI, CBM_A2090B) - PROD("A2060", ARCNET, CBM_A2060) - PROD("A590/A2052/A2058/A2091", RAM, CBM_A590_A2052_A2058_A2091) - PROD("A560", RAM, CBM_A560_RAM) - PROD("A2232 Prototype", MULTIIO, CBM_A2232_PROTOTYPE) - PROD("A2232", MULTIIO, CBM_A2232) - PROD("A2620 68020/RAM", TURBO_RAM, CBM_A2620) - PROD("A2630 68030/RAM", TURBO_RAM, CBM_A2630) - PROD("A4091", SCSI, CBM_A4091_2) - PROD("A2065", ETHERNET, CBM_A2065_1) - PROD("Romulator Card", UNKNOWN, CBM_ROMULATOR) - PROD("A3000 Test Fixture", MISC, CBM_A3000_TEST_FIXTURE) - PROD("A2386-SX", BRIDGE, CBM_A2386SX_2) - PROD("A2065", ETHERNET, CBM_A2065_2) -END - -BEGIN_PROD(COMMODORE_WEST_CHESTER_2) - PROD("A2090/A2090A Combitec/MacroSystem", SCSI, CBM_A2090A_CM) -END - -BEGIN_PROD(PROGRESSIVE_PERIPHERALS_AND_SYSTEMS_2) - PROD("EXP8000", RAM, PPS_EXP8000) -END - -BEGIN_PROD(KOLFF_COMPUTER_SUPPLIES) - PROD("KCS Power PC Board", BRIDGE, KCS_POWER_PC_BOARD) -END - -BEGIN_PROD(CARDCO_1) - PROD("Kronos 2000", SCSI, CARDCO_KRONOS_2000_1) - PROD("A1000", SCSI, CARDCO_A1000_1) - PROD("Escort", SCSI, CARDCO_ESCORT) - PROD("A2410 HiRes", GFX, CARDCO_A2410) -END - -BEGIN_PROD(A_SQUARED) - PROD("Live! 2000", VIDEO, A_SQUARED_LIVE_2000) -END - -BEGIN_PROD(COMSPEC_COMMUNICATIONS) - PROD("AX2000", RAM, COMSPEC_COMMUNICATIONS_AX2000) -END - -BEGIN_PROD(ANAKIN_RESEARCH) - PROD("Easyl", TABLET, ANAKIN_RESEARCH_EASYL) -END - -BEGIN_PROD(MICROBOTICS) - PROD("StarBoard II", RAM, MICROBOTICS_STARBOARD_II) - PROD("StarDrive", SCSI, MICROBOTICS_STARDRIVE) - PROD("8-Up (Rev A)", RAM, MICROBOTICS_8_UP_A) - PROD("8-Up (Rev Z)", RAM, MICROBOTICS_8_UP_Z) - PROD("Delta", RAM, MICROBOTICS_DELTA_RAM) - PROD("8-Star", RAM, MICROBOTICS_8_STAR_RAM) - PROD("8-Star", MISC, MICROBOTICS_8_STAR) - PROD("VXL RAM*32", RAM, MICROBOTICS_VXL_RAM_32) - PROD("VXL-30", TURBO, MICROBOTICS_VXL_68030) - PROD("Delta", MISC, MICROBOTICS_DELTA) - PROD("MBX 1200/1200z", RAM, MICROBOTICS_MBX_1200_1200Z_RAM) - PROD("Hardframe 2000", SCSI, MICROBOTICS_HARDFRAME_2000_1) - PROD("Hardframe 2000", SCSI, MICROBOTICS_HARDFRAME_2000_2) - PROD("MBX 1200/1200z", MISC, MICROBOTICS_MBX_1200_1200Z) -END - -BEGIN_PROD(ACCESS_ASSOCIATES_ALEGRA) -END - -BEGIN_PROD(EXPANSION_TECHNOLOGIES) -END - -BEGIN_PROD(ASDG) - PROD(NULL, RAM, ASDG_MEMORY_1) - PROD(NULL, RAM, ASDG_MEMORY_2) - PROD("EB-920 Lan Rover", ETHERNET, ASDG_EB920_LAN_ROVER) - PROD("GPIB/Dual IEEE-488/Twin-X", MULTIIO, ASDG_GPIB_DUALIEEE488_TWIN_X) -END - -BEGIN_PROD(IMTRONICS_1) - PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_1) - PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_2) -END - -BEGIN_PROD(CBM_UNIVERSITY_OF_LOWELL) - PROD("A2410 HiRes", GFX, CBM_A2410) -END - -BEGIN_PROD(AMERISTAR) - PROD("A2065", ETHERNET, AMERISTAR_A2065) - PROD("A560", ARCNET, AMERISTAR_A560) - PROD("A4066", ETHERNET, AMERISTAR_A4066) -END - -BEGIN_PROD(SUPRA) - PROD("SupraDrive 4x4", SCSI, SUPRA_SUPRADRIVE_4x4) - PROD("1000", RAM, SUPRA_1000_RAM) - PROD("2000 DMA", SCSI, SUPRA_2000_DMA) - PROD("500", SCSI_RAM, SUPRA_500) - PROD("500", SCSI, SUPRA_500_SCSI) - PROD("500XP/2000", RAM, SUPRA_500XP_2000_RAM) - PROD("500RX/2000", RAM, SUPRA_500RX_2000_RAM) - PROD("2400zi", MODEM, SUPRA_2400ZI) - PROD("500XP/SupraDrive WordSync", SCSI, SUPRA_500XP_SUPRADRIVE_WORDSYNC) - PROD("SupraDrive WordSync II", SCSI, SUPRA_SUPRADRIVE_WORDSYNC_II) - PROD("2400zi+", MODEM, SUPRA_2400ZIPLUS) -END - -BEGIN_PROD(COMPUTER_SYSTEMS_ASSOCIATES) - PROD("Magnum 40", TURBO_SCSI, CSA_MAGNUM) - PROD("12 Gauge", SCSI, CSA_12_GAUGE) -END - -BEGIN_PROD(MARC_MICHAEL_GROTH) -END - -BEGIN_PROD(M_TECH) - PROD("AT500", RAM, MTEC_AT500_1) -END - -BEGIN_PROD(GREAT_VALLEY_PRODUCTS_1) - PROD("Impact Series I", SCSI_RAM, GVP_IMPACT_SERIES_I) -END - -BEGIN_PROD(BYTEBOX) - PROD("A500", UNKNOWN, BYTEBOX_A500) -END - -BEGIN_PROD(DKB_POWER_COMPUTING) - PROD("SecureKey", UNKNOWN, DKB_POWER_COMPUTING_SECUREKEY) - PROD("DKM 3128", RAM, DKB_POWER_COMPUTING_DKM_3128) - PROD("Rapid Fire", SCSI, DKB_POWER_COMPUTING_RAPID_FIRE) - PROD("DKM 1202", FPU_RAM, DKB_POWER_COMPUTING_DKM_1202) - PROD("Cobra/Viper II 68EC030", TURBO, DKB_POWER_COMPUTING_COBRA_VIPER_II_68EC030) - PROD("WildFire 060", TURBO, DKB_POWER_COMPUTING_WILDFIRE_060_1) - PROD("WildFire 060", TURBO, DKB_POWER_COMPUTING_WILDFIRE_060_2) -END - -BEGIN_PROD(GREAT_VALLEY_PRODUCTS_2) - PROD("Impact Series I (4K)", SCSI, GVP_IMPACT_SERIES_I_4K) - PROD("Impact Series I (16K/2)", SCSI, GVP_IMPACT_SERIES_I_16K_2) - PROD("Impact Series I (16K/2)", SCSI, GVP_IMPACT_SERIES_I_16K_3) - PROD("Impact 3001", IDE, GVP_IMPACT_3001_IDE_1) - PROD("Impact 3001", RAM, GVP_IMPACT_3001_RAM) - PROD("Impact Series II", RAM, GVP_IMPACT_SERIES_II_RAM_1) -/* PROD(NULL, UNKNOWN, GVP_EPC_BASE) */ - PROD("Impact 3001", IDE, GVP_IMPACT_3001_IDE_2) -/* PROD("A2000 030", TURBO, GVP_A2000_030) */ -/* PROD("GForce 040", TURBO_SCSI, GFORCE_040_SCSI_2) */ - PROD("GForce 040/060", TURBO_SCSI, GVP_GFORCE_040_060) - PROD("Impact Vision 24", GFX, GVP_IMPACT_VISION_24) - PROD("GForce 040", TURBO, GVP_GFORCE_040_2) -END - -BEGIN_GVP_PROD /* ZORRO_PROD_GVP_EPC_BASE */ - GVP_PROD("GForce 040", TURBO, GVP_GFORCE_040_1) - GVP_PROD("GForce 040", TURBO_SCSI, GVP_GFORCE_040_SCSI_1) - GVP_PROD("A1291", SCSI, GVP_A1291) - GVP_PROD("Combo 030 R4", TURBO, GVP_COMBO_030_R4) - GVP_PROD("Combo 030 R4", TURBO_SCSI, GVP_COMBO_030_R4_SCSI) - GVP_PROD("Phone Pak", UNKNOWN, GVP_PHONEPAK) - GVP_PROD("IO-Extender", MULTIIO, GVP_IO_EXTENDER) - GVP_PROD("GForce 030", TURBO, GVP_GFORCE_030) - GVP_PROD("GForce 030", TURBO_SCSI, GVP_GFORCE_030_SCSI) - GVP_PROD("A530", TURBO, GVP_A530) - GVP_PROD("A530", TURBO_SCSI, GVP_A530_SCSI) - GVP_PROD("Combo 030 R3", TURBO, GVP_COMBO_030_R3) - GVP_PROD("Combo 030 R3", TURBO_SCSI, GVP_COMBO_030_R3_SCSI) - GVP_PROD("Series-II", SCSI, GVP_SERIES_II) -END - -BEGIN_PROD(CALIFORNIA_ACCESS_SYNERGY) - PROD("Malibu", SCSI, CALIFORNIA_ACCESS_SYNERGY_MALIBU) -END - -BEGIN_PROD(XETEC) - PROD("FastCard", SCSI, XETEC_FASTCARD) - PROD("FastCard", RAM, XETEC_FASTCARD_RAM) - PROD("FastCard Plus", SCSI, XETEC_FASTCARD_PLUS) -END - -BEGIN_PROD(PROGRESSIVE_PERIPHERALS_AND_SYSTEMS) - PROD("Mercury", TURBO, PPS_MERCURY) - PROD("A3000 68040", TURBO, PPS_A3000_68040) - PROD("A2000 68040", TURBO, PPS_A2000_68040) - PROD("Zeus", TURBO_SCSI_RAM, PPS_ZEUS) - PROD("A500 68040", TURBO, PPS_A500_68040) -END - -BEGIN_PROD(XEBEC) -END - -BEGIN_PROD(SPIRIT_TECHNOLOGY) - PROD("Insider IN1000", RAM, SPIRIT_TECHNOLOGY_INSIDER_IN1000) - PROD("Insider IN500", RAM, SPIRIT_TECHNOLOGY_INSIDER_IN500) - PROD("SIN500", RAM, SPIRIT_TECHNOLOGY_SIN500) - PROD("HDA 506", HD, SPIRIT_TECHNOLOGY_HDA_506) - PROD("AX-S", MISC, SPIRIT_TECHNOLOGY_AX_S) - PROD("OctaByte", RAM, SPIRIT_TECHNOLOGY_OCTABYTE) - PROD("Inmate", SCSI_RAM, SPIRIT_TECHNOLOGY_INMATE) -END - -BEGIN_PROD(SPIRIT_TECHNOLOGY_2) -END - -BEGIN_PROD(BSC_ALFADATA_1) - PROD("ALF 3", SCSI, BSC_ALF_3_1) -END - -BEGIN_PROD(BSC_ALFADATA_2) - PROD("ALF 2", SCSI, BSC_ALF_2_1) - PROD("ALF 2", SCSI, BSC_ALF_2_2) - PROD("ALF 3", SCSI, BSC_ALF_3_2) -END - -BEGIN_PROD(CARDCO_2) - PROD("Kronos", SCSI, CARDCO_KRONOS_2000_2) - PROD("A1000", SCSI, CARDCO_A1000_2) -END - -BEGIN_PROD(JOCHHEIM) - PROD(NULL, RAM, JOCHHEIM_RAM) -END - -BEGIN_PROD(CHECKPOINT_TECHNOLOGIES) - PROD("Serial Solution", SERIAL, CHECKPOINT_TECHNOLOGIES_SERIAL_SOLUTION) -END - -BEGIN_PROD(EDOTRONIK) - PROD("IEEE-488 Interface Board", UNKNOWN, EDOTRONIK_IEEE_488) - PROD("CBM-8032 Board", UNKNOWN, EDOTRONIK_8032) - PROD(NULL, SERIAL, EDOTRONIK_MULTISERIAL) - PROD("24Bit Realtime Video Digitizer", UNKNOWN, EDOTRONIK_VIDEODIGITIZER) - PROD("32Bit Parallel I/O Interface", UNKNOWN, EDOTRONIK_PARALLEL_IO) - PROD("PIC Prototyping Board", UNKNOWN, EDOTRONIK_PIC_PROTOYPING) - PROD("16 Channel ADC Interface", UNKNOWN, EDOTRONIK_ADC) - PROD("VME-Bus Controller", UNKNOWN, EDOTRONIK_VME) - PROD("DSP96000 Realtime Data Acquisition", DSP, EDOTRONIK_DSP96000) -END - -BEGIN_PROD(NES_INC) - PROD(NULL, RAM, NES_INC_RAM) -END - -BEGIN_PROD(ICD) - PROD("Advantage 2000", SCSI, ICD_ADVANTAGE_2000_SCSI) - PROD("Advantage", IDE, ICD_ADVANTAGE_2000_SCSI) - PROD("Advantage 2080", RAM, ICD_ADVANTAGE_2080_RAM) -END - -BEGIN_PROD(KUPKE_2) - PROD("Omti", HD, KUPKE_OMTI) - PROD("Golem SCSI-II", SCSI, KUPKE_SCSI_II) - PROD("Golem Box", UNKNOWN, KUPKE_GOLEM_BOX) - PROD("030/882", TURBO, KUPKE_030_882) - PROD("Golem", SCSI, KUPKE_SCSI_AT) -END - -BEGIN_PROD(GREAT_VALLEY_PRODUCTS_3) - PROD("A2000-RAM8/2", MISC, GVP_A2000_RAM8) - PROD("Impact Series II", RAM, GVP_IMPACT_SERIES_II_RAM_2) -END - -BEGIN_PROD(INTERWORKS_NETWORK) -END - -BEGIN_PROD(HARDITAL_SYNTHESIS) - PROD("TQM 68030+68882", TURBO, HARDITAL_SYNTHESIS_TQM_68030_68882) -END - -BEGIN_PROD(APPLIED_ENGINEERING) - PROD("DL2000", MODEM, APPLIED_ENGINEERING_DL2000) - PROD("RAM Works", RAM, APPLIED_ENGINEERING_RAM_WORKS) -END - -BEGIN_PROD(BSC_ALFADATA_3) - PROD("Oktagon 2008", SCSI, BSC_OKTAGON_2008) - PROD("Tandem AT-2008/508", IDE, BSC_TANDEM_AT_2008_508) - PROD("Alpha RAM 1200", RAM, BSC_ALFA_RAM_1200) - PROD("Oktagon 2008", RAM, BSC_OKTAGON_2008_RAM) - PROD("MultiFace I", MULTIIO, BSC_MULTIFACE_I) - PROD("MultiFace II", MULTIIO, BSC_MULTIFACE_II) - PROD("MultiFace III", MULTIIO, BSC_MULTIFACE_III) - PROD("Framebuffer", MISC, BSC_FRAMEBUFFER) - PROD("Graffiti", GFXRAM, BSC_GRAFFITI_RAM) - PROD("Graffiti", GFX, BSC_GRAFFITI_REG) - PROD("ISDN MasterCard", ISDN, BSC_ISDN_MASTERCARD) - PROD("ISDN MasterCard II", ISDN, BSC_ISDN_MASTERCARD_II) -END - -BEGIN_PROD(PHOENIX) - PROD("ST506", HD, PHOENIX_ST506) - PROD(NULL, SCSI, PHOENIX_SCSI) - PROD(NULL, RAM, PHOENIX_RAM) -END - -BEGIN_PROD(ADVANCED_STORAGE_SYSTEMS) - PROD("Nexus", SCSI, ADVANCED_STORAGE_SYSTEMS_NEXUS) - PROD("Nexus", RAM, ADVANCED_STORAGE_SYSTEMS_NEXUS_RAM) -END - -BEGIN_PROD(IMPULSE) - PROD("FireCracker 24", GFX, IMPULSE_FIRECRACKER_24) -END - -BEGIN_PROD(IVS) - PROD("GrandSlam PIC 2", RAM, IVS_GRANDSLAM_PIC_2) - PROD("GrandSlam PIC 1", RAM, IVS_GRANDSLAM_PIC_1) - PROD("OverDrive", HD, IVS_OVERDRIVE) - PROD("TrumpCard Classic", SCSI, IVS_TRUMPCARD_CLASSIC) - PROD("TrumpCard Pro/GrandSlam", SCSI, IVS_TRUMPCARD_PRO_GRANDSLAM) - PROD("Meta-4", RAM, IVS_META_4) - PROD("Wavetools", AUDIO, IVS_WAVETOOLS) - PROD("Vector", SCSI, IVS_VECTOR_1) - PROD("Vector", SCSI, IVS_VECTOR_2) -END - -BEGIN_PROD(VECTOR_1) - PROD("Connection", MULTIIO, VECTOR_CONNECTION_1) -END - -BEGIN_PROD(XPERT_PRODEV) - PROD("Visiona", GFXRAM, XPERT_PRODEV_VISIONA_RAM) - PROD("Visiona", GFX, XPERT_PRODEV_VISIONA_REG) - PROD("Merlin", GFXRAM, XPERT_PRODEV_MERLIN_RAM) - PROD("Merlin", GFX, XPERT_PRODEV_MERLIN_REG_1) - PROD("Merlin", GFX, XPERT_PRODEV_MERLIN_REG_2) -END - -BEGIN_PROD(HYDRA_SYSTEMS) - PROD("Amiganet", ETHERNET, HYDRA_SYSTEMS_AMIGANET) -END - -BEGIN_PROD(SUNRIZE_INDUSTRIES) - PROD("AD1012", AUDIO, SUNRIZE_INDUSTRIES_AD1012) - PROD("AD516", AUDIO, SUNRIZE_INDUSTRIES_AD516) - PROD("DD512", AUDIO, SUNRIZE_INDUSTRIES_DD512) -END - -BEGIN_PROD(TRICERATOPS) - PROD(NULL, MULTIIO, TRICERATOPS_MULTI_IO) -END - -BEGIN_PROD(APPLIED_MAGIC) - PROD("DMI Resolver", GFX, APPLIED_MAGIC_DMI_RESOLVER) - PROD("Digital Broadcaster", VIDEO, APPLIED_MAGIC_DIGITAL_BROADCASTER) -END - -BEGIN_PROD(GFX_BASE) - PROD("GDA-1 VRAM", GFX, GFX_BASE_GDA_1_VRAM) - PROD("GDA-1", GFX, GFX_BASE_GDA_1) -END - -BEGIN_PROD(ROCTEC) - PROD("RH 800C", HD, ROCTEC_RH_800C) - PROD("RH 800C", RAM, ROCTEC_RH_800C_RAM) -END - -BEGIN_PROD(KATO) - PROD("Melody MPEG", AUDIO, KATO_MELODY) - PROD("Rainbow II", GFX, HELFRICH_RAINBOW_II) /* ID clash!! */ - PROD("Rainbow III", GFX, HELFRICH_RAINBOW_III) /* ID clash!! */ -END - -BEGIN_PROD(ATLANTIS) -END - -BEGIN_PROD(PROTAR) -END - -BEGIN_PROD(ACS) -END - -BEGIN_PROD(SOFTWARE_RESULTS_ENTERPRISES) - PROD("Golden Gate 2 Bus+", BRIDGE, SOFTWARE_RESULTS_ENTERPRISES_GOLDEN_GATE_2_BUS_PLUS) -END - -BEGIN_PROD(MASOBOSHI) - PROD("MasterCard SC201", RAM, MASOBOSHI_MASTER_CARD_SC201) - PROD("MasterCard MC702", SCSI_IDE, MASOBOSHI_MASTER_CARD_MC702) - PROD("MVD 819", UNKNOWN, MASOBOSHI_MVD_819) -END - -BEGIN_PROD(MAINHATTAN_DATA) - PROD(NULL, IDE, MAINHATTAN_DATA_IDE) -END - -BEGIN_PROD(VILLAGE_TRONIC) - PROD("Domino", GFXRAM, VILLAGE_TRONIC_DOMINO_RAM) - PROD("Domino", GFX, VILLAGE_TRONIC_DOMINO_REG) - PROD("Domino 16M Prototype", GFX, VILLAGE_TRONIC_DOMINO_16M_PROTOTYPE) - PROD("Picasso II/II+", GFXRAM, VILLAGE_TRONIC_PICASSO_II_II_PLUS_RAM) - PROD("Picasso II/II+", GFX, VILLAGE_TRONIC_PICASSO_II_II_PLUS_REG) - PROD("Picasso II/II+ (Segmented Mode)", GFX, VILLAGE_TRONIC_PICASSO_II_II_PLUS_SEGMENTED_MODE) - PROD("Picasso IV Z2", GFXRAM, VILLAGE_TRONIC_PICASSO_IV_Z2_MEM1) - PROD("Picasso IV Z2", GFXRAM, VILLAGE_TRONIC_PICASSO_IV_Z2_MEM2) - PROD("Picasso IV Z2", GFX, VILLAGE_TRONIC_PICASSO_IV_Z2_REG) - PROD("Picasso IV Z3", GFX, VILLAGE_TRONIC_PICASSO_IV_Z3) - PROD("Ariadne", ETHERNET_PARALLEL, VILLAGE_TRONIC_ARIADNE) -END - -BEGIN_PROD(UTILITIES_UNLIMITED) - PROD("Emplant Deluxe", MACEMU, UTILITIES_UNLIMITED_EMPLANT_DELUXE) - PROD("Emplant Deluxe", MACEMU, UTILITIES_UNLIMITED_EMPLANT_DELUXE2) -END - -BEGIN_PROD(AMITRIX) - PROD(NULL, MULTIIO, AMITRIX_MULTI_IO) - PROD("CD-RAM", RAM, AMITRIX_CD_RAM) -END - -BEGIN_PROD(ARMAX) - PROD("OmniBus", GFX, ARMAX_OMNIBUS) -END - -BEGIN_PROD(NEWTEK) - PROD("VideoToaster", VIDEO, NEWTEK_VIDEOTOASTER) -END - -BEGIN_PROD(M_TECH_GERMANY) - PROD("AT500", IDE, MTEC_AT500_2) - PROD("68030", TURBO, MTEC_68030) - PROD("68020i", TURBO, MTEC_68020I) - PROD("A1200 T68030 RTC", TURBO, MTEC_A1200_T68030_RTC) - PROD("Viper Mk V/E-Matrix 530", TURBO_RAM, MTEC_VIPER_MK_V_E_MATRIX_530) - PROD("8MB", RAM, MTEC_8_MB_RAM) - PROD("Viper Mk V/E-Matrix 530 SCSI/IDE", SCSI_IDE, MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE) -END - -BEGIN_PROD(GREAT_VALLEY_PRODUCTS_4) - PROD("EGS 28/24 Spectrum", GFX, GVP_EGS_28_24_SPECTRUM_REG) - PROD("EGS 28/24 Spectrum", GFXRAM, GVP_EGS_28_24_SPECTRUM_RAM) -END - -BEGIN_PROD(APOLLO_1) - PROD("A1200", FPU_RAM, APOLLO_A1200) -END - -BEGIN_PROD(HELFRICH_2) - PROD("Piccolo", GFXRAM, HELFRICH_PICCOLO_RAM) - PROD("Piccolo", GFX, HELFRICH_PICCOLO_REG) - PROD("PeggyPlus MPEG", VIDEO, HELFRICH_PEGGY_PLUS_MPEG) - PROD("VideoCruncher", VIDEO, HELFRICH_VIDEOCRUNCHER) - PROD("Piccolo SD64", GFXRAM, HELFRICH_SD64_RAM) - PROD("Piccolo SD64", GFX, HELFRICH_SD64_REG) -END - -BEGIN_PROD(MACROSYSTEMS_USA) - PROD("Warp Engine 40xx", TURBO_SCSI_RAM, MACROSYSTEMS_WARP_ENGINE_40xx) -END - -BEGIN_PROD(ELBOX_COMPUTER) - PROD("1200/4", RAM, ELBOX_COMPUTER_1200_4) -END - -BEGIN_PROD(HARMS_PROFESSIONAL) - PROD("030 Plus", TURBO, HARMS_PROFESSIONAL_030_PLUS) - PROD("3500 Professional", TURBO_RAM, HARMS_PROFESSIONAL_3500) -END - -BEGIN_PROD(MICRONIK) - PROD("RCA 120", RAM, MICRONIK_RCA_120) -END - -BEGIN_PROD(MICRONIK2) - PROD("Z3i A1200 Zorro III + SCSI", SCSI, MICRONIK2_Z3I) -END - -BEGIN_PROD(MEGAMICRO) - PROD("SCRAM 500", SCSI, MEGAMICRO_SCRAM_500) - PROD("SCRAM 500", RAM, MEGAMICRO_SCRAM_500_RAM) -END - -BEGIN_PROD(IMTRONICS_2) - PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_3) - PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_4) -END - -BEGIN_PROD(INDIVIDUAL_COMPUTERS) - PROD("Buddha", IDE, INDIVIDUAL_COMPUTERS_BUDDHA) - PROD("Catweasel", IDE_FLOPPY, INDIVIDUAL_COMPUTERS_CATWEASEL) -END - -BEGIN_PROD(KUPKE_3) - PROD("Golem HD 3000", HD, KUPKE_GOLEM_HD_3000) -END - -BEGIN_PROD(ITH) - PROD("ISDN-Master II", ISDN, ITH_ISDN_MASTER_II) -END - -BEGIN_PROD(VMC) - PROD("ISDN Blaster Z2", ISDN, VMC_ISDN_BLASTER_Z2) - PROD("HyperCom 4", MULTIIO, VMC_HYPERCOM_4) -END - -BEGIN_PROD(INFORMATION) - PROD("ISDN Engine I", ISDN, INFORMATION_ISDN_ENGINE_I) -END - -BEGIN_PROD(VORTEX) - PROD("Golden Gate 80386SX", BRIDGE, VORTEX_GOLDEN_GATE_80386SX) - PROD("Golden Gate", RAM, VORTEX_GOLDEN_GATE_RAM) - PROD("Golden Gate 80486", BRIDGE, VORTEX_GOLDEN_GATE_80486) -END - -BEGIN_PROD(EXPANSION_SYSTEMS) - PROD("DataFlyer 4000SX", SCSI, EXPANSION_SYSTEMS_DATAFLYER_4000SX) - PROD("DataFlyer 4000SX", RAM, EXPANSION_SYSTEMS_DATAFLYER_4000SX_RAM) -END - -BEGIN_PROD(READYSOFT) - PROD("AMax II/IV", MACEMU, READYSOFT_AMAX_II_IV) -END - -BEGIN_PROD(PHASE5) - PROD("Blizzard", RAM, PHASE5_BLIZZARD_RAM) - PROD("Blizzard", TURBO, PHASE5_BLIZZARD) - PROD("Blizzard 1220-IV", TURBO, PHASE5_BLIZZARD_1220_IV) - PROD("FastLane Z3", RAM, PHASE5_FASTLANE_Z3_RAM) - PROD("Blizzard 1230-II/Fastlane Z3/CyberSCSI/CyberStorm060", TURBO_SCSI, PHASE5_BLIZZARD_1230_II_FASTLANE_Z3_CYBERSCSI_CYBERSTORM060) - PROD("Blizzard 1220/CyberStorm", TURBO_SCSI, PHASE5_BLIZZARD_1220_CYBERSTORM) - PROD("Blizzard 1230", TURBO, PHASE5_BLIZZARD_1230) - PROD("Blizzard 1230-IV/1260", TURBO, PHASE5_BLIZZARD_1230_IV_1260) - PROD("Blizzard 2060", TURBO, PHASE5_BLIZZARD_2060) - PROD("CyberStorm Mk II", FLASHROM, PHASE5_CYBERSTORM_MK_II) - PROD("CyberVision64", GFX, PHASE5_CYBERVISION64) - PROD("CyberVision64-3D Prototype", GFX, PHASE5_CYBERVISION64_3D_PROTOTYPE) - PROD("CyberVision64-3D", GFX, PHASE5_CYBERVISION64_3D) - PROD("CyberStorm Mk III", TURBO_SCSI, PHASE5_CYBERSTORM_MK_III) -END - -BEGIN_PROD(DPS) - PROD("Personal Animation Recorder", VIDEO, DPS_PERSONAL_ANIMATION_RECORDER) -END - -BEGIN_PROD(APOLLO_2) - PROD("A620 68020", TURBO, APOLLO_A620_68020_1) - PROD("A620 68020", TURBO, APOLLO_A620_68020_2) -END - -BEGIN_PROD(APOLLO_3) - PROD("AT-Apollo", UNKNOWN, APOLLO_AT_APOLLO) - PROD("1230/1240/1260/2030/4040/4060", TURBO, APOLLO_1230_1240_1260_2030_4040_4060) -END - -BEGIN_PROD(PETSOFF_LP) - PROD("Delfina", AUDIO, PETSOFF_LP_DELFINA) - PROD("Delfina Lite", AUDIO, PETSOFF_LP_DELFINA_LITE) -END - -BEGIN_PROD(UWE_GERLACH) - PROD("RAM/ROM", MISC, UWE_GERLACH_RAM_ROM) -END - -BEGIN_PROD(MACROSYSTEMS_GERMANY) - PROD("Maestro", AUDIO, MACROSYSTEMS_MAESTRO) - PROD("VLab", VIDEO, MACROSYSTEMS_VLAB) - PROD("Maestro Pro", AUDIO, MACROSYSTEMS_MAESTRO_PRO) - PROD("Retina", GFX, MACROSYSTEMS_RETINA) - PROD("MultiEvolution", SCSI, MACROSYSTEMS_MULTI_EVOLUTION) - PROD("Toccata", AUDIO, MACROSYSTEMS_TOCCATA) - PROD("Retina Z3", GFX, MACROSYSTEMS_RETINA_Z3) - PROD("VLab Motion", VIDEO, MACROSYSTEMS_VLAB_MOTION) - PROD("Altais", GFX, MACROSYSTEMS_ALTAIS) - PROD("Falcon '040", TURBO, MACROSYSTEMS_FALCON_040) -END - -BEGIN_PROD(COMBITEC) -END - -BEGIN_PROD(SKI_PERIPHERALS) - PROD("MAST Fireball", SCSI, SKI_PERIPHERALS_MAST_FIREBALL) - PROD("SCSI/Dual Serial", SCSI_SERIAL, SKI_PERIPHERALS_SCSI_DUAL_SERIAL) -END - -BEGIN_PROD(REIS_WARE_2) - PROD("Scan King", SCANNER, REIS_WARE_SCAN_KING) -END - -BEGIN_PROD(CAMERON) - PROD("Personal A4", SCANNER, CAMERON_PERSONAL_A4) -END - -BEGIN_PROD(REIS_WARE) - PROD("Handyscanner", SCANNER, REIS_WARE_HANDYSCANNER) -END - -BEGIN_PROD(PHOENIX_2) - PROD("ST506", HD, PHOENIX_ST506_2) - PROD(NULL, SCSI, PHOENIX_SCSI_2) - PROD(NULL, RAM, PHOENIX_RAM_2) -END - -BEGIN_PROD(COMBITEC_2) - PROD(NULL, HD, COMBITEC_HD) - PROD("SRAM", RAM, COMBITEC_SRAM) -END - -BEGIN_PROD(HACKER) /* Unused */ -END - - -BEGIN_MANUF - MANUF("Pacific Peripherals", PACIFIC_PERIPHERALS) - MANUF("MacroSystems USA", MACROSYSTEMS_USA_2) - MANUF("Kupke", KUPKE_1) - MANUF("Memphis", MEMPHIS) - MANUF("3-State", 3_STATE) - MANUF("Commodore Braunschweig", COMMODORE_BRAUNSCHWEIG) - MANUF("Commodore West Chester", COMMODORE_WEST_CHESTER_1) - MANUF("Commodore West Chester", COMMODORE_WEST_CHESTER_2) - MANUF("Progressive Peripherals & Systems", PROGRESSIVE_PERIPHERALS_AND_SYSTEMS_2) - MANUF("Kolff Computer Supplies", KOLFF_COMPUTER_SUPPLIES) - MANUF("Cardco Ltd.", CARDCO_1) - MANUF("A-Squared", A_SQUARED) - MANUF("Comspec Communications", COMSPEC_COMMUNICATIONS) - MANUF("Anakin Research", ANAKIN_RESEARCH) - MANUF("Microbotics", MICROBOTICS) - MANUF("Access Associates Alegra", ACCESS_ASSOCIATES_ALEGRA) - MANUF("Expansion Technologies (Pacific Cypress)", EXPANSION_TECHNOLOGIES) - MANUF("ASDG", ASDG) - MANUF("Ronin/Imtronics", IMTRONICS_1) - MANUF("Commodore/University of Lowell", CBM_UNIVERSITY_OF_LOWELL) - MANUF("Ameristar", AMERISTAR) - MANUF("Supra", SUPRA) - MANUF("Computer Systems Assosiates", COMPUTER_SYSTEMS_ASSOCIATES) - MANUF("Marc Michael Groth", MARC_MICHAEL_GROTH) - MANUF("M-Tech", M_TECH) - MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_1) - MANUF("ByteBox", BYTEBOX) - MANUF("DKB/Power Computing", DKB_POWER_COMPUTING) - MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_2) - MANUF("California Access (Synergy)", CALIFORNIA_ACCESS_SYNERGY) - MANUF("Xetec", XETEC) - MANUF("Progressive Peripherals & Systems", PROGRESSIVE_PERIPHERALS_AND_SYSTEMS) - MANUF("Xebec", XEBEC) - MANUF("Spirit Technology", SPIRIT_TECHNOLOGY) - MANUF("Spirit Technology", SPIRIT_TECHNOLOGY_2) - MANUF("BSC/Alfadata", BSC_ALFADATA_1) - MANUF("BSC/Alfadata", BSC_ALFADATA_2) - MANUF("Cardco Ltd.", CARDCO_2) - MANUF("Jochheim", JOCHHEIM) - MANUF("Checkpoint Technologies", CHECKPOINT_TECHNOLOGIES) - MANUF("Edotronik", EDOTRONIK) - MANUF("NES Inc.", NES_INC) - MANUF("ICD", ICD) - MANUF("Kupke", KUPKE_2) - MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_3) - MANUF("Interworks Network", INTERWORKS_NETWORK) - MANUF("Hardital Synthesis", HARDITAL_SYNTHESIS) - MANUF("Applied Engineering", APPLIED_ENGINEERING) - MANUF("BSC/Alfadata", BSC_ALFADATA_3) - MANUF("Phoenix", PHOENIX) - MANUF("Advanced Storage Systems", ADVANCED_STORAGE_SYSTEMS) - MANUF("Impulse", IMPULSE) - MANUF("IVS", IVS) - MANUF("Vector", VECTOR_1) - MANUF("XPert ProDev", XPERT_PRODEV) - MANUF("Hydra Systems", HYDRA_SYSTEMS) - MANUF("Sunrize Industries", SUNRIZE_INDUSTRIES) - MANUF("Triceratops", TRICERATOPS) - MANUF("Applied Magic Inc.", APPLIED_MAGIC) - MANUF("GFX-Base", GFX_BASE) - MANUF("RocTec", ROCTEC) - MANUF("Kato", KATO) - MANUF("Atlantis", ATLANTIS) - MANUF("Protar", PROTAR) - MANUF("ACS", ACS) - MANUF("Software Results Enterprises", SOFTWARE_RESULTS_ENTERPRISES) - MANUF("Masoboshi", MASOBOSHI) - MANUF("Mainhattan-Data (A-Team)", MAINHATTAN_DATA) - MANUF("Village Tronic", VILLAGE_TRONIC) - MANUF("Utilities Unlimited", UTILITIES_UNLIMITED) - MANUF("Amitrix", AMITRIX) - MANUF("ArMax", ARMAX) - MANUF("NewTek", NEWTEK) - MANUF("M-Tech Germany", M_TECH_GERMANY) - MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_4) - MANUF("Apollo", APOLLO_1) - MANUF("Ingenieurbüro Helfrich", HELFRICH_2) - MANUF("MacroSystems USA", MACROSYSTEMS_USA) - MANUF("ElBox Computer", ELBOX_COMPUTER) - MANUF("Harms Professional", HARMS_PROFESSIONAL) - MANUF("Micronik", MICRONIK) - MANUF("Micronik", MICRONIK2) - MANUF("MegaMicro", MEGAMICRO) - MANUF("Ronin/Imtronics", IMTRONICS_2) - MANUF("Individual Computers", INDIVIDUAL_COMPUTERS) - MANUF("Kupke", KUPKE_3) - MANUF("ITH", ITH) - MANUF("VMC", VMC) - MANUF("Information", INFORMATION) - MANUF("Vortex", VORTEX) - MANUF("Expansion Systems", EXPANSION_SYSTEMS) - MANUF("ReadySoft", READYSOFT) - MANUF("Phase 5", PHASE5) - MANUF("DPS", DPS) - MANUF("Apollo", APOLLO_2) - MANUF("Apollo", APOLLO_3) - MANUF("Petsoff LP", PETSOFF_LP) - MANUF("Uwe Gerlach", UWE_GERLACH) - MANUF("MacroSystems Germany", MACROSYSTEMS_GERMANY) - MANUF("Combitec", COMBITEC) - MANUF("SKI Peripherals", SKI_PERIPHERALS) - MANUF("Reis-Ware", REIS_WARE_2) - MANUF("Cameron", CAMERON) - MANUF("Reis-Ware", REIS_WARE) - MANUF("Hacker Test Board", HACKER) /* Unused */ - MANUF("Phoenix", PHOENIX_2) - MANUF("Combitec", COMBITEC_2) -END - -#define NUM_MANUF (ARRAYSIZE(Manufacturers)) -#define NUM_GVP_PROD (ARRAYSIZE(Ext_Prod_GVP)) - - - /* - * Zorro product classes - * - * Make sure to keep these in sync with include/linux/zorro.h! - */ - -static const char *classnames[] = { - NULL, /* ZORRO_CLASS_UNKNOWN */ - "ArcNet Card", /* ZORRO_CLASS_ARCNET */ - "Audio Board", /* ZORRO_CLASS_AUDIO */ - "ISA Bus Bridge", /* ZORRO_CLASS_BRIDGE */ - "DSP Board", /* ZORRO_CLASS_DSP */ - "Ethernet Card", /* ZORRO_CLASS_ETHERNET */ - "Ethernet Card and Parallel Ports", /* ZORRO_CLASS_ETHERNET_PARALLEL */ - "Flash ROM", /* ZORRO_CLASS_FLASHROM */ - "FPU and RAM Expansion", /* ZORRO_CLASS_FPU_RAM */ - "Graphics Board", /* ZORRO_CLASS_GFX */ - "Graphics Board (RAM)", /* ZORRO_CLASS_GFXRAM */ - "HD Controller", /* ZORRO_CLASS_HD */ - "HD Controller and RAM Expansion", /* ZORRO_CLASS_HD_RAM */ - "IDE Interface", /* ZORRO_CLASS_IDE */ - "IDE Interface and RAM Expansion", /* ZORRO_CLASS_IDE_RAM */ - "IDE Interface and Floppy Controller", /* ZORRO_CLASS_IDE_FLOPPY */ - "ISDN Interface", /* ZORRO_CLASS_ISDN */ - "Macintosh Emulator", /* ZORRO_CLASS_MACEMU */ - "Miscellaneous Expansion Card", /* ZORRO_CLASS_MISC */ - "Modem", /* ZORRO_CLASS_MODEM */ - "Multi I/O", /* ZORRO_CLASS_MULTIIO */ - "RAM Expansion", /* ZORRO_CLASS_RAM */ - "Scanner Interface", /* ZORRO_CLASS_SCANNER */ - "SCSI Host Adapter", /* ZORRO_CLASS_SCSI */ - "SCSI Host Adapter and IDE Interface", /* ZORRO_CLASS_SCSI_IDE */ - "SCSI Host Adapter and RAM Expansion", /* ZORRO_CLASS_SCSI_RAM */ - "SCSI Host Adapter and Serial Card", /* ZORRO_CLASS_SCSI_SERIAL */ - "Multi Serial", /* ZORRO_CLASS_SERIAL */ - "Drawing Tablet Interface", /* ZORRO_CLASS_TABLET */ - "Accelerator", /* ZORRO_CLASS_TURBO */ - "Accelerator and RAM Expansion", /* ZORRO_CLASS_TURBO_RAM */ - "Accelerator and HD Controller", /* ZORRO_CLASS_TURBO_HD */ - "Accelerator and IDE Interface", /* ZORRO_CLASS_TURBO_IDE */ - "Accelerator and SCSI Host Adapter", /* ZORRO_CLASS_TURBO_SCSI */ - "Accelerator, SCSI Host Adapter and RAM Expansion", /* ZORRO_CLASS_TURBO_SCSI */ - "Video Board", /* ZORRO_CLASS_VIDEO */ -}; - -static inline const char *get_class_name(enum Zorro_Classes class) -{ - if (class < ARRAYSIZE(classnames)) - return(classnames[class]); - else - return("(**Illegal**)"); -} - -#endif /* CONFIG_ZORRO */ - - - /* - * Expansion Devices - */ - -u_int zorro_num_autocon; -struct ConfigDev zorro_autocon[ZORRO_NUM_AUTO]; -static u32 BoardPartFlags[ZORRO_NUM_AUTO] = { 0, }; - - - /* - * Find the key for the next unconfigured expansion device of a specific - * type. - * - * Part is a device specific number (0 <= part <= 31) to allow for the - * independent configuration of independent parts of an expansion board. - * Thanks to Jes Soerensen for this idea! - * - * Index is used to specify the first board in the autocon list - * to be tested. It was inserted in order to solve the problem - * with the GVP boards that uses the same product code, but - * it should help if there are other companies which use the same - * method as GVP. Drivers for boards which are not using this - * method do not need to think of this - just set index = 0. - * - * Example: - * - * while ((key = zorro_find(ZORRO_PROD_MY_BOARD, MY_PART, 0))) { - * cd = zorro_get_board(key); - * initialise_this_board; - * zorro_config_board(key, MY_PART); - * } - */ - -u_int zorro_find(zorro_id id, u_int part, u_int index) -{ - u_int manuf = ZORRO_MANUF(id); - u_int prod = ZORRO_PROD(id); - u_int epc = ZORRO_EPC(id); - u_int key; - const struct ConfigDev *cd; - u_long addr; - - if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) - return(0); - - if (part > 31) { - printk("zorro_find: bad part %d\n", part); - return(0); - } - - for (key = index + 1; key <= zorro_num_autocon; key++) { - cd = &zorro_autocon[key-1]; - addr = (u_long)cd->cd_BoardAddr; - if ((cd->cd_Rom.er_Manufacturer == manuf) && - (cd->cd_Rom.er_Product == prod) && - !(BoardPartFlags[key-1] & (1< zorro_num_autocon)) - printk("zorro_get_board: bad key %d\n", key); - else - cd = &zorro_autocon[key-1]; - - return(cd); -} - - - /* - * Mark a part of a board as configured - */ - -void zorro_config_board(u_int key, u_int part) -{ - if ((key < 1) || (key > zorro_num_autocon)) - printk("zorro_config_board: bad key %d\n", key); - else if (part > 31) - printk("zorro_config_board: bad part %d\n", part); - else if (BoardPartFlags[key-1] & (1< zorro_num_autocon)) - printk("zorro_unconfig_board: bad key %d\n", key); - else if (part > 31) - printk("zorro_unconfig_board: bad part %d\n", part); - else if (!(BoardPartFlags[key-1] & (1<cd_Rom.er_Manufacturer; - u_int prod = cd->cd_Rom.er_Product; - u_int class = ZORRO_CLASS_UNKNOWN; - u_int epc = 0; - const char *manufname = "Unknown"; - const char *prodname = "Unknown"; - const char *classname; - u_int i, j, k, len = 0; - u_long addr = (u_long)cd->cd_BoardAddr; - u_long size = cd->cd_BoardSize; - char mag; - int identified = 0, gvp = 0; - - if (manuf != ZORRO_MANUF(ZORRO_PROD_GVP_EPC_BASE) || - prod != ZORRO_PROD(ZORRO_PROD_GVP_EPC_BASE)) { - for (i = 0; i < NUM_MANUF; i++) - if (Manufacturers[i].Manuf == manuf) { - manufname = Manufacturers[i].Name; - for (j = 0; j < Manufacturers[i].NumProd; j++) - if (Manufacturers[i].Products[j].Prod == prod) { - prodname = Manufacturers[i].Products[j].Name; - class = Manufacturers[i].Products[j].Class; - identified = 1; - break; - } - } - /* Put workarounds for ID clashes here */ - if (manuf == ZORRO_MANUF(ZORRO_PROD_HELFRICH_RAINBOW_III) && - prod == ZORRO_PROD(ZORRO_PROD_HELFRICH_RAINBOW_III)) - manufname = "Ingenieurbüro Helfrich"; - } else { - manufname = "Great Valley Products"; - gvp = 1; - epc = *(u_short *)ZTWO_VADDR(addr+0x8000) & GVP_PRODMASK; - for (k = 0; k < NUM_GVP_PROD; k++) - if (epc == Ext_Prod_GVP[k].EPC) { - prodname = Ext_Prod_GVP[k].Name; - class = Ext_Prod_GVP[k].Class; - identified = 1; - break; - } - } - classname = get_class_name(class); - if (size & 0xfffff) { - size >>= 10; - mag = 'K'; - } else { - size >>= 20; - mag = 'M'; - } - if (verbose) { - const char *zorro; - int is_mem = cd->cd_Rom.er_Type & ERTF_MEMLIST; - switch (cd->cd_Rom.er_Type & ERT_TYPEMASK) { - case ERT_ZORROII: - zorro = "Zorro II"; - break; - case ERT_ZORROIII: - zorro = "Zorro III"; - break; - default: - zorro = "Unknown Zorro"; - break; - } - if (!prodname) - prodname = "Unknown"; - if (!classname) - classname = "Unknown"; - len = sprintf(buf, " Device %d at 0x%08lx: ID=%04x:%02x", devnum, - addr, manuf, prod); - if (gvp) - len += sprintf(buf+len, ":%02x", epc); - len += sprintf(buf+len, ", %s, %ld%c", zorro, size, mag); - if (is_mem) - len += sprintf(buf+len, ", System RAM"); - else - len += sprintf(buf+len, ", Configured=%08x", configured); - len += sprintf(buf+len, "\n" - " Manufacturer: %s\n" - " Product Name: %s\n" - " Board Class : %s\n", - manufname, prodname, classname); - } else { - len = sprintf(buf, " %c%08lx: ", configured ? '*' : ' ', addr); - if (identified) { - len += sprintf(buf+len, "%s", manufname); - if (prodname) - len += sprintf(buf+len, " %s", prodname); - if (classname) - len += sprintf(buf+len, " %s", classname); - } else if (manuf == ZORRO_MANUF_HACKER) - len += sprintf(buf+len, "Hacker Test Board %02x", prod); - else if (gvp) - len += sprintf(buf+len, "[%04x:%02x:%02x] made by %s", manuf, prod, - epc, manufname); - else - len += sprintf(buf+len, "[%04x:%02x] made by %s", manuf, prod, - manufname); - len += sprintf(buf+len, " (%ld%c)\n", size, mag); - if (!identified && manuf != ZORRO_MANUF_HACKER) - len += sprintf(buf+len, " Please report this unknown device to " - "zorro@linux-m68k.org\n"); - } - return(len); -} - - - /* - * Identify all known AutoConfig Expansion Devices - */ - -void zorro_identify(void) -{ - u_int i; - char tmp[256]; - - if (!AMIGAHW_PRESENT(ZORRO)) - return; - - printk("Probing AutoConfig expansion device(s):\n"); - for (i = 0; i < zorro_num_autocon; i++) { - identify(i, tmp, 0); - printk(tmp); - } - if (!zorro_num_autocon) - printk("No AutoConfig expansion devices present.\n"); -} - - - /* - * Get the list of all AutoConfig Expansion Devices - */ - -int zorro_get_list(char *buffer) -{ - u_int i, len = 0, len2; - char tmp[256]; - - if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { - len = sprintf(buffer, "AutoConfig expansion devices:\n"); - for (i = 0; i < zorro_num_autocon; i++) { - len2 = identify(i, tmp, 1); - if (len+len2 >= 4075) { - len += sprintf(buffer+len, "4K limit reached!\n"); - break; - } - strcpy(buffer+len, tmp); - len += len2; - } - } - return(len); -} - -#endif /* CONFIG_ZORRO */ - - - /* - * Bitmask indicating portions of available Zorro II RAM that are unused - * by the system. Every bit represents a 64K chunk, for a maximum of 8MB - * (128 chunks, physical 0x00200000-0x009fffff). - * - * If you want to use (= allocate) portions of this RAM, you should clear - * the corresponding bits. - * - * Possible uses: - * - z2ram device - * - SCSI DMA bounce buffers - */ - -u32 zorro_unused_z2ram[4] = { 0, 0, 0, 0 }; - - -static void mark_region(u_long addr, u_long size, int flag) -{ - u_long start, end, chunk; - - if (flag) { - start = (addr+Z2RAM_CHUNKMASK) & ~Z2RAM_CHUNKMASK; - end = (addr+size) & ~Z2RAM_CHUNKMASK; - } else { - start = addr & ~Z2RAM_CHUNKMASK; - end = (addr+size+Z2RAM_CHUNKMASK) & ~Z2RAM_CHUNKMASK; - } - if (end <= Z2RAM_START || start >= Z2RAM_END) - return; - start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START; - end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START; - while (start < end) { - chunk = start>>Z2RAM_CHUNKSHIFT; - if (flag) - set_bit( chunk, zorro_unused_z2ram ); - else - clear_bit( chunk, zorro_unused_z2ram ); - start += Z2RAM_CHUNKSIZE; - } -} - - - /* - * Initialization - */ - -void zorro_init(void) -{ - u_int i; - const struct ConfigDev *cd; - - if (!AMIGAHW_PRESENT(ZORRO)) - return; - - /* Mark all available Zorro II memory */ - for (i = 0; i < zorro_num_autocon; i++) { - cd = &zorro_autocon[i]; - if (cd->cd_Rom.er_Type & ERTF_MEMLIST) - mark_region((u_long)cd->cd_BoardAddr, cd->cd_BoardSize, 1); - } - - /* Unmark all used Zorro II memory */ - for (i = 0; i < m68k_num_memory; i++) - mark_region(m68k_memory[i].addr, m68k_memory[i].size, 0); -} diff -u --recursive --new-file v2.1.105/linux/drivers/block/amiflop.c linux/drivers/block/amiflop.c --- v2.1.105/linux/drivers/block/amiflop.c Thu Mar 26 15:57:02 1998 +++ linux/drivers/block/amiflop.c Mon Jun 8 11:03:49 1998 @@ -68,11 +68,11 @@ #include #include #include +#include +#include #include #include -#include -#include #include #include #include diff -u --recursive --new-file v2.1.105/linux/drivers/block/floppy.c linux/drivers/block/floppy.c --- v2.1.105/linux/drivers/block/floppy.c Fri May 8 23:14:47 1998 +++ linux/drivers/block/floppy.c Tue Jun 9 01:21:49 1998 @@ -3,6 +3,7 @@ * * Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1993, 1994 Alain Knaff + * Copyright (C) 1998 Alan Cox */ /* * 02.12.91 - Changed to static variables to indicate need for reset @@ -95,7 +96,11 @@ * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent * features to asm/floppy.h. */ - + +/* + * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation + * failures. + */ #define FLOPPY_SANITY_CHECK #undef FLOPPY_SILENT_DCL_CLEAR @@ -114,9 +119,11 @@ * motor of these drives causes system hangs on some PCI computers. drive * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if * a drive is allowed. */ + static int FLOPPY_IRQ=6; static int FLOPPY_DMA=2; static int allowed_drive_mask = 0x33; +static int irqdma_allocated = 0; #include @@ -759,6 +766,11 @@ UDRS->select_date = jiffies; } } + /* + * We should propogate failures to grab the resources back + * nicely from here. Actually we ought to rewrite the fd + * driver some day too. + */ if (newdor & FLOPPY_MOTOR_MASK) floppy_grab_irq_and_dma(); if (olddor & FLOPPY_MOTOR_MASK) @@ -818,10 +830,11 @@ unsigned long flags; if (!usage_count){ - printk("trying to lock fdc while usage count=0\n"); + printk(KERN_ERR "Trying to lock fdc while usage count=0\n"); return -1; } - floppy_grab_irq_and_dma(); + if(floppy_grab_irq_and_dma()==-1) + return -EBUSY; INT_OFF; while (fdc_busy && NO_SIGNAL) interruptible_sleep_on(&fdc_wait); @@ -4208,7 +4221,12 @@ for (fdc = 0; fdc < N_FDC; fdc++) if (FDCS->address != -1) fd_outb(FDCS->dor, FD_DOR); + /* + * The driver will try and free resources and relies on us + * to know if they were allocated or not. + */ fdc = 0; + irqdma_allocated = 1; return 0; } @@ -4230,10 +4248,13 @@ return; } INT_ON; - fd_disable_dma(); - fd_free_dma(); - fd_free_irq(); - + if(irqdma_allocated) + { + fd_disable_dma(); + fd_free_dma(); + fd_free_irq(); + irqdma_allocated=0; + } set_dor(0, ~0, 8); #if N_FDC > 1 set_dor(1, ~8, 0); @@ -4384,10 +4405,12 @@ int dummy; if(have_no_fdc) return; - floppy_grab_irq_and_dma(); - lock_fdc(MAXTIMEOUT,0); - dummy=fd_eject(0); - process_fd_request(); - floppy_release_irq_and_dma(); + if(floppy_grab_irq_and_dma()==0) + { + lock_fdc(MAXTIMEOUT,0); + dummy=fd_eject(0); + process_fd_request(); + floppy_release_irq_and_dma(); + } } #endif diff -u --recursive --new-file v2.1.105/linux/drivers/cdrom/mcd.c linux/drivers/cdrom/mcd.c --- v2.1.105/linux/drivers/cdrom/mcd.c Thu Feb 12 20:56:05 1998 +++ linux/drivers/cdrom/mcd.c Tue Jun 9 01:21:49 1998 @@ -157,6 +157,7 @@ static short mcd_port = MCD_BASE_ADDR; /* used as "mcd" by "insmod" */ static int mcd_irq = MCD_INTR_NR; /* must directly follow mcd_port */ +MODULE_PARM(mcd, "1-2i"); static int McdTimeout, McdTries; static struct wait_queue *mcd_waitq = NULL; diff -u --recursive --new-file v2.1.105/linux/drivers/char/console.c linux/drivers/char/console.c --- v2.1.105/linux/drivers/char/console.c Wed May 20 19:10:38 1998 +++ linux/drivers/char/console.c Tue Jun 9 19:40:48 1998 @@ -1254,18 +1254,16 @@ } } -static void insert_char(int currcons) +static void insert_char(int currcons, unsigned int nr) { unsigned int i = x; - unsigned short tmp, old = video_erase_char; - unsigned short * p = (unsigned short *) pos; + unsigned short * p, * q = (unsigned short *) pos; - while (i++ < video_num_columns) { - tmp = scr_readw(p); - scr_writew(old, p); - old = tmp; + while (i++ <= video_num_columns - nr) { + scr_writew(scr_readw(p), p + nr); p++; } + memsetw(q, video_erase_char, nr*2); need_wrap = 0; } @@ -1275,16 +1273,16 @@ need_wrap = 0; } -static void delete_char(int currcons) +static void delete_char(int currcons, unsigned int nr) { unsigned int i = x; unsigned short * p = (unsigned short *) pos; - while (++i < video_num_columns) { - scr_writew(scr_readw(p+1), p); + while (++i <= video_num_columns - nr) { + scr_writew(scr_readw(p+nr), p); p++; } - scr_writew(video_erase_char, p); + memsetw(p, video_erase_char, nr*2); need_wrap = 0; } @@ -1300,8 +1298,7 @@ nr = video_num_columns; else if (!nr) nr = 1; - while (nr--) - insert_char(currcons); + insert_char(currcons, nr); } static void csi_L(int currcons, unsigned int nr) @@ -1319,8 +1316,7 @@ nr = video_num_columns; else if (!nr) nr = 1; - while (nr--) - delete_char(currcons); + delete_char(currcons, nr); } static void csi_M(int currcons, unsigned int nr) @@ -1583,7 +1579,7 @@ lf(currcons); } if (decim) - insert_char(currcons); + insert_char(currcons, 1); scr_writew( video_mode_512ch ? ((attr & 0xf7) << 8) + ((tc & 0x100) << 3) + (tc & 0x0ff) : (attr << 8) + tc, diff -u --recursive --new-file v2.1.105/linux/drivers/char/msp3400.c linux/drivers/char/msp3400.c --- v2.1.105/linux/drivers/char/msp3400.c Tue Jun 9 11:57:29 1998 +++ linux/drivers/char/msp3400.c Tue Jun 9 01:21:49 1998 @@ -916,7 +916,7 @@ if (-1 == msp3400c_reset(msp->bus)) { UNLOCK_I2C_BUS(msp->bus); kfree(msp); - return -1; + return -EIO; } msp3400c_setmode(msp, MSP_MODE_FM_TERRA); @@ -1088,6 +1088,8 @@ msp3400c_detach, msp3400c_command }; + +EXPORT_NO_SYMBOLS; #ifdef MODULE int init_module(void) diff -u --recursive --new-file v2.1.105/linux/drivers/char/tuner.c linux/drivers/char/tuner.c --- v2.1.105/linux/drivers/char/tuner.c Wed Apr 8 19:36:26 1998 +++ linux/drivers/char/tuner.c Tue Jun 9 01:21:49 1998 @@ -243,6 +243,8 @@ tuner_command }; +EXPORT_NO_SYMBOLS; + #ifdef MODULE int init_module(void) #else diff -u --recursive --new-file v2.1.105/linux/drivers/net/8390.c linux/drivers/net/8390.c --- v2.1.105/linux/drivers/net/8390.c Tue Jun 9 11:57:29 1998 +++ linux/drivers/net/8390.c Tue Jun 9 01:27:12 1998 @@ -850,8 +850,11 @@ outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR); } -/* Initialize the rest of the 8390 device structure. */ -__initfunc(int ethdev_init(struct device *dev)) +/* + * Initialize the rest of the 8390 device structure. Do NOT __initfunc + * this, as it is used by 8390 based modular drivers too. + */ +int ethdev_init(struct device *dev) { if (ei_debug > 1) printk(version); diff -u --recursive --new-file v2.1.105/linux/drivers/net/cops.c linux/drivers/net/cops.c --- v2.1.105/linux/drivers/net/cops.c Tue Jun 9 11:57:29 1998 +++ linux/drivers/net/cops.c Tue Jun 9 01:28:32 1998 @@ -24,13 +24,16 @@ * Hooks for cops_setup routine * (not yet implemented). * 19971101 Jay Schulist Fixes for multiple lt* devices. - * 19980507 Steven Hirsch Fixed the badly broken support - * for Tangent type cards. (COPS - * LT-1 and the like) + * 19980607 Steven Hirsch Fixed the badly broken support + * for Tangent type cards. Only + * tested on Daystar LT200. Some + * cleanup of formatting and program + * logic. Added emacs 'local-vars' + * setup for Jay's brace style. */ static const char *version = - "cops.c:v0.03 3/17/97 Jay Schulist \n"; +"cops.c:v0.04 6/7/98 Jay Schulist \n"; /* * Sources: * COPS Localtalk SDK. This provides almost all of the information @@ -133,6 +136,15 @@ * driver written by Bradford W. Johnson * Farallon PhoneNET PC * Original Apple LocalTalk PC card + * + * N.B. + * + * The Daystar Digital LT200 boards do not support interrupt-driven + * IO. You must specify 'io=0xff' as a module parameter to invoke + * polled mode. I also believe that the port probing logic is quite + * dangerous at best and certainly hopeless for a polled card. Best to + * specify both. - Steve H. + * */ /* @@ -155,7 +167,7 @@ static struct timer_list cops_timer; -/* use 0 for production, 1 for verification, 2 for debug, 3 for very verbose debug */ +/* use 0 for production, 1 for verification, 2 for debug, 3 for verbose debug */ #ifndef COPS_DEBUG #define COPS_DEBUG 1 #endif @@ -192,7 +204,8 @@ static int cops_send_packet (struct sk_buff *skb, struct device *dev); static void set_multicast_list (struct device *dev); static int cops_hard_header (struct sk_buff *skb, struct device *dev, - unsigned short type, void *daddr, void *saddr, unsigned len); + unsigned short type, void *daddr, void *saddr, + unsigned len); static int cops_ioctl (struct device *dev, struct ifreq *rq, int cmd); static int cops_close (struct device *dev); @@ -202,9 +215,8 @@ /* * Check for a network adaptor of this type, and return '0' iff one exists. * If dev->base_addr == 0, probe all likely locations. - * If dev->base_addr == 1, always return failure. - * If dev->base_addr == 2, allocate space for the device and return success - * (detachable devices only). + * If dev->base_addr in [1..0x1ff], always return failure. + * otherwise go with what we pass in. */ __initfunc(int cops_probe(struct device *dev)) { @@ -219,6 +231,11 @@ else if(base_addr != 0) /* Don't probe at all. */ return -ENXIO; + /* FIXME Does this really work for cards which generate irq? + * It's definitely N.G. for polled Tangent. sh + * Dayna cards don't autoprobe well at all, but if your card is + * at IRQ 5 & IO 0x240 we find it every time. ;) JS + */ for(i=0; cops_portlist[i]; i++) { int ioaddr = cops_portlist[i]; if(check_region(ioaddr, COPS_IO_EXTENT)) @@ -239,17 +256,12 @@ { struct cops_local *lp; static unsigned version_printed = 0; - int irqaddr = 0; - int irqval; int board = board_type; if(cops_debug && version_printed++ == 0) printk("%s", version); - /* Fill in the 'dev' fields. */ - dev->base_addr = ioaddr; - /* * Since this board has jumpered interrupts, allocate the interrupt * vector now. There is no point in waiting since no other device @@ -257,37 +269,47 @@ * interrupts are typically not reported by the boards, and we must * used AutoIRQ to find them. */ - - if(dev->irq < 2 && irq) - dev->irq = irq; - - if(dev->irq < 2) + switch (dev->irq) { - irqaddr = cops_irq(ioaddr, board); /* COPS AutoIRQ routine */ - if(irqaddr == 0) - return -EAGAIN; /* No IRQ found on this port */ - else - dev->irq = irqaddr; - } - else if(dev->irq == 2) - /* - * Fixup for users that don't know that IRQ 2 is really + case 0: + /* COPS AutoIRQ routine */ + dev->irq = cops_irq(ioaddr, board); + if(!dev->irq) + return -EINVAL; /* No IRQ found on this port */ + break; + + case 1: + return -EINVAL; + break; + + /* Fixup for users that don't know that IRQ 2 is really * IRQ 9, or don't know which one to set. */ - dev->irq = 9; + case 2: + dev->irq = 9; + break; - /* Snarf the interrupt now. */ - irqval = request_irq(dev->irq, &cops_interrupt, 0, cardname, dev); + /* Polled operation requested. Although irq of zero passed as + * a parameter tells the init routines to probe, we'll + * overload it to denote polled operation at runtime. + */ + case 0xff: + dev->irq = 0; + break; - /* If its in use set it to 0 and disallow open() calls.. users can still - ifconfig the irq one day */ + default: + break; + } - if(irqval) - dev->irq = 0; + /* Reserve any actual interrupt. */ + if(dev->irq && request_irq(dev->irq, &cops_interrupt, 0, cardname, dev)) + return -EINVAL; - dev->hard_start_xmit = &cops_send_packet; + /* Grab the region so no one else tries to probe our ioports. */ + request_region(ioaddr, COPS_IO_EXTENT, cardname); + dev->base_addr = ioaddr; - /* Initialize the device structure. */ + /* Initialize the private device structure. */ dev->priv = kmalloc(sizeof(struct cops_local), GFP_KERNEL); if(dev->priv == NULL) return -ENOMEM; @@ -298,20 +320,10 @@ /* Copy local board variable to lp struct. */ lp->board = board; - /* Tell the user where the card is and what mode were in. */ - if(board==DAYNA) - printk("%s: %s found at %#3x, using IRQ %d, in Dayna mode.\n", - dev->name, cardname, ioaddr, dev->irq); - if(board==TANGENT) - printk("%s: %s found at %#3x, using IRQ %d, in Tangent mode.\n", - dev->name, cardname, ioaddr, dev->irq); - - /* Grab the region so no one else tries to probe our ioports. */ - request_region(ioaddr, COPS_IO_EXTENT, cardname); - /* Fill in the fields of the device structure with LocalTalk values. */ ltalk_setup(dev); + dev->hard_start_xmit = &cops_send_packet; dev->hard_header = cops_hard_header; dev->get_stats = cops_get_stats; dev->open = cops_open; @@ -320,14 +332,17 @@ dev->set_multicast_list = &set_multicast_list; dev->mc_list = NULL; - if(board==TANGENT) /* Poll 20 times per second */ - { - init_timer(&cops_timer); - cops_timer.function = cops_poll; - cops_timer.data = (unsigned long)dev; - cops_timer.expires = jiffies + 5; - add_timer(&cops_timer); - } + /* Tell the user where the card is and what mode we're in. */ + if(board==DAYNA) + printk("%s: %s at %#3x, using IRQ %d, in Dayna mode.\n", + dev->name, cardname, ioaddr, dev->irq); + if(board==TANGENT) + if(dev->irq) + printk("%s: %s at %#3x, IRQ %d, in Tangent mode\n", + dev->name, cardname, ioaddr, dev->irq); + else + printk("%s: %s at %#3x, using polled IO, in Tangent mode.\n", + dev->name, cardname, ioaddr); return 0; } @@ -335,7 +350,7 @@ __initfunc(static int cops_irq (int ioaddr, int board)) { /* * This does not use the IRQ to determine where the IRQ is. We just - * assume that when we get a correct status response that its the IRQ. + * assume that when we get a correct status response that it's the IRQ. * This really just verifies the IO port but since we only have access * to such a small number of IRQs (5, 4, 3) this is not bad. * This will probably not work for more than one card. @@ -383,10 +398,27 @@ */ static int cops_open(struct device *dev) { + struct cops_local *lp = (struct cops_local *)dev->priv; + if(dev->irq==0) { - printk(KERN_WARNING "%s: No irq line set.\n", dev->name); - return -EAGAIN; + /* + * I don't know if the Dayna-style boards support polled + * operation. For now, only allow it for Tangent. + */ + if(lp->board==TANGENT) /* Poll 20 times per second */ + { + init_timer(&cops_timer); + cops_timer.function = cops_poll; + cops_timer.data = (unsigned long)dev; + cops_timer.expires = jiffies + 5; + add_timer(&cops_timer); + } + else + { + printk(KERN_WARNING "%s: No irq line set\n", dev->name); + return -EAGAIN; + } } cops_jumpstart(dev); /* Start the card up. */ @@ -428,18 +460,12 @@ return 0; } -static int tangent_wait_reset(int ioaddr) +static void tangent_wait_reset(int ioaddr) { - long snapt=jiffies; - - while(jiffies-snapt<5*HZ) - { - if((inb(ioaddr+TANG_CARD_STATUS)&TANG_RX_READY)==0) - break; - schedule(); - } + int timeout=0; - return 0; + while(timeout++ < 5 && (inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0) + mdelay(1); /* Wait 1 second */ } /* @@ -452,23 +478,11 @@ if(lp->board==TANGENT) { - inb(ioaddr); /* Clear request latch. */ - outb(0,ioaddr); /* Clear the TANG_TX_READY flop. */ + inb(ioaddr); /* Clear request latch. */ + outb(0,ioaddr); /* Clear the TANG_TX_READY flop. */ outb(0, ioaddr+TANG_RESET); /* Reset the adapter. */ - /* Can take 5 seconds max - youch! */ - if(sleep) - { - long snapt=jiffies; - while(jiffies-snapt<5*HZ) - { - if(inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY) - break; - schedule(); - } - } - else - tangent_wait_reset(ioaddr); + tangent_wait_reset(ioaddr); outb(0, ioaddr+TANG_CLEAR_INT); } if(lp->board==DAYNA) @@ -563,12 +577,13 @@ } if(cops_debug > 1) - printk(KERN_DEBUG "%s: Uploaded firmware - %d bytes of %d bytes.\n", dev->name, i, ltf->length); + printk("%s: Uploaded firmware - %d bytes of %d bytes.\n", + dev->name, i, ltf->length); - if(lp->board==DAYNA) - outb(1, ioaddr+DAYNA_INT_CARD); /* Tell Dayna to run the firmware code. */ - else - inb(ioaddr); /* Tell Tang to run the firmware code. */ + if(lp->board==DAYNA) /* Tell Dayna to run the firmware code. */ + outb(1, ioaddr+DAYNA_INT_CARD); + else /* Tell Tang to run the firmware code. */ + inb(ioaddr); if(lp->board==TANGENT) { @@ -601,10 +616,10 @@ schedule(); } - outb(2, ioaddr); /* Output command packet length as 2. */ + outb(2, ioaddr); /* Output command packet length as 2. */ outb(0, ioaddr); - outb(LAP_INIT, ioaddr); /* Send LAP_INIT command byte. */ - outb(nodeid, ioaddr); /* Suggest node address. */ + outb(LAP_INIT, ioaddr); /* Send LAP_INIT command byte. */ + outb(nodeid, ioaddr); /* Suggest node address. */ } if(lp->board == TANGENT) @@ -612,19 +627,19 @@ /* Empty any pending adapter responses. */ while(inb(ioaddr+TANG_CARD_STATUS)&TANG_RX_READY) { - outb(0, ioaddr+COPS_CLEAR_INT); /* Clear any interrupt. */ - cops_rx(dev); /* Kick out any packet waiting. */ + outb(0, ioaddr+COPS_CLEAR_INT); /* Clear interrupt. */ + cops_rx(dev); /* Kick out packets waiting. */ schedule(); } - /* Not sure what Tangent does if random nodeid we picked is already used. */ + /* Not sure what Tangent does if nodeid picked is used. */ if(nodeid == 0) /* Seed. */ - nodeid = jiffies&0xFF; /* Get a random try .*/ - outb(2, ioaddr); /* Command length LSB. */ - outb(0, ioaddr); /* Command length MSB. */ - outb(LAP_INIT, ioaddr); /* Send LAP_INIT command byte. */ + nodeid = jiffies&0xFF; /* Get a random try */ + outb(2, ioaddr); /* Command length LSB */ + outb(0, ioaddr); /* Command length MSB */ + outb(LAP_INIT, ioaddr); /* Send LAP_INIT byte */ outb(nodeid, ioaddr); /* LAP address hint. */ - outb(0xFF, ioaddr); /* Interrupt level to use (NONE). */ + outb(0xFF, ioaddr); /* Int. level to use */ } lp->node_acquire=0; /* Set nodeid holder to 0. */ @@ -646,7 +661,8 @@ } if(cops_debug > 1) - printk(KERN_DEBUG "%s: Node ID %d has been acquired.\n", dev->name, lp->node_acquire); + printk(KERN_DEBUG "%s: Node ID %d has been acquired.\n", + dev->name, lp->node_acquire); lp->nodeid=1; /* Set got nodeid to 1. */ @@ -658,7 +674,6 @@ */ static void cops_poll(unsigned long ltdev) { - struct cops_local *lp; int ioaddr, status; int boguscount = 0; @@ -670,12 +685,6 @@ return; /* We've been downed */ ioaddr = dev->base_addr; - - /* Clear any interrupt. */ - outb(0, ioaddr + COPS_CLEAR_INT); - dev->interrupt = 0; - - lp = (struct cops_local *)dev->priv; do { status=inb(ioaddr+TANG_CARD_STATUS); if(status & TANG_RX_READY) @@ -704,7 +713,8 @@ if(dev == NULL) { - printk(KERN_WARNING "%s: irq %d for unknown device.\n", cardname, irq); + printk(KERN_WARNING "%s: irq %d for unknown device.\n", + cardname, irq); return; } dev->interrupt = 1; @@ -787,7 +797,8 @@ skb = dev_alloc_skb(pkt_len); if(skb == NULL) { - printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name); + printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", + dev->name); lp->stats.rx_dropped++; while(pkt_len--) /* Discard packet */ inb(ioaddr); @@ -800,14 +811,15 @@ insb(ioaddr, skb->data, pkt_len); /* Eat the Data */ if(lp->board==DAYNA) - outb(1, ioaddr+DAYNA_INT_CARD); /* Interrupt the card. */ + outb(1, ioaddr+DAYNA_INT_CARD); /* Interrupt the card */ sti(); /* Restore interrupts. */ /* Check for bad response length */ if(pkt_len < 0 || pkt_len > MAX_LLAP_SIZE) { - printk(KERN_NOTICE "%s: Bad packet length of %d bytes.\n", dev->name, pkt_len); + printk(KERN_NOTICE "%s: Bad packet length of %d bytes.\n", + dev->name, pkt_len); lp->stats.tx_errors++; kfree_skb(skb); return; @@ -815,8 +827,8 @@ /* Set nodeid and then get out. */ if(rsp_type == LAP_INIT_RSP) - { - lp->node_acquire = skb->data[0]; /* Nodeid taken from received packet. */ + { /* Nodeid taken from received packet. */ + lp->node_acquire = skb->data[0]; kfree_skb(skb); return; } @@ -878,7 +890,8 @@ * done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */ if(test_and_set_bit(0, (void*) &dev->tbusy) != 0) - printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name); + printk(KERN_WARNING "%s: Transmitter access conflict.\n", + dev->name); else { cli(); /* Disable interrupts. */ @@ -902,7 +915,7 @@ outsb(ioaddr, skb->data, skb->len); /* Send out the data. */ - if(lp->board==DAYNA) /* The Dayna requires you kick the card. */ + if(lp->board==DAYNA) /* Dayna requires you kick the card */ outb(1, ioaddr+DAYNA_INT_CARD); sti(); /* Restore interrupts. */ @@ -926,7 +939,7 @@ static void set_multicast_list(struct device *dev) { if(cops_debug >= 3) - printk("%s: set_mulicast_list executed. NeatO.\n", dev->name); + printk("%s: set_multicast_list executed\n", dev->name); } /* @@ -934,7 +947,8 @@ */ static int cops_hard_header(struct sk_buff *skb, struct device *dev, - unsigned short type, void *daddr, void *saddr, unsigned len) + unsigned short type, void *daddr, void *saddr, + unsigned len) { if(cops_debug >= 3) printk("%s: cops_hard_header executed. Wow!\n", dev->name); @@ -983,6 +997,13 @@ static int cops_close(struct device *dev) { + struct cops_local *lp = (struct cops_local *)dev->priv; + + /* If we were running polled, yank the timer. + */ + if(lp->board==TANGENT && dev->irq==0) + del_timer(&cops_timer); + dev->tbusy = 1; dev->start = 0; @@ -1024,7 +1045,8 @@ int result, err; if(io == 0) - printk(KERN_WARNING "%s: You shouldn't use auto-probing with insmod!\n", cardname); + printk(KERN_WARNING "%s: You shouldn't autoprobe with insmod\n", + cardname); /* Copy the parameters from insmod into the device structure. */ cops0_dev.base_addr = io; @@ -1046,7 +1068,16 @@ unregister_netdev(&cops0_dev); if(cops0_dev.priv) kfree_s(cops0_dev.priv, sizeof(struct cops_local)); - free_irq(cops0_dev.irq, &cops0_dev); + if(cops0_dev.irq) + free_irq(cops0_dev.irq, &cops0_dev); release_region(cops0_dev.base_addr, COPS_IO_EXTENT); } #endif /* MODULE */ + +/* + * Local variables: + * compile-command: "gcc -DMODVERSIONS -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -c cops.c" + * c-basic-offset: 4 + * c-file-offsets: ((substatement-open . 0)) + * End: + */ diff -u --recursive --new-file v2.1.105/linux/drivers/net/net_init.c linux/drivers/net/net_init.c --- v2.1.105/linux/drivers/net/net_init.c Fri May 8 23:14:48 1998 +++ linux/drivers/net/net_init.c Tue Jun 9 01:21:49 1998 @@ -390,7 +390,7 @@ for (i = 0; i < MAX_ETH_CARDS; ++i) { if (ethdev_index[i] == NULL) { sprintf(dev->name, "eth%d", i); - printk("loading device '%s'...\n", dev->name); +/* printk("loading device '%s'...\n", dev->name);*/ ethdev_index[i] = dev; return i; } diff -u --recursive --new-file v2.1.105/linux/drivers/net/ppp.c linux/drivers/net/ppp.c --- v2.1.105/linux/drivers/net/ppp.c Thu May 7 22:51:50 1998 +++ linux/drivers/net/ppp.c Tue Jun 9 01:21:49 1998 @@ -8,7 +8,9 @@ * Dynamic PPP devices by Jim Freeman . * ppp_tty_receive ``noisy-raise-bug'' fixed by Ove Ewerlid * - * ==FILEVERSION 980501== + * Machine hang caused by NULLing a live wait queue fix. + * + * ==FILEVERSION 980607== * * NOTE TO MAINTAINERS: * If you modify this file at all, please set the number above to the @@ -415,8 +417,6 @@ ppp->ubuf = NULL; ppp->cbuf = NULL; ppp->slcomp = NULL; - ppp->read_wait = NULL; - ppp->write_wait = NULL; ppp->last_xmit = jiffies - flag_time; ppp->last_recv = jiffies; diff -u --recursive --new-file v2.1.105/linux/drivers/scsi/aha1542.c linux/drivers/scsi/aha1542.c --- v2.1.105/linux/drivers/scsi/aha1542.c Tue Jun 9 11:57:30 1998 +++ linux/drivers/scsi/aha1542.c Tue Jun 9 01:21:50 1998 @@ -223,7 +223,7 @@ /* Similar to aha1542_in, except that we wait a very short period of time. We use this if we know the board is alive and awake, but we are not sure - if the board will respond the command we are about to send or not */ + if the board will respond to the command we are about to send or not */ static int aha1542_in1(unsigned int base, unchar *cmdp, int len) { unsigned long flags; diff -u --recursive --new-file v2.1.105/linux/drivers/scsi/ncr53c8xx.c linux/drivers/scsi/ncr53c8xx.c --- v2.1.105/linux/drivers/scsi/ncr53c8xx.c Sun Jun 7 11:16:34 1998 +++ linux/drivers/scsi/ncr53c8xx.c Tue Jun 9 01:21:50 1998 @@ -369,8 +369,8 @@ static void DELAY(long us) { - if (us/1000) mdelay(us/1000); - if (us%1000) udelay(us%1000); + for (;us>1000;us-=1000) udelay(1000); + if (us) udelay(us); } /* diff -u --recursive --new-file v2.1.105/linux/drivers/zorro/Makefile linux/drivers/zorro/Makefile --- v2.1.105/linux/drivers/zorro/Makefile Wed Dec 31 16:00:00 1969 +++ linux/drivers/zorro/Makefile Mon Jun 8 11:03:49 1998 @@ -0,0 +1,12 @@ +# +# Makefile for the linux/drivers/zorro/ directory. +# + +SUB_DIRS := +MOD_SUB_DIRS := $(SUB_DIRS) +ALL_SUB_DIRS := $(SUB_DIRS) + +L_OBJS := zorro.o +L_TARGET := zorro.a + +include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.1.105/linux/drivers/zorro/zorro.c linux/drivers/zorro/zorro.c --- v2.1.105/linux/drivers/zorro/zorro.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/zorro/zorro.c Mon Jun 8 11:03:50 1998 @@ -0,0 +1,1245 @@ +/* + * linux/arch/m68k/amiga/zorro.c + * + * Copyright (C) 1995 Geert Uytterhoeven + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef CONFIG_ZORRO + + /* + * Zorro Expansion Device Manufacturers and Products + */ + +struct Manufacturer { + const char *Name; + u_short Manuf; + u_short NumProd; + const struct Product *Products; +}; + +struct Product { + const char *Name; + u_char Class; + u_char Prod; +}; + +struct GVP_Product { + const char *Name; + u_char Class; + u_char EPC; +}; + + + /* + * Macro's to make life easier + */ + +#define ARRAYSIZE(x) (sizeof(x)/sizeof(*(x))) + +#define BEGIN_PROD(id) \ + static struct Product Prod_##id[] = { +#define PROD(name, class, id) \ + { name, ZORRO_CLASS_##class, ZORRO_PROD(ZORRO_PROD_##id) }, + +#define BEGIN_GVP_PROD \ + static struct GVP_Product Ext_Prod_GVP[] = { +#define GVP_PROD(name, class, id) \ + { name, ZORRO_CLASS_##class, ZORRO_EPC(ZORRO_PROD_##id) }, + +#define BEGIN_MANUF \ + static struct Manufacturer Manufacturers[] = { +#define MANUF(name, id) \ + { name, ZORRO_MANUF_##id, ARRAYSIZE(Prod_##id), Prod_##id }, + +#define END \ + }; + + + /* + * Recognized Zorro Expansion Devices + */ + +BEGIN_PROD(PACIFIC_PERIPHERALS) + PROD("SE 2000 A500", HD, PACIFIC_PERIPHERALS_SE_2000_A500) + PROD(NULL, SCSI, PACIFIC_PERIPHERALS_SCSI) +END + +BEGIN_PROD(MACROSYSTEMS_USA_2) + PROD("Warp Engine", TURBO_SCSI_RAM, MACROSYSTEMS_WARP_ENGINE) +END + +BEGIN_PROD(KUPKE_1) + PROD("Golem RAM Box 2MB", RAM, KUPKE_GOLEM_RAM_BOX_2MB) +END + +BEGIN_PROD(MEMPHIS) + PROD("Stormbringer", TURBO, MEMPHIS_STORMBRINGER) +END + +BEGIN_PROD(3_STATE) + PROD("Megamix 2000", RAM, 3_STATE_MEGAMIX_2000) +END + +BEGIN_PROD(COMMODORE_BRAUNSCHWEIG) + PROD("A2088 XT/A2286 AT", BRIDGE, CBM_A2088_A2286) + PROD("A2286 AT", BRIDGE, CBM_A2286) + PROD("A4091", SCSI, CBM_A4091_1) + PROD("A2386-SX", BRIDGE, CBM_A2386SX_1) +END + +BEGIN_PROD(COMMODORE_WEST_CHESTER_1) + PROD("A2090/A2090A", SCSI, CBM_A2090A) + PROD("A590/A2091", SCSI, CBM_A590_A2091_1) + PROD("A590/A2091", SCSI, CBM_A590_A2091_2) + PROD("A2090B 2090 Autoboot", SCSI, CBM_A2090B) + PROD("A2060", ARCNET, CBM_A2060) + PROD("A590/A2052/A2058/A2091", RAM, CBM_A590_A2052_A2058_A2091) + PROD("A560", RAM, CBM_A560_RAM) + PROD("A2232 Prototype", MULTIIO, CBM_A2232_PROTOTYPE) + PROD("A2232", MULTIIO, CBM_A2232) + PROD("A2620 68020/RAM", TURBO_RAM, CBM_A2620) + PROD("A2630 68030/RAM", TURBO_RAM, CBM_A2630) + PROD("A4091", SCSI, CBM_A4091_2) + PROD("A2065", ETHERNET, CBM_A2065_1) + PROD("Romulator Card", UNKNOWN, CBM_ROMULATOR) + PROD("A3000 Test Fixture", MISC, CBM_A3000_TEST_FIXTURE) + PROD("A2386-SX", BRIDGE, CBM_A2386SX_2) + PROD("A2065", ETHERNET, CBM_A2065_2) +END + +BEGIN_PROD(COMMODORE_WEST_CHESTER_2) + PROD("A2090/A2090A Combitec/MacroSystem", SCSI, CBM_A2090A_CM) +END + +BEGIN_PROD(PROGRESSIVE_PERIPHERALS_AND_SYSTEMS_2) + PROD("EXP8000", RAM, PPS_EXP8000) +END + +BEGIN_PROD(KOLFF_COMPUTER_SUPPLIES) + PROD("KCS Power PC Board", BRIDGE, KCS_POWER_PC_BOARD) +END + +BEGIN_PROD(CARDCO_1) + PROD("Kronos 2000", SCSI, CARDCO_KRONOS_2000_1) + PROD("A1000", SCSI, CARDCO_A1000_1) + PROD("Escort", SCSI, CARDCO_ESCORT) + PROD("A2410 HiRes", GFX, CARDCO_A2410) +END + +BEGIN_PROD(A_SQUARED) + PROD("Live! 2000", VIDEO, A_SQUARED_LIVE_2000) +END + +BEGIN_PROD(COMSPEC_COMMUNICATIONS) + PROD("AX2000", RAM, COMSPEC_COMMUNICATIONS_AX2000) +END + +BEGIN_PROD(ANAKIN_RESEARCH) + PROD("Easyl", TABLET, ANAKIN_RESEARCH_EASYL) +END + +BEGIN_PROD(MICROBOTICS) + PROD("StarBoard II", RAM, MICROBOTICS_STARBOARD_II) + PROD("StarDrive", SCSI, MICROBOTICS_STARDRIVE) + PROD("8-Up (Rev A)", RAM, MICROBOTICS_8_UP_A) + PROD("8-Up (Rev Z)", RAM, MICROBOTICS_8_UP_Z) + PROD("Delta", RAM, MICROBOTICS_DELTA_RAM) + PROD("8-Star", RAM, MICROBOTICS_8_STAR_RAM) + PROD("8-Star", MISC, MICROBOTICS_8_STAR) + PROD("VXL RAM*32", RAM, MICROBOTICS_VXL_RAM_32) + PROD("VXL-30", TURBO, MICROBOTICS_VXL_68030) + PROD("Delta", MISC, MICROBOTICS_DELTA) + PROD("MBX 1200/1200z", RAM, MICROBOTICS_MBX_1200_1200Z_RAM) + PROD("Hardframe 2000", SCSI, MICROBOTICS_HARDFRAME_2000_1) + PROD("Hardframe 2000", SCSI, MICROBOTICS_HARDFRAME_2000_2) + PROD("MBX 1200/1200z", MISC, MICROBOTICS_MBX_1200_1200Z) +END + +BEGIN_PROD(ACCESS_ASSOCIATES_ALEGRA) +END + +BEGIN_PROD(EXPANSION_TECHNOLOGIES) +END + +BEGIN_PROD(ASDG) + PROD(NULL, RAM, ASDG_MEMORY_1) + PROD(NULL, RAM, ASDG_MEMORY_2) + PROD("EB-920 Lan Rover", ETHERNET, ASDG_EB920_LAN_ROVER) + PROD("GPIB/Dual IEEE-488/Twin-X", MULTIIO, ASDG_GPIB_DUALIEEE488_TWIN_X) +END + +BEGIN_PROD(IMTRONICS_1) + PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_1) + PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_2) +END + +BEGIN_PROD(CBM_UNIVERSITY_OF_LOWELL) + PROD("A2410 HiRes", GFX, CBM_A2410) +END + +BEGIN_PROD(AMERISTAR) + PROD("A2065", ETHERNET, AMERISTAR_A2065) + PROD("A560", ARCNET, AMERISTAR_A560) + PROD("A4066", ETHERNET, AMERISTAR_A4066) +END + +BEGIN_PROD(SUPRA) + PROD("SupraDrive 4x4", SCSI, SUPRA_SUPRADRIVE_4x4) + PROD("1000", RAM, SUPRA_1000_RAM) + PROD("2000 DMA", SCSI, SUPRA_2000_DMA) + PROD("500", SCSI_RAM, SUPRA_500) + PROD("500", SCSI, SUPRA_500_SCSI) + PROD("500XP/2000", RAM, SUPRA_500XP_2000_RAM) + PROD("500RX/2000", RAM, SUPRA_500RX_2000_RAM) + PROD("2400zi", MODEM, SUPRA_2400ZI) + PROD("500XP/SupraDrive WordSync", SCSI, SUPRA_500XP_SUPRADRIVE_WORDSYNC) + PROD("SupraDrive WordSync II", SCSI, SUPRA_SUPRADRIVE_WORDSYNC_II) + PROD("2400zi+", MODEM, SUPRA_2400ZIPLUS) +END + +BEGIN_PROD(COMPUTER_SYSTEMS_ASSOCIATES) + PROD("Magnum 40", TURBO_SCSI, CSA_MAGNUM) + PROD("12 Gauge", SCSI, CSA_12_GAUGE) +END + +BEGIN_PROD(MARC_MICHAEL_GROTH) +END + +BEGIN_PROD(M_TECH) + PROD("AT500", RAM, MTEC_AT500_1) +END + +BEGIN_PROD(GREAT_VALLEY_PRODUCTS_1) + PROD("Impact Series I", SCSI_RAM, GVP_IMPACT_SERIES_I) +END + +BEGIN_PROD(BYTEBOX) + PROD("A500", UNKNOWN, BYTEBOX_A500) +END + +BEGIN_PROD(DKB_POWER_COMPUTING) + PROD("SecureKey", UNKNOWN, DKB_POWER_COMPUTING_SECUREKEY) + PROD("DKM 3128", RAM, DKB_POWER_COMPUTING_DKM_3128) + PROD("Rapid Fire", SCSI, DKB_POWER_COMPUTING_RAPID_FIRE) + PROD("DKM 1202", FPU_RAM, DKB_POWER_COMPUTING_DKM_1202) + PROD("Cobra/Viper II 68EC030", TURBO, DKB_POWER_COMPUTING_COBRA_VIPER_II_68EC030) + PROD("WildFire 060", TURBO, DKB_POWER_COMPUTING_WILDFIRE_060_1) + PROD("WildFire 060", TURBO, DKB_POWER_COMPUTING_WILDFIRE_060_2) +END + +BEGIN_PROD(GREAT_VALLEY_PRODUCTS_2) + PROD("Impact Series I (4K)", SCSI, GVP_IMPACT_SERIES_I_4K) + PROD("Impact Series I (16K/2)", SCSI, GVP_IMPACT_SERIES_I_16K_2) + PROD("Impact Series I (16K/2)", SCSI, GVP_IMPACT_SERIES_I_16K_3) + PROD("Impact 3001", IDE, GVP_IMPACT_3001_IDE_1) + PROD("Impact 3001", RAM, GVP_IMPACT_3001_RAM) + PROD("Impact Series II", RAM, GVP_IMPACT_SERIES_II_RAM_1) +/* PROD(NULL, UNKNOWN, GVP_EPC_BASE) */ + PROD("Impact 3001", IDE, GVP_IMPACT_3001_IDE_2) +/* PROD("A2000 030", TURBO, GVP_A2000_030) */ +/* PROD("GForce 040", TURBO_SCSI, GFORCE_040_SCSI_2) */ + PROD("GForce 040/060", TURBO_SCSI, GVP_GFORCE_040_060) + PROD("Impact Vision 24", GFX, GVP_IMPACT_VISION_24) + PROD("GForce 040", TURBO, GVP_GFORCE_040_2) +END + +BEGIN_GVP_PROD /* ZORRO_PROD_GVP_EPC_BASE */ + GVP_PROD("GForce 040", TURBO, GVP_GFORCE_040_1) + GVP_PROD("GForce 040", TURBO_SCSI, GVP_GFORCE_040_SCSI_1) + GVP_PROD("A1291", SCSI, GVP_A1291) + GVP_PROD("Combo 030 R4", TURBO, GVP_COMBO_030_R4) + GVP_PROD("Combo 030 R4", TURBO_SCSI, GVP_COMBO_030_R4_SCSI) + GVP_PROD("Phone Pak", UNKNOWN, GVP_PHONEPAK) + GVP_PROD("IO-Extender", MULTIIO, GVP_IO_EXTENDER) + GVP_PROD("GForce 030", TURBO, GVP_GFORCE_030) + GVP_PROD("GForce 030", TURBO_SCSI, GVP_GFORCE_030_SCSI) + GVP_PROD("A530", TURBO, GVP_A530) + GVP_PROD("A530", TURBO_SCSI, GVP_A530_SCSI) + GVP_PROD("Combo 030 R3", TURBO, GVP_COMBO_030_R3) + GVP_PROD("Combo 030 R3", TURBO_SCSI, GVP_COMBO_030_R3_SCSI) + GVP_PROD("Series-II", SCSI, GVP_SERIES_II) +END + +BEGIN_PROD(CALIFORNIA_ACCESS_SYNERGY) + PROD("Malibu", SCSI, CALIFORNIA_ACCESS_SYNERGY_MALIBU) +END + +BEGIN_PROD(XETEC) + PROD("FastCard", SCSI, XETEC_FASTCARD) + PROD("FastCard", RAM, XETEC_FASTCARD_RAM) + PROD("FastCard Plus", SCSI, XETEC_FASTCARD_PLUS) +END + +BEGIN_PROD(PROGRESSIVE_PERIPHERALS_AND_SYSTEMS) + PROD("Mercury", TURBO, PPS_MERCURY) + PROD("A3000 68040", TURBO, PPS_A3000_68040) + PROD("A2000 68040", TURBO, PPS_A2000_68040) + PROD("Zeus", TURBO_SCSI_RAM, PPS_ZEUS) + PROD("A500 68040", TURBO, PPS_A500_68040) +END + +BEGIN_PROD(XEBEC) +END + +BEGIN_PROD(SPIRIT_TECHNOLOGY) + PROD("Insider IN1000", RAM, SPIRIT_TECHNOLOGY_INSIDER_IN1000) + PROD("Insider IN500", RAM, SPIRIT_TECHNOLOGY_INSIDER_IN500) + PROD("SIN500", RAM, SPIRIT_TECHNOLOGY_SIN500) + PROD("HDA 506", HD, SPIRIT_TECHNOLOGY_HDA_506) + PROD("AX-S", MISC, SPIRIT_TECHNOLOGY_AX_S) + PROD("OctaByte", RAM, SPIRIT_TECHNOLOGY_OCTABYTE) + PROD("Inmate", SCSI_RAM, SPIRIT_TECHNOLOGY_INMATE) +END + +BEGIN_PROD(SPIRIT_TECHNOLOGY_2) +END + +BEGIN_PROD(BSC_ALFADATA_1) + PROD("ALF 3", SCSI, BSC_ALF_3_1) +END + +BEGIN_PROD(BSC_ALFADATA_2) + PROD("ALF 2", SCSI, BSC_ALF_2_1) + PROD("ALF 2", SCSI, BSC_ALF_2_2) + PROD("ALF 3", SCSI, BSC_ALF_3_2) +END + +BEGIN_PROD(CARDCO_2) + PROD("Kronos", SCSI, CARDCO_KRONOS_2000_2) + PROD("A1000", SCSI, CARDCO_A1000_2) +END + +BEGIN_PROD(JOCHHEIM) + PROD(NULL, RAM, JOCHHEIM_RAM) +END + +BEGIN_PROD(CHECKPOINT_TECHNOLOGIES) + PROD("Serial Solution", SERIAL, CHECKPOINT_TECHNOLOGIES_SERIAL_SOLUTION) +END + +BEGIN_PROD(EDOTRONIK) + PROD("IEEE-488 Interface Board", UNKNOWN, EDOTRONIK_IEEE_488) + PROD("CBM-8032 Board", UNKNOWN, EDOTRONIK_8032) + PROD(NULL, SERIAL, EDOTRONIK_MULTISERIAL) + PROD("24Bit Realtime Video Digitizer", UNKNOWN, EDOTRONIK_VIDEODIGITIZER) + PROD("32Bit Parallel I/O Interface", UNKNOWN, EDOTRONIK_PARALLEL_IO) + PROD("PIC Prototyping Board", UNKNOWN, EDOTRONIK_PIC_PROTOYPING) + PROD("16 Channel ADC Interface", UNKNOWN, EDOTRONIK_ADC) + PROD("VME-Bus Controller", UNKNOWN, EDOTRONIK_VME) + PROD("DSP96000 Realtime Data Acquisition", DSP, EDOTRONIK_DSP96000) +END + +BEGIN_PROD(NES_INC) + PROD(NULL, RAM, NES_INC_RAM) +END + +BEGIN_PROD(ICD) + PROD("Advantage 2000", SCSI, ICD_ADVANTAGE_2000_SCSI) + PROD("Advantage", IDE, ICD_ADVANTAGE_2000_SCSI) + PROD("Advantage 2080", RAM, ICD_ADVANTAGE_2080_RAM) +END + +BEGIN_PROD(KUPKE_2) + PROD("Omti", HD, KUPKE_OMTI) + PROD("Golem SCSI-II", SCSI, KUPKE_SCSI_II) + PROD("Golem Box", UNKNOWN, KUPKE_GOLEM_BOX) + PROD("030/882", TURBO, KUPKE_030_882) + PROD("Golem", SCSI, KUPKE_SCSI_AT) +END + +BEGIN_PROD(GREAT_VALLEY_PRODUCTS_3) + PROD("A2000-RAM8/2", MISC, GVP_A2000_RAM8) + PROD("Impact Series II", RAM, GVP_IMPACT_SERIES_II_RAM_2) +END + +BEGIN_PROD(INTERWORKS_NETWORK) +END + +BEGIN_PROD(HARDITAL_SYNTHESIS) + PROD("TQM 68030+68882", TURBO, HARDITAL_SYNTHESIS_TQM_68030_68882) +END + +BEGIN_PROD(APPLIED_ENGINEERING) + PROD("DL2000", MODEM, APPLIED_ENGINEERING_DL2000) + PROD("RAM Works", RAM, APPLIED_ENGINEERING_RAM_WORKS) +END + +BEGIN_PROD(BSC_ALFADATA_3) + PROD("Oktagon 2008", SCSI, BSC_OKTAGON_2008) + PROD("Tandem AT-2008/508", IDE, BSC_TANDEM_AT_2008_508) + PROD("Alpha RAM 1200", RAM, BSC_ALFA_RAM_1200) + PROD("Oktagon 2008", RAM, BSC_OKTAGON_2008_RAM) + PROD("MultiFace I", MULTIIO, BSC_MULTIFACE_I) + PROD("MultiFace II", MULTIIO, BSC_MULTIFACE_II) + PROD("MultiFace III", MULTIIO, BSC_MULTIFACE_III) + PROD("Framebuffer", MISC, BSC_FRAMEBUFFER) + PROD("Graffiti", GFXRAM, BSC_GRAFFITI_RAM) + PROD("Graffiti", GFX, BSC_GRAFFITI_REG) + PROD("ISDN MasterCard", ISDN, BSC_ISDN_MASTERCARD) + PROD("ISDN MasterCard II", ISDN, BSC_ISDN_MASTERCARD_II) +END + +BEGIN_PROD(PHOENIX) + PROD("ST506", HD, PHOENIX_ST506) + PROD(NULL, SCSI, PHOENIX_SCSI) + PROD(NULL, RAM, PHOENIX_RAM) +END + +BEGIN_PROD(ADVANCED_STORAGE_SYSTEMS) + PROD("Nexus", SCSI, ADVANCED_STORAGE_SYSTEMS_NEXUS) + PROD("Nexus", RAM, ADVANCED_STORAGE_SYSTEMS_NEXUS_RAM) +END + +BEGIN_PROD(IMPULSE) + PROD("FireCracker 24", GFX, IMPULSE_FIRECRACKER_24) +END + +BEGIN_PROD(IVS) + PROD("GrandSlam PIC 2", RAM, IVS_GRANDSLAM_PIC_2) + PROD("GrandSlam PIC 1", RAM, IVS_GRANDSLAM_PIC_1) + PROD("OverDrive", HD, IVS_OVERDRIVE) + PROD("TrumpCard Classic", SCSI, IVS_TRUMPCARD_CLASSIC) + PROD("TrumpCard Pro/GrandSlam", SCSI, IVS_TRUMPCARD_PRO_GRANDSLAM) + PROD("Meta-4", RAM, IVS_META_4) + PROD("Wavetools", AUDIO, IVS_WAVETOOLS) + PROD("Vector", SCSI, IVS_VECTOR_1) + PROD("Vector", SCSI, IVS_VECTOR_2) +END + +BEGIN_PROD(VECTOR_1) + PROD("Connection", MULTIIO, VECTOR_CONNECTION_1) +END + +BEGIN_PROD(XPERT_PRODEV) + PROD("Visiona", GFXRAM, XPERT_PRODEV_VISIONA_RAM) + PROD("Visiona", GFX, XPERT_PRODEV_VISIONA_REG) + PROD("Merlin", GFXRAM, XPERT_PRODEV_MERLIN_RAM) + PROD("Merlin", GFX, XPERT_PRODEV_MERLIN_REG_1) + PROD("Merlin", GFX, XPERT_PRODEV_MERLIN_REG_2) +END + +BEGIN_PROD(HYDRA_SYSTEMS) + PROD("Amiganet", ETHERNET, HYDRA_SYSTEMS_AMIGANET) +END + +BEGIN_PROD(SUNRIZE_INDUSTRIES) + PROD("AD1012", AUDIO, SUNRIZE_INDUSTRIES_AD1012) + PROD("AD516", AUDIO, SUNRIZE_INDUSTRIES_AD516) + PROD("DD512", AUDIO, SUNRIZE_INDUSTRIES_DD512) +END + +BEGIN_PROD(TRICERATOPS) + PROD(NULL, MULTIIO, TRICERATOPS_MULTI_IO) +END + +BEGIN_PROD(APPLIED_MAGIC) + PROD("DMI Resolver", GFX, APPLIED_MAGIC_DMI_RESOLVER) + PROD("Digital Broadcaster", VIDEO, APPLIED_MAGIC_DIGITAL_BROADCASTER) +END + +BEGIN_PROD(GFX_BASE) + PROD("GDA-1 VRAM", GFX, GFX_BASE_GDA_1_VRAM) + PROD("GDA-1", GFX, GFX_BASE_GDA_1) +END + +BEGIN_PROD(ROCTEC) + PROD("RH 800C", HD, ROCTEC_RH_800C) + PROD("RH 800C", RAM, ROCTEC_RH_800C_RAM) +END + +BEGIN_PROD(KATO) + PROD("Melody MPEG", AUDIO, KATO_MELODY) + PROD("Rainbow II", GFX, HELFRICH_RAINBOW_II) /* ID clash!! */ + PROD("Rainbow III", GFX, HELFRICH_RAINBOW_III) /* ID clash!! */ +END + +BEGIN_PROD(ATLANTIS) +END + +BEGIN_PROD(PROTAR) +END + +BEGIN_PROD(ACS) +END + +BEGIN_PROD(SOFTWARE_RESULTS_ENTERPRISES) + PROD("Golden Gate 2 Bus+", BRIDGE, SOFTWARE_RESULTS_ENTERPRISES_GOLDEN_GATE_2_BUS_PLUS) +END + +BEGIN_PROD(MASOBOSHI) + PROD("MasterCard SC201", RAM, MASOBOSHI_MASTER_CARD_SC201) + PROD("MasterCard MC702", SCSI_IDE, MASOBOSHI_MASTER_CARD_MC702) + PROD("MVD 819", UNKNOWN, MASOBOSHI_MVD_819) +END + +BEGIN_PROD(MAINHATTAN_DATA) + PROD(NULL, IDE, MAINHATTAN_DATA_IDE) +END + +BEGIN_PROD(VILLAGE_TRONIC) + PROD("Domino", GFXRAM, VILLAGE_TRONIC_DOMINO_RAM) + PROD("Domino", GFX, VILLAGE_TRONIC_DOMINO_REG) + PROD("Domino 16M Prototype", GFX, VILLAGE_TRONIC_DOMINO_16M_PROTOTYPE) + PROD("Picasso II/II+", GFXRAM, VILLAGE_TRONIC_PICASSO_II_II_PLUS_RAM) + PROD("Picasso II/II+", GFX, VILLAGE_TRONIC_PICASSO_II_II_PLUS_REG) + PROD("Picasso II/II+ (Segmented Mode)", GFX, VILLAGE_TRONIC_PICASSO_II_II_PLUS_SEGMENTED_MODE) + PROD("Picasso IV Z2", GFXRAM, VILLAGE_TRONIC_PICASSO_IV_Z2_MEM1) + PROD("Picasso IV Z2", GFXRAM, VILLAGE_TRONIC_PICASSO_IV_Z2_MEM2) + PROD("Picasso IV Z2", GFX, VILLAGE_TRONIC_PICASSO_IV_Z2_REG) + PROD("Picasso IV Z3", GFX, VILLAGE_TRONIC_PICASSO_IV_Z3) + PROD("Ariadne", ETHERNET_PARALLEL, VILLAGE_TRONIC_ARIADNE) +END + +BEGIN_PROD(UTILITIES_UNLIMITED) + PROD("Emplant Deluxe", MACEMU, UTILITIES_UNLIMITED_EMPLANT_DELUXE) + PROD("Emplant Deluxe", MACEMU, UTILITIES_UNLIMITED_EMPLANT_DELUXE2) +END + +BEGIN_PROD(AMITRIX) + PROD(NULL, MULTIIO, AMITRIX_MULTI_IO) + PROD("CD-RAM", RAM, AMITRIX_CD_RAM) +END + +BEGIN_PROD(ARMAX) + PROD("OmniBus", GFX, ARMAX_OMNIBUS) +END + +BEGIN_PROD(ZEUS) + PROD("Spider", VIDEO, ZEUS_SPIDER) +END + +BEGIN_PROD(NEWTEK) + PROD("VideoToaster", VIDEO, NEWTEK_VIDEOTOASTER) +END + +BEGIN_PROD(M_TECH_GERMANY) + PROD("AT500", IDE, MTEC_AT500_2) + PROD("68030", TURBO, MTEC_68030) + PROD("68020i", TURBO, MTEC_68020I) + PROD("A1200 T68030 RTC", TURBO, MTEC_A1200_T68030_RTC) + PROD("Viper Mk V/E-Matrix 530", TURBO_RAM, MTEC_VIPER_MK_V_E_MATRIX_530) + PROD("8MB", RAM, MTEC_8_MB_RAM) + PROD("Viper Mk V/E-Matrix 530 SCSI/IDE", SCSI_IDE, MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE) +END + +BEGIN_PROD(GREAT_VALLEY_PRODUCTS_4) + PROD("EGS 28/24 Spectrum", GFX, GVP_EGS_28_24_SPECTRUM_REG) + PROD("EGS 28/24 Spectrum", GFXRAM, GVP_EGS_28_24_SPECTRUM_RAM) +END + +BEGIN_PROD(APOLLO_1) + PROD("A1200", FPU_RAM, APOLLO_A1200) +END + +BEGIN_PROD(HELFRICH_2) + PROD("Piccolo", GFXRAM, HELFRICH_PICCOLO_RAM) + PROD("Piccolo", GFX, HELFRICH_PICCOLO_REG) + PROD("PeggyPlus MPEG", VIDEO, HELFRICH_PEGGY_PLUS_MPEG) + PROD("VideoCruncher", VIDEO, HELFRICH_VIDEOCRUNCHER) + PROD("Piccolo SD64", GFXRAM, HELFRICH_SD64_RAM) + PROD("Piccolo SD64", GFX, HELFRICH_SD64_REG) +END + +BEGIN_PROD(MACROSYSTEMS_USA) + PROD("Warp Engine 40xx", TURBO_SCSI_RAM, MACROSYSTEMS_WARP_ENGINE_40xx) +END + +BEGIN_PROD(ELBOX_COMPUTER) + PROD("1200/4", RAM, ELBOX_COMPUTER_1200_4) +END + +BEGIN_PROD(HARMS_PROFESSIONAL) + PROD("030 Plus", TURBO, HARMS_PROFESSIONAL_030_PLUS) + PROD("3500 Professional", TURBO_RAM, HARMS_PROFESSIONAL_3500) +END + +BEGIN_PROD(MICRONIK) + PROD("RCA 120", RAM, MICRONIK_RCA_120) +END + +BEGIN_PROD(MICRONIK2) + PROD("Z3i A1200 Zorro III + SCSI", SCSI, MICRONIK2_Z3I) +END + +BEGIN_PROD(MEGAMICRO) + PROD("SCRAM 500", SCSI, MEGAMICRO_SCRAM_500) + PROD("SCRAM 500", RAM, MEGAMICRO_SCRAM_500_RAM) +END + +BEGIN_PROD(IMTRONICS_2) + PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_3) + PROD("Hurricane 2800", TURBO_RAM, IMTRONICS_HURRICANE_2800_4) +END + +BEGIN_PROD(INDIVIDUAL_COMPUTERS) + PROD("Buddha", IDE, INDIVIDUAL_COMPUTERS_BUDDHA) + PROD("Catweasel", IDE_FLOPPY, INDIVIDUAL_COMPUTERS_CATWEASEL) +END + +BEGIN_PROD(KUPKE_3) + PROD("Golem HD 3000", HD, KUPKE_GOLEM_HD_3000) +END + +BEGIN_PROD(ITH) + PROD("ISDN-Master II", ISDN, ITH_ISDN_MASTER_II) +END + +BEGIN_PROD(VMC) + PROD("ISDN Blaster Z2", ISDN, VMC_ISDN_BLASTER_Z2) + PROD("HyperCom 4", MULTIIO, VMC_HYPERCOM_4) +END + +BEGIN_PROD(INFORMATION) + PROD("ISDN Engine I", ISDN, INFORMATION_ISDN_ENGINE_I) +END + +BEGIN_PROD(VORTEX) + PROD("Golden Gate 80386SX", BRIDGE, VORTEX_GOLDEN_GATE_80386SX) + PROD("Golden Gate", RAM, VORTEX_GOLDEN_GATE_RAM) + PROD("Golden Gate 80486", BRIDGE, VORTEX_GOLDEN_GATE_80486) +END + +BEGIN_PROD(EXPANSION_SYSTEMS) + PROD("DataFlyer 4000SX", SCSI, EXPANSION_SYSTEMS_DATAFLYER_4000SX) + PROD("DataFlyer 4000SX", RAM, EXPANSION_SYSTEMS_DATAFLYER_4000SX_RAM) +END + +BEGIN_PROD(READYSOFT) + PROD("AMax II/IV", MACEMU, READYSOFT_AMAX_II_IV) +END + +BEGIN_PROD(PHASE5) + PROD("Blizzard", RAM, PHASE5_BLIZZARD_RAM) + PROD("Blizzard", TURBO, PHASE5_BLIZZARD) + PROD("Blizzard 1220-IV", TURBO, PHASE5_BLIZZARD_1220_IV) + PROD("FastLane Z3", RAM, PHASE5_FASTLANE_Z3_RAM) + PROD("Blizzard 1230-II/Fastlane Z3/CyberSCSI/CyberStorm060", TURBO_SCSI, PHASE5_BLIZZARD_1230_II_FASTLANE_Z3_CYBERSCSI_CYBERSTORM060) + PROD("Blizzard 1220/CyberStorm", TURBO_SCSI, PHASE5_BLIZZARD_1220_CYBERSTORM) + PROD("Blizzard 1230", TURBO, PHASE5_BLIZZARD_1230) + PROD("Blizzard 1230-IV/1260", TURBO, PHASE5_BLIZZARD_1230_IV_1260) + PROD("Blizzard 2060", TURBO, PHASE5_BLIZZARD_2060) + PROD("CyberStorm Mk II", FLASHROM, PHASE5_CYBERSTORM_MK_II) + PROD("CyberVision64", GFX, PHASE5_CYBERVISION64) + PROD("CyberVision64-3D Prototype", GFX, PHASE5_CYBERVISION64_3D_PROTOTYPE) + PROD("CyberVision64-3D", GFX, PHASE5_CYBERVISION64_3D) + PROD("CyberStorm Mk III", TURBO_SCSI, PHASE5_CYBERSTORM_MK_III) + PROD("Blizzard 603e+", TURBO_SCSI, PHASE5_BLIZZARD_603E_PLUS) +END + +BEGIN_PROD(DPS) + PROD("Personal Animation Recorder", VIDEO, DPS_PERSONAL_ANIMATION_RECORDER) +END + +BEGIN_PROD(APOLLO_2) + PROD("A620 68020", TURBO, APOLLO_A620_68020_1) + PROD("A620 68020", TURBO, APOLLO_A620_68020_2) +END + +BEGIN_PROD(APOLLO_3) + PROD("AT-Apollo", UNKNOWN, APOLLO_AT_APOLLO) + PROD("1230/1240/1260/2030/4040/4060", TURBO, APOLLO_1230_1240_1260_2030_4040_4060) +END + +BEGIN_PROD(PETSOFF_LP) + PROD("Delfina", AUDIO, PETSOFF_LP_DELFINA) + PROD("Delfina Lite", AUDIO, PETSOFF_LP_DELFINA_LITE) +END + +BEGIN_PROD(UWE_GERLACH) + PROD("RAM/ROM", MISC, UWE_GERLACH_RAM_ROM) +END + +BEGIN_PROD(ACT) + PROD("Prelude", AUDIO, ACT_PRELUDE) +END + +BEGIN_PROD(MACROSYSTEMS_GERMANY) + PROD("Maestro", AUDIO, MACROSYSTEMS_MAESTRO) + PROD("VLab", VIDEO, MACROSYSTEMS_VLAB) + PROD("Maestro Pro", AUDIO, MACROSYSTEMS_MAESTRO_PRO) + PROD("Retina", GFX, MACROSYSTEMS_RETINA) + PROD("MultiEvolution", SCSI, MACROSYSTEMS_MULTI_EVOLUTION) + PROD("Toccata", AUDIO, MACROSYSTEMS_TOCCATA) + PROD("Retina Z3", GFX, MACROSYSTEMS_RETINA_Z3) + PROD("VLab Motion", VIDEO, MACROSYSTEMS_VLAB_MOTION) + PROD("Altais", GFX, MACROSYSTEMS_ALTAIS) + PROD("Falcon '040", TURBO, MACROSYSTEMS_FALCON_040) +END + +BEGIN_PROD(COMBITEC) +END + +BEGIN_PROD(SKI_PERIPHERALS) + PROD("MAST Fireball", SCSI, SKI_PERIPHERALS_MAST_FIREBALL) + PROD("SCSI/Dual Serial", SCSI_SERIAL, SKI_PERIPHERALS_SCSI_DUAL_SERIAL) +END + +BEGIN_PROD(REIS_WARE_2) + PROD("Scan King", SCANNER, REIS_WARE_SCAN_KING) +END + +BEGIN_PROD(CAMERON) + PROD("Personal A4", SCANNER, CAMERON_PERSONAL_A4) +END + +BEGIN_PROD(REIS_WARE) + PROD("Handyscanner", SCANNER, REIS_WARE_HANDYSCANNER) +END + +BEGIN_PROD(PHOENIX_2) + PROD("ST506", HD, PHOENIX_ST506_2) + PROD(NULL, SCSI, PHOENIX_SCSI_2) + PROD(NULL, RAM, PHOENIX_RAM_2) +END + +BEGIN_PROD(COMBITEC_2) + PROD(NULL, HD, COMBITEC_HD) + PROD("SRAM", RAM, COMBITEC_SRAM) +END + +BEGIN_PROD(HACKER) /* Unused */ +END + + +BEGIN_MANUF + MANUF("Pacific Peripherals", PACIFIC_PERIPHERALS) + MANUF("MacroSystems USA", MACROSYSTEMS_USA_2) + MANUF("Kupke", KUPKE_1) + MANUF("Memphis", MEMPHIS) + MANUF("3-State", 3_STATE) + MANUF("Commodore Braunschweig", COMMODORE_BRAUNSCHWEIG) + MANUF("Commodore West Chester", COMMODORE_WEST_CHESTER_1) + MANUF("Commodore West Chester", COMMODORE_WEST_CHESTER_2) + MANUF("Progressive Peripherals & Systems", PROGRESSIVE_PERIPHERALS_AND_SYSTEMS_2) + MANUF("Kolff Computer Supplies", KOLFF_COMPUTER_SUPPLIES) + MANUF("Cardco Ltd.", CARDCO_1) + MANUF("A-Squared", A_SQUARED) + MANUF("Comspec Communications", COMSPEC_COMMUNICATIONS) + MANUF("Anakin Research", ANAKIN_RESEARCH) + MANUF("Microbotics", MICROBOTICS) + MANUF("Access Associates Alegra", ACCESS_ASSOCIATES_ALEGRA) + MANUF("Expansion Technologies (Pacific Cypress)", EXPANSION_TECHNOLOGIES) + MANUF("ASDG", ASDG) + MANUF("Ronin/Imtronics", IMTRONICS_1) + MANUF("Commodore/University of Lowell", CBM_UNIVERSITY_OF_LOWELL) + MANUF("Ameristar", AMERISTAR) + MANUF("Supra", SUPRA) + MANUF("Computer Systems Assosiates", COMPUTER_SYSTEMS_ASSOCIATES) + MANUF("Marc Michael Groth", MARC_MICHAEL_GROTH) + MANUF("M-Tech", M_TECH) + MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_1) + MANUF("ByteBox", BYTEBOX) + MANUF("DKB/Power Computing", DKB_POWER_COMPUTING) + MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_2) + MANUF("California Access (Synergy)", CALIFORNIA_ACCESS_SYNERGY) + MANUF("Xetec", XETEC) + MANUF("Progressive Peripherals & Systems", PROGRESSIVE_PERIPHERALS_AND_SYSTEMS) + MANUF("Xebec", XEBEC) + MANUF("Spirit Technology", SPIRIT_TECHNOLOGY) + MANUF("Spirit Technology", SPIRIT_TECHNOLOGY_2) + MANUF("BSC/Alfadata", BSC_ALFADATA_1) + MANUF("BSC/Alfadata", BSC_ALFADATA_2) + MANUF("Cardco Ltd.", CARDCO_2) + MANUF("Jochheim", JOCHHEIM) + MANUF("Checkpoint Technologies", CHECKPOINT_TECHNOLOGIES) + MANUF("Edotronik", EDOTRONIK) + MANUF("NES Inc.", NES_INC) + MANUF("ICD", ICD) + MANUF("Kupke", KUPKE_2) + MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_3) + MANUF("Interworks Network", INTERWORKS_NETWORK) + MANUF("Hardital Synthesis", HARDITAL_SYNTHESIS) + MANUF("Applied Engineering", APPLIED_ENGINEERING) + MANUF("BSC/Alfadata", BSC_ALFADATA_3) + MANUF("Phoenix", PHOENIX) + MANUF("Advanced Storage Systems", ADVANCED_STORAGE_SYSTEMS) + MANUF("Impulse", IMPULSE) + MANUF("IVS", IVS) + MANUF("Vector", VECTOR_1) + MANUF("XPert ProDev", XPERT_PRODEV) + MANUF("Hydra Systems", HYDRA_SYSTEMS) + MANUF("Sunrize Industries", SUNRIZE_INDUSTRIES) + MANUF("Triceratops", TRICERATOPS) + MANUF("Applied Magic Inc.", APPLIED_MAGIC) + MANUF("GFX-Base", GFX_BASE) + MANUF("RocTec", ROCTEC) + MANUF("Kato", KATO) + MANUF("Atlantis", ATLANTIS) + MANUF("Protar", PROTAR) + MANUF("ACS", ACS) + MANUF("Software Results Enterprises", SOFTWARE_RESULTS_ENTERPRISES) + MANUF("Masoboshi", MASOBOSHI) + MANUF("Mainhattan-Data (A-Team)", MAINHATTAN_DATA) + MANUF("Village Tronic", VILLAGE_TRONIC) + MANUF("Utilities Unlimited", UTILITIES_UNLIMITED) + MANUF("Amitrix", AMITRIX) + MANUF("ArMax", ARMAX) + MANUF("ZEUS Electronic Development", ZEUS) + MANUF("NewTek", NEWTEK) + MANUF("M-Tech Germany", M_TECH_GERMANY) + MANUF("Great Valley Products", GREAT_VALLEY_PRODUCTS_4) + MANUF("Apollo", APOLLO_1) + MANUF("Ingenieurbüro Helfrich", HELFRICH_2) + MANUF("MacroSystems USA", MACROSYSTEMS_USA) + MANUF("ElBox Computer", ELBOX_COMPUTER) + MANUF("Harms Professional", HARMS_PROFESSIONAL) + MANUF("Micronik", MICRONIK) + MANUF("Micronik", MICRONIK2) + MANUF("MegaMicro", MEGAMICRO) + MANUF("Ronin/Imtronics", IMTRONICS_2) + MANUF("Individual Computers", INDIVIDUAL_COMPUTERS) + MANUF("Kupke", KUPKE_3) + MANUF("ITH", ITH) + MANUF("VMC", VMC) + MANUF("Information", INFORMATION) + MANUF("Vortex", VORTEX) + MANUF("Expansion Systems", EXPANSION_SYSTEMS) + MANUF("ReadySoft", READYSOFT) + MANUF("Phase 5", PHASE5) + MANUF("DPS", DPS) + MANUF("Apollo", APOLLO_2) + MANUF("Apollo", APOLLO_3) + MANUF("Petsoff LP", PETSOFF_LP) + MANUF("Uwe Gerlach", UWE_GERLACH) + MANUF("ACT", ACT) + MANUF("MacroSystems Germany", MACROSYSTEMS_GERMANY) + MANUF("Combitec", COMBITEC) + MANUF("SKI Peripherals", SKI_PERIPHERALS) + MANUF("Reis-Ware", REIS_WARE_2) + MANUF("Cameron", CAMERON) + MANUF("Reis-Ware", REIS_WARE) + MANUF("Hacker Test Board", HACKER) /* Unused */ + MANUF("Phoenix", PHOENIX_2) + MANUF("Combitec", COMBITEC_2) +END + +#define NUM_MANUF (ARRAYSIZE(Manufacturers)) +#define NUM_GVP_PROD (ARRAYSIZE(Ext_Prod_GVP)) + + + /* + * Zorro product classes + * + * Make sure to keep these in sync with include/linux/zorro.h! + */ + +static const char *classnames[] = { + NULL, /* ZORRO_CLASS_UNKNOWN */ + "ArcNet Card", /* ZORRO_CLASS_ARCNET */ + "Audio Board", /* ZORRO_CLASS_AUDIO */ + "ISA Bus Bridge", /* ZORRO_CLASS_BRIDGE */ + "DSP Board", /* ZORRO_CLASS_DSP */ + "Ethernet Card", /* ZORRO_CLASS_ETHERNET */ + "Ethernet Card and Parallel Ports", /* ZORRO_CLASS_ETHERNET_PARALLEL */ + "Flash ROM", /* ZORRO_CLASS_FLASHROM */ + "FPU and RAM Expansion", /* ZORRO_CLASS_FPU_RAM */ + "Graphics Board", /* ZORRO_CLASS_GFX */ + "Graphics Board (RAM)", /* ZORRO_CLASS_GFXRAM */ + "HD Controller", /* ZORRO_CLASS_HD */ + "HD Controller and RAM Expansion", /* ZORRO_CLASS_HD_RAM */ + "IDE Interface", /* ZORRO_CLASS_IDE */ + "IDE Interface and RAM Expansion", /* ZORRO_CLASS_IDE_RAM */ + "IDE Interface and Floppy Controller", /* ZORRO_CLASS_IDE_FLOPPY */ + "ISDN Interface", /* ZORRO_CLASS_ISDN */ + "Macintosh Emulator", /* ZORRO_CLASS_MACEMU */ + "Miscellaneous Expansion Card", /* ZORRO_CLASS_MISC */ + "Modem", /* ZORRO_CLASS_MODEM */ + "Multi I/O", /* ZORRO_CLASS_MULTIIO */ + "RAM Expansion", /* ZORRO_CLASS_RAM */ + "Scanner Interface", /* ZORRO_CLASS_SCANNER */ + "SCSI Host Adapter", /* ZORRO_CLASS_SCSI */ + "SCSI Host Adapter and IDE Interface", /* ZORRO_CLASS_SCSI_IDE */ + "SCSI Host Adapter and RAM Expansion", /* ZORRO_CLASS_SCSI_RAM */ + "SCSI Host Adapter and Serial Card", /* ZORRO_CLASS_SCSI_SERIAL */ + "Multi Serial", /* ZORRO_CLASS_SERIAL */ + "Drawing Tablet Interface", /* ZORRO_CLASS_TABLET */ + "Accelerator", /* ZORRO_CLASS_TURBO */ + "Accelerator and RAM Expansion", /* ZORRO_CLASS_TURBO_RAM */ + "Accelerator and HD Controller", /* ZORRO_CLASS_TURBO_HD */ + "Accelerator and IDE Interface", /* ZORRO_CLASS_TURBO_IDE */ + "Accelerator and SCSI Host Adapter", /* ZORRO_CLASS_TURBO_SCSI */ + "Accelerator, SCSI Host Adapter and RAM Expansion", /* ZORRO_CLASS_TURBO_SCSI */ + "Video Board", /* ZORRO_CLASS_VIDEO */ +}; + +static inline const char *get_class_name(enum Zorro_Classes class) +{ + if (class < ARRAYSIZE(classnames)) + return(classnames[class]); + else + return("(**Illegal**)"); +} + +#endif /* CONFIG_ZORRO */ + + + /* + * Expansion Devices + */ + +u_int zorro_num_autocon; +struct ConfigDev zorro_autocon[ZORRO_NUM_AUTO]; +static u32 BoardPartFlags[ZORRO_NUM_AUTO] = { 0, }; + + + /* + * Find the key for the next unconfigured expansion device of a specific + * type. + * + * Part is a device specific number (0 <= part <= 31) to allow for the + * independent configuration of independent parts of an expansion board. + * Thanks to Jes Soerensen for this idea! + * + * Index is used to specify the first board in the autocon list + * to be tested. It was inserted in order to solve the problem + * with the GVP boards that uses the same product code, but + * it should help if there are other companies which use the same + * method as GVP. Drivers for boards which are not using this + * method do not need to think of this - just set index = 0. + * + * Example: + * + * while ((key = zorro_find(ZORRO_PROD_MY_BOARD, MY_PART, 0))) { + * cd = zorro_get_board(key); + * initialise_this_board; + * zorro_config_board(key, MY_PART); + * } + */ + +u_int zorro_find(zorro_id id, u_int part, u_int index) +{ + u_int manuf = ZORRO_MANUF(id); + u_int prod = ZORRO_PROD(id); + u_int epc = ZORRO_EPC(id); + u_int key; + const struct ConfigDev *cd; + u_long addr; + + if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) + return(0); + + if (part > 31) { + printk("zorro_find: bad part %d\n", part); + return(0); + } + + for (key = index + 1; key <= zorro_num_autocon; key++) { + cd = &zorro_autocon[key-1]; + addr = (u_long)cd->cd_BoardAddr; + if ((cd->cd_Rom.er_Manufacturer == manuf) && + (cd->cd_Rom.er_Product == prod) && + !(BoardPartFlags[key-1] & (1< zorro_num_autocon)) + printk("zorro_get_board: bad key %d\n", key); + else + cd = &zorro_autocon[key-1]; + + return(cd); +} + + + /* + * Mark a part of a board as configured + */ + +void zorro_config_board(u_int key, u_int part) +{ + if ((key < 1) || (key > zorro_num_autocon)) + printk("zorro_config_board: bad key %d\n", key); + else if (part > 31) + printk("zorro_config_board: bad part %d\n", part); + else if (BoardPartFlags[key-1] & (1< zorro_num_autocon)) + printk("zorro_unconfig_board: bad key %d\n", key); + else if (part > 31) + printk("zorro_unconfig_board: bad part %d\n", part); + else if (!(BoardPartFlags[key-1] & (1<cd_Rom.er_Manufacturer; + u_int prod = cd->cd_Rom.er_Product; + u_int class = ZORRO_CLASS_UNKNOWN; + u_int epc = 0; + const char *manufname = "Unknown"; + const char *prodname = "Unknown"; + const char *classname; + u_int i, j, k, len = 0; + u_long addr = (u_long)cd->cd_BoardAddr; + u_long size = cd->cd_BoardSize; + char mag; + int identified = 0, gvp = 0; + + if (manuf != ZORRO_MANUF(ZORRO_PROD_GVP_EPC_BASE) || + prod != ZORRO_PROD(ZORRO_PROD_GVP_EPC_BASE)) { + for (i = 0; i < NUM_MANUF; i++) + if (Manufacturers[i].Manuf == manuf) { + manufname = Manufacturers[i].Name; + for (j = 0; j < Manufacturers[i].NumProd; j++) + if (Manufacturers[i].Products[j].Prod == prod) { + prodname = Manufacturers[i].Products[j].Name; + class = Manufacturers[i].Products[j].Class; + identified = 1; + break; + } + } + /* Put workarounds for ID clashes here */ + if (manuf == ZORRO_MANUF(ZORRO_PROD_HELFRICH_RAINBOW_III) && + prod == ZORRO_PROD(ZORRO_PROD_HELFRICH_RAINBOW_III)) + manufname = "Ingenieurbüro Helfrich"; + } else { + manufname = "Great Valley Products"; + gvp = 1; + epc = *(u_short *)ZTWO_VADDR(addr+0x8000) & GVP_PRODMASK; + for (k = 0; k < NUM_GVP_PROD; k++) + if (epc == Ext_Prod_GVP[k].EPC) { + prodname = Ext_Prod_GVP[k].Name; + class = Ext_Prod_GVP[k].Class; + identified = 1; + break; + } + } + classname = get_class_name(class); + if (size & 0xfffff) { + size >>= 10; + mag = 'K'; + } else { + size >>= 20; + mag = 'M'; + } + if (verbose) { + const char *zorro; + int is_mem = cd->cd_Rom.er_Type & ERTF_MEMLIST; + switch (cd->cd_Rom.er_Type & ERT_TYPEMASK) { + case ERT_ZORROII: + zorro = "Zorro II"; + break; + case ERT_ZORROIII: + zorro = "Zorro III"; + break; + default: + zorro = "Unknown Zorro"; + break; + } + if (!prodname) + prodname = "Unknown"; + if (!classname) + classname = "Unknown"; + len = sprintf(buf, " Device %d at 0x%08lx: ID=%04x:%02x", devnum, + addr, manuf, prod); + if (gvp) + len += sprintf(buf+len, ":%02x", epc); + len += sprintf(buf+len, ", %s, %ld%c", zorro, size, mag); + if (is_mem) + len += sprintf(buf+len, ", System RAM"); + else + len += sprintf(buf+len, ", Configured=%08x", configured); + len += sprintf(buf+len, "\n" + " Manufacturer: %s\n" + " Product Name: %s\n" + " Board Class : %s\n", + manufname, prodname, classname); + } else { + len = sprintf(buf, " %c%08lx: ", configured ? '*' : ' ', addr); + if (identified) { + len += sprintf(buf+len, "%s", manufname); + if (prodname) + len += sprintf(buf+len, " %s", prodname); + if (classname) + len += sprintf(buf+len, " %s", classname); + } else if (manuf == ZORRO_MANUF_HACKER) + len += sprintf(buf+len, "Hacker Test Board %02x", prod); + else if (gvp) + len += sprintf(buf+len, "[%04x:%02x:%02x] made by %s", manuf, prod, + epc, manufname); + else + len += sprintf(buf+len, "[%04x:%02x] made by %s", manuf, prod, + manufname); + len += sprintf(buf+len, " (%ld%c)\n", size, mag); + if (!identified && manuf != ZORRO_MANUF_HACKER) + len += sprintf(buf+len, " Please report this unknown device to " + "zorro@linux-m68k.org\n"); + } + return(len); +} + + + /* + * Identify all known AutoConfig Expansion Devices + */ + +void zorro_identify(void) +{ + u_int i; + char tmp[256]; + + if (!AMIGAHW_PRESENT(ZORRO)) + return; + + printk("Probing AutoConfig expansion device(s):\n"); + for (i = 0; i < zorro_num_autocon; i++) { + identify(i, tmp, 0); + printk(tmp); + } + if (!zorro_num_autocon) + printk("No AutoConfig expansion devices present.\n"); +} + + + /* + * Get the list of all AutoConfig Expansion Devices + */ + +int zorro_get_list(char *buffer) +{ + u_int i, len = 0, len2; + char tmp[256]; + + if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { + len = sprintf(buffer, "AutoConfig expansion devices:\n"); + for (i = 0; i < zorro_num_autocon; i++) { + len2 = identify(i, tmp, 1); + if (len+len2 >= 4075) { + len += sprintf(buffer+len, "4K limit reached!\n"); + break; + } + strcpy(buffer+len, tmp); + len += len2; + } + } + return(len); +} + +#endif /* CONFIG_ZORRO */ + + + /* + * Bitmask indicating portions of available Zorro II RAM that are unused + * by the system. Every bit represents a 64K chunk, for a maximum of 8MB + * (128 chunks, physical 0x00200000-0x009fffff). + * + * If you want to use (= allocate) portions of this RAM, you should clear + * the corresponding bits. + * + * Possible uses: + * - z2ram device + * - SCSI DMA bounce buffers + */ + +u32 zorro_unused_z2ram[4] = { 0, 0, 0, 0 }; + + +static void mark_region(u_long addr, u_long size, int flag) +{ + u_long start, end, chunk; + + if (flag) { + start = (addr+Z2RAM_CHUNKMASK) & ~Z2RAM_CHUNKMASK; + end = (addr+size) & ~Z2RAM_CHUNKMASK; + } else { + start = addr & ~Z2RAM_CHUNKMASK; + end = (addr+size+Z2RAM_CHUNKMASK) & ~Z2RAM_CHUNKMASK; + } + if (end <= Z2RAM_START || start >= Z2RAM_END) + return; + start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START; + end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START; + while (start < end) { + chunk = start>>Z2RAM_CHUNKSHIFT; + if (flag) + set_bit( chunk, zorro_unused_z2ram ); + else + clear_bit( chunk, zorro_unused_z2ram ); + start += Z2RAM_CHUNKSIZE; + } +} + + + /* + * Initialization + */ + +void zorro_init(void) +{ + u_int i; + const struct ConfigDev *cd; + + if (!AMIGAHW_PRESENT(ZORRO)) + return; + + /* Mark all available Zorro II memory */ + for (i = 0; i < zorro_num_autocon; i++) { + cd = &zorro_autocon[i]; + if (cd->cd_Rom.er_Type & ERTF_MEMLIST) + mark_region((u_long)cd->cd_BoardAddr, cd->cd_BoardSize, 1); + } + + /* Unmark all used Zorro II memory */ + for (i = 0; i < m68k_num_memory; i++) + mark_region(m68k_memory[i].addr, m68k_memory[i].size, 0); +} diff -u --recursive --new-file v2.1.105/linux/include/asm-alpha/signal.h linux/include/asm-alpha/signal.h --- v2.1.105/linux/include/asm-alpha/signal.h Thu Feb 12 20:56:12 1998 +++ linux/include/asm-alpha/signal.h Tue Jun 9 00:55:10 1998 @@ -76,7 +76,7 @@ /* * SA_FLAGS values: * - * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). + * SA_ONSTACK indicates that a registered stack_t will be used. * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. @@ -100,6 +100,16 @@ #define SA_NOMASK SA_NODEFER #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 4096 +#define SIGSTKSZ 16384 + + #ifdef __KERNEL__ /* * These values of sa_flags are used only by the kernel as part of the @@ -163,6 +173,15 @@ int ss_flags; size_t ss_size; } stack_t; + +/* sigstack(2) is deprecated, and will be withdrawn in a future version + of the X/Open CAE Specification. Use sigaltstack instead. It is only + implemented here for OSF/1 compatability. */ + +struct sigstack { + void *ss_sp; + int ss_onstack; +}; #ifdef __KERNEL__ #include diff -u --recursive --new-file v2.1.105/linux/include/asm-alpha/unistd.h linux/include/asm-alpha/unistd.h --- v2.1.105/linux/include/asm-alpha/unistd.h Sun Jun 7 11:16:36 1998 +++ linux/include/asm-alpha/unistd.h Tue Jun 9 13:34:01 1998 @@ -113,7 +113,7 @@ #define __NR_osf_old_sigblock 109 /* not implemented */ #define __NR_osf_old_sigsetmask 110 /* not implemented */ #define __NR_sigsuspend 111 -#define __NR_osf_sigstack 112 /* not implemented */ +#define __NR_osf_sigstack 112 #define __NR_recvmsg 113 #define __NR_sendmsg 114 #define __NR_osf_old_vtrace 115 /* not implemented */ @@ -205,7 +205,7 @@ #define __NR_getpgid 233 #define __NR_getsid 234 -#define __NR_osf_sigaltstack 235 /* not implemented */ +#define __NR_sigaltstack 235 #define __NR_osf_waitid 236 /* not implemented */ #define __NR_osf_priocntlset 237 /* not implemented */ #define __NR_osf_sigsendset 238 /* not implemented */ @@ -305,7 +305,8 @@ #define __NR_wait4 365 #define __NR_adjtimex 366 #define __NR_getcwd 367 - +#define __NR_capget 368 +#define __NR_capset 369 #if defined(__LIBRARY__) && defined(__GNUC__) diff -u --recursive --new-file v2.1.105/linux/include/asm-i386/math_emu.h linux/include/asm-i386/math_emu.h --- v2.1.105/linux/include/asm-i386/math_emu.h Tue Dec 9 17:57:09 1997 +++ linux/include/asm-i386/math_emu.h Tue Jun 9 00:55:10 1998 @@ -3,8 +3,8 @@ #include -void restore_i387_soft(void *s387, struct _fpstate *buf); -struct _fpstate * save_i387_soft(void *s387, struct _fpstate * buf); +int restore_i387_soft(void *s387, struct _fpstate *buf); +int save_i387_soft(void *s387, struct _fpstate * buf); /* This structure matches the layout of the data saved to the stack following a device-not-present interrupt, part of it saved diff -u --recursive --new-file v2.1.105/linux/include/asm-i386/signal.h linux/include/asm-i386/signal.h --- v2.1.105/linux/include/asm-i386/signal.h Thu Feb 12 20:56:12 1998 +++ linux/include/asm-i386/signal.h Tue Jun 9 00:55:10 1998 @@ -72,7 +72,7 @@ /* * SA_FLAGS values: * - * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). + * SA_ONSTACK indicates that a registered stack_t will be used. * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. @@ -96,6 +96,15 @@ #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 + +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 #ifdef __KERNEL__ diff -u --recursive --new-file v2.1.105/linux/include/asm-i386/termios.h linux/include/asm-i386/termios.h --- v2.1.105/linux/include/asm-i386/termios.h Wed Apr 8 19:36:29 1998 +++ linux/include/asm-i386/termios.h Mon Jun 8 10:02:35 1998 @@ -47,6 +47,7 @@ #define N_AX25 5 #define N_X25 6 /* X.25 async */ #define N_6PACK 7 +#define N_MASC 8 /* Reserved fo Mobitex module */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.1.105/linux/include/asm-i386/unistd.h linux/include/asm-i386/unistd.h --- v2.1.105/linux/include/asm-i386/unistd.h Thu May 7 22:51:54 1998 +++ linux/include/asm-i386/unistd.h Tue Jun 9 00:55:10 1998 @@ -191,6 +191,7 @@ #define __NR_getcwd 183 #define __NR_capget 184 #define __NR_capset 185 +#define __NR_sigaltstack 186 /* user-visible error numbers are in the range -1 - -122: see */ diff -u --recursive --new-file v2.1.105/linux/include/asm-m68k/amifd.h linux/include/asm-m68k/amifd.h --- v2.1.105/linux/include/asm-m68k/amifd.h Thu Mar 26 15:57:05 1998 +++ linux/include/asm-m68k/amifd.h Wed Dec 31 16:00:00 1969 @@ -1,61 +0,0 @@ -#ifndef _ASM_M68K_AMIFD_H -#define _ASM_M68K_AMIFD_H - -/* Definitions for the Amiga floppy driver */ - -#include - -#define FD_MAX_UNITS 4 /* Max. Number of drives */ -#define FLOPPY_MAX_SECTORS 22 /* Max. Number of sectors per track */ - -#ifndef ASSEMBLER - -struct fd_data_type { - char *name; /* description of data type */ - int sects; /* sectors per track */ -#ifdef __STDC__ - int (*read_fkt)(int); - void (*write_fkt)(int); -#else - int (*read_fkt)(); /* read whole track */ - void (*write_fkt)(); /* write whole track */ -#endif -}; - -/* -** Floppy type descriptions -*/ - -struct fd_drive_type { - unsigned long code; /* code returned from drive */ - char *name; /* description of drive */ - unsigned int tracks; /* number of tracks */ - unsigned int heads; /* number of heads */ - unsigned int read_size; /* raw read size for one track */ - unsigned int write_size; /* raw write size for one track */ - unsigned int sect_mult; /* sectors and gap multiplier (HD = 2) */ - unsigned int precomp1; /* start track for precomp 1 */ - unsigned int precomp2; /* start track for precomp 2 */ - unsigned int step_delay; /* time (in ms) for delay after step */ - unsigned int settle_time; /* time to settle after dir change */ - unsigned int side_time; /* time needed to change sides */ -}; - -struct amiga_floppy_struct { - struct fd_drive_type *type; /* type of floppy for this unit */ - struct fd_data_type *dtype; /* type of floppy for this unit */ - int track; /* current track (-1 == unknown) */ - unsigned char *trackbuf; /* current track (kmaloc()'d */ - - int blocks; /* total # blocks on disk */ - - int changed; /* true when not known */ - int disk; /* disk in drive (-1 == unknown) */ - int motor; /* true when motor is at speed */ - int busy; /* true when drive is active */ - int dirty; /* true when trackbuf is not on disk */ - int status; /* current error code for unit */ -}; -#endif - -#endif diff -u --recursive --new-file v2.1.105/linux/include/asm-m68k/amifdreg.h linux/include/asm-m68k/amifdreg.h --- v2.1.105/linux/include/asm-m68k/amifdreg.h Wed Dec 27 12:46:43 1995 +++ linux/include/asm-m68k/amifdreg.h Wed Dec 31 16:00:00 1969 @@ -1,81 +0,0 @@ -#ifndef _LINUX_AMIFDREG_H -#define _LINUX_AMIFDREG_H - -/* -** CIAAPRA bits (read only) -*/ - -#define DSKRDY (0x1<<5) /* disk ready when low */ -#define DSKTRACK0 (0x1<<4) /* head at track zero when low */ -#define DSKPROT (0x1<<3) /* disk protected when low */ -#define DSKCHANGE (0x1<<2) /* low when disk removed */ - -/* -** CIAAPRB bits (read/write) -*/ - -#define DSKMOTOR (0x1<<7) /* motor on when low */ -#define DSKSEL3 (0x1<<6) /* select drive 3 when low */ -#define DSKSEL2 (0x1<<5) /* select drive 2 when low */ -#define DSKSEL1 (0x1<<4) /* select drive 1 when low */ -#define DSKSEL0 (0x1<<3) /* select drive 0 when low */ -#define DSKSIDE (0x1<<2) /* side selection: 0 = upper, 1 = lower */ -#define DSKDIREC (0x1<<1) /* step direction: 0=in, 1=out (to trk 0) */ -#define DSKSTEP (0x1) /* pulse low to step head 1 track */ - -/* -** DSKBYTR bits (read only) -*/ - -#define DSKBYT (1<<15) /* register contains valid byte when set */ -#define DMAON (1<<14) /* disk DMA enabled */ -#define DISKWRITE (1<<13) /* disk write bit in DSKLEN enabled */ -#define WORDEQUAL (1<<12) /* DSKSYNC register match when true */ -/* bits 7-0 are data */ - -/* -** ADKCON/ADKCONR bits -*/ - -#ifndef SETCLR -#define ADK_SETCLR (1<<15) /* control bit */ -#endif -#define ADK_PRECOMP1 (1<<14) /* precompensation selection */ -#define ADK_PRECOMP0 (1<<13) /* 00=none, 01=140ns, 10=280ns, 11=500ns */ -#define ADK_MFMPREC (1<<12) /* 0=GCR precomp., 1=MFM precomp. */ -#define ADK_WORDSYNC (1<<10) /* enable DSKSYNC auto DMA */ -#define ADK_MSBSYNC (1<<9) /* when 1, enable sync on MSbit (for GCR) */ -#define ADK_FAST (1<<8) /* bit cell: 0=2us (GCR), 1=1us (MFM) */ - -/* -** DSKLEN bits -*/ - -#define DSKLEN_DMAEN (1<<15) -#define DSKLEN_WRITE (1<<14) - -/* -** INTENA/INTREQ bits -*/ - -#define DSKINDEX (0x1<<4) /* DSKINDEX bit */ - -/* -** Misc -*/ - -#define MFM_SYNC 0x4489 /* standard MFM sync value */ - -/* Values for FD_COMMAND */ -#define FD_RECALIBRATE 0x07 /* move to track 0 */ -#define FD_SEEK 0x0F /* seek track */ -#define FD_READ 0xE6 /* read with MT, MFM, SKip deleted */ -#define FD_WRITE 0xC5 /* write with MT, MFM */ -#define FD_SENSEI 0x08 /* Sense Interrupt Status */ -#define FD_SPECIFY 0x03 /* specify HUT etc */ -#define FD_FORMAT 0x4D /* format one track */ -#define FD_VERSION 0x10 /* get version code */ -#define FD_CONFIGURE 0x13 /* configure FIFO operation */ -#define FD_PERPENDICULAR 0x12 /* perpendicular r/w mode */ - -#endif /* _LINUX_AMIFDREG_H */ diff -u --recursive --new-file v2.1.105/linux/include/asm-m68k/amigardb.h linux/include/asm-m68k/amigardb.h --- v2.1.105/linux/include/asm-m68k/amigardb.h Wed Dec 27 12:46:44 1995 +++ linux/include/asm-m68k/amigardb.h Wed Dec 31 16:00:00 1969 @@ -1,126 +0,0 @@ -#ifndef _LINUX_AMIGARDB_H -#define _LINUX_AMIGARDB_H 1 - -#define ULONG u_long -#define LONG long -#define UBYTE u_char - -/* definitions for the Amiga RigidDiskBlock layout, which always starts in - cylinder 0 of a medium. Taken from page 254f of the RKM: Devices */ - -struct RigidDiskBlock { - ULONG rdb_ID; /* 4 character identifier */ - ULONG rdb_SummedLongs; /* size of this checksummed structure */ - LONG rdb_ChkSum; /* block checksum (longword sum to zero) */ - ULONG rdb_HostID; /* SCSI Target ID of host */ - ULONG rdb_BlockBytes; /* size of disk blocks */ - ULONG rdb_Flags; /* see below for defines */ - /* block list heads */ - ULONG rdb_BadBlockList; /* optional bad block list */ - ULONG rdb_PartitionList; /* optional first partition block */ - ULONG rdb_FileSysHeaderList; /* optional file system header block */ - ULONG rdb_DriveInit; /* optional drive-specific init code */ - /* DriveInit(lun,rdb,ior): "C" stk & d0/a0/a1 */ - ULONG rdb_Reserved1[6]; /* set to $ffffffff */ - /* physical drive characteristics */ - ULONG rdb_Cylinders; /* number of drive cylinders */ - ULONG rdb_Sectors; /* sectors per track */ - ULONG rdb_Heads; /* number of drive heads */ - ULONG rdb_Interleave; /* interleave */ - ULONG rdb_Park; /* landing zone cylinder */ - ULONG rdb_Reserved2[3]; - ULONG rdb_WritePreComp; /* starting cylinder: write precompensation */ - ULONG rdb_ReducedWrite; /* starting cylinder: reduced write current */ - ULONG rdb_StepRate; /* drive step rate */ - ULONG rdb_Reserved3[5]; - /* logical drive characteristics */ - ULONG rdb_RDBBlocksLo; /* low block of range reserved for hardblocks */ - ULONG rdb_RDBBlocksHi; /* high block of range for these hardblocks */ - ULONG rdb_LoCylinder; /* low cylinder of partitionable disk area */ - ULONG rdb_HiCylinder; /* high cylinder of partitionable data area */ - ULONG rdb_CylBlocks; /* number of blocks available per cylinder */ - ULONG rdb_AutoParkSeconds; /* zero for no auto park */ - ULONG rdb_HighRDSKBlock; /* highest block used by RDSK */ - /* (not including replacement bad blocks) */ - ULONG rdb_Reserved4; - /* drive identification */ - char rdb_DiskVendor[8]; - char rdb_DiskProduct[16]; - char rdb_DiskRevision[4]; - char rdb_ControllerVendor[8]; - char rdb_ControllerProduct[16]; - char rdb_ControllerRevision[4]; - ULONG rdb_Reserved5[10]; -}; - -#define IDNAME_RIGIDDISK 0x5244534B /* 'RDSK' */ - -#define RDB_LOCATION_LIMIT 16 - -#define RDBFB_LAST 0 /* no disks exist to be configured after */ -#define RDBFF_LAST 0x01L /* this one on this controller */ -#define RDBFB_LASTLUN 1 /* no LUNs exist to be configured greater */ -#define RDBFF_LASTLUN 0x02L /* than this one at this SCSI Target ID */ -#define RDBFB_LASTTID 2 /* no Target IDs exist to be configured */ -#define RDBFF_LASTTID 0x04L /* greater than this one on this SCSI bus */ -#define RDBFB_NORESELECT 3 /* don't bother trying to perform reselection */ -#define RDBFF_NORESELECT 0x08L /* when talking to this drive */ -#define RDBFB_DISKID 4 /* rdb_Disk... identification valid */ -#define RDBFF_DISKID 0x10L -#define RDBFB_CTRLRID 5 /* rdb_Controller... identification valid */ -#define RDBFF_CTRLRID 0x20L - /* added 7/20/89 by commodore: */ -#define RDBFB_SYNCH 6 /* drive supports scsi synchronous mode */ -#define RDBFF_SYNCH 0x40L /* CAN BE DANGEROUS TO USE IF IT DOESN'T! */ - -struct PartitionBlock { - ULONG pb_ID; /* 4 character identifier */ - ULONG pb_SummedLongs; /* size of this checksummed structure */ - LONG pb_ChkSum; /* block checksum (longword sum to zero) */ - ULONG pb_HostID; /* SCSI Target ID of host */ - ULONG pb_Next; /* block number of the next PartitionBlock */ - ULONG pb_Flags; /* see below for defines */ - ULONG pb_Reserved1[2]; - ULONG pb_DevFlags; /* preferred flags for OpenDevice */ - UBYTE pb_DriveName[32]; /* preferred DOS device name: BSTR form */ - /* (not used if this name is in use) */ - ULONG pb_Reserved2[15]; /* filler to 32 longwords */ - ULONG pb_Environment[17]; /* environment vector for this partition */ - ULONG pb_EReserved[15]; /* reserved for future environment vector */ -}; - -#define IDNAME_PARTITION 0x50415254 /* 'PART' */ - -#define PBFB_BOOTABLE 0 /* this partition is intended to be bootable */ -#define PBFF_BOOTABLE 1L /* (expected directories and files exist) */ -#define PBFB_NOMOUNT 1 /* do not mount this partition (e.g. manually */ -#define PBFF_NOMOUNT 2L /* mounted, but space reserved here) */ - -/* this is from */ - -#define DE_TABLESIZE 0 /* minimum value is 11 (includes NumBuffers) */ -#define DE_SIZEBLOCK 1 /* in longwords: standard value is 128 */ -#define DE_SECORG 2 /* not used; must be 0 */ -#define DE_NUMHEADS 3 /* # of heads (surfaces). drive specific */ -#define DE_SECSPERBLK 4 /* not used; must be 1 */ -#define DE_BLKSPERTRACK 5 /* blocks per track. drive specific */ -#define DE_RESERVEDBLKS 6 /* unavailable blocks at start. usually 2 */ -#define DE_PREFAC 7 /* not used; must be 0 */ -#define DE_INTERLEAVE 8 /* usually 0 */ -#define DE_LOWCYL 9 /* starting cylinder. typically 0 */ -#define DE_UPPERCYL 10 /* max cylinder. drive specific */ -#define DE_NUMBUFFERS 11 /* starting # of buffers. typically 5 */ -#define DE_MEMBUFTYPE 12 /* type of mem to allocate for buffers. */ -#define DE_BUFMEMTYPE 12 /* same as above, better name - * 1 is public, 3 is chip, 5 is fast */ -#define DE_MAXTRANSFER 13 /* Max number bytes to transfer at a time */ -#define DE_MASK 14 /* Address Mask to block out certain memory */ -#define DE_BOOTPRI 15 /* Boot priority for autoboot */ -#define DE_DOSTYPE 16 /* ASCII (HEX) string showing filesystem type; - * 0X444F5300 is old filesystem, - * 0X444F5301 is fast file system */ -#define DE_BAUD 17 /* Baud rate for serial handler */ -#define DE_CONTROL 18 /* Control word for handler/filesystem */ -#define DE_BOOTBLOCKS 19 /* Number of blocks containing boot code */ - -#endif /* _LINUX_AMIGARDB_H */ diff -u --recursive --new-file v2.1.105/linux/include/linux/if_ether.h linux/include/linux/if_ether.h --- v2.1.105/linux/include/linux/if_ether.h Sun Feb 2 05:18:47 1997 +++ linux/include/linux/if_ether.h Mon Jun 8 10:02:35 1998 @@ -72,6 +72,7 @@ #define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ #define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ #define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ +#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ /* * This is an Ethernet frame header. diff -u --recursive --new-file v2.1.105/linux/include/linux/mm.h linux/include/linux/mm.h --- v2.1.105/linux/include/linux/mm.h Wed Apr 8 19:36:29 1998 +++ linux/include/linux/mm.h Tue Jun 9 10:14:42 1998 @@ -299,13 +299,14 @@ /* mmap.c */ extern void vma_init(void); -extern unsigned long do_mmap(struct file * file, unsigned long addr, unsigned long len, - unsigned long prot, unsigned long flags, unsigned long off); extern void merge_segments(struct mm_struct *, unsigned long, unsigned long); extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *); extern void exit_mmap(struct mm_struct *); -extern int do_munmap(unsigned long, size_t); extern unsigned long get_unmapped_area(unsigned long, unsigned long); + +extern unsigned long do_mmap(struct file *, unsigned long, unsigned long, + unsigned long, unsigned long, unsigned long); +extern int do_munmap(unsigned long, size_t); /* filemap.c */ extern unsigned long page_unuse(unsigned long); diff -u --recursive --new-file v2.1.105/linux/include/linux/sched.h linux/include/linux/sched.h --- v2.1.105/linux/include/linux/sched.h Sun Jun 7 11:16:39 1998 +++ linux/include/linux/sched.h Tue Jun 9 10:14:35 1998 @@ -284,6 +284,8 @@ struct signal_struct *sig; sigset_t signal, blocked; struct signal_queue *sigqueue, **sigqueue_tail; + unsigned long sas_ss_sp; + size_t sas_ss_size; /* SMP state */ int has_cpu; int processor; @@ -365,6 +367,7 @@ /* files */ &init_files, \ /* mm */ &init_mm, \ /* signals */ &init_signals, {{0}}, {{0}}, NULL, &init_task.sigqueue, \ + 0, 0, \ /* SMP */ 0,0,0,0, \ /* locks */ INIT_LOCKS \ } @@ -480,6 +483,7 @@ extern int kill_proc(pid_t, int, int); extern int do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact); +extern int do_sigaltstack(const stack_t *ss, stack_t *oss, unsigned long sp); extern inline int signal_pending(struct task_struct *p) { @@ -517,6 +521,19 @@ t->sigpending = (ready != 0); } +/* True if we are on the alternate signal stack. */ + +static inline int on_sig_stack(unsigned long sp) +{ + return (sp >= current->sas_ss_sp + && sp < current->sas_ss_sp + current->sas_ss_size); +} + +static inline int sas_ss_flags(unsigned long sp) +{ + return (current->sas_ss_size == 0 ? SS_DISABLE + : on_sig_stack(sp) ? SS_ONSTACK : 0); +} extern int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), diff -u --recursive --new-file v2.1.105/linux/include/linux/zorro.h linux/include/linux/zorro.h --- v2.1.105/linux/include/linux/zorro.h Sun Jun 7 11:16:39 1998 +++ linux/include/linux/zorro.h Mon Jun 8 11:03:50 1998 @@ -87,7 +87,7 @@ #define ZORRO_ID(manuf, prod, epc) \ ((ZORRO_MANUF_##manuf << 16) | ((prod) << 8) | (epc)) -typedef u32 zorro_id; +typedef __u32 zorro_id; #define ZORRO_MANUF_PACIFIC_PERIPHERALS 0x00D3 @@ -462,6 +462,9 @@ #define ZORRO_MANUF_ARMAX 0x0885 #define ZORRO_PROD_ARMAX_OMNIBUS ZORRO_ID(ARMAX, 0x00, 0) +#define ZORRO_MANUF_ZEUS 0x088d +#define ZORRO_PROD_ZEUS_SPIDER ZORRO_ID(ZEUS, 0x04, 0) + #define ZORRO_MANUF_NEWTEK 0x088F #define ZORRO_PROD_NEWTEK_VIDEOTOASTER ZORRO_ID(NEWTEK, 0x00, 0) @@ -558,6 +561,7 @@ #define ZORRO_PROD_PHASE5_CYBERVISION64_3D_PROTOTYPE ZORRO_ID(PHASE5, 0x32, 0) #define ZORRO_PROD_PHASE5_CYBERVISION64_3D ZORRO_ID(PHASE5, 0x43, 0) #define ZORRO_PROD_PHASE5_CYBERSTORM_MK_III ZORRO_ID(PHASE5, 0x64, 0) +#define ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS ZORRO_ID(PHASE5, 0x6e, 0) #define ZORRO_MANUF_DPS 0x2169 #define ZORRO_PROD_DPS_PERSONAL_ANIMATION_RECORDER ZORRO_ID(DPS, 0x01, 0) @@ -576,6 +580,9 @@ #define ZORRO_MANUF_UWE_GERLACH 0x3FF7 #define ZORRO_PROD_UWE_GERLACH_RAM_ROM ZORRO_ID(UWE_GERLACH, 0xd4, 0) + +#define ZORRO_MANUF_ACT 0x4231 +#define ZORRO_PROD_ACT_PRELUDE ZORRO_ID(ACT, 0x01, 0) #define ZORRO_MANUF_MACROSYSTEMS_GERMANY 0x4754 #define ZORRO_PROD_MACROSYSTEMS_MAESTRO ZORRO_ID(MACROSYSTEMS_GERMANY, 0x03, 0) diff -u --recursive --new-file v2.1.105/linux/init/main.c linux/init/main.c --- v2.1.105/linux/init/main.c Tue Jun 9 11:57:31 1998 +++ linux/init/main.c Tue Jun 9 01:21:49 1998 @@ -378,6 +378,17 @@ { "sdc", 0x0820 }, { "sdd", 0x0830 }, { "sde", 0x0840 }, + { "sdf", 0x0850 }, + { "sdg", 0x0860 }, + { "sdh", 0x0870 }, + { "sdi", 0x0880 }, + { "sdj", 0x0890 }, + { "sdk", 0x08a0 }, + { "sdl", 0x08b0 }, + { "sdm", 0x08c0 }, + { "sdn", 0x08d0 }, + { "sdo", 0x08e0 }, + { "sdp", 0x08f0 }, #endif #ifdef CONFIG_ATARI_ACSI { "ada", 0x1c00 }, @@ -667,7 +678,7 @@ #ifdef CONFIG_ISP16_CDI { "isp16=", isp16_setup }, #endif CONFIG_ISP16_CDI -#ifdef CONFIG_SOUND +#ifdef CONFIG_SOUND_OSS { "sound=", sound_setup }, #endif #ifdef CONFIG_ISDN_DRV_ICN diff -u --recursive --new-file v2.1.105/linux/ipc/shm.c linux/ipc/shm.c --- v2.1.105/linux/ipc/shm.c Thu May 7 22:51:55 1998 +++ linux/ipc/shm.c Tue Jun 9 10:34:33 1998 @@ -136,6 +136,7 @@ struct shmid_ds *shp; int err, id = 0; + down(¤t->mm->mmap_sem); lock_kernel(); if (size < 0 || size > SHMMAX) { err = -EINVAL; @@ -160,6 +161,7 @@ err = (int) shp->shm_perm.seq * SHMMNI + id; } unlock_kernel(); + up(¤t->mm->mmap_sem); return err; } @@ -484,6 +486,7 @@ unsigned long addr; unsigned long len; + down(¤t->mm->mmap_sem); lock_kernel(); if (shmid < 0) { /* printk("shmat() -> EINVAL because shmid = %d < 0\n",shmid); */ @@ -584,6 +587,7 @@ err = 0; out: unlock_kernel(); + up(¤t->mm->mmap_sem); return err; } @@ -634,6 +638,7 @@ { struct vm_area_struct *shmd, *shmdnext; + down(¤t->mm->mmap_sem); lock_kernel(); for (shmd = current->mm->mmap; shmd; shmd = shmdnext) { shmdnext = shmd->vm_next; @@ -642,6 +647,7 @@ do_munmap(shmd->vm_start, shmd->vm_end - shmd->vm_start); } unlock_kernel(); + up(¤t->mm->mmap_sem); return 0; } diff -u --recursive --new-file v2.1.105/linux/kernel/fork.c linux/kernel/fork.c --- v2.1.105/linux/kernel/fork.c Thu May 7 22:51:55 1998 +++ linux/kernel/fork.c Tue Jun 9 10:37:17 1998 @@ -204,7 +204,6 @@ int retval; flush_cache_mm(current->mm); - down(¤t->mm->mmap_sem); pprev = &mm->mmap; for (mpnt = current->mm->mmap ; mpnt ; mpnt = mpnt->vm_next) { struct file *file; @@ -254,7 +253,6 @@ fail_nomem: flush_tlb_mm(current->mm); - up(¤t->mm->mmap_sem); return retval; } @@ -466,6 +464,7 @@ int error = -ENOMEM; struct task_struct *p; + down(¤t->mm->mmap_sem); lock_kernel(); p = alloc_task_struct(); if (!p) @@ -570,6 +569,7 @@ ++total_forks; error = p->pid; bad_fork: + up(¤t->mm->mmap_sem); unlock_kernel(); return error; diff -u --recursive --new-file v2.1.105/linux/kernel/kmod.c linux/kernel/kmod.c --- v2.1.105/linux/kernel/kmod.c Tue Jun 9 11:57:31 1998 +++ linux/kernel/kmod.c Tue Jun 9 01:21:50 1998 @@ -93,6 +93,13 @@ int pid; int waitpid_result; + /* Don't allow request_mode() before the root fs is mounted! */ + if ( ! current->fs->root ) { + printk(KERN_ERR "request_module[%s]: Root fs not mounted\n", + module_name); + return -EPERM; + } + pid = kernel_thread(exec_modprobe, (void*) module_name, CLONE_FS); if (pid < 0) { printk(KERN_ERR "kmod: fork failed, errno %d\n", -pid); diff -u --recursive --new-file v2.1.105/linux/kernel/signal.c linux/kernel/signal.c --- v2.1.105/linux/kernel/signal.c Thu May 7 22:51:55 1998 +++ linux/kernel/signal.c Tue Jun 9 10:14:12 1998 @@ -840,6 +840,62 @@ return 0; } +int +do_sigaltstack (const stack_t *uss, stack_t *uoss, unsigned long sp) +{ + stack_t oss; + int error; + + if (uoss) { + oss.ss_sp = (void *) current->sas_ss_sp; + oss.ss_size = current->sas_ss_size; + oss.ss_flags = sas_ss_flags(sp); + } + + if (uss) { + void *ss_sp; + size_t ss_size; + int ss_flags; + + error = -EFAULT; + if (verify_area(VERIFY_READ, uss, sizeof(*uss)) + || __get_user(ss_sp, &uss->ss_sp) + || __get_user(ss_flags, &uss->ss_flags) + || __get_user(ss_size, &uss->ss_size)) + goto out; + + error = -EPERM; + if (on_sig_stack (sp)) + goto out; + + error = -EINVAL; + if (ss_flags & ~SS_DISABLE) + goto out; + + if (ss_flags & SS_DISABLE) { + ss_size = 0; + ss_sp = NULL; + } else { + error = -ENOMEM; + if (ss_size < MINSIGSTKSZ) + goto out; + } + + current->sas_ss_sp = (unsigned long) ss_sp; + current->sas_ss_size = ss_size; + } + + if (uoss) { + error = -EFAULT; + if (copy_to_user(uoss, &oss, sizeof(oss))) + goto out; + } + + error = 0; +out: + return error; +} + #if !defined(__alpha__) /* Alpha has its own versions with special arguments. */ @@ -908,6 +964,7 @@ return error; } +#ifndef __sparc__ asmlinkage int sys_rt_sigaction(int sig, const struct sigaction *act, struct sigaction *oact, size_t sigsetsize) @@ -933,6 +990,7 @@ out: return ret; } +#endif /* __sparc__ */ #endif #if !defined(__alpha__) diff -u --recursive --new-file v2.1.105/linux/mm/filemap.c linux/mm/filemap.c --- v2.1.105/linux/mm/filemap.c Thu Mar 26 15:57:06 1998 +++ linux/mm/filemap.c Tue Jun 9 10:34:03 1998 @@ -1256,6 +1256,7 @@ struct vm_area_struct * vma; int unmapped_error, error = -EINVAL; + down(¤t->mm->mmap_sem); lock_kernel(); if (start & ~PAGE_MASK) goto out; @@ -1303,6 +1304,7 @@ } out: unlock_kernel(); + up(¤t->mm->mmap_sem); return error; } diff -u --recursive --new-file v2.1.105/linux/mm/memory.c linux/mm/memory.c --- v2.1.105/linux/mm/memory.c Tue Mar 10 10:03:36 1998 +++ linux/mm/memory.c Tue Jun 9 16:03:20 1998 @@ -895,6 +895,9 @@ do_wp_page(tsk, vma, address, write_access, pte); } +/* + * By the time we get here, we already hold the mm semaphore + */ void handle_mm_fault(struct task_struct *tsk, struct vm_area_struct * vma, unsigned long address, int write_access) { @@ -909,7 +912,9 @@ pte = pte_alloc(pmd, address); if (!pte) goto no_memory; + lock_kernel(); handle_pte_fault(tsk, vma, address, write_access, pte); + unlock_kernel(); update_mmu_cache(vma, address, *pte); return; no_memory: diff -u --recursive --new-file v2.1.105/linux/mm/mlock.c linux/mm/mlock.c --- v2.1.105/linux/mm/mlock.c Fri May 8 23:14:57 1998 +++ linux/mm/mlock.c Tue Jun 9 11:10:20 1998 @@ -127,13 +127,25 @@ pages = -pages; vma->vm_mm->locked_vm += pages; - if (newflags & VM_LOCKED) +#if 0 +/* + * This is horribly broken. See the comment on the same + * brokenness in mm/mmap.c (essentially, this doesn't + * work anyway for PROT_NONE and writable pages, and now + * that we properly get the mmap semaphore it would just + * lock up on us). + * + * Fix the same way. + */ + if (newflags & VM_LOCKED) { while (start < end) { int c; get_user(c,(int *) start); __asm__ __volatile__("": :"r" (c)); start += PAGE_SIZE; } + } +#endif } return retval; } @@ -192,6 +204,7 @@ unsigned long lock_limit; int error = -ENOMEM; + down(¤t->mm->mmap_sem); lock_kernel(); len = (len + (start & ~PAGE_MASK) + ~PAGE_MASK) & PAGE_MASK; start &= PAGE_MASK; @@ -214,6 +227,7 @@ error = do_mlock(start, len, 1); out: unlock_kernel(); + up(¤t->mm->mmap_sem); return error; } @@ -221,11 +235,13 @@ { int ret; + down(¤t->mm->mmap_sem); lock_kernel(); len = (len + (start & ~PAGE_MASK) + ~PAGE_MASK) & PAGE_MASK; start &= PAGE_MASK; ret = do_mlock(start, len, 0); unlock_kernel(); + up(¤t->mm->mmap_sem); return ret; } @@ -263,6 +279,7 @@ unsigned long lock_limit; int ret = -EINVAL; + down(¤t->mm->mmap_sem); lock_kernel(); if (!flags || (flags & ~(MCL_CURRENT | MCL_FUTURE))) goto out; @@ -282,6 +299,7 @@ ret = do_mlockall(flags); out: unlock_kernel(); + up(¤t->mm->mmap_sem); return ret; } @@ -289,8 +307,10 @@ { int ret; + down(¤t->mm->mmap_sem); lock_kernel(); ret = do_mlockall(0); unlock_kernel(); + up(¤t->mm->mmap_sem); return ret; } diff -u --recursive --new-file v2.1.105/linux/mm/mmap.c linux/mm/mmap.c --- v2.1.105/linux/mm/mmap.c Tue Mar 10 10:03:36 1998 +++ linux/mm/mmap.c Tue Jun 9 10:32:57 1998 @@ -92,6 +92,7 @@ unsigned long newbrk, oldbrk; struct mm_struct *mm = current->mm; + down(&mm->mmap_sem); lock_kernel(); if (brk < mm->end_code) goto out; @@ -132,6 +133,7 @@ out: retval = mm->brk; unlock_kernel(); + up(&mm->mmap_sem); return retval; } @@ -316,9 +318,21 @@ merge_segments(mm, vma->vm_start, vma->vm_end); mm->total_vm += len >> PAGE_SHIFT; - if ((flags & VM_LOCKED) && !(flags & VM_IO)) { - unsigned long start = addr; + if (flags & VM_LOCKED) { mm->locked_vm += len >> PAGE_SHIFT; + +/* + * This used to be just slightly broken, now it's just completely + * buggered. We can't take a page fault here, because we already + * hold the mm semaphore (as is proper). We should do this by hand + * by calling the appropriate fault-in routine. + * + * That would also fix this routine wrt writes and PROT_NONE + * areas, both of which can't be handled by the page fault + * approach anyway. + */ +#if 0 + unsigned long start = addr; do { char c; get_user(c,(char *) start); @@ -326,6 +340,7 @@ start += PAGE_SIZE; __asm__ __volatile__("": :"r" (c)); } while (len > 0); +#endif } return addr; @@ -442,16 +457,6 @@ return 1; } -asmlinkage int sys_munmap(unsigned long addr, size_t len) -{ - int ret; - - lock_kernel(); - ret = do_munmap(addr, len); - unlock_kernel(); - return ret; -} - /* Munmap is split into 2 main parts -- this part which finds * what needs doing, and the areas themselves, which do the * work. This now handles partial unmappings. @@ -555,6 +560,18 @@ return 0; } +asmlinkage int sys_munmap(unsigned long addr, size_t len) +{ + int ret; + + down(¤t->mm->mmap_sem); + lock_kernel(); + ret = do_munmap(addr, len); + unlock_kernel(); + up(¤t->mm->mmap_sem); + return ret; +} + /* Release all mmaps. */ void exit_mmap(struct mm_struct * mm) { @@ -630,13 +647,13 @@ * This assumes that the list is ordered by address. * We don't need to traverse the entire list, only those segments * which intersect or are adjacent to a given interval. + * + * We must already hold the mm semaphore when we get here.. */ void merge_segments (struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr) { struct vm_area_struct *prev, *mpnt, *next; - down(&mm->mmap_sem); - prev = NULL; mpnt = mm->mmap; while(mpnt && mpnt->vm_end <= start_addr) { @@ -644,7 +661,7 @@ mpnt = mpnt->vm_next; } if (!mpnt) - goto no_vma; + return; next = mpnt->vm_next; @@ -700,8 +717,6 @@ mpnt = prev; } mm->mmap_cache = NULL; /* Kill the cache. */ -no_vma: - up(&mm->mmap_sem); } __initfunc(void vma_init(void)) diff -u --recursive --new-file v2.1.105/linux/mm/mprotect.c linux/mm/mprotect.c --- v2.1.105/linux/mm/mprotect.c Thu Mar 26 15:57:06 1998 +++ linux/mm/mprotect.c Tue Jun 9 10:33:10 1998 @@ -208,18 +208,20 @@ struct vm_area_struct * vma, * next; int error = -EINVAL; - lock_kernel(); if (start & ~PAGE_MASK) - goto out; + return -EINVAL; len = (len + ~PAGE_MASK) & PAGE_MASK; end = start + len; if (end < start) - goto out; + return -EINVAL; if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) - goto out; - error = 0; + return -EINVAL; if (end == start) - goto out; + return 0; + + down(¤t->mm->mmap_sem); + lock_kernel(); + vma = find_vma(current->mm, start); error = -EFAULT; if (!vma || vma->vm_start > start) @@ -256,5 +258,6 @@ merge_segments(current->mm, start, end); out: unlock_kernel(); + up(¤t->mm->mmap_sem); return error; } diff -u --recursive --new-file v2.1.105/linux/mm/mremap.c linux/mm/mremap.c --- v2.1.105/linux/mm/mremap.c Tue Mar 10 10:03:36 1998 +++ linux/mm/mremap.c Tue Jun 9 10:33:20 1998 @@ -167,6 +167,7 @@ struct vm_area_struct *vma; unsigned long ret = -EINVAL; + down(¤t->mm->mmap_sem); lock_kernel(); if (addr & ~PAGE_MASK) goto out; @@ -233,5 +234,6 @@ ret = -ENOMEM; out: unlock_kernel(); + up(¤t->mm->mmap_sem); return ret; } diff -u --recursive --new-file v2.1.105/linux/net/Config.in linux/net/Config.in --- v2.1.105/linux/net/Config.in Sat May 2 14:19:54 1998 +++ linux/net/Config.in Mon Jun 8 10:02:34 1998 @@ -56,7 +56,7 @@ if [ "$CONFIG_NET_SCHED" = "y" ]; then source net/sched/Config.in fi - bool 'Network code profiler' CONFIG_NET_PROFILE +# bool 'Network code profiler' CONFIG_NET_PROFILE fi fi endmenu diff -u --recursive --new-file v2.1.105/linux/net/core/profile.c linux/net/core/profile.c --- v2.1.105/linux/net/core/profile.c Thu Feb 12 20:56:14 1998 +++ linux/net/core/profile.c Mon Jun 8 10:02:34 1998 @@ -277,7 +277,7 @@ printk("Evaluating net profiler cost ..."); #if CPU == 586 || CPU == 686 if (!(boot_cpu_data.x86_capability & 16)) { - panic("Sorry, you CPU does not support tsc. I am dying...\n"); + printk(KERN_ERR "Sorry, you CPU does not support tsc. Net profiler is dying...\n"); return -1; } #endif diff -u --recursive --new-file v2.1.105/linux/net/unix/af_unix.c linux/net/unix/af_unix.c --- v2.1.105/linux/net/unix/af_unix.c Fri May 8 23:14:58 1998 +++ linux/net/unix/af_unix.c Tue Jun 9 01:21:50 1998 @@ -86,6 +86,7 @@ #include #include #include +#include #include @@ -100,6 +101,8 @@ #define UNIX_ABSTRACT(sk) ((sk)->protinfo.af_unix.addr->hash!=UNIX_HASH_SIZE) +static void unix_destroy_socket(unix_socket *sk); + extern __inline__ unsigned unix_hash_fold(unsigned hash) { hash ^= hash>>16; @@ -127,7 +130,7 @@ extern __inline__ int unix_unlock(unix_socket *sk) { - return sk->sock_readers--; + return --sk->sock_readers; } extern __inline__ int unix_locked(unix_socket *sk) @@ -254,6 +257,10 @@ if(!unix_locked(sk) && atomic_read(&sk->wmem_alloc) == 0) { sk_free(sk); + unix_remove_socket(sk); + + /* socket destroyed, decrement count */ + MOD_DEC_USE_COUNT; return; } @@ -273,28 +280,56 @@ sk->timer.function=unix_destroy_timer; add_timer(&sk->timer); } + +static int unix_release_sock (unix_socket *sk) +{ + unix_socket *skpair; + + sk->state_change(sk); + sk->dead=1; + sk->socket = NULL; + + skpair=unix_peer(sk); + + /* Try to flush out this socket. Throw out buffers at least */ + unix_destroy_socket(sk); + + if (skpair!=NULL) + { + if (sk->type==SOCK_STREAM && unix_our_peer(sk, skpair)) + { + skpair->state_change(skpair); + skpair->shutdown=SHUTDOWN_MASK; /* No more writes*/ + } + unix_unlock(skpair); /* It may now die */ + } + + /* + * Fixme: BSD difference: In BSD all sockets connected to use get + * ECONNRESET and we die on the spot. In Linux we behave + * like files and pipes do and wait for the last + * dereference. + * + * Can't we simply set sock->err? + */ + + unix_gc(); /* Garbage collect fds */ + return 0; +} static void unix_destroy_socket(unix_socket *sk) { struct sk_buff *skb; - unix_remove_socket(sk); - while((skb=skb_dequeue(&sk->receive_queue))!=NULL) { if(sk->state==TCP_LISTEN) { - unix_socket *osk=skb->sk; - osk->state=TCP_CLOSE; - kfree_skb(skb); /* Now surplus - free the skb first before the socket */ - osk->state_change(osk); /* So the connect wakes and cleans up (if any) */ - /* osk will be destroyed when it gets to close or the timer fires */ - } - else - { - /* passed fds are erased in the kfree_skb hook */ - kfree_skb(skb); + unix_unlock(sk); + unix_release_sock(skb->sk); } + /* passed fds are erased in the kfree_skb hook */ + kfree_skb(skb); } if(sk->protinfo.af_unix.dentry!=NULL) @@ -306,15 +341,18 @@ if(!unix_unlock(sk) && atomic_read(&sk->wmem_alloc) == 0) { sk_free(sk); + unix_remove_socket(sk); + + /* socket destroyed, decrement count */ + MOD_DEC_USE_COUNT; } else { + sk->state=TCP_CLOSE; sk->dead=1; unix_delayed_delete(sk); /* Try every so often until buffers are all freed */ } - /* socket destroyed, decrement count */ - MOD_DEC_USE_COUNT; } static int unix_listen(struct socket *sock, int backlog) @@ -332,23 +370,29 @@ sk->state_change(sk); sk->state=TCP_LISTEN; sock->flags |= SO_ACCEPTCON; + /* set credentials so connect can copy them */ + sk->peercred.pid = current->pid; + sk->peercred.uid = current->euid; + sk->peercred.gid = current->egid; return 0; } extern struct proto_ops unix_stream_ops; extern struct proto_ops unix_dgram_ops; -static int unix_create(struct socket *sock, int protocol) +static int unix_create1(struct socket *sock, struct sock **skp, int protocol) { struct sock *sk; - sock->state = SS_UNCONNECTED; - if (protocol && protocol != PF_UNIX) return -EPROTONOSUPPORT; - switch (sock->type) + if (sock) { + sock->state = SS_UNCONNECTED; + + switch (sock->type) + { case SOCK_STREAM: sock->ops = &unix_stream_ops; break; @@ -363,6 +407,7 @@ break; default: return -ESOCKTNOSUPPORT; + } } sk = sk_alloc(PF_UNIX, GFP_KERNEL, 1); if (!sk) @@ -378,51 +423,32 @@ sk->mtu=4096; sk->protinfo.af_unix.list=&unix_sockets_unbound; unix_insert_socket(sk); - + if (skp) + *skp =sk; + /* socket created, increment count */ MOD_INC_USE_COUNT; return 0; } +static int unix_create(struct socket *sock, int protocol) +{ + return unix_create1(sock, NULL, protocol); +} + static int unix_release(struct socket *sock, struct socket *peer) { unix_socket *sk = sock->sk; - unix_socket *skpair; if (!sk) return 0; + sock->sk = NULL; if (sock->state != SS_UNCONNECTED) sock->state = SS_DISCONNECTING; - sk->state_change(sk); - sk->dead=1; - skpair=unix_peer(sk); - if (sock->type==SOCK_STREAM && skpair) - { - if (unix_our_peer(sk, skpair)) - skpair->shutdown=SHUTDOWN_MASK; /* No more writes */ - if (skpair->state!=TCP_LISTEN) - skpair->state_change(skpair); /* Wake any blocked writes */ - } - if (skpair!=NULL) - unix_unlock(skpair); /* It may now die */ - unix_peer(sk)=NULL; /* No pair */ - unix_destroy_socket(sk); /* Try to flush out this socket. Throw out buffers at least */ - unix_gc(); /* Garbage collect fds */ - - /* - * FIXME: BSD difference: In BSD all sockets connected to use get ECONNRESET and we die on the spot. In - * Linux we behave like files and pipes do and wait for the last dereference. - */ - if (sk->socket) - { - sk->socket = NULL; - sock->sk = NULL; - } - - return 0; + return unix_release_sock (sk); } static int unix_autobind(struct socket *sock) @@ -625,18 +651,17 @@ return 0; } -static int unix_stream_connect1(struct socket *sock, struct msghdr *msg, - int len, struct unix_skb_parms *cmsg, int nonblock) +static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, + int addr_len, int flags) { - struct sockaddr_un *sunaddr=(struct sockaddr_un *)msg->msg_name; - struct sock *sk = sock->sk; + struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr; + struct sock *sk = sock->sk, *newsk; unix_socket *other; struct sk_buff *skb; int err; unsigned hash; - int addr_len; - addr_len = unix_mkname(sunaddr, msg->msg_namelen, &hash); + addr_len = unix_mkname(sunaddr, addr_len, &hash); if (addr_len < 0) return addr_len; @@ -648,123 +673,80 @@ case SS_CONNECTED: /* Socket is already connected */ return -EISCONN; - case SS_CONNECTING: - /* Not yet connected... we will check this. */ - break; default: return(-EINVAL); } + /* + * Now ready to connect + */ + + sk->state=TCP_CLOSE; + + /* Find listening sock */ + other=unix_find_other(sunaddr, addr_len, sk->type, hash, &err); + if(other==NULL) + goto out; - if (unix_peer(sk)) - { - if (sock->state==SS_CONNECTING && sk->state==TCP_ESTABLISHED) - { - sock->state=SS_CONNECTED; - if (!sk->protinfo.af_unix.addr) - unix_autobind(sock); - return 0; - } - if (sock->state==SS_CONNECTING && sk->state == TCP_CLOSE) - { - sock->state=SS_UNCONNECTED; - return -ECONNREFUSED; - } - if (sock->state!=SS_CONNECTING) - return -EISCONN; - if (nonblock) - return -EALREADY; - /* - * Drop through the connect up logic to the wait. - */ - } + /* create new sock for complete connection */ + err = unix_create1(NULL, &newsk, PF_UNIX); + if (newsk == NULL) + goto out; - if (sock->state==SS_UNCONNECTED) - { + /* Allocate skb for sending to listening sock */ + skb=sock_alloc_send_skb(newsk, 0, 0, flags&O_NONBLOCK, &err); + if(skb==NULL) /* - * Now ready to connect + * if it gives EAGAIN we should give back + * EINPROGRESS. But this should not happen since the + * socket should have some writespace left (it did not + * allocate any memory until now) */ - - skb=sock_alloc_send_skb(sk, len, 0, nonblock, &err); /* Marker object */ - if(skb==NULL) - goto out; - memcpy(&UNIXCB(skb), cmsg, sizeof(*cmsg)); - if (len) { - err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, - len); - if (err) - goto out_free; - } + goto out_release; - sk->state=TCP_CLOSE; - other=unix_find_other(sunaddr, addr_len, sk->type, hash, &err); - if(other==NULL) - goto out_free; - other->ack_backlog++; - unix_peer(sk)=other; - skb_queue_tail(&other->receive_queue,skb); - sk->state=TCP_SYN_SENT; - sock->state=SS_CONNECTING; - other->data_ready(other,0); /* Wake up ! */ - } - - - /* Wait for an accept */ - - while(sk->state==TCP_SYN_SENT) - { - if(nonblock) - return -EINPROGRESS; - interruptible_sleep_on(sk->sleep); - if(signal_pending(current)) - return -ERESTARTSYS; - } - - /* - * Has the other end closed on us ? - */ - - if(sk->state==TCP_CLOSE) - { - unix_unlock(unix_peer(sk)); - unix_peer(sk)=NULL; - sock->state=SS_UNCONNECTED; - return -ECONNREFUSED; - } - - /* - * Amazingly it has worked - */ - + UNIXCB(skb).attr = MSG_SYN; + + /* set up connecting socket */ sock->state=SS_CONNECTED; if (!sk->protinfo.af_unix.addr) unix_autobind(sock); + unix_peer(sk)=newsk; + unix_lock(sk); + sk->state=TCP_ESTABLISHED; + /* Set credentials */ + sk->peercred = other->peercred; + + /* set up newly created sock */ + unix_peer(newsk)=sk; + unix_lock(newsk); + newsk->state=TCP_ESTABLISHED; + newsk->type=SOCK_STREAM; + newsk->peercred.pid = current->pid; + newsk->peercred.uid = current->euid; + newsk->peercred.gid = current->egid; + + /* copy address information from listening to new sock*/ + if (other->protinfo.af_unix.addr) + { + atomic_inc(&other->protinfo.af_unix.addr->refcnt); + newsk->protinfo.af_unix.addr=other->protinfo.af_unix.addr; + } + if (other->protinfo.af_unix.dentry) + newsk->protinfo.af_unix.dentry=dget(other->protinfo.af_unix.dentry); + + /* send info to listening sock */ + other->ack_backlog++; + skb_queue_tail(&other->receive_queue,skb); + other->data_ready(other,0); /* Wake up ! */ + return 0; -out_free: - kfree_skb(skb); +out_release: + unix_destroy_socket(newsk); out: return err; } - -static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, - int addr_len, int flags) -{ - struct msghdr msg; - struct unix_skb_parms cmsg; - - msg.msg_name = uaddr; - msg.msg_namelen = addr_len; - cmsg.fp = NULL; - cmsg.attr = MSG_SYN; - cmsg.creds.pid = current->pid; - cmsg.creds.uid = current->euid; - cmsg.creds.gid = current->egid; - - return unix_stream_connect1(sock, &msg, 0, &cmsg, flags&O_NONBLOCK); -} - static int unix_socketpair(struct socket *socka, struct socket *sockb) { struct sock *ska=socka->sk, *skb = sockb->sk; @@ -802,14 +784,6 @@ if (sk->state!=TCP_LISTEN) return -EINVAL; - if (sk->protinfo.af_unix.addr) - { - atomic_inc(&sk->protinfo.af_unix.addr->refcnt); - newsk->protinfo.af_unix.addr=sk->protinfo.af_unix.addr; - } - if (sk->protinfo.af_unix.dentry) - newsk->protinfo.af_unix.dentry=dget(sk->protinfo.af_unix.dentry); - for (;;) { skb=skb_dequeue(&sk->receive_queue); @@ -834,20 +808,19 @@ tsk=skb->sk; sk->ack_backlog--; - unix_peer(newsk)=tsk; - unix_peer(tsk)=newsk; - tsk->state=TCP_ESTABLISHED; - newsk->state=TCP_ESTABLISHED; - memcpy(&newsk->peercred, UNIXCREDS(skb), sizeof(struct ucred)); - tsk->peercred.pid = current->pid; - tsk->peercred.uid = current->euid; - tsk->peercred.gid = current->egid; - unix_lock(newsk); /* Swap lock over */ - unix_unlock(sk); /* Locked to child socket not master */ - unix_lock(tsk); /* Back lock */ - kfree_skb(skb); /* The buffer is just used as a tag */ - tsk->state_change(tsk); /* Wake up any sleeping connect */ - sock_wake_async(tsk->socket, 0); + unix_unlock(sk); /* No longer locked to master */ + kfree_skb(skb); + + /* attach accepted sock to socket */ + newsock->state=SS_CONNECTED; + newsock->sk=tsk; + tsk->sleep=newsk->sleep; + tsk->socket=newsock; + + /* destroy handed sock */ + newsk->socket = NULL; + unix_destroy_socket(newsk); + return 0; } @@ -1389,6 +1362,38 @@ return(0); } +static unsigned int unix_poll(struct file * file, struct socket *sock, poll_table *wait) +{ + struct sock *sk = sock->sk; + unsigned int mask; + + poll_wait(file, sk->sleep, wait); + mask = 0; + + /* exceptional events? */ + if (sk->err) + mask |= POLLERR; + if (sk->shutdown & RCV_SHUTDOWN) + mask |= POLLHUP; + + /* readable? */ + if (!skb_queue_empty(&sk->receive_queue)) + mask |= POLLIN | POLLRDNORM; + + /* Connection-based need to check for termination and startup */ + if (sk->type == SOCK_STREAM && sk->state==TCP_CLOSE) + mask |= POLLHUP; + + /* + * we set writable also when the other side has shut down the + * connection. This prevents stuck sockets. + */ + if (sk->sndbuf - atomic_read(&sk->wmem_alloc) >= MIN_WRITE_SPACE) + mask |= POLLOUT | POLLWRNORM | POLLWRBAND; + + return mask; +} + #ifdef CONFIG_PROC_FS static int unix_read_proc(char *buffer, char **start, off_t offset, int length, int *eof, void *data) @@ -1410,7 +1415,9 @@ 0, s->socket ? s->socket->flags : 0, s->type, - s->socket ? s->socket->state : 0, + s->socket ? s->socket->state : + (s->state == TCP_ESTABLISHED ? + SS_CONNECTING : SS_DISCONNECTING), s->socket ? s->socket->inode->i_ino : 0); if (s->protinfo.af_unix.addr) @@ -1426,7 +1433,7 @@ } buffer[len++]='\n'; - pos=begin+len; + pos+=len; if(poslength) len=length; + if (len < 0) + len = 0; return len; } #endif @@ -1455,7 +1464,7 @@ unix_socketpair, unix_accept, unix_getname, - datagram_poll, + unix_poll, unix_ioctl, unix_listen, unix_shutdown, @@ -1537,6 +1546,9 @@ sock_unregister(PF_UNIX); #ifdef CONFIG_SYSCTL unix_sysctl_unregister(); +#endif +#ifdef CONFIG_PROC_FS + remove_proc_entry("net/unix", 0); #endif } #endif