For SMP, use prv_PPAGE1/prv_PMAP1 instead of PADDR1/PMAP1.

get_ptbase and pmap_pte_quick no longer generates IPIs.
This should reduce the number of IPIs during heavy paging.
This commit is contained in:
Tor Egge 1998-05-17 18:53:19 +00:00
parent 592d5821a1
commit 5931a9c24e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=36125
18 changed files with 133 additions and 35 deletions

View File

@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
* $Id: genassym.c,v 1.53 1998/04/06 15:40:10 peter Exp $
* $Id: genassym.c,v 1.54 1998/04/06 18:59:14 peter Exp $
*/
#include "opt_vm86.h"
@ -219,6 +219,7 @@ main()
printf("#define\tGD_PRV_CMAP1 %d\n", &globaldata->prv_CMAP1);
printf("#define\tGD_PRV_CMAP2 %d\n", &globaldata->prv_CMAP2);
printf("#define\tGD_PRV_CMAP3 %d\n", &globaldata->prv_CMAP3);
printf("#define\tGD_PRV_PMAP1 %d\n", &globaldata->prv_PMAP1);
printf("#define\tGD_INSIDE_INTR %d\n", &globaldata->inside_intr);
printf("#define\tPS_GLOBALDATA 0x%x\n", &privatespace->globaldata);
printf("#define\tPS_PRVPT 0x%x\n", &privatespace->prvpt);
@ -228,6 +229,7 @@ main()
printf("#define\tPS_CPAGE1 0x%x\n", &privatespace->CPAGE1);
printf("#define\tPS_CPAGE2 0x%x\n", &privatespace->CPAGE2);
printf("#define\tPS_CPAGE3 0x%x\n", &privatespace->CPAGE3);
printf("#define\tPS_PPAGE1 0x%x\n", &privatespace->PPAGE1);
printf("#define\tPS_IOAPICS 0x%x\n", &privatespace->ioapics);
#endif

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp_machdep.c,v 1.73 1998/04/06 15:48:30 peter Exp $
* $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
*/
#include "opt_smp.h"
@ -1717,6 +1717,7 @@ start_all_aps(u_int boot_addr)
newpt[3 + UPAGES] = 0; /* *prv_CMAP1 */
newpt[4 + UPAGES] = 0; /* *prv_CMAP2 */
newpt[5 + UPAGES] = 0; /* *prv_CMAP3 */
newpt[6 + UPAGES] = 0; /* *prv_PMAP1 */
/* prime data page for it to use */
gd->cpuid = x;
@ -1725,6 +1726,7 @@ start_all_aps(u_int boot_addr)
gd->prv_CMAP1 = &newpt[3 + UPAGES];
gd->prv_CMAP2 = &newpt[4 + UPAGES];
gd->prv_CMAP3 = &newpt[5 + UPAGES];
gd->prv_PMAP1 = &newpt[6 + UPAGES];
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp_machdep.c,v 1.73 1998/04/06 15:48:30 peter Exp $
* $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
*/
#include "opt_smp.h"
@ -1717,6 +1717,7 @@ start_all_aps(u_int boot_addr)
newpt[3 + UPAGES] = 0; /* *prv_CMAP1 */
newpt[4 + UPAGES] = 0; /* *prv_CMAP2 */
newpt[5 + UPAGES] = 0; /* *prv_CMAP3 */
newpt[6 + UPAGES] = 0; /* *prv_PMAP1 */
/* prime data page for it to use */
gd->cpuid = x;
@ -1725,6 +1726,7 @@ start_all_aps(u_int boot_addr)
gd->prv_CMAP1 = &newpt[3 + UPAGES];
gd->prv_CMAP2 = &newpt[4 + UPAGES];
gd->prv_CMAP3 = &newpt[5 + UPAGES];
gd->prv_PMAP1 = &newpt[6 + UPAGES];
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;

View File

