From owner-freebsd-bugs Sat Apr 15 1:20:17 2000 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 2174237B87A for ; Sat, 15 Apr 2000 01:20:02 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id BAA74794; Sat, 15 Apr 2000 01:20:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Date: Sat, 15 Apr 2000 01:20:01 -0700 (PDT) Message-Id: <200004150820.BAA74794@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: NOKUBI Hirotaka Subject: Re: kern/16021: To support SMP on NEC PC98, call mp_probe() after pmap_bootstrap() Reply-To: NOKUBI Hirotaka Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR kern/16021; it has been noted by GNATS. From: NOKUBI Hirotaka To: freebsd-gnats-submit@freebsd.org Cc: nokubi@ff.iij4u.or.jp Subject: Re: kern/16021: To support SMP on NEC PC98, call mp_probe() after pmap_bootstrap() Date: Sat, 15 Apr 2000 17:15:06 +0900 Would someone commit this? I'll attach a patch for newer revision files. If there is problem, suspicion or suggestion, tell me about it. I'll seek solution. Thanks. ---- NOKUBI Hirotaka Fingerprint20 = DEBC 0793 7CD6 92F1 0A1F A792 9E2F EEEE A41B 171D Index: i386/i386/machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/machdep.c,v retrieving revision 1.388 diff -u -u -r1.388 machdep.c --- machdep.c 2000/03/30 07:16:59 1.388 +++ machdep.c 2000/04/15 07:37:01 @@ -1599,9 +1599,6 @@ #ifdef SMP /* make hole for AP bootstrap code */ physmap[1] = mp_bootaddress(physmap[1] / 1024); - - /* look for the MP hardware - needed for apic addresses */ - mp_probe(); #endif /* @@ -1662,6 +1659,11 @@ /* call pmap initialization to make new kernel address space */ pmap_bootstrap(first, 0); + +#ifdef SMP + /* look for the MP hardware - needed for apic addresses */ + mp_probe(); +#endif /* * Size up each available chunk of physical memory. Index: i386/i386/mp_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/mp_machdep.c,v retrieving revision 1.116 diff -u -u -r1.116 mp_machdep.c --- mp_machdep.c 2000/03/28 07:16:15 1.116 +++ mp_machdep.c 2000/04/15 07:37:01 @@ -392,7 +392,7 @@ found: /* calculate needed resources */ - mpfps = (mpfps_t)x; + mpfps = (mpfps_t)(x + KERNBASE); if (mptable_pass1()) panic("you must reconfigure your kernel"); @@ -691,12 +691,12 @@ {MCA, "MCA"}, {UNKNOWN_BUSTYPE, "---"}, {ISA, "ISA"}, + {ISA, "NEC98"}, {MCA, "MCA"}, {UNKNOWN_BUSTYPE, "---"}, {UNKNOWN_BUSTYPE, "---"}, {UNKNOWN_BUSTYPE, "---"}, {UNKNOWN_BUSTYPE, "---"}, - {UNKNOWN_BUSTYPE, "---"}, {PCI, "PCI"}, {UNKNOWN_BUSTYPE, "---"}, {UNKNOWN_BUSTYPE, "---"}, @@ -758,6 +758,8 @@ int count; int type; int mustpanic; + int i, j; + struct globaldata *gd; POSTCODE(MPTABLE_PASS1_POST); @@ -792,6 +794,15 @@ if ((cth = mpfps->pap) == 0) panic("MP Configuration Table Header MISSING!"); + if (cth >= (mpcth_t)0x100000) { + pmap_enter(kernel_pmap, (vm_offset_t)CADDR1, + trunc_page((vm_offset_t)cth), VM_PROT_READ, TRUE); + /* XXX do not support MPCT across page boundary */ + cth = (mpcth_t)(CADDR1 + ((int)cth & PAGE_MASK)); + } else { + cth = (mpcth_t)((u_int)cth + KERNBASE); + } + cpu_apic_address = (vm_offset_t) cth->apic_address; /* walk the table, recording info of interest */ @@ -858,6 +869,46 @@ --mp_naps; /* subtract the BSP */ + if (cpu_apic_address == 0) + panic("pmap_bootstrap: no local apic!"); + + /* local apic is mapped on last page */ + SMPpt[NPTEPG - 1] = (pt_entry_t)(PG_V | PG_RW | PG_N | /*pgeflag |*/ + (cpu_apic_address & PG_FRAME)); + + for (i = 0; i < mp_napics; i++) { + for (j = 0; j < mp_napics; j++) { + /* same page frame as a previous IO apic? */ + if (((vm_offset_t)SMPpt[NPTEPG-2-j] & PG_FRAME) == + (io_apic_address[0] & PG_FRAME)) { + ioapic[i] = (ioapic_t *)((u_int)SMP_prvspace + + (NPTEPG-2-j)*PAGE_SIZE); + break; + } + /* use this slot if available */ + if (((vm_offset_t)SMPpt[NPTEPG-2-j] & PG_FRAME) == 0) { + SMPpt[NPTEPG-2-j] = (pt_entry_t)(PG_V | PG_RW | + /*pgeflag |*/ (io_apic_address[i] & PG_FRAME)); + ioapic[i] = (ioapic_t *)((u_int)SMP_prvspace + + (NPTEPG-2-j)*PAGE_SIZE); + break; + } + } + } + + /* BSP does this itself, AP's get it pre-set */ + gd = &SMP_prvspace[0].globaldata; + gd->gd_prv_CMAP1 = &SMPpt[1]; + gd->gd_prv_CMAP2 = &SMPpt[2]; + gd->gd_prv_CMAP3 = &SMPpt[3]; + gd->gd_prv_PMAP1 = &SMPpt[4]; + gd->gd_prv_CADDR1 = SMP_prvspace[0].CPAGE1; + gd->gd_prv_CADDR2 = SMP_prvspace[0].CPAGE2; + gd->gd_prv_CADDR3 = SMP_prvspace[0].CPAGE3; + gd->gd_prv_PADDR1 = (unsigned *)SMP_prvspace[0].PPAGE1; + + invltlb(); + return mustpanic; } @@ -915,6 +966,15 @@ if ((cth = mpfps->pap) == 0) panic("MP Configuration Table Header MISSING!"); + + if (cth >= (mpcth_t)0x100000) { + pmap_enter(kernel_pmap, (vm_offset_t)CADDR1, + trunc_page((vm_offset_t)cth), VM_PROT_READ, TRUE); + /* XXX do not support MPCT across page boundary */ + cth = (mpcth_t)(CADDR1 + ((int)cth & PAGE_MASK)); + } else { + cth = (mpcth_t)((u_int)cth + KERNBASE); + } /* walk the table, recording info of interest */ totalSize = cth->base_table_length - sizeof(struct MPCTH); Index: i386/i386/pmap.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/pmap.c,v retrieving revision 1.252 diff -u -u -r1.252 pmap.c --- pmap.c 2000/03/16 08:51:49 1.252 +++ pmap.c 2000/04/15 07:37:02 @@ -283,10 +283,6 @@ { vm_offset_t va; pt_entry_t *pte; -#ifdef SMP - int i, j; - struct globaldata *gd; -#endif avail_start = firstaddr; @@ -412,46 +408,6 @@ invltlb(); #endif } -#endif - -#ifdef SMP - if (cpu_apic_address == 0) - panic("pmap_bootstrap: no local apic!"); - - /* local apic is mapped on last page */ - SMPpt[NPTEPG - 1] = (pt_entry_t)(PG_V | PG_RW | PG_N | pgeflag | - (cpu_apic_address & PG_FRAME)); - - for (i = 0; i < mp_napics; i++) { - for (j = 0; j < mp_napics; j++) { - /* same page frame as a previous IO apic? */ - if (((vm_offset_t)SMPpt[NPTEPG-2-j] & PG_FRAME) == - (io_apic_address[0] & PG_FRAME)) { - ioapic[i] = (ioapic_t *)((u_int)SMP_prvspace - + (NPTEPG-2-j)*PAGE_SIZE); - break; - } - /* use this slot if available */ - if (((vm_offset_t)SMPpt[NPTEPG-2-j] & PG_FRAME) == 0) { - SMPpt[NPTEPG-2-j] = (pt_entry_t)(PG_V | PG_RW | - pgeflag | (io_apic_address[i] & PG_FRAME)); - ioapic[i] = (ioapic_t *)((u_int)SMP_prvspace - + (NPTEPG-2-j)*PAGE_SIZE); - break; - } - } - } - - /* BSP does this itself, AP's get it pre-set */ - gd = &SMP_prvspace[0].globaldata; - gd->gd_prv_CMAP1 = &SMPpt[1]; - gd->gd_prv_CMAP2 = &SMPpt[2]; - gd->gd_prv_CMAP3 = &SMPpt[3]; - gd->gd_prv_PMAP1 = &SMPpt[4]; - gd->gd_prv_CADDR1 = SMP_prvspace[0].CPAGE1; - gd->gd_prv_CADDR2 = SMP_prvspace[0].CPAGE2; - gd->gd_prv_CADDR3 = SMP_prvspace[0].CPAGE3; - gd->gd_prv_PADDR1 = (unsigned *)SMP_prvspace[0].PPAGE1; #endif invltlb(); Index: i386/include/smp.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/smp.h,v retrieving revision 1.51 diff -u -u -r1.51 smp.h --- smp.h 2000/03/28 18:06:38 1.51 +++ smp.h 2000/04/15 07:37:03 @@ -34,6 +34,7 @@ #ifndef LOCORE +#ifndef PC98 /* * For sending values to POST displays. * XXX FIXME: where does this really belong, isa.h/isa.c perhaps? @@ -47,7 +48,11 @@ #define POSTCODE_HI(X) current_postcode &= 0x0f, \ current_postcode |= (((X) << 4) & 0xf0), \ outb(0x80, current_postcode) - +#else +#define POSTCODE(X) +#define POSTCODE_LO(X) +#define POSTCODE_HI(X) +#endif #include Index: pc98/i386/machdep.c =================================================================== RCS file: /home/ncvs/src/sys/pc98/i386/machdep.c,v retrieving revision 1.155 diff -u -u -r1.155 machdep.c --- machdep.c 2000/03/30 07:17:05 1.155 +++ machdep.c 2000/04/15 07:37:20 @@ -1475,14 +1475,14 @@ } #endif + /* call pmap initialization to make new kernel address space */ + pmap_bootstrap (first, 0); + #ifdef SMP /* look for the MP hardware - needed for apic addresses */ mp_probe(); #endif - /* call pmap initialization to make new kernel address space */ - pmap_bootstrap (first, 0); - /* * Size up each available chunk of physical memory. */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message