From: | "Simon 'corecode' Schubert" <corecode@xxxxxxxxxxxx> |
Date: | Sun, 21 Jan 2007 12:38:36 +0100 |
Here's the panic string Peter Avalos got when he tried to boot a kernel compiled with 4.1:
http://leaf.dragonflybsd.org/~pavalos/gcc41-kernel.crash
cheers simon
-- Serve - BSD +++ RENT this banner advert +++ ASCII Ribbon /"\ Work - Mac +++ space for low €€€ NOW!1 +++ Campaign \ / Party Enjoy Relax | http://dragonflybsd.org Against HTML \ Dude 2c 2 the max ! http://golden-apple.biz Mail + News / \
Index: cpu/i386/include/cpu.h =================================================================== RCS file: /home/dcvs/src/sys/cpu/i386/include/cpu.h,v retrieving revision 1.22 diff -u -p -r1.22 cpu.h --- cpu/i386/include/cpu.h 14 Jan 2007 20:07:11 -0000 1.22 +++ cpu/i386/include/cpu.h 21 Jan 2007 08:55:49 -0000 @@ -125,7 +125,7 @@ extern char etext[]; void fork_trampoline (void); -void fork_return (struct lwp *, struct trapframe); +void fork_return (struct lwp *, struct trapframe *); #endif Index: kern/kern_intr.c =================================================================== RCS file: /home/dcvs/src/sys/kern/kern_intr.c,v retrieving revision 1.45 diff -u -p -r1.45 kern_intr.c --- kern/kern_intr.c 23 Dec 2006 00:35:04 -0000 1.45 +++ kern/kern_intr.c 21 Jan 2007 08:22:48 -0000 @@ -536,10 +536,10 @@ * * Must return non-zero if we do not want the vector code to re-enable * the interrupt (which we don't if we have to schedule the interrupt) */ -int ithread_fast_handler(struct intrframe frame); +int ithread_fast_handler(struct intrframe *frame); int -ithread_fast_handler(struct intrframe frame) +ithread_fast_handler(struct intrframe *frame) { int intr; struct intr_info *info; @@ -551,7 +551,7 @@ #endif intrec_t rec, next_rec; globaldata_t gd; - intr = frame.if_vec; + intr = frame->if_vec; gd = mycpu; info = &intr_info_ary[intr]; @@ -622,9 +622,9 @@ #endif if (rec->serializer) { must_schedule += lwkt_serialize_handler_try( rec->serializer, rec->handler, - rec->argument, &frame); + rec->argument, frame); } else { - rec->handler(rec->argument, &frame); + rec->handler(rec->argument, frame); } } } Index: kern/lwkt_ipiq.c =================================================================== RCS file: /home/dcvs/src/sys/kern/lwkt_ipiq.c,v retrieving revision 1.20 diff -u -p -r1.20 lwkt_ipiq.c --- kern/lwkt_ipiq.c 27 Dec 2006 06:51:47 -0000 1.20 +++ kern/lwkt_ipiq.c 21 Jan 2007 08:37:19 -0000 @@ -465,7 +465,7 @@ } #ifdef _KERNEL void -lwkt_process_ipiq_frame(struct intrframe frame) +lwkt_process_ipiq_frame(struct intrframe *frame) { globaldata_t gd = mycpu; globaldata_t sgd; @@ -478,13 +478,13 @@ if (n != gd->gd_cpuid) { sgd = globaldata_find(n); ip = sgd->gd_ipiq; if (ip != NULL) { - while (lwkt_process_ipiq_core(sgd, &ip[gd->gd_cpuid], &frame)) + while (lwkt_process_ipiq_core(sgd, &ip[gd->gd_cpuid], frame)) ; } } } if (gd->gd_cpusyncq.ip_rindex != gd->gd_cpusyncq.ip_windex) { - if (lwkt_process_ipiq_core(gd, &gd->gd_cpusyncq, &frame)) { + if (lwkt_process_ipiq_core(gd, &gd->gd_cpusyncq, frame)) { if (gd->gd_curthread->td_cscount == 0) goto again; need_ipiq(); Index: platform/pc32/apic/apic_vector.s =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/apic/apic_vector.s,v retrieving revision 1.35 diff -u -p -r1.35 apic_vector.s --- platform/pc32/apic/apic_vector.s 8 Jan 2007 03:33:42 -0000 1.35 +++ platform/pc32/apic/apic_vector.s 21 Jan 2007 10:10:27 -0000 @@ -166,8 +166,9 @@ 2: ; \ /* clear pending bit, run handler */ \ andl $~IRQ_LBIT(irq_num),PCPU(fpending) ; \ pushl $irq_num ; \ + pushl %esp ; /* pass frame by reference */ \ call ithread_fast_handler ; /* returns 0 to unmask */ \ - addl $4, %esp ; \ + addl $8, %esp ; \ UNMASK_IRQ(irq_num) ; \ 5: ; \ MEXITCOUNT ; \ @@ -378,12 +379,13 @@ movl PCPU(curthread),%ebx cmpl $TDPRI_CRIT,TD_PRI(%ebx) jge 1f subl $8,%esp /* make same as interrupt frame */ + pushl %esp /* pass frame by reference */ incl PCPU(intr_nesting_level) addl $TDPRI_CRIT,TD_PRI(%ebx) call lwkt_process_ipiq_frame subl $TDPRI_CRIT,TD_PRI(%ebx) decl PCPU(intr_nesting_level) - addl $8,%esp + addl $12,%esp pushl $0 /* CPL for frame (REMOVED) */ MEXITCOUNT jmp doreti Index: platform/pc32/apic/apicvar.h =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/apic/apicvar.h,v retrieving revision 1.2 diff -u -p -r1.2 apicvar.h --- platform/pc32/apic/apicvar.h 27 Jun 2004 08:52:46 -0000 1.2 +++ platform/pc32/apic/apicvar.h 21 Jan 2007 08:42:56 -0000 @@ -148,7 +148,7 @@ void lapic_ipi_raw(register_t icrlo, u_int dest); void lapic_ipi_vectored(u_int vector, int dest); int lapic_ipi_wait(int delay); -void lapic_handle_intr(struct intrframe frame); +void lapic_handle_intr(struct intrframe *frame); void lapic_set_logical_id(u_int apic_id, u_int cluster, u_int cluster_id); int lapic_set_lvt_mask(u_int apic_id, u_int lvt, u_char masked); int lapic_set_lvt_mode(u_int apic_id, u_int lvt, u_int32_t mode); Index: platform/pc32/i386/exception.s =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/i386/exception.s,v retrieving revision 1.30 diff -u -p -r1.30 exception.s --- platform/pc32/i386/exception.s 8 Jan 2007 03:33:42 -0000 1.30 +++ platform/pc32/i386/exception.s 21 Jan 2007 10:06:02 -0000 @@ -779,7 +779,9 @@ FAKE_MCOUNT(15*4(%esp)) FAKE_MCOUNT(btrap) /* init "from" _btrap -> calltrap */ incl PCPU(cnt)+V_TRAP /* warning, trap frame dummy arg, no extra reg pushes */ + pushl %esp /* pass frame by reference */ call trap + addl $4,%esp /* * Return via doreti to handle ASTs. Have to change trap frame @@ -826,7 +828,9 @@ movl $7,TF_ERR(%esp) /* sizeof "lcall FAKE_MCOUNT(15*4(%esp)) incl PCPU(cnt)+V_SYSCALL /* YYY per-cpu */ /* warning, trap frame dummy arg, no extra reg pushes */ + push %esp /* pass frame by reference */ call syscall2 + addl $4,%esp MEXITCOUNT cli /* atomic reqflags interlock w/iret */ cmpl $0,PCPU(reqflags) @@ -864,7 +868,9 @@ movl $2,TF_ERR(%esp) /* sizeof "int 0x FAKE_MCOUNT(15*4(%esp)) incl PCPU(cnt)+V_SYSCALL /* warning, trap frame dummy arg, no extra reg pushes */ + push %esp /* pass frame by reference */ call syscall2 + addl $4,%esp MEXITCOUNT cli /* atomic reqflags interlock w/irq */ cmpl $0,PCPU(reqflags) @@ -893,10 +899,16 @@ * have this call a non-return function * * initproc has its own fork handler, start_init(), which DOES * return. + * + * The function (set in pcb_esi) gets passed two arguments, + * the primary parameter set in pcb_ebx and a pointer to the + * trapframe. + * void (func)(int arg, struct trapframe *frame); */ + pushl %esp /* pass frame by reference */ pushl %ebx /* arg1 */ call *%esi /* function */ - addl $4,%esp + addl $8,%esp /* cut from syscall */ sti Index: platform/pc32/i386/trap.c =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/i386/trap.c,v retrieving revision 1.95 diff -u -p -r1.95 trap.c --- platform/pc32/i386/trap.c 14 Jan 2007 20:07:12 -0000 1.95 +++ platform/pc32/i386/trap.c 21 Jan 2007 08:50:43 -0000 @@ -119,9 +119,9 @@ #endif int (*pmath_emulate) (struct trapframe *); -extern void trap (struct trapframe frame); +extern void trap (struct trapframe *frame); extern int trapwrite (unsigned addr); -extern void syscall2 (struct trapframe frame); +extern void syscall2 (struct trapframe *frame); static int trap_pfault (struct trapframe *, int, vm_offset_t); static void trap_fatal (struct trapframe *, vm_offset_t); @@ -373,7 +373,7 @@ * get_mplock() has to block. */ void -trap(struct trapframe frame) +trap(struct trapframe *frame) { struct globaldata *gd = mycpu; struct thread *td = gd->gd_curthread; @@ -392,10 +392,10 @@ p = td->td_proc; #ifdef DDB if (db_active) { - eva = (frame.tf_trapno == T_PAGEFLT ? rcr2() : 0); + eva = (frame->tf_trapno == T_PAGEFLT ? rcr2() : 0); ++gd->gd_trap_nesting_level; MAKEMPSAFE(have_mplock); - trap_fatal(&frame, eva); + trap_fatal(frame, eva); --gd->gd_trap_nesting_level; goto out2; } @@ -403,7 +403,7 @@ #endif eva = 0; ++gd->gd_trap_nesting_level; - if (frame.tf_trapno == T_PAGEFLT) { + if (frame->tf_trapno == T_PAGEFLT) { /* * For some Cyrix CPUs, %cr2 is clobbered by interrupts. * This problem is worked around by using an interrupt @@ -425,15 +425,15 @@ #endif --gd->gd_trap_nesting_level; - if (!(frame.tf_eflags & PSL_I)) { + if (!(frame->tf_eflags & PSL_I)) { /* * Buggy application or kernel code has disabled interrupts * and then trapped. Enabling interrupts now is wrong, but * it is better than running with interrupts disabled until * they are accidentally enabled later. */ - type = frame.tf_trapno; - if (ISPL(frame.tf_cs)==SEL_UPL || (frame.tf_eflags & PSL_VM)) { + type = frame->tf_trapno; + if (ISPL(frame->tf_cs)==SEL_UPL || (frame->tf_eflags & PSL_VM)) { MAKEMPSAFE(have_mplock); kprintf( "pid %ld (%s): trap %d with interrupts disabled\n", @@ -453,17 +453,17 @@ #if defined(I586_CPU) && !defined(NO_F00F_HACK) restart: #endif - type = frame.tf_trapno; - code = frame.tf_err; + type = frame->tf_trapno; + code = frame->tf_err; if (in_vm86call) { ASSERT_MP_LOCK_HELD(curthread); - if (frame.tf_eflags & PSL_VM && + if (frame->tf_eflags & PSL_VM && (type == T_PROTFLT || type == T_STKFLT)) { #ifdef SMP KKASSERT(td->td_mpcount > 0); #endif - i = vm86_emulate((struct vm86frame *)&frame); + i = vm86_emulate((struct vm86frame *)frame); #ifdef SMP KKASSERT(td->td_mpcount > 0); #endif @@ -472,10 +472,10 @@ /* * returns to original process */ #ifdef SMP - vm86_trap((struct vm86frame *)&frame, + vm86_trap((struct vm86frame *)frame, have_mplock); #else - vm86_trap((struct vm86frame *)&frame, 0); + vm86_trap((struct vm86frame *)frame, 0); #endif KKASSERT(0); /* NOT REACHED */ } @@ -488,7 +488,7 @@ * assume a normal userspace trap. */ case T_PROTFLT: case T_SEGNPFLT: - trap_fatal(&frame, eva); + trap_fatal(frame, eva); goto out2; case T_TRCTRAP: type = T_BPTFLT; /* kernel breakpoint */ @@ -497,13 +497,13 @@ } goto kernel_trap; /* normal kernel trap handling */ } - if ((ISPL(frame.tf_cs) == SEL_UPL) || (frame.tf_eflags & PSL_VM)) { + if ((ISPL(frame->tf_cs) == SEL_UPL) || (frame->tf_eflags & PSL_VM)) { /* user trap */ userenter(td); sticks = (int)td->td_sticks; - lp->lwp_md.md_regs = &frame; + lp->lwp_md.md_regs = frame; switch (type) { case T_PRIVINFLT: /* privileged instruction fault */ @@ -513,7 +513,7 @@ break; case T_BPTFLT: /* bpt instruction fault */ case T_TRCTRAP: /* trace trap */ - frame.tf_eflags &= ~PSL_T; + frame->tf_eflags &= ~PSL_T; i = SIGTRAP; break; @@ -539,8 +539,8 @@ * them specially. */ case T_PROTFLT: /* general protection fault */ case T_STKFLT: /* stack fault */ - if (frame.tf_eflags & PSL_VM) { - i = vm86_emulate((struct vm86frame *)&frame); + if (frame->tf_eflags & PSL_VM) { + i = vm86_emulate((struct vm86frame *)frame); if (i == 0) goto out; break; @@ -557,7 +557,7 @@ break; case T_PAGEFLT: /* page fault */ MAKEMPSAFE(have_mplock); - i = trap_pfault(&frame, TRUE, eva); + i = trap_pfault(frame, TRUE, eva); if (i == -1) goto out; #if defined(I586_CPU) && !defined(NO_F00F_HACK) @@ -590,7 +590,7 @@ * for debugging. */ if (ddb_on_nmi) { kprintf ("NMI ... going to debugger\n"); - kdb_trap (type, 0, &frame); + kdb_trap (type, 0, frame); } #endif /* DDB */ goto out2; @@ -644,11 +644,11 @@ i = SIGFPE; ucode = FPE_FPU_NP_TRAP; break; } - i = (*pmath_emulate)(&frame); + i = (*pmath_emulate)(frame); if (i == 0) { - if (!(frame.tf_eflags & PSL_T)) + if (!(frame->tf_eflags & PSL_T)) goto out2; - frame.tf_eflags &= ~PSL_T; + frame->tf_eflags &= ~PSL_T; i = SIGTRAP; } /* else ucode = emulator_only_knows() XXX */ @@ -671,7 +671,7 @@ switch (type) { case T_PAGEFLT: /* page fault */ MAKEMPSAFE(have_mplock); - trap_pfault(&frame, FALSE, eva); + trap_pfault(frame, FALSE, eva); goto out2; case T_DNA: @@ -699,8 +699,8 @@ * them. */ #define MAYBE_DORETI_FAULT(where, whereto) \ do { \ - if (frame.tf_eip == (int)where) { \ - frame.tf_eip = (int)whereto; \ + if (frame->tf_eip == (int)where) { \ + frame->tf_eip = (int)whereto; \ goto out2; \ } \ } while (0) @@ -725,7 +725,7 @@ doreti_popl_fs_fault); MAYBE_DORETI_FAULT(doreti_popl_gs, doreti_popl_gs_fault); if (td->td_pcb->pcb_onfault) { - frame.tf_eip = + frame->tf_eip = (register_t)td->td_pcb->pcb_onfault; goto out2; } @@ -742,14 +742,14 @@ * want to get this fault so that we * problem here and not every time the kernel is * entered. */ - if (frame.tf_eflags & PSL_NT) { - frame.tf_eflags &= ~PSL_NT; + if (frame->tf_eflags & PSL_NT) { + frame->tf_eflags &= ~PSL_NT; goto out2; } break; case T_TRCTRAP: /* trace trap */ - if (frame.tf_eip == (int)IDTVEC(syscall)) { + if (frame->tf_eip == (int)IDTVEC(syscall)) { /* * We've just entered system mode via the * syscall lcall. Continue single stepping @@ -758,12 +758,12 @@ * saved the flags. */ goto out2; } - if (frame.tf_eip == (int)IDTVEC(syscall) + 1) { + if (frame->tf_eip == (int)IDTVEC(syscall) + 1) { /* * The syscall handler has now saved the * flags. Stop single stepping it. */ - frame.tf_eflags &= ~PSL_T; + frame->tf_eflags &= ~PSL_T; goto out2; } /* @@ -794,7 +794,7 @@ * Otherwise, debugger traps "can't h */ #ifdef DDB MAKEMPSAFE(have_mplock); - if (kdb_trap (type, 0, &frame)) + if (kdb_trap (type, 0, frame)) goto out2; #endif break; @@ -829,7 +829,7 @@ * for debugging. */ if (ddb_on_nmi) { kprintf ("NMI ... going to debugger\n"); - kdb_trap (type, 0, &frame); + kdb_trap (type, 0, frame); } #endif /* DDB */ goto out2; @@ -841,7 +841,7 @@ #endif /* NISA > 0 */ } MAKEMPSAFE(have_mplock); - trap_fatal(&frame, eva); + trap_fatal(frame, eva); goto out2; } @@ -851,7 +851,7 @@ * VM context managed by a virtual kern * handle it. */ if (p->p_vkernel && p->p_vkernel->vk_current) { - vkernel_trap(p, &frame); + vkernel_trap(p, frame); goto out; } @@ -876,10 +876,10 @@ #endif out: #ifdef SMP - if (ISPL(frame.tf_cs) == SEL_UPL) - KASSERT(td->td_mpcount == have_mplock, ("badmpcount trap/end from %p", (void *)frame.tf_eip)); + if (ISPL(frame->tf_cs) == SEL_UPL) + KASSERT(td->td_mpcount == have_mplock, ("badmpcount trap/end from %p", (void *)frame->tf_eip)); #endif - userret(lp, &frame, sticks); + userret(lp, frame, sticks); userexit(lp); out2: ; #ifdef SMP @@ -1182,7 +1182,7 @@ * the MP lock. */ void -syscall2(struct trapframe frame) +syscall2(struct trapframe *frame) { struct thread *td = curthread; struct proc *p = td->td_proc; @@ -1203,7 +1203,7 @@ u_int code; union sysunion args; #ifdef DIAGNOSTIC - if (ISPL(frame.tf_cs) != SEL_UPL) { + if (ISPL(frame->tf_cs) != SEL_UPL) { get_mplock(); panic("syscall"); /* NOT REACHED */ @@ -1211,7 +1211,7 @@ } #endif #ifdef SMP - KASSERT(td->td_mpcount == 0, ("badmpcount syscall2 from %p", (void *)frame.tf_eip)); + KASSERT(td->td_mpcount == 0, ("badmpcount syscall2 from %p", (void *)frame->tf_eip)); if (syscall_mpsafe == 0) MAKEMPSAFE(have_mplock); #endif @@ -1221,7 +1221,7 @@ /* * Misc */ sticks = (int)td->td_sticks; - orig_tf_eflags = frame.tf_eflags; + orig_tf_eflags = frame->tf_eflags; /* * Virtual kernel intercept - if a VM context managed by a virtual @@ -1230,10 +1230,10 @@ * Restore the virtual kernel context a * call. The current frame is copied out to the virtual kernel. */ if (p->p_vkernel && p->p_vkernel->vk_current) { - error = vkernel_trap(p, &frame); - frame.tf_eax = error; + error = vkernel_trap(p, frame); + frame->tf_eax = error; if (error) - frame.tf_eflags |= PSL_C; + frame->tf_eflags |= PSL_C; error = EJUSTRETURN; goto out; } @@ -1241,13 +1241,13 @@ /* * Get the system call parameters and account for time */ - lp->lwp_md.md_regs = &frame; - params = (caddr_t)frame.tf_esp + sizeof(int); - code = frame.tf_eax; + lp->lwp_md.md_regs = frame; + params = (caddr_t)frame->tf_esp + sizeof(int); + code = frame->tf_eax; if (p->p_sysent->sv_prepsyscall) { (*p->p_sysent->sv_prepsyscall)( - &frame, (int *)(&args.nosys.sysmsg + 1), + frame, (int *)(&args.nosys.sysmsg + 1), &code, ¶ms); } else { /* @@ -1310,13 +1310,13 @@ * results are returned. Since edx is * system call returns we pre-set it here. */ args.sysmsg_fds[0] = 0; - args.sysmsg_fds[1] = frame.tf_edx; + args.sysmsg_fds[1] = frame->tf_edx; /* * The syscall might manipulate the trap frame. If it does it * will probably return EJUSTRETURN. */ - args.sysmsg_frame = &frame; + args.sysmsg_frame = frame; STOPEVENT(p, S_SCE, narg); /* MP aware */ @@ -1344,16 +1344,16 @@ * if this is a child returning from f */ p = curproc; lp = curthread->td_lwp; - frame.tf_eax = args.sysmsg_fds[0]; - frame.tf_edx = args.sysmsg_fds[1]; - frame.tf_eflags &= ~PSL_C; + frame->tf_eax = args.sysmsg_fds[0]; + frame->tf_edx = args.sysmsg_fds[1]; + frame->tf_eflags &= ~PSL_C; break; case ERESTART: /* * Reconstruct pc, assuming lcall $X,y is 7 bytes, * int 0x80 is 2 bytes. We saved this in tf_err. */ - frame.tf_eip -= frame.tf_err; + frame->tf_eip -= frame->tf_err; break; case EJUSTRETURN: break; @@ -1367,8 +1367,8 @@ error = -1; /* XXX */ else error = p->p_sysent->sv_errtbl[error]; } - frame.tf_eax = error; - frame.tf_eflags |= PSL_C; + frame->tf_eax = error; + frame->tf_eflags |= PSL_C; break; } @@ -1377,14 +1377,14 @@ * Traced syscall. trapsignal() is not */ if ((orig_tf_eflags & PSL_T) && !(orig_tf_eflags & PSL_VM)) { MAKEMPSAFE(have_mplock); - frame.tf_eflags &= ~PSL_T; + frame->tf_eflags &= ~PSL_T; trapsignal(p, SIGTRAP, 0); } /* * Handle reschedule and other end-of-syscall issues */ - userret(lp, &frame, sticks); + userret(lp, frame, sticks); #ifdef KTRACE if (KTRPOINT(td, KTR_SYSRET)) { @@ -1406,7 +1406,7 @@ /* * Release the MP lock if we had to get it */ KASSERT(td->td_mpcount == have_mplock, - ("badmpcount syscall2/end from %p", (void *)frame.tf_eip)); + ("badmpcount syscall2/end from %p", (void *)frame->tf_eip)); if (have_mplock) rel_mplock(); #endif @@ -1424,13 +1424,13 @@ * released on return. This code will r * trampoline code which then runs doreti. */ void -fork_return(struct lwp *lp, struct trapframe frame) +fork_return(struct lwp *lp, struct trapframe *frame) { struct proc *p = lp->lwp_proc; - frame.tf_eax = 0; /* Child returns zero */ - frame.tf_eflags &= ~PSL_C; /* success */ - frame.tf_edx = 1; + frame->tf_eax = 0; /* Child returns zero */ + frame->tf_eflags &= ~PSL_C; /* success */ + frame->tf_edx = 1; /* * Newly forked processes are given a kernel priority. We have to @@ -1443,7 +1443,7 @@ * released when the thread goes to sle */ lwkt_setpri_self(TDPRI_USER_NORM); userenter(lp->lwp_thread); - userret(lp, &frame, 0); + userret(lp, frame, 0); #ifdef KTRACE if (KTRPOINT(lp->lwp_thread, KTR_SYSRET)) ktrsysret(p, SYS_fork, 0, 0); Index: platform/pc32/i386/vm86.c =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/i386/vm86.c,v retrieving revision 1.24 diff -u -p -r1.24 vm86.c --- platform/pc32/i386/vm86.c 8 Jan 2007 03:33:42 -0000 1.24 +++ platform/pc32/i386/vm86.c 21 Jan 2007 09:42:18 -0000 @@ -77,7 +77,7 @@ char vml_iomap[IOMAP_SIZE]; char vml_iomap_trailer; }; -void vm86_prepcall(struct vm86frame); +void vm86_prepcall(struct vm86frame *); struct system_map { int type; @@ -569,25 +569,25 @@ /* * called from vm86_bioscall, while in vm86 address space, to finalize setup. */ void -vm86_prepcall(struct vm86frame vmf) +vm86_prepcall(struct vm86frame *vmf) { uintptr_t addr[] = { 0xA00, 0x1000 }; /* code, stack */ u_char intcall[] = { CLI, INTn, 0x00, STI, HLT }; - if ((vmf.vmf_trapno & PAGE_MASK) <= 0xff) { + if ((vmf->vmf_trapno & PAGE_MASK) <= 0xff) { /* interrupt call requested */ - intcall[2] = (u_char)(vmf.vmf_trapno & 0xff); + intcall[2] = (u_char)(vmf->vmf_trapno & 0xff); memcpy((void *)addr[0], (void *)intcall, sizeof(intcall)); - vmf.vmf_ip = addr[0]; - vmf.vmf_cs = 0; + vmf->vmf_ip = addr[0]; + vmf->vmf_cs = 0; } - vmf.vmf_sp = addr[1] - 2; /* keep aligned */ - vmf.kernel_fs = vmf.kernel_es = vmf.kernel_ds = vmf.kernel_gs = 0; - vmf.vmf_ss = 0; - vmf.vmf_eflags = PSL_VIF | PSL_VM | PSL_USER; - vm86_initflags(&vmf); + vmf->vmf_sp = addr[1] - 2; /* keep aligned */ + vmf->kernel_fs = vmf->kernel_es = vmf->kernel_ds = vmf->kernel_gs = 0; + vmf->vmf_ss = 0; + vmf->vmf_eflags = PSL_VIF | PSL_VM | PSL_USER; + vm86_initflags(vmf); } /* Index: platform/pc32/i386/vm86bios.s =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/i386/vm86bios.s,v retrieving revision 1.13 diff -u -p -r1.13 vm86bios.s --- platform/pc32/i386/vm86bios.s 16 Jun 2005 21:12:44 -0000 1.13 +++ platform/pc32/i386/vm86bios.s 21 Jan 2007 09:43:47 -0000 @@ -130,7 +130,9 @@ movl %ecx,%cr3 /* new page tables */ movl SCR_VMFRAME(%edx),%esp /* switch to new stack */ + pushl %esp /* pass frame by reference */ call vm86_prepcall /* finish setup */ + addl $4,%esp movl $1,in_vm86call /* set flag for trap() */ Index: platform/pc32/icu/icu_vector.s =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/icu/icu_vector.s,v retrieving revision 1.29 diff -u -p -r1.29 icu_vector.s --- platform/pc32/icu/icu_vector.s 8 Jan 2007 03:33:42 -0000 1.29 +++ platform/pc32/icu/icu_vector.s 21 Jan 2007 10:10:12 -0000 @@ -155,8 +155,9 @@ 2: ; \ /* clear pending bit, run handler */ \ andl $~IRQ_LBIT(irq_num),PCPU(fpending) ; \ pushl $irq_num ; \ + pushl %esp ; /* pass frame by reference */ \ call ithread_fast_handler ; /* returns 0 to unmask int */ \ - addl $4,%esp ; \ + addl $8,%esp ; \ UNMASK_IRQ(icu, irq_num) ; \ 5: ; \ MEXITCOUNT ; \ Index: platform/pc32/isa/ipl.s =================================================================== RCS file: /home/dcvs/src/sys/platform/pc32/isa/ipl.s,v retrieving revision 1.27 diff -u -p -r1.27 ipl.s --- platform/pc32/isa/ipl.s 8 Jan 2007 03:33:43 -0000 1.27 +++ platform/pc32/isa/ipl.s 21 Jan 2007 11:02:33 -0000 @@ -310,9 +310,11 @@ andl $~(RQF_AST_SIGNAL|RQF_AST_UPCALL), sti movl %eax,%esi /* save cpl (can't use stack) */ movl $T_ASTFLT,TF_TRAPNO(%esp) + pushl %esp /* pass frame by reference */ subl $TDPRI_CRIT,TD_PRI(%ebx) call trap addl $TDPRI_CRIT,TD_PRI(%ebx) + addl $4,%esp movl %esi,%eax /* restore cpl for loop */ jmp doreti_next @@ -325,8 +327,9 @@ movl %eax,%esi /* save cpl (can't use incl PCPU(intr_nesting_level) andl $~RQF_IPIQ,PCPU(reqflags) subl $8,%esp /* add dummy vec and ppl */ + pushl %esp /* pass frame by reference */ call lwkt_process_ipiq_frame - addl $8,%esp + addl $12,%esp decl PCPU(intr_nesting_level) movl %esi,%eax /* restore cpl for loop */ jmp doreti_next @@ -504,7 +507,9 @@ movl %esp,%ebp PUSH_DUMMY pushl %ecx /* last part of intrframe = intr */ incl fastunpend_count + pushl %esp /* pass frame by reference */ call ithread_fast_handler /* returns 0 to unmask */ + addl $4,%esp /* remove pointer, now intr on top */ cmpl $0,%eax jnz 1f movl MachIntrABI + MACHINTR_INTREN, %eax Index: platform/vkernel/i386/fork_tramp.s =================================================================== RCS file: /home/dcvs/src/sys/platform/vkernel/i386/fork_tramp.s,v retrieving revision 1.2 diff -u -p -r1.2 fork_tramp.s --- platform/vkernel/i386/fork_tramp.s 14 Jan 2007 07:59:05 -0000 1.2 +++ platform/vkernel/i386/fork_tramp.s 21 Jan 2007 09:38:17 -0000 @@ -67,10 +67,16 @@ * have this call a non-return function * * initproc has its own fork handler, start_init(), which DOES * return. + * + * The function (set in pcb_esi) gets passed two arguments, + * the primary parameter set in pcb_ebx and a pointer to the + * trapframe. + * void (func)(int arg, struct trapframe *frame); */ + pushl %esp /* pass frame by reference */ pushl %ebx /* arg1 */ call *%esi /* function */ - addl $4,%esp + addl $8,%esp /* cut from syscall */ call splz @@ -93,6 +99,7 @@ */ MEXITCOUNT pushl $0 /* if_ppl */ pushl $0 /* if_vec */ + pushl %esp /* pass by reference */ call go_user /* NOT REACHED */ Index: platform/vkernel/i386/trap.c =================================================================== RCS file: /home/dcvs/src/sys/platform/vkernel/i386/trap.c,v retrieving revision 1.13 diff -u -p -r1.13 trap.c --- platform/vkernel/i386/trap.c 14 Jan 2007 20:07:14 -0000 1.13 +++ platform/vkernel/i386/trap.c 21 Jan 2007 08:53:03 -0000 @@ -1333,13 +1333,13 @@ * released on return. This code will r * trampoline code which then runs doreti. */ void -fork_return(struct lwp *lp, struct trapframe frame) +fork_return(struct lwp *lp, struct trapframe *frame) { struct proc *p = lp->lwp_proc; - frame.tf_eax = 0; /* Child returns zero */ - frame.tf_eflags &= ~PSL_C; /* success */ - frame.tf_edx = 1; + frame->tf_eax = 0; /* Child returns zero */ + frame->tf_eflags &= ~PSL_C; /* success */ + frame->tf_edx = 1; /* * Newly forked processes are given a kernel priority. We have to @@ -1352,7 +1352,7 @@ * released when the thread goes to sle */ lwkt_setpri_self(TDPRI_USER_NORM); userenter(lp->lwp_thread); - userret(lp, &frame, 0); + userret(lp, frame, 0); #ifdef KTRACE if (KTRPOINT(lp->lwp_thread, KTR_SYSRET)) ktrsysret(p, SYS_fork, 0, 0); @@ -1381,9 +1381,9 @@ * vmspace_ctl() returns an error only i * context we supplied or problems copying data to/from our VM space. */ void -go_user(struct intrframe frame) +go_user(struct intrframe *frame) { - struct trapframe *tf = (void *)&frame.if_gs; + struct trapframe *tf = (void *)&frame->if_gs; int r; /* @@ -1427,19 +1427,19 @@ * bit is normally set only by T_PAGEF */ r = vmspace_ctl(&curproc->p_vmspace->vm_pmap, VMSPACE_CTL_RUN, tf, &curthread->td_savevext); - frame.if_xflags |= PGEX_U; + frame->if_xflags |= PGEX_U; #if 0 kprintf("GO USER %d trap %d EVA %08x EIP %08x ESP %08x XFLAGS %02x/%02x\n", r, tf->tf_trapno, tf->tf_err, tf->tf_eip, tf->tf_esp, - tf->tf_xflags, frame.if_xflags); + tf->tf_xflags, frame->if_xflags); #endif if (r < 0) { if (errno == EINTR) - signalmailbox(&frame); + signalmailbox(frame); else panic("vmspace_ctl failed"); } else { - signalmailbox(&frame); + signalmailbox(frame); if (tf->tf_trapno) { user_trap(tf); } else if (mycpu->gd_reqflags & RQF_AST_MASK) { Index: platform/vkernel/include/md_var.h =================================================================== RCS file: /home/dcvs/src/sys/platform/vkernel/include/md_var.h,v retrieving revision 1.16 diff -u -p -r1.16 md_var.h --- platform/vkernel/include/md_var.h 15 Jan 2007 05:27:30 -0000 1.16 +++ platform/vkernel/include/md_var.h 21 Jan 2007 08:53:10 -0000 @@ -82,7 +82,7 @@ void cpu_exit_switch (struct thread *next); void cpu_setregs (void); void cpu_idle (void); -void go_user (struct intrframe frame); +void go_user (struct intrframe *frame); void init_exceptions(void); void init_kqueue(void); Index: sys/thread.h =================================================================== RCS file: /home/dcvs/src/sys/sys/thread.h,v retrieving revision 1.86 diff -u -p -r1.86 thread.h --- sys/thread.h 4 Jun 2006 21:09:50 -0000 1.86 +++ sys/thread.h 21 Jan 2007 08:37:26 -0000 @@ -389,7 +389,7 @@ void *arg1, int arg2); extern int lwkt_seq_ipiq(struct globaldata *targ); extern void lwkt_process_ipiq(void); #ifdef _KERNEL -extern void lwkt_process_ipiq_frame(struct intrframe frame); +extern void lwkt_process_ipiq_frame(struct intrframe *frame); #endif extern void lwkt_smp_stopped(void);
Attachment:
signature.asc
Description: OpenPGP digital signature