@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* $Id: pmap.c,v 1.197 1998/05/15 07:25:25 dyson Exp $
* $Id: pmap.c,v 1.198 1998/05/17 17:43:13 tegge Exp $
*/
/*
@ -190,8 +190,13 @@ extern pd_entry_t *IdlePTDS[];
extern pt_entry_t SMP_prvpt[];
#endif
#ifdef SMP
extern unsigned int prv_PPAGE1[];
extern pt_entry_t *prv_PMAP1;
#else
static pt_entry_t *PMAP1 = 0;
static unsigned *PADDR1 = 0;
#endif
static PMAP_INLINE void free_pv_entry __P((pv_entry_t pv));
static unsigned * get_ptbase __P((pmap_t pmap));
@ -347,10 +352,12 @@ pmap_bootstrap(firstaddr, loadaddr)
SYSMAP(struct msgbuf *, msgbufmap, msgbufp,
atop(round_page(sizeof(struct msgbuf))))
#if !defined(SMP)
/*
* ptemap is used for pmap_pte_quick
*/
SYSMAP(unsigned *, PMAP1, PADDR1, 1);
#endif
virtual_avail = va;
@ -438,6 +445,7 @@ pmap_bootstrap(firstaddr, loadaddr)
prv_CMAP1 = &SMP_prvpt[3 + UPAGES];
prv_CMAP2 = &SMP_prvpt[4 + UPAGES];
prv_CMAP3 = &SMP_prvpt[5 + UPAGES];
prv_PMAP1 = &SMP_prvpt[6 + UPAGES];
#endif
invltlb();
@ -735,7 +743,12 @@ get_ptbase(pmap)
/* otherwise, we are alternate address space */
if (frame != (((unsigned) APTDpde) & PG_FRAME)) {
APTDpde = (pd_entry_t) (frame | PG_RW | PG_V);
#if defined(SMP)
/* The page directory is not shared between CPUs */
cpu_invltlb();
#else
invltlb();
#endif
}
return (unsigned *) APTmap;
}
@ -763,11 +776,19 @@ pmap_pte_quick(pmap, va)
return (unsigned *) PTmap + index;
}
newpf = pde & PG_FRAME;
#ifdef SMP
if ( ((* (unsigned *) prv_PMAP1) & PG_FRAME) != newpf) {
* (unsigned *) prv_PMAP1 = newpf | PG_RW | PG_V;
cpu_invlpg(&prv_PPAGE1);
}
return prv_PPAGE1 + ((unsigned) index & (NPTEPG - 1));
#else
if ( ((* (unsigned *) PMAP1) & PG_FRAME) != newpf) {
* (unsigned *) PMAP1 = newpf | PG_RW | PG_V;
invltlb_1pg((vm_offset_t) PADDR1);
}
return PADDR1 + ((unsigned) index & (NPTEPG - 1));
#endif
}
return (0);
}

View File

@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: cpufunc.h,v 1.77 1998/05/11 02:13:47 dyson Exp $
* $Id: cpufunc.h,v 1.78 1998/05/12 18:28:05 dyson Exp $
*/
/*
@ -225,6 +225,20 @@ cpu_invlpg(void *addr)
__asm __volatile("invlpg %0"::"m"(*(char *)addr):"memory");
}
static __inline void
cpu_invltlb(void)
{
u_long temp;
/*
* This should be implemented as load_cr3(rcr3()) when load_cr3()
* is inlined.
*/
__asm __volatile("movl %%cr3, %0; movl %0, %%cr3" : "=r" (temp)
: : "memory");
#if defined(SWTCH_OPTIM_STATS)
++tlb_flush_count;
#endif
}
#else /* !SMP */
static __inline void

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp_machdep.c,v 1.73 1998/04/06 15:48:30 peter Exp $
* $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
*/
#include "opt_smp.h"
@ -1717,6 +1717,7 @@ start_all_aps(u_int boot_addr)
newpt[3 + UPAGES] = 0; /* *prv_CMAP1 */
newpt[4 + UPAGES] = 0; /* *prv_CMAP2 */
newpt[5 + UPAGES] = 0; /* *prv_CMAP3 */
newpt[6 + UPAGES] = 0; /* *prv_PMAP1 */
/* prime data page for it to use */
gd->cpuid = x;
@ -1725,6 +1726,7 @@ start_all_aps(u_int boot_addr)
gd->prv_CMAP1 = &newpt[3 + UPAGES];
gd->prv_CMAP2 = &newpt[4 + UPAGES];
gd->prv_CMAP3 = &newpt[5 + UPAGES];
gd->prv_PMAP1 = &newpt[6 + UPAGES];
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: globaldata.h,v 1.1 1998/04/06 15:37:21 peter Exp $
* $Id: globaldata.h,v 1.2 1998/04/06 18:59:15 peter Exp $
*/
/*
@ -57,6 +57,7 @@ struct globaldata {
pt_entry_t *prv_CMAP1;
pt_entry_t *prv_CMAP2;
pt_entry_t *prv_CMAP3;
pt_entry_t *prv_PMAP1;
int inside_intr;
#endif
};
@ -79,16 +80,17 @@ struct privatespace {
lapic_t lapic;
char __filler1[PAGE_SIZE - sizeof(lapic_t)];
/* page 3,4 - idle stack (2 pages) */
char idlestack[2 * PAGE_SIZE];
/* page 3..2+UPAGES - idle stack (UPAGES pages) */
char idlestack[UPAGES * PAGE_SIZE];
/* page 5,6,7 - CPAGE1,CPAGE2,CPAGE3 */
/* page 3+UPAGES..6+UPAGES - CPAGE1,CPAGE2,CPAGE3,PPAGE1 */
char CPAGE1[PAGE_SIZE];
char CPAGE2[PAGE_SIZE];
char CPAGE3[PAGE_SIZE];
char PPAGE1[PAGE_SIZE];
/* page 8-15 - spare, unmapped */
char __filler2[8 * PAGE_SIZE];
/* page 7+UPAGES..15 - spare, unmapped */
char __filler2[(9-UPAGES) * PAGE_SIZE];
/* page 16-31 - space for IO apics */
char ioapics[16 * PAGE_SIZE];

