Date: Tue, 3 Feb 2004 08:22:17 -0800 (PST) From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 46420 for review Message-ID: <200402031622.i13GMHoE053951@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=46420 Change 46420 by jhb@jhb_slimer on 2004/02/03 08:21:53 IFC @46414. Affected files ... .. //depot/projects/smpng/sys/alpha/osf1/osf1_misc.c#24 integrate .. //depot/projects/smpng/sys/amd64/acpica/madt.c#3 integrate .. //depot/projects/smpng/sys/amd64/amd64/cpu_switch.S#8 integrate .. //depot/projects/smpng/sys/amd64/amd64/db_trace.c#4 integrate .. //depot/projects/smpng/sys/amd64/amd64/fpu.c#4 integrate .. //depot/projects/smpng/sys/amd64/amd64/genassym.c#10 integrate .. //depot/projects/smpng/sys/amd64/amd64/local_apic.c#3 integrate .. //depot/projects/smpng/sys/amd64/amd64/machdep.c#20 integrate .. //depot/projects/smpng/sys/amd64/amd64/mp_machdep.c#6 integrate .. //depot/projects/smpng/sys/amd64/amd64/pmap.c#21 integrate .. //depot/projects/smpng/sys/amd64/amd64/trap.c#15 integrate .. //depot/projects/smpng/sys/amd64/amd64/vm_machdep.c#14 integrate .. //depot/projects/smpng/sys/amd64/conf/GENERIC#13 integrate .. //depot/projects/smpng/sys/amd64/include/cpufunc.h#6 integrate .. //depot/projects/smpng/sys/amd64/include/fpu.h#2 integrate .. //depot/projects/smpng/sys/amd64/include/md_var.h#8 integrate .. //depot/projects/smpng/sys/amd64/include/pcb.h#6 integrate .. //depot/projects/smpng/sys/amd64/include/reg.h#4 integrate .. //depot/projects/smpng/sys/amd64/include/smp.h#3 integrate .. //depot/projects/smpng/sys/amd64/include/specialreg.h#5 integrate .. //depot/projects/smpng/sys/amd64/isa/atpic.c#4 integrate .. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_misc.c#6 integrate .. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_proto.h#6 integrate .. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_syscall.h#6 integrate .. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_syscalls.c#6 integrate .. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_sysent.c#6 integrate .. //depot/projects/smpng/sys/compat/freebsd32/syscalls.master#6 integrate .. //depot/projects/smpng/sys/compat/ndis/kern_ndis.c#7 integrate .. //depot/projects/smpng/sys/compat/ndis/subr_ndis.c#7 integrate .. //depot/projects/smpng/sys/conf/files.i386#53 integrate .. //depot/projects/smpng/sys/conf/files.powerpc#17 integrate .. //depot/projects/smpng/sys/conf/majors#34 integrate .. //depot/projects/smpng/sys/conf/systags.sh#2 integrate .. //depot/projects/smpng/sys/dev/aac/aac.c#33 integrate .. //depot/projects/smpng/sys/dev/aac/aac_pci.c#27 integrate .. //depot/projects/smpng/sys/dev/aac/aacvar.h#20 integrate .. //depot/projects/smpng/sys/dev/acpica/acpi_thermal.c#22 integrate .. //depot/projects/smpng/sys/dev/ata/ata-all.c#46 integrate .. //depot/projects/smpng/sys/dev/ata/ata-all.h#23 integrate .. //depot/projects/smpng/sys/dev/ata/ata-chipset.c#29 integrate .. //depot/projects/smpng/sys/dev/ata/ata-lowlevel.c#9 integrate .. //depot/projects/smpng/sys/dev/ata/ata-pci.h#18 integrate .. //depot/projects/smpng/sys/dev/ata/ata-queue.c#7 integrate .. //depot/projects/smpng/sys/dev/firewire/firewire.c#30 integrate .. //depot/projects/smpng/sys/dev/firewire/fwohci.c#30 integrate .. //depot/projects/smpng/sys/dev/firewire/fwohci_pci.c#24 integrate .. //depot/projects/smpng/sys/dev/firewire/fwohcireg.h#12 integrate .. //depot/projects/smpng/sys/dev/gem/if_gem_pci.c#13 integrate .. //depot/projects/smpng/sys/dev/hifn/hifn7751.c#14 integrate .. //depot/projects/smpng/sys/dev/if_ndis/if_ndis.c#7 integrate .. //depot/projects/smpng/sys/dev/isp/isp_target.c#11 integrate .. //depot/projects/smpng/sys/dev/sound/driver.c#2 integrate .. //depot/projects/smpng/sys/dev/usb/umass.c#34 integrate .. //depot/projects/smpng/sys/dev/usb/uscanner.c#19 integrate .. //depot/projects/smpng/sys/geom/geom_event.c#25 integrate .. //depot/projects/smpng/sys/geom/geom_mirror.c#7 integrate .. //depot/projects/smpng/sys/geom/geom_subr.c#36 integrate .. //depot/projects/smpng/sys/i386/conf/GENERIC#46 integrate .. //depot/projects/smpng/sys/i386/conf/NOTES#75 integrate .. //depot/projects/smpng/sys/i386/i386/local_apic.c#7 integrate .. //depot/projects/smpng/sys/i386/i386/longrun.c#2 integrate .. //depot/projects/smpng/sys/i386/i386/machdep.c#72 integrate .. //depot/projects/smpng/sys/i386/i386/pmap.c#57 integrate .. //depot/projects/smpng/sys/i386/i386/trap.c#67 integrate .. //depot/projects/smpng/sys/kern/init_sysent.c#40 integrate .. //depot/projects/smpng/sys/kern/kern_mac.c#34 integrate .. //depot/projects/smpng/sys/kern/kern_mutex.c#76 integrate .. //depot/projects/smpng/sys/kern/kern_sig.c#85 integrate .. //depot/projects/smpng/sys/kern/kern_subr.c#29 integrate .. //depot/projects/smpng/sys/kern/kern_switch.c#35 integrate .. //depot/projects/smpng/sys/kern/kern_synch.c#64 integrate .. //depot/projects/smpng/sys/kern/sched_4bsd.c#22 integrate .. //depot/projects/smpng/sys/kern/sched_ule.c#25 integrate .. //depot/projects/smpng/sys/kern/subr_witness.c#111 integrate .. //depot/projects/smpng/sys/kern/sys_pipe.c#41 integrate .. //depot/projects/smpng/sys/kern/syscalls.c#40 integrate .. //depot/projects/smpng/sys/kern/syscalls.master#39 integrate .. //depot/projects/smpng/sys/kern/uipc_mbuf.c#24 integrate .. //depot/projects/smpng/sys/kern/uipc_sem.c#9 integrate .. //depot/projects/smpng/sys/kern/uipc_socket.c#46 integrate .. //depot/projects/smpng/sys/kern/uipc_syscalls.c#45 integrate .. //depot/projects/smpng/sys/kern/vfs_mount.c#23 integrate .. //depot/projects/smpng/sys/net/if.c#41 integrate .. //depot/projects/smpng/sys/net/if_gre.c#14 integrate .. //depot/projects/smpng/sys/netgraph/ng_source.c#5 integrate .. //depot/projects/smpng/sys/netinet/ip_gre.c#11 integrate .. //depot/projects/smpng/sys/netinet/ip_icmp.c#24 integrate .. //depot/projects/smpng/sys/netinet/ip_input.c#47 integrate .. //depot/projects/smpng/sys/netinet/udp_usrreq.c#37 integrate .. //depot/projects/smpng/sys/nfsclient/nfs_vfsops.c#33 integrate .. //depot/projects/smpng/sys/opencrypto/cryptodev.h#7 integrate .. //depot/projects/smpng/sys/opencrypto/cryptosoft.c#6 integrate .. //depot/projects/smpng/sys/pc98/conf/GENERIC#39 integrate .. //depot/projects/smpng/sys/pc98/conf/NOTES#21 integrate .. //depot/projects/smpng/sys/posix4/_semaphore.h#2 integrate .. //depot/projects/smpng/sys/posix4/semaphore.h#5 integrate .. //depot/projects/smpng/sys/powerpc/include/vmparam.h#2 integrate .. //depot/projects/smpng/sys/powerpc/powermac/openpic_macio.c#2 integrate .. //depot/projects/smpng/sys/powerpc/powerpc/pmap.c#35 integrate .. //depot/projects/smpng/sys/powerpc/powerpc/uma_machdep.c#1 branch .. //depot/projects/smpng/sys/security/mac/mac_pipe.c#5 integrate .. //depot/projects/smpng/sys/security/mac_biba/mac_biba.c#24 integrate .. //depot/projects/smpng/sys/security/mac_lomac/mac_lomac.c#19 integrate .. //depot/projects/smpng/sys/security/mac_mls/mac_mls.c#23 integrate .. //depot/projects/smpng/sys/security/mac_stub/mac_stub.c#5 integrate .. //depot/projects/smpng/sys/security/mac_test/mac_test.c#19 integrate .. //depot/projects/smpng/sys/sys/mac.h#24 integrate .. //depot/projects/smpng/sys/sys/mac_policy.h#20 integrate .. //depot/projects/smpng/sys/sys/mount.h#25 integrate .. //depot/projects/smpng/sys/sys/param.h#54 integrate .. //depot/projects/smpng/sys/sys/pipe.h#7 integrate .. //depot/projects/smpng/sys/sys/sched.h#8 integrate .. //depot/projects/smpng/sys/sys/socket.h#16 integrate .. //depot/projects/smpng/sys/sys/syscall.h#40 integrate .. //depot/projects/smpng/sys/sys/syscall.mk#40 integrate .. //depot/projects/smpng/sys/sys/sysproto.h#42 integrate .. //depot/projects/smpng/sys/sys/uio.h#14 integrate .. //depot/projects/smpng/sys/ufs/ffs/ffs_vnops.c#25 integrate .. //depot/projects/smpng/sys/vm/swap_pager.c#40 integrate .. //depot/projects/smpng/sys/vm/uma_core.c#41 integrate .. //depot/projects/smpng/sys/vm/vm_glue.c#36 integrate .. //depot/projects/smpng/sys/vm/vm_map.c#53 integrate .. //depot/projects/smpng/sys/vm/vm_zeroidle.c#14 integrate Differences ... ==== //depot/projects/smpng/sys/alpha/osf1/osf1_misc.c#24 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/alpha/osf1/osf1_misc.c,v 1.43 2003/08/17 06:42:08 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/osf1/osf1_misc.c,v 1.44 2004/02/02 12:57:49 phk Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -683,16 +683,7 @@ } -#if 1 #define bsd2osf_dev(dev) (umajor(dev) << 20 | uminor(dev)) -#define osf2bsd_dev(dev) umakedev((umajor(dev) >> 20) & 0xfff, uminor(dev) & 0xfffff) -#else -#define minor(x) ((int)((x)&0xffff00ff)) -#define major(x) ((int)(((u_int)(x) >> 8)&0xff)) -#define makedev(x,y) ((dev_t)(((x) << 8) | (y))) -#define bsd2osf_dev(dev) (major(dev) << 20 | minor(dev)) -#define osf2bsd_dev(dev) makedev(((dev) >> 20) & 0xfff, (dev) & 0xfffff) -#endif /* * Convert from a stat structure to an osf1 stat structure. */ @@ -728,19 +719,7 @@ struct thread *td; struct osf1_mknod_args *uap; { -#if notanymore - struct mknod_args a; - caddr_t sg; - - sg = stackgap_init(); - CHECKALTEXIST(td, &sg, uap->path); - a.path = uap->path; - a.mode = uap->mode; - a.dev = osf2bsd_dev(uap->dev); - - return mknod(td, &a); -#endif printf("osf1_mknod no longer implemented\n"); return ENOSYS; } ==== //depot/projects/smpng/sys/amd64/acpica/madt.c#3 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/acpica/madt.c,v 1.10 2003/12/09 03:04:19 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/acpica/madt.c,v 1.11 2004/01/30 00:24:45 peter Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -320,13 +320,22 @@ } /* - * Run through the MP table enumerating I/O APICs. + * Enumerate I/O APICs and setup interrupt sources. */ static int madt_setup_io(void) { int i; + /* Try to initialize ACPI so that we can access the FADT. */ + i = acpi_Startup(); + if (ACPI_FAILURE(i)) { + printf("MADT: ACPI Startup failed with %s\n", + AcpiFormatException(i)); + printf("Try disabling either ACPI or apic support.\n"); + panic("Using MADT but ACPI doesn't work"); + } + /* First, we run through adding I/O APIC's. */ madt_walk_table(madt_parse_apics, NULL); @@ -523,6 +532,7 @@ { void *new_ioapic, *old_ioapic; u_int new_pin, old_pin; + int force_lo; if (bootverbose) printf("MADT: intr override: source %u, irq %u\n", @@ -535,9 +545,27 @@ return; } + /* + * If the SCI is remapped to a non-ISA global interrupt, + * force it to level trigger and active-lo polarity. + * If the SCI is identity mapped but has edge trigger and + * active-hi polarity, also force it to use level/lo. + */ + force_lo = 0; + if (intr->Source == AcpiGbl_FADT->SciInt) + if (intr->Interrupt > 15 || (intr->Interrupt == intr->Source && + intr->TriggerMode == TRIGGER_EDGE && + intr->Polarity == POLARITY_ACTIVE_HIGH)) + force_lo = 1; + if (intr->Source != intr->Interrupt) { - /* XXX: This assumes that the SCI uses IRQ 9. */ - if (intr->Interrupt > 15 && intr->Source == 9) + /* + * If the SCI is remapped to a non-ISA global interrupt, + * then override the vector we use to setup and allocate + * the interrupt. + */ + if (intr->Interrupt > 15 && + intr->Source == AcpiGbl_FADT->SciInt) acpi_OverrideInterruptLevel(intr->Interrupt); else ioapic_remap_vector(new_ioapic, new_pin, intr->Source); @@ -549,10 +577,18 @@ intr->Source) ioapic_disable_pin(old_ioapic, old_pin); } - ioapic_set_triggermode(new_ioapic, new_pin, - interrupt_trigger(intr->TriggerMode)); - ioapic_set_polarity(new_ioapic, new_pin, - interrupt_polarity(intr->Polarity)); + if (force_lo) { + printf( + "MADT: Forcing active-lo polarity and level trigger for IRQ %d\n", + intr->Source); + ioapic_set_polarity(new_ioapic, new_pin, 0); + ioapic_set_triggermode(new_ioapic, new_pin, 0); + } else { + ioapic_set_polarity(new_ioapic, new_pin, + interrupt_polarity(intr->Polarity)); + ioapic_set_triggermode(new_ioapic, new_pin, + interrupt_trigger(intr->TriggerMode)); + } } /* ==== //depot/projects/smpng/sys/amd64/amd64/cpu_switch.S#8 (text+ko) ==== @@ -34,10 +34,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/amd64/cpu_switch.S,v 1.145 2004/01/23 01:04:28 peter Exp $ + * $FreeBSD: src/sys/amd64/amd64/cpu_switch.S,v 1.146 2004/01/29 00:02:54 peter Exp $ */ #include <machine/asmacros.h> +#include <machine/specialreg.h> #include "assym.s" @@ -130,16 +131,36 @@ movl %fs,PCB_FS(%r8) movl %gs,PCB_GS(%r8) + /* Test if debug registers should be saved. */ + testl $PCB_DBREGS,PCB_FLAGS(%r8) + jz 1f /* no, skip over */ + movq %dr7,%rax /* yes, do the save */ + movq %rax,PCB_DR7(%r8) + andq $0x0000fc00, %rax /* disable all watchpoints */ + movq %rax,%dr7 + movq %dr6,%rax + movq %rax,PCB_DR6(%r8) + movq %dr3,%rax + movq %rax,PCB_DR3(%r8) + movq %dr2,%rax + movq %rax,PCB_DR2(%r8) + movq %dr1,%rax + movq %rax,PCB_DR1(%r8) + movq %dr0,%rax + movq %rax,PCB_DR0(%r8) +1: + /* have we used fp, and need a save? */ cmpq %rdi,PCPU(FPCURTHREAD) jne 1f - pushq %rdi - pushq %rsi - addq $PCB_SAVEFPU,%r8 /* h/w bugs make saving complicated */ - movq %r8, %rdi - call fpusave /* do it in a big C function */ - popq %rsi - popq %rdi + addq $PCB_SAVEFPU,%r8 + clts + fxsave (%r8) + smsw %ax + orb $CR0_TS,%al + lmsw %ax + xorq %rax,%rax + movq %rax,PCPU(FPCURTHREAD) 1: /* Save is done. Now fire up new thread. Leave old vmspace. */ @@ -148,12 +169,19 @@ jz badsw3 /* no, panic */ #endif movq TD_PCB(%rsi),%r8 - movl PCPU(CPUID), %eax /* switch address space */ movq PCB_CR3(%r8),%rdx +#ifdef LAZY_SWITCH + cmpq %rdx,KPML4phys /* Kernel address space? */ + je sw1 +#endif + movq %cr3,%rax + cmpq %rdx,%rax /* Same address space? */ + je sw1 movq %rdx,%cr3 /* new address space */ + movl PCPU(CPUID), %eax /* Release bit from old pmap->pm_active */ movq TD_PROC(%rdi), %rdx /* oldproc */ movq P_VMSPACE(%rdx), %rdx @@ -223,6 +251,28 @@ movq %r8, PCPU(CURPCB) movq %rsi, PCPU(CURTHREAD) /* into next thread */ + /* Test if debug registers should be restored. */ + testl $PCB_DBREGS,PCB_FLAGS(%r8) + jz 1f + movq PCB_DR6(%r8),%rax + movq %rax,%dr6 + movq PCB_DR3(%r8),%rax + movq %rax,%dr3 + movq PCB_DR2(%r8),%rax + movq %rax,%dr2 + movq PCB_DR1(%r8),%rax + movq %rax,%dr1 + movq PCB_DR0(%r8),%rax + movq %rax,%dr0 + /* But preserve reserved bits in %dr7 */ + movq %dr7,%rax + andq $0x0000fc00,%rax + movq PCB_DR7(%r8),%rcx + andq $~0x0000fc00,%rcx + orq %rcx,%rax + movq %rax,%dr7 +1: + ret #ifdef INVARIANTS @@ -242,7 +292,9 @@ pushq %r13 pushq %r14 pushq %r15 - pushq $sw0_1 + movq $0,%rdi + movq $0,%rsi + leaq sw0_1,%rdx call __panic sw0_1: .asciz "cpu_throw: no newthread supplied" @@ -262,7 +314,9 @@ pushq %r13 pushq %r14 pushq %r15 - pushq $sw0_2 + movq $0,%rdi + movq $0,%rsi + leaq sw0_2,%rdx call __panic sw0_2: .asciz "cpu_switch: no curthread supplied" @@ -282,7 +336,9 @@ pushq %r13 pushq %r14 pushq %r15 - pushq $sw0_3 + movq $0,%rdi + movq $0,%rsi + leaq sw0_3,%rdx call __panic sw0_3: .asciz "cpu_switch: no newthread supplied" #endif @@ -332,17 +388,17 @@ testq %rax,%rax je 1f - pushq %rcx - pushq %rax movq TD_PCB(%rax),%rdi leaq PCB_SAVEFPU(%rdi),%rdi - call fpusave - popq %rax - popq %rcx + clts + fxsave (%rdi) + smsw %ax + orb $CR0_TS,%al + lmsw %ax movq $PCB_SAVEFPU_SIZE,%rdx /* arg 3 */ leaq PCB_SAVEFPU(%rcx),%rsi /* arg 2 */ - movq %rax,%rdi /* arg 1 */ + /* arg 1 (%rdi) already loaded */ call bcopy 1: popfq ==== //depot/projects/smpng/sys/amd64/amd64/db_trace.c#4 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/db_trace.c,v 1.59 2003/11/17 08:58:12 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/db_trace.c,v 1.60 2004/01/28 23:57:40 peter Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -46,7 +46,6 @@ #include <ddb/db_sym.h> #include <ddb/db_variables.h> -#if 0 db_varfcn_t db_dr0; db_varfcn_t db_dr1; db_varfcn_t db_dr2; @@ -55,7 +54,6 @@ db_varfcn_t db_dr5; db_varfcn_t db_dr6; db_varfcn_t db_dr7; -#endif /* * Machine register set. @@ -87,7 +85,6 @@ { "r15", &ddb_regs.tf_r15, FCN_NULL }, { "rip", &ddb_regs.tf_rip, FCN_NULL }, { "rflags", &ddb_regs.tf_rflags, FCN_NULL }, -#if 0 { "dr0", NULL, db_dr0 }, { "dr1", NULL, db_dr1 }, { "dr2", NULL, db_dr2 }, @@ -96,7 +93,6 @@ { "dr5", NULL, db_dr5 }, { "dr6", NULL, db_dr6 }, { "dr7", NULL, db_dr7 }, -#endif }; struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]); @@ -124,12 +120,10 @@ struct proc *p, struct amd64_frame *frame, db_addr_t callpc); -#if 0 static char * watchtype_str(int type); int amd64_set_watch(int watchnum, unsigned int watchaddr, int size, int access, struct dbreg * d); int amd64_clr_watch(int watchnum, struct dbreg * d); -#endif int db_md_set_watchpoint(db_expr_t addr, db_expr_t size); int db_md_clr_watchpoint(db_expr_t addr, db_expr_t size); void db_md_list_watchpoints(void); @@ -517,7 +511,6 @@ db_stack_trace_cmd(ebp, 1, -1, NULL); } -#if 0 #define DB_DRX_FUNC(reg) \ int \ db_ ## reg (vp, valuep, op) \ @@ -709,9 +702,9 @@ unsigned type, len; type = (d.dr[7] >> (16+(i*4))) & 3; len = (d.dr[7] >> (16+(i*4)+2)) & 3; - db_printf(" %-5d %-8s %10s %3d 0x%08x\n", + db_printf(" %-5d %-8s %10s %3d 0x%016lx\n", i, "enabled", watchtype_str(type), - len+1, DBREG_DRX((&d),i)); + len + 1, DBREG_DRX((&d), i)); } else { db_printf(" %-5d disabled\n", i); @@ -720,30 +713,7 @@ db_printf("\ndebug register values:\n"); for (i=0; i<8; i++) { - db_printf(" dr%d 0x%08x\n", i, DBREG_DRX((&d),i)); + db_printf(" dr%d 0x%016lx\n", i, DBREG_DRX((&d), i)); } db_printf("\n"); } - -#else -int -db_md_set_watchpoint(addr, size) - db_expr_t addr; - db_expr_t size; -{ - return (-1); -} - -int -db_md_clr_watchpoint(addr, size) - db_expr_t addr; - db_expr_t size; -{ - return (-1); -} - -void -db_md_list_watchpoints() -{ -} -#endif ==== //depot/projects/smpng/sys/amd64/amd64/fpu.c#4 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/fpu.c,v 1.147 2003/12/06 23:19:47 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/fpu.c,v 1.148 2004/01/28 23:55:58 peter Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -112,26 +112,17 @@ * Initialize floating point unit. */ void -fpuinit() +fpuinit(void) { register_t savecrit; u_short control; - /* - * fpusave() initializes the fpu and sets fpcurthread = NULL - */ savecrit = intr_disable(); - fpusave(&fpu_cleanstate); /* XXX borrow for now */ + PCPU_SET(fpcurthread, 0); stop_emulating(); - /* XXX fpusave() doesn't actually initialize the fpu in the SSE case. */ fninit(); control = __INITIAL_FPUCW__; fldcw(&control); - start_emulating(); - intr_restore(savecrit); - - savecrit = intr_disable(); - stop_emulating(); fxsave(&fpu_cleanstate); start_emulating(); fpu_cleanstate_ready = 1; @@ -147,8 +138,12 @@ register_t savecrit; savecrit = intr_disable(); - if (curthread == PCPU_GET(fpcurthread)) - fpusave(&PCPU_GET(curpcb)->pcb_save); + if (curthread == PCPU_GET(fpcurthread)) { + stop_emulating(); + fxsave(&PCPU_GET(curpcb)->pcb_save); + start_emulating(); + PCPU_SET(fpcurthread, 0); + } intr_restore(savecrit); } @@ -422,42 +417,14 @@ control = __INITIAL_FPUCW__; fldcw(&control); pcb->pcb_flags |= PCB_FPUINITDONE; - } else { - /* - * The following frstor may cause a trap when the state - * being restored has a pending error. The error will - * appear to have been triggered by the current (fpu) user - * instruction even when that instruction is a no-wait - * instruction that should not trigger an error (e.g., - * instructions are broken the same as frstor, so our - * treatment does not amplify the breakage. - */ + } else fxrstor(&pcb->pcb_save); - } intr_restore(s); return (1); } /* - * Wrapper for fnsave instruction. - * - * fpusave() must be called with interrupts disabled, so that it clears - * fpcurthread atomically with saving the state. We require callers to do the - * disabling, since most callers need to disable interrupts anyway to call - * fpusave() atomically with checking fpcurthread. - */ -void -fpusave(struct savefpu *addr) -{ - - stop_emulating(); - fxsave(addr); - start_emulating(); - PCPU_SET(fpcurthread, NULL); -} - -/* * This should be called with interrupts disabled and only when the owning * FPU thread is non-null. */ ==== //depot/projects/smpng/sys/amd64/amd64/genassym.c#10 (text+ko) ==== @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.151 2003/11/21 03:01:59 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.152 2004/01/28 23:57:02 peter Exp $"); #include "opt_compat.h" #include "opt_kstack_pages.h" @@ -135,6 +135,13 @@ ASSYM(PCB_ES, offsetof(struct pcb, pcb_es)); ASSYM(PCB_FS, offsetof(struct pcb, pcb_fs)); ASSYM(PCB_GS, offsetof(struct pcb, pcb_gs)); +ASSYM(PCB_DR0, offsetof(struct pcb, pcb_dr0)); +ASSYM(PCB_DR1, offsetof(struct pcb, pcb_dr1)); +ASSYM(PCB_DR2, offsetof(struct pcb, pcb_dr2)); +ASSYM(PCB_DR3, offsetof(struct pcb, pcb_dr3)); +ASSYM(PCB_DR6, offsetof(struct pcb, pcb_dr6)); +ASSYM(PCB_DR7, offsetof(struct pcb, pcb_dr7)); +ASSYM(PCB_DBREGS, PCB_DBREGS); ASSYM(PCB_FLAGS, offsetof(struct pcb, pcb_flags)); ASSYM(PCB_FULLCTX, PCB_FULLCTX); @@ -206,10 +213,5 @@ ASSYM(KUC32SEL, GSEL(GUCODE32_SEL, SEL_UPL)); ASSYM(SEL_RPL_MASK, SEL_RPL_MASK); -ASSYM(MSR_FSBASE, MSR_FSBASE); -ASSYM(MSR_GSBASE, MSR_GSBASE); -ASSYM(MSR_KGSBASE, MSR_KGSBASE); -ASSYM(GPROC0_SEL, GPROC0_SEL); - ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock)); ASSYM(MTX_RECURSECNT, offsetof(struct mtx, mtx_recurse)); ==== //depot/projects/smpng/sys/amd64/amd64/local_apic.c#3 (text+ko) ==== @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/local_apic.c,v 1.5 2003/12/06 23:14:44 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/local_apic.c,v 1.7 2004/01/30 00:24:45 peter Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -600,6 +600,10 @@ if (retval != 0) printf("%s: Failed to setup the local APIC: returned %d\n", best_enum->apic_name, retval); +#ifdef SMP + /* Last, setup the cpu topology now that we have probed CPUs */ + mp_topology(); +#endif } SYSINIT(apic_setup_local, SI_SUB_CPU, SI_ORDER_FIRST, apic_setup_local, NULL) @@ -634,7 +638,6 @@ * private the sys/i386 code. The public interface for the rest of the * kernel is defined in mp_machdep.c. */ -#define DETECT_DEADLOCK int lapic_ipi_wait(int delay) ==== //depot/projects/smpng/sys/amd64/amd64/machdep.c#20 (text+ko) ==== @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.602 2004/01/03 02:02:24 davidxu Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.603 2004/01/29 00:07:29 peter Exp $"); #include "opt_atalk.h" #include "opt_atpic.h" @@ -147,7 +147,7 @@ long Maxmem = 0; -vm_paddr_t phys_avail[10]; +vm_paddr_t phys_avail[20]; /* must be 2 less so 0 0 can signal end of chunks */ #define PHYS_AVAIL_ARRAY_END ((sizeof(phys_avail) / sizeof(vm_offset_t)) - 2) @@ -266,7 +266,7 @@ } else sp = (char *)regs->tf_rsp - sizeof(struct sigframe) - 128; /* Align to 16 bytes. */ - sfp = (struct sigframe *)((unsigned long)sp & ~0xF); + sfp = (struct sigframe *)((unsigned long)sp & ~0xFul); /* Translate the signal if appropriate. */ if (p->p_sysent->sv_sigtbl && sig <= p->p_sysent->sv_sigsize) @@ -527,13 +527,35 @@ bzero((char *)regs, sizeof(struct trapframe)); regs->tf_rip = entry; - regs->tf_rsp = ((stack - 8) & ~0xF) + 8; + regs->tf_rsp = ((stack - 8) & ~0xFul) + 8; regs->tf_rdi = stack; /* argv */ regs->tf_rflags = PSL_USER | (regs->tf_rflags & PSL_T); regs->tf_ss = _udatasel; regs->tf_cs = _ucodesel; /* + * Reset the hardware debug registers if they were in use. + * They won't have any meaning for the newly exec'd process. + */ + if (pcb->pcb_flags & PCB_DBREGS) { + pcb->pcb_dr0 = 0; + pcb->pcb_dr1 = 0; + pcb->pcb_dr2 = 0; + pcb->pcb_dr3 = 0; + pcb->pcb_dr6 = 0; + pcb->pcb_dr7 = 0; + if (pcb == PCPU_GET(curpcb)) { + /* + * Clear the debug registers on the running + * CPU, otherwise they will end up affecting + * the next process we switch to. + */ + reset_dbregs(); + } + pcb->pcb_flags &= ~PCB_DBREGS; + } + + /* * Arrange to trap the next fpu or `fwait' instruction (see fpu.c * for why fwait must be trapped at least if there is an fpu or an * emulator). This is mainly to handle the case where npx0 is not @@ -819,7 +841,8 @@ * "Consumer may safely assume that size value precedes data." * ie: an int32_t immediately precedes smap. */ - smapbase = (struct bios_smap *)preload_search_info(kmdp, MODINFO_METADATA | MODINFOMD_SMAP); + smapbase = (struct bios_smap *)preload_search_info(kmdp, + MODINFO_METADATA | MODINFOMD_SMAP); if (smapbase == NULL) panic("No BIOS smap info from loader!"); @@ -983,30 +1006,26 @@ * Test for alternating 1's and 0's */ *(volatile int *)ptr = 0xaaaaaaaa; - if (*(volatile int *)ptr != 0xaaaaaaaa) { + if (*(volatile int *)ptr != 0xaaaaaaaa) page_bad = TRUE; - } /* * Test for alternating 0's and 1's */ *(volatile int *)ptr = 0x55555555; - if (*(volatile int *)ptr != 0x55555555) { - page_bad = TRUE; - } + if (*(volatile int *)ptr != 0x55555555) + page_bad = TRUE; /* * Test for all 1's */ *(volatile int *)ptr = 0xffffffff; - if (*(volatile int *)ptr != 0xffffffff) { + if (*(volatile int *)ptr != 0xffffffff) page_bad = TRUE; - } /* * Test for all 0's */ *(volatile int *)ptr = 0x0; - if (*(volatile int *)ptr != 0x0) { + if (*(volatile int *)ptr != 0x0) page_bad = TRUE; - } /* * Restore original value. */ @@ -1015,9 +1034,8 @@ /* * Adjust array of valid/good pages. */ - if (page_bad == TRUE) { + if (page_bad == TRUE) continue; - } /* * If this good page is a continuation of the * previous set of good pages, then just increase @@ -1040,7 +1058,7 @@ break; } phys_avail[pa_indx++] = pa; /* start */ - phys_avail[pa_indx] = pa + PAGE_SIZE; /* end */ + phys_avail[pa_indx] = pa + PAGE_SIZE; /* end */ } physmem++; } @@ -1127,7 +1145,8 @@ if (x != GPROC0_SEL && x != (GPROC0_SEL + 1)) ssdtosd(&gdt_segs[x], &gdt[x]); } - ssdtosyssd(&gdt_segs[GPROC0_SEL], (struct system_segment_descriptor *)&gdt[GPROC0_SEL]); + ssdtosyssd(&gdt_segs[GPROC0_SEL], + (struct system_segment_descriptor *)&gdt[GPROC0_SEL]); r_gdt.rd_limit = NGDT * sizeof(gdt[0]) - 1; r_gdt.rd_base = (long) gdt; @@ -1136,7 +1155,7 @@ wrmsr(MSR_FSBASE, 0); /* User value */ wrmsr(MSR_GSBASE, (u_int64_t)pc); - wrmsr(MSR_KGSBASE, 0); /* User value while we're in the kernel */ + wrmsr(MSR_KGSBASE, 0); /* User value while in the kernel */ pcpu_init(pc, 0, sizeof(struct pcpu)); PCPU_SET(prvspace, pc); @@ -1204,7 +1223,7 @@ common_tss[0].tss_rsp0 = thread0.td_kstack + \ KSTACK_PAGES * PAGE_SIZE - sizeof(struct pcb); /* Ensure the stack is aligned to 16 bytes */ - common_tss[0].tss_rsp0 &= ~0xF; + common_tss[0].tss_rsp0 &= ~0xFul; PCPU_SET(rsp0, common_tss[0].tss_rsp0); /* doublefault stack space, runs on ist1 */ @@ -1559,17 +1578,197 @@ int fill_dbregs(struct thread *td, struct dbreg *dbregs) { + struct pcb *pcb; + if (td == NULL) { + dbregs->dr[0] = rdr0(); + dbregs->dr[1] = rdr1(); + dbregs->dr[2] = rdr2(); + dbregs->dr[3] = rdr3(); + dbregs->dr[6] = rdr6(); + dbregs->dr[7] = rdr7(); + } else { + pcb = td->td_pcb; + dbregs->dr[0] = pcb->pcb_dr0; + dbregs->dr[1] = pcb->pcb_dr1; + dbregs->dr[2] = pcb->pcb_dr2; + dbregs->dr[3] = pcb->pcb_dr3; + dbregs->dr[6] = pcb->pcb_dr6; + dbregs->dr[7] = pcb->pcb_dr7; + } + dbregs->dr[4] = 0; + dbregs->dr[5] = 0; + dbregs->dr[8] = 0; + dbregs->dr[9] = 0; + dbregs->dr[10] = 0; + dbregs->dr[11] = 0; + dbregs->dr[12] = 0; + dbregs->dr[13] = 0; + dbregs->dr[14] = 0; + dbregs->dr[15] = 0; return (0); } int set_dbregs(struct thread *td, struct dbreg *dbregs) { + struct pcb *pcb; + int i; + u_int64_t mask1, mask2; + + if (td == NULL) { + load_dr0(dbregs->dr[0]); + load_dr1(dbregs->dr[1]); + load_dr2(dbregs->dr[2]); + load_dr3(dbregs->dr[3]); + load_dr6(dbregs->dr[6]); + load_dr7(dbregs->dr[7]); + } else { + /* + * Don't let an illegal value for dr7 get set. Specifically, + * check for undefined settings. Setting these bit patterns + * result in undefined behaviour and can lead to an unexpected + * TRCTRAP or a general protection fault right here. + */ + for (i = 0, mask1 = 0x3<<16, mask2 = 0x2<<16; i < 8; + i++, mask1 <<= 2, mask2 <<= 2) + if ((dbregs->dr[7] & mask1) == mask2) + return (EINVAL); + + pcb = td->td_pcb; + /* + * Don't let a process set a breakpoint that is not within the + * process's address space. If a process could do this, it + * could halt the system by setting a breakpoint in the kernel + * (if ddb was enabled). Thus, we need to check to make sure + * that no breakpoints are being enabled for addresses outside + * process's address space, unless, perhaps, we were called by + * uid 0. + * + * XXX - what about when the watched area of the user's + * address space is written into from within the kernel + * ... wouldn't that still cause a breakpoint to be generated + * from within kernel mode? + */ + + if (suser(td) != 0) { + if (dbregs->dr[7] & 0x3) { + /* dr0 is enabled */ + if (dbregs->dr[0] >= VM_MAXUSER_ADDRESS) + return (EINVAL); + } + if (dbregs->dr[7] & 0x3<<2) { + /* dr1 is enabled */ + if (dbregs->dr[1] >= VM_MAXUSER_ADDRESS) + return (EINVAL); + } + if (dbregs->dr[7] & 0x3<<4) { + /* dr2 is enabled */ + if (dbregs->dr[2] >= VM_MAXUSER_ADDRESS) + return (EINVAL); + } + if (dbregs->dr[7] & 0x3<<6) { + /* dr3 is enabled */ + if (dbregs->dr[3] >= VM_MAXUSER_ADDRESS) + return (EINVAL); + } + } + + pcb->pcb_dr0 = dbregs->dr[0]; + pcb->pcb_dr1 = dbregs->dr[1]; + pcb->pcb_dr2 = dbregs->dr[2]; + pcb->pcb_dr3 = dbregs->dr[3]; + pcb->pcb_dr6 = dbregs->dr[6]; + pcb->pcb_dr7 = dbregs->dr[7]; + + pcb->pcb_flags |= PCB_DBREGS; + } + return (0); } +void +reset_dbregs(void) +{ + >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200402031622.i13GMHoE053951>