Date: Wed, 7 Nov 2007 19:58:34 GMT From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 128784 for review Message-ID: <200711071958.lA7JwYkx031295@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=128784 Change 128784 by peter@peter_overcee on 2007/11/07 19:57:56 Begin backporting amd64 smp startup. Eliminates a whole mess of bogus code that dates back to the early i386 smp pcpu stuff at a fixed virtual address. This became a sewer dumping ground for stuff that didn't need to be there. It also isn't minidump friendly. Affected files ... .. //depot/projects/hammer/sys/i386/i386/locore.s#17 edit .. //depot/projects/hammer/sys/i386/i386/machdep.c#80 edit .. //depot/projects/hammer/sys/i386/i386/mp_machdep.c#66 edit .. //depot/projects/hammer/sys/i386/i386/pmap.c#98 edit .. //depot/projects/hammer/sys/i386/include/pmap.h#31 edit .. //depot/projects/hammer/sys/i386/include/privatespace.h#3 delete Differences ... ==== //depot/projects/hammer/sys/i386/i386/locore.s#17 (text+ko) ==== @@ -72,17 +72,7 @@ .set PTD,PTmap + (PTDPTDI * PAGE_SIZE) .set PTDpde,PTD + (PTDPTDI * PDESIZE) -#ifdef SMP /* - * Define layout of per-cpu address space. - * This is "constructed" in locore.s on the BSP and in mp_machdep.c - * for each AP. DO NOT REORDER THESE WITHOUT UPDATING THE REST! - */ - .globl SMP_prvspace - .set SMP_prvspace,(MPPTDI << PDRSHIFT) -#endif /* SMP */ - -/* * Compiled KERNBASE location and the kernel load address */ .globl kernbase @@ -106,16 +96,6 @@ KERNend: .long 0 /* phys addr end of kernel (just after bss) */ physfree: .long 0 /* phys addr of next free page */ -#ifdef SMP - .globl cpu0prvpage -cpu0pp: .long 0 /* phys addr cpu0 private pg */ -cpu0prvpage: .long 0 /* relocated version */ - - .globl SMPpt -SMPptpa: .long 0 /* phys addr SMP page table */ -SMPpt: .long 0 /* relocated version */ -#endif /* SMP */ - .globl IdlePTD IdlePTD: .long 0 /* phys addr of kernel PTD */ @@ -763,20 +743,6 @@ addl $KERNBASE, %esi movl %esi, R(vm86paddr) -#ifdef SMP -/* Allocate cpu0's private data page */ - ALLOCPAGES(1) - movl %esi,R(cpu0pp) - addl $KERNBASE, %esi - movl %esi, R(cpu0prvpage) /* relocated to KVM space */ - -/* Allocate SMP page table page */ - ALLOCPAGES(1) - movl %esi,R(SMPptpa) - addl $KERNBASE, %esi - movl %esi, R(SMPpt) /* relocated to KVM space */ -#endif /* SMP */ - /* * Enable PSE and PGE. */ @@ -854,37 +820,6 @@ movl $ISA_HOLE_LENGTH>>PAGE_SHIFT, %ecx fillkpt(R(vm86pa), $PG_RW|PG_U) -#ifdef SMP -/* Map cpu0's private page into global kmem (4K @ cpu0prvpage) */ - movl R(cpu0pp), %eax - movl $1, %ecx - fillkptphys($PG_RW) - -/* Map SMP page table page into global kmem FWIW */ - movl R(SMPptpa), %eax - movl $1, %ecx - fillkptphys($PG_RW) - -/* Map the private page into the SMP page table */ - movl R(cpu0pp), %eax - movl $0, %ebx /* pte offset = 0 */ - movl $1, %ecx /* one private page coming right up */ - fillkpt(R(SMPptpa), $PG_RW) - -/* ... and put the page table table in the pde. */ - movl R(SMPptpa), %eax - movl $MPPTDI, %ebx - movl $1, %ecx - fillkpt(R(IdlePTD), $PG_RW) - -/* Fakeup VA for the local apic to allow early traps. */ - ALLOCPAGES(1) - movl %esi, %eax - movl $(NPTEPG-1), %ebx /* pte offset = NTEPG-1 */ - movl $1, %ecx /* one private pt coming right up */ - fillkpt(R(SMPptpa), $PG_RW) -#endif /* SMP */ - /* * Create an identity mapping for low physical memory, including the kernel. * The part of this mapping that covers the first 1 MB of physical memory ==== //depot/projects/hammer/sys/i386/i386/machdep.c#80 (text+ko) ==== @@ -127,7 +127,6 @@ #include <machine/perfmon.h> #endif #ifdef SMP -#include <machine/privatespace.h> #include <machine/smp.h> #endif @@ -207,9 +206,7 @@ struct kva_md_info kmi; static struct trapframe proc0_tf; -#ifndef SMP -static struct pcpu __pcpu; -#endif +struct pcpu __pcpu[MAXCPU]; struct mtx icu_lock; @@ -2116,11 +2113,7 @@ gdt_segs[GUFS_SEL].ssd_limit = atop(0 - 1); gdt_segs[GUGS_SEL].ssd_limit = atop(0 - 1); -#ifdef SMP - pc = &SMP_prvspace[0].pcpu; -#else - pc = &__pcpu; -#endif + pc = &__pcpu[0]; gdt_segs[GPRIV_SEL].ssd_limit = atop(0 - 1); gdt_segs[GPRIV_SEL].ssd_base = (int) pc; gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pc_common_tss; ==== //depot/projects/hammer/sys/i386/i386/mp_machdep.c#66 (text+ko) ==== @@ -78,7 +78,6 @@ #include <machine/psl.h> #include <machine/smp.h> #include <machine/specialreg.h> -#include <machine/privatespace.h> #define WARMBOOT_TARGET 0 #define WARMBOOT_OFF (KERNBASE + 0x0467) @@ -134,6 +133,8 @@ int boot_cpu_id = -1; /* designated BSP */ extern int nkpt; +extern struct pcpu __pcpu[]; + /* * CPU topology map datastructures for HTT. */ @@ -147,9 +148,6 @@ /* Hotwire a 0->4MB V==P mapping */ extern pt_entry_t *KPTphys; -/* SMP page table page */ -extern pt_entry_t *SMPpt; - struct pcb stoppcbs[MAXCPU]; /* Variables needed for SMP tlb shootdown. */ @@ -493,6 +491,7 @@ void init_secondary(void) { + struct pcpu *pc; vm_offset_t addr; int gsel_tss; int x, myid; @@ -500,11 +499,10 @@ /* bootAP is set in start_ap() to our ID. */ myid = bootAP; - gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[myid]; - gdt_segs[GPROC0_SEL].ssd_base = - (int) &SMP_prvspace[myid].pcpu.pc_common_tss; - SMP_prvspace[myid].pcpu.pc_prvspace = - &SMP_prvspace[myid].pcpu; + pc = &__pcpu[myid]; + gdt_segs[GPRIV_SEL].ssd_base = (int) &pc; + gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pcpu.pc_common_tss; + pc->pc_prvspace = pc; for (x = 0; x < NGDT; x++) { ssdtosd(&gdt_segs[x], &gdt[myid * NGDT + x].sd); @@ -760,15 +758,10 @@ /* first page of AP's private space */ pg = cpu * i386_btop(sizeof(struct privatespace)); - /* allocate a new private data page */ - pc = (struct pcpu *)kmem_alloc(kernel_map, PAGE_SIZE); - - /* wire it into the private page table page */ - SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(pc)); - /* allocate and set up an idle stack data page */ stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); /* XXXKSE */ for (i = 0; i < KSTACK_PAGES; i++) + /* YYYSMP fix */ SMPpt[pg + 1 + i] = (pt_entry_t) (PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack)); @@ -784,6 +777,7 @@ outb(CMOS_DATA, BIOS_WARM); /* 'warm-start' */ #endif + /* allocate kstack like on amd64 */ bootSTK = &SMP_prvspace[cpu].idlekstack[KSTACK_PAGES * PAGE_SIZE]; bootAP = cpu; @@ -824,7 +818,7 @@ /* Allocate and setup BSP idle stack */ stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); for (i = 0; i < KSTACK_PAGES; i++) - SMPpt[1 + i] = (pt_entry_t) + /* YYYSMP */SMPpt[1 + i] = (pt_entry_t) (PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack)); for (i = 0; i < NKPT; i++) ==== //depot/projects/hammer/sys/i386/i386/pmap.c#98 (text+ko) ==== @@ -1305,11 +1305,7 @@ LIST_INSERT_HEAD(&allpmaps, pmap, pm_list); mtx_unlock_spin(&allpmaps_lock); /* Wire in kernel global address entries. */ - /* XXX copies current process, does not fill in MPPTDI */ bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * sizeof(pd_entry_t)); -#ifdef SMP - pmap->pm_pdir[MPPTDI] = PTD[MPPTDI]; -#endif /* install self-referential address mapping entry(s) */ for (i = 0; i < NPGPTD; i++) { @@ -1552,9 +1548,6 @@ bzero(pmap->pm_pdir + PTDPTDI, (nkpt + NPGPTD) * sizeof(*pmap->pm_pdir)); -#ifdef SMP - pmap->pm_pdir[MPPTDI] = 0; -#endif pmap_qremove((vm_offset_t)pmap->pm_pdir, NPGPTD); ==== //depot/projects/hammer/sys/i386/include/pmap.h#31 (text+ko) ==== @@ -133,15 +133,8 @@ * * XXX This works for now, but I am not real happy with it, I'll fix it * right after I fix locore.s and the magic 28K hole - * - * SMP_PRIVPAGES: The per-cpu address space is 0xff80000 -> 0xffbfffff */ -#ifdef SMP -#define MPPTDI (NPDEPTD-1) /* per cpu ptd entry */ -#define KPTDI (MPPTDI-NKPDE) /* start of kernel virtual pde's */ -#else -#define KPTDI (NPDEPTD-NKPDE)/* start of kernel virtual pde's */ -#endif /* SMP */ +#define KPTDI (NPDEPTD-NKPDE) /* start of kernel virtual pde's */ #define PTDPTDI (KPTDI-NPGPTD) /* ptd entry that points to ptd! */ /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200711071958.lA7JwYkx031295>