View File

@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
* $Id: genassym.c,v 1.53 1998/04/06 15:40:10 peter Exp $
* $Id: genassym.c,v 1.54 1998/04/06 18:59:14 peter Exp $
*/
#include "opt_vm86.h"
@ -219,6 +219,7 @@ main()
printf("#define\tGD_PRV_CMAP1 %d\n", &globaldata->prv_CMAP1);
printf("#define\tGD_PRV_CMAP2 %d\n", &globaldata->prv_CMAP2);
printf("#define\tGD_PRV_CMAP3 %d\n", &globaldata->prv_CMAP3);
printf("#define\tGD_PRV_PMAP1 %d\n", &globaldata->prv_PMAP1);
printf("#define\tGD_INSIDE_INTR %d\n", &globaldata->inside_intr);
printf("#define\tPS_GLOBALDATA 0x%x\n", &privatespace->globaldata);
printf("#define\tPS_PRVPT 0x%x\n", &privatespace->prvpt);
@ -228,6 +229,7 @@ main()
printf("#define\tPS_CPAGE1 0x%x\n", &privatespace->CPAGE1);
printf("#define\tPS_CPAGE2 0x%x\n", &privatespace->CPAGE2);
printf("#define\tPS_CPAGE3 0x%x\n", &privatespace->CPAGE3);
printf("#define\tPS_PPAGE1 0x%x\n", &privatespace->PPAGE1);
printf("#define\tPS_IOAPICS 0x%x\n", &privatespace->ioapics);
#endif

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: globals.s,v 1.1 1998/04/06 15:39:09 peter Exp $
* $Id: globals.s,v 1.2 1998/04/06 18:59:14 peter Exp $
*/
#include "opt_vm86.h"
@ -43,7 +43,7 @@
.set _SMP_prvstart,(MPPTDI << PDRSHIFT)
.globl globaldata,_SMP_prvpt,_lapic,_SMP_ioapic
.globl _prv_CPAGE1,_prv_CPAGE2,_prv_CPAGE3
.globl _prv_CPAGE1,_prv_CPAGE2,_prv_CPAGE3,_prv_PPAGE1
.globl _idlestack,_idlestack_top
.set globaldata,_SMP_prvstart + PS_GLOBALDATA
@ -54,6 +54,7 @@
.set _prv_CPAGE1,_SMP_prvstart + PS_CPAGE1
.set _prv_CPAGE2,_SMP_prvstart + PS_CPAGE2
.set _prv_CPAGE3,_SMP_prvstart + PS_CPAGE3
.set _prv_PPAGE1,_SMP_prvstart + PS_PPAGE1
.set _SMP_ioapic,_SMP_prvstart + PS_IOAPICS
#endif
@ -86,7 +87,7 @@ globaldata:
* the AP versions are setup in mp_machdep.c.
*/
.globl _cpuid,_cpu_lockid,_other_cpus,_my_idlePTD,_ss_tpr
.globl _prv_CMAP1,_prv_CMAP2,_prv_CMAP3
.globl _prv_CMAP1,_prv_CMAP2,_prv_CMAP3,_prv_PMAP1
.globl _inside_intr
.set _cpuid,globaldata + GD_CPUID
@ -97,6 +98,7 @@ globaldata:
.set _prv_CMAP1,globaldata + GD_PRV_CMAP1
.set _prv_CMAP2,globaldata + GD_PRV_CMAP2
.set _prv_CMAP3,globaldata + GD_PRV_CMAP3
.set _prv_PMAP1,globaldata + GD_PRV_PMAP1
.set _inside_intr,globaldata + GD_INSIDE_INTR
#endif

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp_machdep.c,v 1.73 1998/04/06 15:48:30 peter Exp $
* $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
*/
#include "opt_smp.h"
@ -1717,6 +1717,7 @@ start_all_aps(u_int boot_addr)
newpt[3 + UPAGES] = 0; /* *prv_CMAP1 */
newpt[4 + UPAGES] = 0; /* *prv_CMAP2 */
newpt[5 + UPAGES] = 0; /* *prv_CMAP3 */
newpt[6 + UPAGES] = 0; /* *prv_PMAP1 */
/* prime data page for it to use */
gd->cpuid = x;
@ -1725,6 +1726,7 @@ start_all_aps(u_int boot_addr)
gd->prv_CMAP1 = &newpt[3 + UPAGES];
gd->prv_CMAP2 = &newpt[4 + UPAGES];
gd->prv_CMAP3 = &newpt[5 + UPAGES];
gd->prv_PMAP1 = &newpt[6 + UPAGES];
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp_machdep.c,v 1.73 1998/04/06 15:48:30 peter Exp $
* $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
*/
#include "opt_smp.h"
@ -1717,6 +1717,7 @@ start_all_aps(u_int boot_addr)
newpt[3 + UPAGES] = 0; /* *prv_CMAP1 */
newpt[4 + UPAGES] = 0; /* *prv_CMAP2 */
newpt[5 + UPAGES] = 0; /* *prv_CMAP3 */
newpt[6 + UPAGES] = 0; /* *prv_PMAP1 */
/* prime data page for it to use */
gd->cpuid = x;
@ -1725,6 +1726,7 @@ start_all_aps(u_int boot_addr)
gd->prv_CMAP1 = &newpt[3 + UPAGES];
gd->prv_CMAP2 = &newpt[4 + UPAGES];
gd->prv_CMAP3 = &newpt[5 + UPAGES];
gd->prv_PMAP1 = &newpt[6 + UPAGES];
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;

