From d1368d1a9cb1e243085a10a268783ee7fa8fd95a Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sat, 27 Nov 2010 22:34:56 -0800 Subject: [PATCH] kernel - x86-64 - normalize the location of the pcb/md_regs and remove gd_rsp0 * Normalize the location of the pcb and related user process register frame for traps and system calls. * The pcb is now 16-byte aligned at the top of the kernel thread's stack and md_regs is placed just below it. * We no longer reserve 16 bytes for a 8086 emulation frame. * Change the md_regs assignment in the trap code to an assertion that the value is correct. * Remove gd_rsp0, use the value from common_tss.tss_rsp0 instead (which is the same). --- sys/platform/pc64/include/globaldata.h | 6 +++--- sys/platform/pc64/x86_64/exception.S | 2 +- sys/platform/pc64/x86_64/genassym.c | 1 - sys/platform/pc64/x86_64/global.s | 3 +-- sys/platform/pc64/x86_64/machdep.c | 3 +-- sys/platform/pc64/x86_64/pmap.c | 5 +++-- sys/platform/pc64/x86_64/swtch.s | 4 ++-- sys/platform/pc64/x86_64/trap.c | 6 ++++-- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/sys/platform/pc64/include/globaldata.h b/sys/platform/pc64/include/globaldata.h index 75351e1383..8ccfc35121 100644 --- a/sys/platform/pc64/include/globaldata.h +++ b/sys/platform/pc64/include/globaldata.h @@ -77,12 +77,12 @@ struct mdglobaldata { union savefpu gd_savefpu; /* fast bcopy/zero temp fpu save area */ int gd_fpu_lock; /* fast bcopy/zero cpu lock */ int gd_fpending; /* fast interrupt pending */ - int unused002; + int unused001; int gd_spending; /* software interrupt pending */ int gd_sdelayed; /* delayed software ints */ int gd_currentldt; int gd_private_tss; - u_int unused001; + u_int unused002; u_int gd_other_cpus; u_int gd_ss_eflags; pt_entry_t *gd_CMAP1; @@ -96,7 +96,7 @@ struct mdglobaldata { u_int gd_acpi_id; u_int gd_apic_id; register_t gd_scratch_rsp; - register_t gd_rsp0; + register_t unused003; register_t gd_user_fs; /* current user fs in MSR */ register_t gd_user_gs; /* current user gs in MSR */ cpumask_t gd_invltlb_ret; diff --git a/sys/platform/pc64/x86_64/exception.S b/sys/platform/pc64/x86_64/exception.S index 026803fa4b..15ae309ef3 100644 --- a/sys/platform/pc64/x86_64/exception.S +++ b/sys/platform/pc64/x86_64/exception.S @@ -281,7 +281,7 @@ IDTVEC(prot) IDTVEC(fast_syscall) swapgs movq %rsp,PCPU(scratch_rsp) - movq PCPU(rsp0),%rsp + movq PCPU(common_tss) + TSS_RSP0, %rsp /* Now emulate a trapframe. Make the 8 byte alignment odd for call. */ subq $TF_SIZE,%rsp /* defer TF_RSP till we have a spare register */ diff --git a/sys/platform/pc64/x86_64/genassym.c b/sys/platform/pc64/x86_64/genassym.c index 1e40f86280..2f7ab16ecf 100644 --- a/sys/platform/pc64/x86_64/genassym.c +++ b/sys/platform/pc64/x86_64/genassym.c @@ -196,7 +196,6 @@ ASSYM(MDGLOBALDATA_BASEALLOC_PAGES, MDGLOBALDATA_BASEALLOC_PAGES); ASSYM(GD_PRIVATE_TSS, offsetof(struct mdglobaldata, gd_private_tss)); ASSYM(GD_SCRATCH_RSP, offsetof(struct mdglobaldata, gd_scratch_rsp)); -ASSYM(GD_RSP0, offsetof(struct mdglobaldata, gd_rsp0)); ASSYM(GD_USER_FS, offsetof(struct mdglobaldata, gd_user_fs)); ASSYM(GD_USER_GS, offsetof(struct mdglobaldata, gd_user_gs)); ASSYM(GD_INTR_NESTING_LEVEL, offsetof(struct mdglobaldata, mi.gd_intr_nesting_level)); diff --git a/sys/platform/pc64/x86_64/global.s b/sys/platform/pc64/x86_64/global.s index 7b012a24a1..8f154b8bd0 100644 --- a/sys/platform/pc64/x86_64/global.s +++ b/sys/platform/pc64/x86_64/global.s @@ -82,7 +82,7 @@ .globl gd_CADDR1, gd_CADDR2, gd_CADDR3, gd_PADDR1 .globl gd_spending, gd_fpending .globl gd_cnt, gd_private_tss - .globl gd_scratch_rsp, gd_rsp0 + .globl gd_scratch_rsp .globl gd_user_fs, gd_user_gs .set gd_cpuid,globaldata + GD_CPUID @@ -103,7 +103,6 @@ .set gd_spending,globaldata + GD_SPENDING .set gd_cnt,globaldata + GD_CNT .set gd_scratch_rsp,globaldata + GD_SCRATCH_RSP - .set gd_rsp0,globaldata + GD_RSP0 .set gd_user_fs,globaldata + GD_USER_FS .set gd_user_gs,globaldata + GD_USER_GS diff --git a/sys/platform/pc64/x86_64/machdep.c b/sys/platform/pc64/x86_64/machdep.c index a1ffa1ad53..608b2ed480 100644 --- a/sys/platform/pc64/x86_64/machdep.c +++ b/sys/platform/pc64/x86_64/machdep.c @@ -1824,7 +1824,6 @@ hammer_time(u_int64_t modulep, u_int64_t physfree) KSTACK_PAGES * PAGE_SIZE - sizeof(struct pcb)); /* Ensure the stack is aligned to 16 bytes */ gd->gd_common_tss.tss_rsp0 &= ~(register_t)0xF; - gd->gd_rsp0 = gd->gd_common_tss.tss_rsp0; /* double fault stack */ gd->gd_common_tss.tss_ist1 = @@ -1877,7 +1876,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree) thread0.td_pcb->pcb_flags = 0; thread0.td_pcb->pcb_cr3 = KPML4phys; thread0.td_pcb->pcb_ext = 0; - lwp0.lwp_md.md_regs = &proc0_tf; + lwp0.lwp_md.md_regs = &proc0_tf; /* XXX needed? */ /* Location of kernel stack for locore */ return ((u_int64_t)thread0.td_pcb); diff --git a/sys/platform/pc64/x86_64/pmap.c b/sys/platform/pc64/x86_64/pmap.c index 3c2b7b5dd7..5594467f61 100644 --- a/sys/platform/pc64/x86_64/pmap.c +++ b/sys/platform/pc64/x86_64/pmap.c @@ -1139,10 +1139,11 @@ pmap_page_lookup(vm_object_t object, vm_pindex_t pindex) void pmap_init_thread(thread_t td) { - /* enforce pcb placement */ + /* enforce pcb placement & alignment */ td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_size) - 1; + td->td_pcb = (struct pcb *)((intptr_t)td->td_pcb & ~(intptr_t)0xF); td->td_savefpu = &td->td_pcb->pcb_save; - td->td_sp = (char *)td->td_pcb - 16; /* JG is -16 needed on x86_64? */ + td->td_sp = (char *)td->td_pcb; /* no -16 */ } /* diff --git a/sys/platform/pc64/x86_64/swtch.s b/sys/platform/pc64/x86_64/swtch.s index f7a66435d6..da40d8d66b 100644 --- a/sys/platform/pc64/x86_64/swtch.s +++ b/sys/platform/pc64/x86_64/swtch.s @@ -373,9 +373,9 @@ ENTRY(cpu_heavy_restore) * usermode. The PCB is at the top of the stack but we need another * 16 bytes to take vm86 into account. */ - leaq -16(%rdx),%rbx + movq %rdx,%rbx + /*leaq -TF_SIZE(%rdx),%rbx*/ movq %rbx, PCPU(common_tss) + TSS_RSP0 - movq %rbx, PCPU(rsp0) #if JG cmpl $0,PCPU(private_tss) /* don't have to reload if */ diff --git a/sys/platform/pc64/x86_64/trap.c b/sys/platform/pc64/x86_64/trap.c index e6e8af0b9d..e4e8214532 100644 --- a/sys/platform/pc64/x86_64/trap.c +++ b/sys/platform/pc64/x86_64/trap.c @@ -426,7 +426,8 @@ trap(struct trapframe *frame) userenter(td, p); sticks = (int)td->td_sticks; - lp->lwp_md.md_regs = frame; + KASSERT(lp->lwp_md.md_regs == frame, + ("Frame mismatch %p %p", lp->lwp_md.md_regs, frame)); switch (type) { case T_PRIVINFLT: /* privileged instruction fault */ @@ -1103,7 +1104,8 @@ syscall2(struct trapframe *frame) /* * Get the system call parameters and account for time */ - lp->lwp_md.md_regs = frame; + KASSERT(lp->lwp_md.md_regs == frame, + ("Frame mismatch %p %p", lp->lwp_md.md_regs, frame)); params = (caddr_t)frame->tf_rsp + sizeof(register_t); code = frame->tf_rax; -- 2.41.0