PERFORCE change 31043 for review
John Baldwin
jhb at FreeBSD.org
Tue May 13 09:35:54 PDT 2003
On 13-May-2003 Peter Wemm wrote:
> http://perforce.freebsd.org/chv.cgi?CH=31043
>
> Change 31043 by peter at peter_hammer on 2003/05/12 19:08:19
>
> And now for something completely different... i386 binary emulation!
> This was submitted by p4/i386 on the amd64 box itself!
Can we possibly have a shared compat/ia32? syscalls.master should be
able to be shared for example.
> Affected files ...
>
> .. //depot/projects/hammer/sys/amd64/amd64/cpu_switch.S#4 edit
> .. //depot/projects/hammer/sys/amd64/amd64/exception.S#11 edit
> .. //depot/projects/hammer/sys/amd64/amd64/genassym.c#12 edit
> .. //depot/projects/hammer/sys/amd64/amd64/machdep.c#30 edit
> .. //depot/projects/hammer/sys/amd64/amd64/support.S#6 edit
> .. //depot/projects/hammer/sys/amd64/amd64/trap.c#14 edit
> .. //depot/projects/hammer/sys/amd64/amd64/vm_machdep.c#6 edit
> .. //depot/projects/hammer/sys/amd64/conf/GENERIC#8 edit
> .. //depot/projects/hammer/sys/amd64/ia32/Makefile#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/ia32.h#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/ia32_misc.c#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/ia32_proto.h#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/ia32_syscall.h#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/ia32_sysent.c#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/ia32_sysvec.c#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/ia32_util.h#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/syscalls.conf#1 add
> .. //depot/projects/hammer/sys/amd64/ia32/syscalls.master#1 add
> .. //depot/projects/hammer/sys/amd64/include/cpufunc.h#6 edit
> .. //depot/projects/hammer/sys/amd64/include/elf.h#7 edit
> .. //depot/projects/hammer/sys/amd64/include/pcb.h#8 edit
> .. //depot/projects/hammer/sys/conf/files.amd64#9 edit
> .. //depot/projects/hammer/sys/conf/options.amd64#8 edit
>
> Differences ...
>
> ==== //depot/projects/hammer/sys/amd64/amd64/cpu_switch.S#4 (text+ko) ====
>
> @@ -106,6 +106,12 @@
> pushfq /* PSL */
> popq PCB_RFLAGS(%r8)
>
> + /* Save kernel %gs.base */
> + movl $MSR_GSBASE,%ecx
> + rdmsr
> + movl %eax,PCB_KGSBASE(%r8)
> + movl %edx,PCB_KGSBASE+4(%r8)
> +
> /* Save userland %fs */
> movl $MSR_FSBASE,%ecx
> rdmsr
> @@ -118,6 +124,12 @@
> movl %eax,PCB_GSBASE(%r8)
> movl %edx,PCB_GSBASE+4(%r8)
>
> + /* Save segment selector numbers */
> + movl %ds,PCB_DS(%r8)
> + movl %es,PCB_ES(%r8)
> + movl %fs,PCB_FS(%r8)
> + movl %gs,PCB_GS(%r8)
> +
> /* have we used fp, and need a save? */
> cmpq %rdi,PCPU(FPCURTHREAD)
> jne 1f
> @@ -160,6 +172,18 @@
> */
> movq TD_PCB(%rsi),%r8
>
> + /* Restore segment selector numbers */
> + movl PCB_DS(%r8),%ds
> + movl PCB_ES(%r8),%es
> + movl PCB_FS(%r8),%fs
> + movl PCB_GS(%r8),%gs
> +
> + /* Restore kernel %gs.base */
> + movl $MSR_GSBASE,%ecx
> + movl PCB_KGSBASE(%r8),%eax
> + movl PCB_KGSBASE+4(%r8),%edx
> + wrmsr
> +
> /* Restore userland %fs */
> movl $MSR_FSBASE,%ecx
> movl PCB_FSBASE(%r8),%eax
>
> ==== //depot/projects/hammer/sys/amd64/amd64/exception.S#11 (text+ko) ====
>
> @@ -247,7 +247,7 @@
> movq %r14,TF_R14(%rsp)
> movq %r15,TF_R15(%rsp)
> FAKE_MCOUNT(13*4(%rsp))
> - call syscall
> + call ia32_syscall
> MEXITCOUNT
> jmp doreti
>
>
> ==== //depot/projects/hammer/sys/amd64/amd64/genassym.c#12 (text+ko) ====
>
> @@ -125,6 +125,11 @@
> ASSYM(PCB_RFLAGS, offsetof(struct pcb, pcb_rflags));
> ASSYM(PCB_FSBASE, offsetof(struct pcb, pcb_fsbase));
> ASSYM(PCB_GSBASE, offsetof(struct pcb, pcb_gsbase));
> +ASSYM(PCB_KGSBASE, offsetof(struct pcb, pcb_kgsbase));
> +ASSYM(PCB_DS, offsetof(struct pcb, pcb_ds));
> +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_FLAGS, offsetof(struct pcb, pcb_flags));
> ASSYM(PCB_FULLCTX, PCB_FULLCTX);
> @@ -181,8 +186,10 @@
> ASSYM(KDSEL, GSEL(GDATA_SEL, SEL_KPL));
> ASSYM(KUCSEL, GSEL(GUCODE_SEL, SEL_UPL));
> ASSYM(KUDSEL, GSEL(GUDATA_SEL, SEL_UPL));
> +ASSYM(KUC32SEL, GSEL(GUCODE32_SEL, SEL_UPL));
>
> ASSYM(MSR_FSBASE, MSR_FSBASE);
> +ASSYM(MSR_GSBASE, MSR_GSBASE);
> ASSYM(MSR_KGSBASE, MSR_KGSBASE);
> ASSYM(GPROC0_SEL, GPROC0_SEL);
>
>
> ==== //depot/projects/hammer/sys/amd64/amd64/machdep.c#30 (text+ko) ====
>
> @@ -129,7 +129,7 @@
> static int set_fpcontext(struct thread *td, const mcontext_t *mcp);
> SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL)
>
> -int _udatasel, _ucodesel;
> +int _udatasel, _ucodesel, _ucode32sel;
> u_long atdevbase;
>
> u_int64_t modulep; /* phys addr of metadata table */
> @@ -466,11 +466,25 @@
> {
> struct trapframe *regs = td->td_frame;
> struct pcb *pcb = td->td_pcb;
> + u_int64_t pc;
>
> + wrmsr(MSR_FSBASE, 0);
> + wrmsr(MSR_KGSBASE, 0); /* User value while we're in the kernel */
> pcb->pcb_fsbase = 0;
> pcb->pcb_gsbase = 0;
> - wrmsr(MSR_FSBASE, 0);
> - wrmsr(MSR_KGSBASE, 0); /* User value while we're in the kernel */
> + pcb->pcb_kgsbase = rdmsr(MSR_GSBASE);
> + load_ds(_udatasel);
> + load_es(_udatasel);
> + load_fs(_udatasel);
> + critical_enter();
> + pc = rdmsr(MSR_GSBASE);
> + load_gs(_udatasel); /* Clobbers kernel %GS.base */
> + wrmsr(MSR_GSBASE, pc);
> + critical_exit();
> + pcb->pcb_ds = _udatasel;
> + pcb->pcb_es = _udatasel;
> + pcb->pcb_fs = _udatasel;
> + pcb->pcb_gs = _udatasel;
>
> bzero((char *)regs, sizeof(struct trapframe));
> regs->tf_rip = entry;
> @@ -589,7 +603,7 @@
> 0xfffff, /* length - all address space */
> SDT_MEMERA, /* segment type */
> SEL_UPL, /* segment descriptor priority level */
> - 0, /* segment descriptor present */
> + 1, /* segment descriptor present */
> 0, /* long */
> 1, /* default 32 vs 16 bit size */
> 1 /* limit granularity (byte/page units)*/ },
> @@ -1289,10 +1303,12 @@
>
> _ucodesel = GSEL(GUCODE_SEL, SEL_UPL);
> _udatasel = GSEL(GUDATA_SEL, SEL_UPL);
> + _ucode32sel = GSEL(GUCODE32_SEL, SEL_UPL);
>
> /* setup proc 0's pcb */
> thread0.td_pcb->pcb_flags = 0; /* XXXKSE */
> thread0.td_pcb->pcb_cr3 = IdlePML4;
> + thread0.td_pcb->pcb_kgsbase = (u_int64_t)pc;
> thread0.td_frame = &proc0_tf;
> }
>
>
> ==== //depot/projects/hammer/sys/amd64/amd64/support.S#6 (text+ko) ====
>
> @@ -358,6 +358,9 @@
> movq $0,PCB_ONFAULT(%rcx)
> ret
>
> +ENTRY(fuword)
> + jmp fuword64
> +
> ENTRY(fuword32)
> movq PCPU(CURPCB),%rcx
> movq $fusufault,PCB_ONFAULT(%rcx)
> @@ -366,15 +369,10 @@
> cmpq %rax,%rdi /* verify address is valid */
> ja fusufault
>
> -/* XXX use the 64 extend */
> - xorq %rax, %rax
> movl (%rdi),%eax
> movq $0,PCB_ONFAULT(%rcx)
> ret
>
> -ENTRY(fuword)
> - jmp fuword32
> -
> /*
> * These two routines are called from the profiling code, potentially
> * at interrupt time. If they fail, that's okay, good things will
> @@ -397,8 +395,6 @@
> cmpq %rax,%rdi
> ja fusufault
>
> -/* XXX use the 64 extend */
> - xorq %rax, %rax
> movzwl (%rdi),%eax
> movq $0,PCB_ONFAULT(%rcx)
> ret
> @@ -414,8 +410,6 @@
> cmpq %rax,%rdi
> ja fusufault
>
> -/* XXX use the 64 extend */
> - xorq %rax, %rax
> movzbl (%rdi),%eax
> movq $0,PCB_ONFAULT(%rcx)
> ret
> @@ -448,6 +442,9 @@
> movq %rax,PCB_ONFAULT(%rcx)
> ret
>
> +ENTRY(suword)
> + jmp suword64
> +
> ENTRY(suword32)
> movq PCPU(CURPCB),%rcx
> movq $fusufault,PCB_ONFAULT(%rcx)
> @@ -462,9 +459,6 @@
> movq %rax,PCB_ONFAULT(%rcx)
> ret
>
> -ENTRY(suword)
> - jmp suword32
> -
> /*
> * suword16 - MP SAFE
> */
>
> ==== //depot/projects/hammer/sys/amd64/amd64/trap.c#14 (text+ko) ====
>
> @@ -91,7 +91,7 @@
> extern void trap(struct trapframe frame);
> extern void syscall(struct trapframe frame);
>
> -static int trap_pfault(struct trapframe *, int, vm_offset_t);
> +static int trap_pfault(struct trapframe *, int);
> static void trap_fatal(struct trapframe *, vm_offset_t);
> void dblfault_handler(void);
>
> @@ -161,13 +161,13 @@
> struct proc *p = td->td_proc;
> u_int sticks = 0;
> int i = 0, ucode = 0, type, code;
> - vm_offset_t eva;
>
> atomic_add_int(&cnt.v_trap, 1);
> type = frame.tf_trapno;
>
> #ifdef DDB
> if (db_active) {
> + vm_offset_t eva;
> eva = (type == T_PAGEFLT ? frame.tf_addr : 0);
> trap_fatal(&frame, eva);
> goto out;
> @@ -202,7 +202,6 @@
> }
> }
>
> - eva = 0;
> code = frame.tf_err;
> if (type == T_PAGEFLT) {
> /*
> @@ -213,9 +212,8 @@
> * kernel can print out a useful trap message and even get
> * to the debugger.
> */
> - eva = frame.tf_addr;
> if (PCPU_GET(spinlocks) != NULL)
> - trap_fatal(&frame, eva);
> + trap_fatal(&frame, frame.tf_addr);
> }
>
> #ifdef DEVICE_POLLING
> @@ -261,7 +259,7 @@
> break;
>
> case T_PAGEFLT: /* page fault */
> - i = trap_pfault(&frame, TRUE, eva);
> + i = trap_pfault(&frame, TRUE);
> if (i == -1)
> goto userout;
> if (i == 0)
> @@ -331,7 +329,7 @@
> ("kernel trap doesn't have ucred"));
> switch (type) {
> case T_PAGEFLT: /* page fault */
> - (void) trap_pfault(&frame, FALSE, eva);
> + (void) trap_pfault(&frame, FALSE);
> goto out;
>
> case T_DNA:
> @@ -430,7 +428,7 @@
> #endif /* DEV_ISA */
> }
>
> - trap_fatal(&frame, eva);
> + trap_fatal(&frame, 0);
> goto out;
> }
>
> @@ -445,7 +443,7 @@
> uprintf("fatal process exception: %s",
> trap_msg[type]);
> if ((type == T_PAGEFLT) || (type == T_PROTFLT))
> - uprintf(", fault VA = 0x%lx", eva);
> + uprintf(", fault VA = 0x%lx", frame.tf_addr);
> uprintf("\n");
> }
> #endif
> @@ -462,10 +460,9 @@
> }
>
> static int
> -trap_pfault(frame, usermode, eva)
> +trap_pfault(frame, usermode)
> struct trapframe *frame;
> int usermode;
> - vm_offset_t eva;
> {
> vm_offset_t va;
> struct vmspace *vm = NULL;
> @@ -474,6 +471,7 @@
> vm_prot_t ftype;
> struct thread *td = curthread;
> struct proc *p = td->td_proc;
> + vm_offset_t eva = frame->tf_addr;
>
> va = trunc_page(eva);
> if (va >= KERNBASE) {
> @@ -542,7 +540,7 @@
> return (-1);
> }
>
> -printf("trap_pfault: pid %d %s %s %s eva %p, rip %p, rax %p, rbx %p, rcx %p, rdx %p, rsp %p, rvp
> %p, rsi %p, rdi %p\n", p->p_pid,
> +printf("trap_pfault: pid %d %s %s %s eva %p, rip %p, rax %p, rbx %p, rcx %p, rdx %p, rsp %p, rbp
> %p, rsi %p, rdi %p\n", p->p_pid,
> frame->tf_err & PGEX_U ? "user" : "supervisor",
> frame->tf_err & PGEX_W ? "write" : "read",
> frame->tf_err & PGEX_P ? "protection violation" : "page not present",
> @@ -820,3 +818,173 @@
> mtx_assert(&Giant, MA_NOTOWNED);
> }
>
> +void ia32_syscall(struct trapframe frame);
> +void
> +ia32_syscall(struct trapframe frame)
> +{
> + caddr_t params;
> + int i;
> + struct sysent *callp;
> + struct thread *td = curthread;
> + struct proc *p = td->td_proc;
> + register_t orig_tf_rflags;
> + u_int sticks;
> + int error;
> + int narg;
> + u_int32_t args[8];
> + u_int64_t args64[8];
> + u_int code;
> +
> + /*
> + * note: PCPU_LAZY_INC() can only be used if we can afford
> + * occassional inaccuracy in the count.
> + */
> + cnt.v_syscall++;
> +
> + sticks = td->td_sticks;
> + td->td_frame = &frame;
> + if (td->td_ucred != p->p_ucred)
> + cred_update_thread(td);
> + params = (caddr_t)frame.tf_rsp + sizeof(u_int32_t);
> + code = frame.tf_rax;
> + orig_tf_rflags = frame.tf_rflags;
> +
> + if (p->p_sysent->sv_prepsyscall) {
> + /*
> + * The prep code is MP aware.
> + */
> + (*p->p_sysent->sv_prepsyscall)(&frame, args, &code, ¶ms);
> + } else {
> + /*
> + * Need to check if this is a 32 bit or 64 bit syscall.
> + * fuword is MP aware.
> + */
> + if (code == SYS_syscall) {
> + /*
> + * Code is first argument, followed by actual args.
> + */
> + code = fuword32(params);
> + params += sizeof(int);
> + } else if (code == SYS___syscall) {
> + /*
> + * Like syscall, but code is a quad, so as to maintain
> + * quad alignment for the rest of the arguments.
> + * We use a 32-bit fetch in case params is not
> + * aligned.
> + */
> + code = fuword32(params);
> + params += sizeof(quad_t);
> + }
> + }
> +
> + if (p->p_sysent->sv_mask)
> + code &= p->p_sysent->sv_mask;
> +
> + if (code >= p->p_sysent->sv_size)
> + callp = &p->p_sysent->sv_table[0];
> + else
> + callp = &p->p_sysent->sv_table[code];
> +
> + narg = callp->sy_narg & SYF_ARGMASK;
> +
> + /*
> + * copyin and the ktrsyscall()/ktrsysret() code is MP-aware
> + */
> + if (params != NULL && narg != 0)
> + error = copyin(params, (caddr_t)args,
> + (u_int)(narg * sizeof(int)));
> + else
> + error = 0;
> +
> + for (i = 0; i < narg; i++)
> + args64[i] = args[i];
> +
> +#ifdef KTRACE
> + if (KTRPOINT(td, KTR_SYSCALL))
> + ktrsyscall(code, narg, args64);
> +#endif
> + /*
> + * Try to run the syscall without Giant if the syscall
> + * is MP safe.
> + */
> + if ((callp->sy_narg & SYF_MPSAFE) == 0)
> + mtx_lock(&Giant);
> +
> + if (error == 0) {
> + td->td_retval[0] = 0;
> + td->td_retval[1] = frame.tf_rdx;
> +
> + STOPEVENT(p, S_SCE, narg);
> +
> + error = (*callp->sy_call)(td, args64);
> + }
> +
> + switch (error) {
> + case 0:
> + frame.tf_rax = td->td_retval[0];
> + frame.tf_rdx = td->td_retval[1];
> + frame.tf_rflags &= ~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_rip -= frame.tf_err;
> + break;
> +
> + case EJUSTRETURN:
> + break;
> +
> + default:
> + if (p->p_sysent->sv_errsize) {
> + if (error >= p->p_sysent->sv_errsize)
> + error = -1; /* XXX */
> + else
> + error = p->p_sysent->sv_errtbl[error];
> + }
> + frame.tf_rax = error;
> + frame.tf_rflags |= PSL_C;
> + break;
> + }
> +
> + /*
> + * Release Giant if we previously set it.
> + */
> + if ((callp->sy_narg & SYF_MPSAFE) == 0)
> + mtx_unlock(&Giant);
> +
> + /*
> + * Traced syscall.
> + */
> + if (orig_tf_rflags & PSL_T) {
> + frame.tf_rflags &= ~PSL_T;
> + trapsignal(td, SIGTRAP, 0);
> + }
> +
> + /*
> + * Handle reschedule and other end-of-syscall issues
> + */
> + userret(td, &frame, sticks);
> +
> +#ifdef KTRACE
> + if (KTRPOINT(td, KTR_SYSRET))
> + ktrsysret(code, error, td->td_retval[0]);
> +#endif
> +
> + /*
> + * This works because errno is findable through the
> + * register set. If we ever support an emulation where this
> + * is not the case, this code will need to be revisited.
> + */
> + STOPEVENT(p, S_SCX, code);
> +
> +#ifdef DIAGNOSTIC
> + cred_free_thread(td);
> +#endif
> + WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
> + (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
> + mtx_assert(&sched_lock, MA_NOTOWNED);
> + mtx_assert(&Giant, MA_NOTOWNED);
> +}
>
> ==== //depot/projects/hammer/sys/amd64/amd64/vm_machdep.c#6 (text+ko) ====
>
> @@ -76,7 +76,6 @@
> #include <amd64/isa/isa.h>
>
> static void cpu_reset_real(void);
> -extern int _ucodesel, _udatasel;
>
> /*
> * Finish a fork operation, with process p2 nearly set up.
> @@ -143,6 +142,7 @@
> * pcb2->pcb_savefpu: cloned above.
> * pcb2->pcb_flags: cloned above.
> * pcb2->pcb_onfault: cloned above (always NULL here?).
> + * pcb2->pcb_[fg]sbase: cloned above
> */
>
> /*
>
> ==== //depot/projects/hammer/sys/amd64/conf/GENERIC#8 (text+ko) ====
>
> @@ -23,6 +23,7 @@
> ident GENERIC
> maxusers 0
> options NDA #Avoid accidental cut/paste of NDA'ed stuff
> +options IA32
>
> makeoptions NO_MODULES=not_yet
>
> @@ -42,6 +43,10 @@
> options INVARIANTS #Enable calls of extra sanity checking
> options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by
INVARIANTS
>
> +options SYSVMSG
> +options SYSVSEM
> +options SYSVSHM
> +
> device isa
> device pci
>
>
> ==== //depot/projects/hammer/sys/amd64/include/cpufunc.h#6 (text+ko) ====
>
> @@ -447,7 +447,6 @@
> __asm __volatile("invlpg %0" : : "m" (*(char *)addr) : "memory");
> }
>
> -/* XXX these are replaced with rdmsr/wrmsr */
> static __inline u_int
> rfs(void)
> {
> @@ -465,6 +464,18 @@
> }
>
> static __inline void
> +load_ds(u_int sel)
> +{
> + __asm __volatile("movl %0,%%ds" : : "rm" (sel));
> +}
> +
> +static __inline void
> +load_es(u_int sel)
> +{
> + __asm __volatile("movl %0,%%es" : : "rm" (sel));
> +}
> +
> +static __inline void
> load_fs(u_int sel)
> {
> __asm __volatile("movl %0,%%fs" : : "rm" (sel));
>
> ==== //depot/projects/hammer/sys/amd64/include/elf.h#7 (text+ko) ====
>
> @@ -33,9 +33,12 @@
> * ELF definitions for the AMD64 architecture.
> */
>
> -#include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */
>
> +#ifndef __ELF_WORD_SIZE
> #define __ELF_WORD_SIZE 64 /* Used by <sys/elf_generic.h> */
> +#endif
> +#include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */
> +#include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */
> #include <sys/elf_generic.h>
>
> #define ELF_ARCH EM_X86_64
> @@ -48,6 +51,13 @@
> * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
> * but POSIX lays claim to all symbols ending with "_t".
> */
> +typedef struct { /* Auxiliary vector entry on initial stack */
> + int a_type; /* Entry type. */
> + union {
> + int a_val; /* Integer value. */
> + } a_un;
> +} Elf32_Auxinfo;
> +
>
> typedef struct { /* Auxiliary vector entry on initial stack */
> long a_type; /* Entry type. */
> @@ -118,7 +128,11 @@
> #define R_X86_64_COUNT 16 /* Count of defined relocation types. */
>
> /* Define "machine" characteristics */
> -#define ELF_TARG_CLASS ELFCLASS64
> +#if __ELF_WORD_SIZE == 32
> +#define ELF_TARG_CLASS ELFCLASS32
> +#else
> +#define ELF_TARG_CLASS ELFCLASS64
> +#endif
> #define ELF_TARG_DATA ELFDATA2LSB
> #define ELF_TARG_MACH EM_X86_64
> #define ELF_TARG_VER 1
>
> ==== //depot/projects/hammer/sys/amd64/include/pcb.h#8 (text+ko) ====
>
> @@ -59,6 +59,11 @@
> register_t pcb_rflags;
> register_t pcb_fsbase;
> register_t pcb_gsbase;
> + register_t pcb_kgsbase;
> + u_int32_t pcb_ds;
> + u_int32_t pcb_es;
> + u_int32_t pcb_fs;
> + u_int32_t pcb_gs;
>
> struct savefpu pcb_save;
> u_long pcb_flags;
>
> ==== //depot/projects/hammer/sys/conf/files.amd64#9 (text+ko) ====
>
> @@ -64,7 +64,10 @@
> amd64/pci/pci_cfgreg.c optional pci
> amd64/pci/pci_bus.c optional pci
>
> -
> +amd64/ia32/ia32_misc.c optional ia32
> +amd64/ia32/ia32_sysent.c optional ia32
> +amd64/ia32/ia32_sysvec.c optional ia32
> +kern/imgact_elf32.c optional ia32
>
> # This file tells config what files go into building a kernel,
> # files marked standard are always included.
>
> ==== //depot/projects/hammer/sys/conf/options.amd64#8 (text+ko) ====
>
> @@ -60,3 +60,4 @@
> PSM_HOOKRESUME opt_psm.h
> PSM_RESETAFTERSUSPEND opt_psm.h
> PSM_DEBUG opt_psm.h
> +IA32
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!" - http://www.FreeBSD.org/
More information about the p4-projects
mailing list