View File

@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* $Id: pmap.c,v 1.197 1998/05/15 07:25:25 dyson Exp $
* $Id: pmap.c,v 1.198 1998/05/17 17:43:13 tegge Exp $
*/
/*
@ -190,8 +190,13 @@ extern pd_entry_t *IdlePTDS[];
extern pt_entry_t SMP_prvpt[];
#endif
#ifdef SMP
extern unsigned int prv_PPAGE1[];
extern pt_entry_t *prv_PMAP1;
#else
static pt_entry_t *PMAP1 = 0;
static unsigned *PADDR1 = 0;
#endif
static PMAP_INLINE void free_pv_entry __P((pv_entry_t pv));
static unsigned * get_ptbase __P((pmap_t pmap));
@ -347,10 +352,12 @@ pmap_bootstrap(firstaddr, loadaddr)
SYSMAP(struct msgbuf *, msgbufmap, msgbufp,
atop(round_page(sizeof(struct msgbuf))))
#if !defined(SMP)
/*
* ptemap is used for pmap_pte_quick
*/
SYSMAP(unsigned *, PMAP1, PADDR1, 1);
#endif
virtual_avail = va;
@ -438,6 +445,7 @@ pmap_bootstrap(firstaddr, loadaddr)
prv_CMAP1 = &SMP_prvpt[3 + UPAGES];
prv_CMAP2 = &SMP_prvpt[4 + UPAGES];
prv_CMAP3 = &SMP_prvpt[5 + UPAGES];
prv_PMAP1 = &SMP_prvpt[6 + UPAGES];
#endif
invltlb();
@ -735,7 +743,12 @@ get_ptbase(pmap)
/* otherwise, we are alternate address space */
if (frame != (((unsigned) APTDpde) & PG_FRAME)) {
APTDpde = (pd_entry_t) (frame | PG_RW | PG_V);
#if defined(SMP)
/* The page directory is not shared between CPUs */
cpu_invltlb();
#else
invltlb();
#endif
}
return (unsigned *) APTmap;
}
@ -763,11 +776,19 @@ pmap_pte_quick(pmap, va)
return (unsigned *) PTmap + index;
}
newpf = pde & PG_FRAME;
#ifdef SMP
if ( ((* (unsigned *) prv_PMAP1) & PG_FRAME) != newpf) {
* (unsigned *) prv_PMAP1 = newpf | PG_RW | PG_V;
cpu_invlpg(&prv_PPAGE1);
}
return prv_PPAGE1 + ((unsigned) index & (NPTEPG - 1));
#else
if ( ((* (unsigned *) PMAP1) & PG_FRAME) != newpf) {
* (unsigned *) PMAP1 = newpf | PG_RW | PG_V;
invltlb_1pg((vm_offset_t) PADDR1);
}
return PADDR1 + ((unsigned) index & (NPTEPG - 1));
#endif
}
return (0);
}

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: asnames.h,v 1.20 1998/04/22 09:46:16 peter Exp $
* $Id: asnames.h,v 1.21 1998/05/17 11:52:06 phk Exp $
*/
#ifndef _MACHINE_ASNAMES_H_
@ -306,9 +306,11 @@
#define _prv_CMAP1 prv_CMAP1
#define _prv_CMAP2 prv_CMAP2
#define _prv_CMAP3 prv_CMAP3
#define _prv_PMAP1 prv_PMAP1
#define _prv_CPAGE1 prv_CPAGE1
#define _prv_CPAGE2 prv_CPAGE2
#define _prv_CPAGE3 prv_CPAGE3
#define _prv_PPAGE1 prv_PPAGE1
#define _qs qs
#define _rcpoll rcpoll
#define _real_2op_NaN real_2op_NaN

