PERFORCE change 42554 for review
Peter Wemm
peter at FreeBSD.org
Sun Nov 16 09:22:19 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=42554
Change 42554 by peter at peter_overcee on 2003/11/16 09:21:27
fix some bugs:
- basemem is in K, not bytes (argh, not again!)
- access the pagetables in KERNBASE
- actually or in the pte bits
- it would be useful to set %rsp to the end of the stack.
- restore the warmstart vector prior to panic() so that
resetting the BSP will not cause it to try and do AP startup
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/mp_machdep.c#32 edit
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/mp_machdep.c#32 (text+ko) ====
@@ -147,11 +147,11 @@
{
bootMP_size = mptramp_end - mptramp_start;
- boot_address = trunc_page(basemem); /* round down to 4k boundary */
+ boot_address = trunc_page(basemem * 1024); /* round down to 4k boundary */
if ((basemem - boot_address) < bootMP_size)
boot_address -= PAGE_SIZE; /* not enough, lower by 4k */
/* 3 levels of page table pages */
- mptramp_pagetables = boot_address - PAGE_SIZE * 3;
+ mptramp_pagetables = boot_address - (PAGE_SIZE * 3);
return mptramp_pagetables;
}
@@ -464,26 +464,24 @@
bcopy(mptramp_start, (void *)((uintptr_t)boot_address + KERNBASE), bootMP_size);
/* Locate the page tables, they'll be below the trampoline */
- pt4 = (u_int64_t *)(uintptr_t)mptramp_pagetables;
+ pt4 = (u_int64_t *)(uintptr_t)(mptramp_pagetables + KERNBASE);
pt3 = pt4 + 512;
pt2 = pt3 + 512;
- printf("pt4 = %p; pt3 = %p; pt2 = %p\n", pt4, pt3, pt2);
/* Create the initial 1GB replicated page tables */
for (i = 0; i < 512; i++) {
/* Each slot of the level 4 pages points to the same level 3 page */
- pt4[i] = (u_int64_t)(uintptr_t)pt3;
- pt4[i] = PG_V | PG_RW | PG_U;
+ pt4[i] = (u_int64_t)(uintptr_t)(mptramp_pagetables + PAGE_SIZE);
+ pt4[i] |= PG_V | PG_RW | PG_U;
/* Each slot of the level 3 pages points to the same level 2 page */
- pt3[i] = (u_int64_t)(uintptr_t)pt2;
- pt3[i] = PG_V | PG_RW | PG_U;
+ pt3[i] = (u_int64_t)(uintptr_t)(mptramp_pagetables + 2 * PAGE_SIZE);
+ pt3[i] |= PG_V | PG_RW | PG_U;
/* The level 2 page slots are mapped with 2MB pages for 1GB. */
pt2[i] = i * (2 * 1024 * 1024);
- pt2[i] = PG_V | PG_RW | PG_PS | PG_U;
+ pt2[i] |= PG_V | PG_RW | PG_PS | PG_U;
}
- printf("pagetables created\n");
/* save the current value of the warm-start vector */
mpbioswarmvec = *((u_int32_t *) WARMBOOT_OFF);
@@ -491,7 +489,8 @@
mpbiosreason = inb(CMOS_DATA);
/* start each AP */
- for (cpu = 0, apic_id = 0; apic_id < MAXCPU; apic_id++) {
+ cpu = 0;
+ for (apic_id = 0; apic_id < MAXCPU; apic_id++) {
if (!cpu_info[apic_id].cpu_present ||
cpu_info[apic_id].cpu_bsp)
continue;
@@ -534,12 +533,15 @@
outb(CMOS_REG, BIOS_RESET);
outb(CMOS_DATA, BIOS_WARM); /* 'warm-start' */
- bootSTK = bootstacks[cpu];
+ bootSTK = (char *)bootstacks[cpu] + KSTACK_PAGES * PAGE_SIZE - 8;
bootAP = cpu;
/* attempt to start the Application Processor */
- if (!start_ap(apic_id))
+ if (!start_ap(apic_id)) {
+ /* restore the warmstart vector */
+ *(u_int32_t *) WARMBOOT_OFF = mpbioswarmvec;
panic("AP #%d (PHY# %d) failed!", cpu, apic_id);
+ }
all_cpus |= (1 << cpu); /* record AP in CPU map */
}
More information about the p4-projects
mailing list