View File

@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: cpufunc.h,v 1.77 1998/05/11 02:13:47 dyson Exp $
* $Id: cpufunc.h,v 1.78 1998/05/12 18:28:05 dyson Exp $
*/
/*
@ -225,6 +225,20 @@ cpu_invlpg(void *addr)
__asm __volatile("invlpg %0"::"m"(*(char *)addr):"memory");
}
static __inline void
cpu_invltlb(void)
{
u_long temp;
/*
* This should be implemented as load_cr3(rcr3()) when load_cr3()
* is inlined.
*/
__asm __volatile("movl %%cr3, %0; movl %0, %%cr3" : "=r" (temp)
: : "memory");
#if defined(SWTCH_OPTIM_STATS)
++tlb_flush_count;
#endif
}
#else /* !SMP */
static __inline void

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: globaldata.h,v 1.1 1998/04/06 15:37:21 peter Exp $
* $Id: globaldata.h,v 1.2 1998/04/06 18:59:15 peter Exp $
*/
/*
@ -57,6 +57,7 @@ struct globaldata {
pt_entry_t *prv_CMAP1;
pt_entry_t *prv_CMAP2;
pt_entry_t *prv_CMAP3;
pt_entry_t *prv_PMAP1;
int inside_intr;
#endif
};
@ -79,16 +80,17 @@ struct privatespace {
lapic_t lapic;
char __filler1[PAGE_SIZE - sizeof(lapic_t)];
/* page 3,4 - idle stack (2 pages) */
char idlestack[2 * PAGE_SIZE];
/* page 3..2+UPAGES - idle stack (UPAGES pages) */
char idlestack[UPAGES * PAGE_SIZE];
/* page 5,6,7 - CPAGE1,CPAGE2,CPAGE3 */
/* page 3+UPAGES..6+UPAGES - CPAGE1,CPAGE2,CPAGE3,PPAGE1 */
char CPAGE1[PAGE_SIZE];
char CPAGE2[PAGE_SIZE];
char CPAGE3[PAGE_SIZE];
char PPAGE1[PAGE_SIZE];
/* page 8-15 - spare, unmapped */
char __filler2[8 * PAGE_SIZE];
/* page 7+UPAGES..15 - spare, unmapped */
char __filler2[(9-UPAGES) * PAGE_SIZE];
/* page 16-31 - space for IO apics */
char ioapics[16 * PAGE_SIZE];

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp_machdep.c,v 1.73 1998/04/06 15:48:30 peter Exp $
* $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
*/
#include "opt_smp.h"
@ -1717,6 +1717,7 @@ start_all_aps(u_int boot_addr)
newpt[3 + UPAGES] = 0; /* *prv_CMAP1 */
newpt[4 + UPAGES] = 0; /* *prv_CMAP2 */
newpt[5 + UPAGES] = 0; /* *prv_CMAP3 */
newpt[6 + UPAGES] = 0; /* *prv_PMAP1 */
/* prime data page for it to use */
gd->cpuid = x;
@ -1725,6 +1726,7 @@ start_all_aps(u_int boot_addr)
gd->prv_CMAP1 = &newpt[3 + UPAGES];
gd->prv_CMAP2 = &newpt[4 + UPAGES];
gd->prv_CMAP3 = &newpt[5 + UPAGES];
gd->prv_PMAP1 = &newpt[6 + UPAGES];
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: globaldata.h,v 1.1 1998/04/06 15:37:21 peter Exp $
* $Id: globaldata.h,v 1.2 1998/04/06 18:59:15 peter Exp $
*/
/*
@ -57,6 +57,7 @@ struct globaldata {
pt_entry_t *prv_CMAP1;
pt_entry_t *prv_CMAP2;
pt_entry_t *prv_CMAP3;
pt_entry_t *prv_PMAP1;
int inside_intr;
#endif
};
@ -79,16 +80,17 @@ struct privatespace {
lapic_t lapic;
char __filler1[PAGE_SIZE - sizeof(lapic_t)];
/* page 3,4 - idle stack (2 pages) */
char idlestack[2 * PAGE_SIZE];
/* page 3..2+UPAGES - idle stack (UPAGES pages) */
char idlestack[UPAGES * PAGE_SIZE];
/* page 5,6,7 - CPAGE1,CPAGE2,CPAGE3 */
/* page 3+UPAGES..6+UPAGES - CPAGE1,CPAGE2,CPAGE3,PPAGE1 */
char CPAGE1[PAGE_SIZE];
char CPAGE2[PAGE_SIZE];
char CPAGE3[PAGE_SIZE];
char PPAGE1[PAGE_SIZE];
/* page 8-15 - spare, unmapped */
char __filler2[8 * PAGE_SIZE];
/* page 7+UPAGES..15 - spare, unmapped */
char __filler2[(9-UPAGES) * PAGE_SIZE];
/* page 16-31 - space for IO apics */
char ioapics[16 * PAGE_SIZE];

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: mp_machdep.c,v 1.73 1998/04/06 15:48:30 peter Exp $
* $Id: mp_machdep.c,v 1.74 1998/05/11 01:06:06 dyson Exp $
*/
#include "opt_smp.h"
@ -1717,6 +1717,7 @@ start_all_aps(u_int boot_addr)
newpt[3 + UPAGES] = 0; /* *prv_CMAP1 */
newpt[4 + UPAGES] = 0; /* *prv_CMAP2 */
newpt[5 + UPAGES] = 0; /* *prv_CMAP3 */
newpt[6 + UPAGES] = 0; /* *prv_PMAP1 */
/* prime data page for it to use */
gd->cpuid = x;
@ -1725,6 +1726,7 @@ start_all_aps(u_int boot_addr)
gd->prv_CMAP1 = &newpt[3 + UPAGES];
gd->prv_CMAP2 = &newpt[4 + UPAGES];
gd->prv_CMAP3 = &newpt[5 + UPAGES];
gd->prv_PMAP1 = &newpt[6 + UPAGES];
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;