mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-31 16:57:10 +00:00
Synchronize with following changes:
> Revision Changes Path > 1.250 +1 -18 src/sys/i386/i386/machdep.c > 1.48 +1 -7 src/sys/i386/conf/options.i386 > 1.251 +19 -46 src/sys/i386/i386/machdep.c > 1.24 +2 -6 src/sys/i386/i386/microtime.s > 1.100 +4 -15 src/sys/i386/i386/trap.c > 1.46 +6 -7 src/sys/i386/isa/npx.c
This commit is contained in:
parent
5603173abd
commit
879210125e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=26843
@ -1,4 +1,4 @@
|
||||
# $Id: options.pc98,v 1.26 1997/06/04 10:29:17 kato Exp $
|
||||
# $Id: options.pc98,v 1.27 1997/06/06 13:07:18 kato Exp $
|
||||
BOUNCEPAGES opt_bounce.h
|
||||
USER_LDT
|
||||
MATH_EMULATE opt_math_emulate.h
|
||||
@ -40,12 +40,6 @@ NAPIC opt_smp.h
|
||||
NINTR opt_smp.h
|
||||
SMP_TIMER_NC opt_smp.h
|
||||
|
||||
# These three are known to be broken, don't enable them.
|
||||
SMP_PRIVPAGES opt_smp_privpages.h
|
||||
SMP_AUTOSTART opt_smp_autostart.h
|
||||
|
||||
SERIAL_DEBUG opt_serial.h
|
||||
|
||||
AHC_TAGENABLE opt_aic7xxx.h
|
||||
AHC_SCBPAGING_ENABLE opt_aic7xxx.h
|
||||
AHC_ALLOW_MEMIO opt_aic7xxx.h
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: options.pc98,v 1.26 1997/06/04 10:29:17 kato Exp $
|
||||
# $Id: options.pc98,v 1.27 1997/06/06 13:07:18 kato Exp $
|
||||
BOUNCEPAGES opt_bounce.h
|
||||
USER_LDT
|
||||
MATH_EMULATE opt_math_emulate.h
|
||||
@ -40,12 +40,6 @@ NAPIC opt_smp.h
|
||||
NINTR opt_smp.h
|
||||
SMP_TIMER_NC opt_smp.h
|
||||
|
||||
# These three are known to be broken, don't enable them.
|
||||
SMP_PRIVPAGES opt_smp_privpages.h
|
||||
SMP_AUTOSTART opt_smp_autostart.h
|
||||
|
||||
SERIAL_DEBUG opt_serial.h
|
||||
|
||||
AHC_TAGENABLE opt_aic7xxx.h
|
||||
AHC_SCBPAGING_ENABLE opt_aic7xxx.h
|
||||
AHC_ALLOW_MEMIO opt_aic7xxx.h
|
||||
|
@ -35,7 +35,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||
* $Id: machdep.c,v 1.44 1997/06/09 13:38:21 kato Exp $
|
||||
* $Id: machdep.c,v 1.45 1997/06/15 16:35:13 kato Exp $
|
||||
*/
|
||||
|
||||
#include "apm.h"
|
||||
@ -229,12 +229,6 @@ cpu_startup(dummy)
|
||||
* Good {morning,afternoon,evening,night}.
|
||||
*/
|
||||
printf(version);
|
||||
#ifdef SMP
|
||||
#if defined(LATE_START)
|
||||
mp_start(); /* fire up the APs and APICs */
|
||||
#endif /* LATE_START */
|
||||
mp_announce();
|
||||
#endif /* SMP */
|
||||
earlysetcpuclass();
|
||||
startrtclock();
|
||||
printcpuinfo();
|
||||
@ -370,23 +364,6 @@ cpu_startup(dummy)
|
||||
u_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr,
|
||||
(maxproc*UPAGES*PAGE_SIZE), FALSE);
|
||||
|
||||
#if defined(SMP) && defined(SMP_PRIVPAGES)
|
||||
/* Per-cpu pages.. (the story so far is... subject to change)
|
||||
* ========= For the per-cpu data page ========
|
||||
* 1 private data page
|
||||
* 1 PDE (per-cpu PTD entry page)
|
||||
* 1 PT (per-cpu page table page)
|
||||
* ============ For the idle loop =============
|
||||
* 2 UPAGEs (per-cpu idle procs)
|
||||
* 1 PTD (for per-cpu equiv of IdlePTD)
|
||||
* ============================================
|
||||
* = total of 6 pages per cpu. The BSP reuses the ones allocated
|
||||
* by locore.s during boot to remove special cases at runtime.
|
||||
*/
|
||||
ppage_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr,
|
||||
(NCPU*6*PAGE_SIZE), FALSE);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Finally, allocate mbuf pool. Since mclrefcnt is an off-size
|
||||
* we use the more space efficient malloc in place of kmem_alloc.
|
||||
@ -430,6 +407,14 @@ cpu_startup(dummy)
|
||||
printf("avail memory = %d (%dK bytes)\n", ptoa(cnt.v_free_count),
|
||||
ptoa(cnt.v_free_count) / 1024);
|
||||
|
||||
#ifdef SMP
|
||||
/*
|
||||
* OK, enough kmem_alloc/malloc state should be up, lets get on with it!
|
||||
*/
|
||||
mp_start(); /* fire up the APs and APICs */
|
||||
mp_announce();
|
||||
#endif /* SMP */
|
||||
|
||||
/*
|
||||
* Set up buffers, so they can be used to read disk labels.
|
||||
*/
|
||||
@ -815,8 +800,7 @@ struct region_descriptor r_gdt, r_idt;
|
||||
#endif
|
||||
|
||||
#ifdef SMP
|
||||
struct i386tss SMPcommon_tss[NCPU]; /* One tss per cpu */
|
||||
struct i386tss *SMPcommon_tss_ptr[NCPU]; /* for the benefit of asmp code */
|
||||
extern struct i386tss common_tss; /* One tss per cpu */
|
||||
#else
|
||||
struct i386tss common_tss;
|
||||
#endif
|
||||
@ -893,11 +877,7 @@ struct soft_segment_descriptor gdt_segs[
|
||||
0 /* limit granularity (byte/page units)*/ },
|
||||
/* GPROC0_SEL 6 Proc 0 Tss Descriptor */
|
||||
{
|
||||
#ifdef SMP
|
||||
(int) &SMPcommon_tss[0],/* segment base address */
|
||||
#else
|
||||
(int) &common_tss, /* segment base address */
|
||||
#endif
|
||||
sizeof(struct i386tss)-1,/* length - all address space */
|
||||
SDT_SYS386TSS, /* segment type */
|
||||
0, /* segment descriptor priority level */
|
||||
@ -1090,12 +1070,11 @@ init386(first)
|
||||
|
||||
#ifdef SMP
|
||||
/*
|
||||
* Oh puke!
|
||||
* Spin these up now. init_secondary() grabs them. We could use
|
||||
* #for(x,y,z) / #endfor cpp directives if they existed.
|
||||
*/
|
||||
for (x = 0; x < NCPU; x++) {
|
||||
SMPcommon_tss_ptr[x] = &SMPcommon_tss[x];
|
||||
gdt_segs[NGDT + x] = gdt_segs[GPROC0_SEL];
|
||||
gdt_segs[NGDT + x].ssd_base = (int) SMPcommon_tss_ptr[x];
|
||||
ssdtosd(&gdt_segs[NGDT + x], &gdt[NGDT + x].sd);
|
||||
}
|
||||
#endif
|
||||
@ -1301,6 +1280,11 @@ init386(first)
|
||||
Maxmem = idp->id_msize / 4;
|
||||
#endif
|
||||
|
||||
#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);
|
||||
|
||||
@ -1436,40 +1420,18 @@ init386(first)
|
||||
avail_end + off, VM_PROT_ALL, TRUE);
|
||||
msgbufmapped = 1;
|
||||
|
||||
#ifdef SMP
|
||||
/* look for the MP hardware */
|
||||
mp_probe();
|
||||
|
||||
/* make the initial tss so cpu can get interrupt stack on syscall! */
|
||||
for(x = 0; x < NCPU; x++) {
|
||||
SMPcommon_tss[x].tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE;
|
||||
SMPcommon_tss[x].tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ;
|
||||
SMPcommon_tss[x].tss_ioopt = (sizeof SMPcommon_tss[x]) << 16;
|
||||
}
|
||||
#if 0
|
||||
/** XXX FIXME:
|
||||
* We can't access the LOCAL APIC till mp_enable() runs. Since
|
||||
* this is run by the BSP, cpunumber() should always equal 0 anyway.
|
||||
*/
|
||||
gsel_tss = GSEL(NGDT + cpunumber(), SEL_KPL);
|
||||
#else
|
||||
gsel_tss = GSEL(NGDT /** + 0 */, SEL_KPL);
|
||||
#endif /** 0 */
|
||||
ltr(gsel_tss);
|
||||
#else
|
||||
/* make an initial tss so cpu can get interrupt stack on syscall! */
|
||||
common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE;
|
||||
common_tss.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ;
|
||||
common_tss.tss_ioopt = (sizeof common_tss) << 16;
|
||||
gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
|
||||
ltr(gsel_tss);
|
||||
#endif /* SMP */
|
||||
|
||||
dblfault_tss.tss_esp = dblfault_tss.tss_esp0 = dblfault_tss.tss_esp1 =
|
||||
dblfault_tss.tss_esp2 = (int) &dblfault_stack[sizeof(dblfault_stack)];
|
||||
dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 =
|
||||
dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL);
|
||||
dblfault_tss.tss_cr3 = IdlePTD;
|
||||
dblfault_tss.tss_cr3 = (int)IdlePTD;
|
||||
dblfault_tss.tss_eip = (int) dblfault_handler;
|
||||
dblfault_tss.tss_eflags = PSL_KERNEL;
|
||||
dblfault_tss.tss_ds = dblfault_tss.tss_es = dblfault_tss.tss_fs =
|
||||
@ -1503,14 +1465,8 @@ init386(first)
|
||||
|
||||
/* setup proc 0's pcb */
|
||||
proc0.p_addr->u_pcb.pcb_flags = 0;
|
||||
proc0.p_addr->u_pcb.pcb_cr3 = IdlePTD;
|
||||
proc0.p_addr->u_pcb.pcb_cr3 = (int)IdlePTD;
|
||||
proc0.p_addr->u_pcb.pcb_mpnest = 1;
|
||||
|
||||
#ifdef SMP
|
||||
#if !defined(LATE_START)
|
||||
mp_start(); /* fire up the APs and APICs */
|
||||
#endif /* LATE_START */
|
||||
#endif /* SMP */
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -32,14 +32,11 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: Steve McCanne's microtime code
|
||||
* $Id: microtime.s,v 1.9 1997/04/27 13:22:02 kato Exp $
|
||||
* $Id: microtime.s,v 1.10 1997/05/30 10:00:58 kato Exp $
|
||||
*/
|
||||
|
||||
#include "opt_cpu.h"
|
||||
|
||||
#ifdef APIC_IO
|
||||
#include <machine/apic.h>
|
||||
#endif /* APIC_IO */
|
||||
#include <machine/asmacros.h>
|
||||
|
||||
#include <i386/isa/icu.h>
|
||||
@ -129,8 +126,7 @@ ENTRY(microtime)
|
||||
jbe 1f
|
||||
|
||||
#if defined(APIC_IO)
|
||||
movl _apic_base, %eax
|
||||
movl APIC_IRR1(%eax), %eax /** XXX assumption: IRQ0-24 */
|
||||
movl lapic_irr1, %eax /** XXX assumption: IRQ0-24 */
|
||||
testl %eax, _mask8254 /* is a hard timer interrupt pending? */
|
||||
#else
|
||||
inb $IO_ICU1, %al /* read IRR in ICU */
|
||||
|
@ -35,7 +35,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91
|
||||
* $Id: trap.c,v 1.23 1997/06/02 15:45:32 kato Exp $
|
||||
* $Id: trap.c,v 1.24 1997/06/09 13:38:21 kato Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -87,11 +87,7 @@
|
||||
#include "isa.h"
|
||||
#include "npx.h"
|
||||
|
||||
#ifdef SMP
|
||||
extern struct i386tss *SMPcommon_tss_ptr[];
|
||||
#else
|
||||
extern struct i386tss common_tss;
|
||||
#endif
|
||||
|
||||
int (*pmath_emulate) __P((struct trapframe *));
|
||||
|
||||
@ -754,7 +750,7 @@ trap_fatal(frame)
|
||||
type, trap_msg[type],
|
||||
ISPL(frame->tf_cs) == SEL_UPL ? "user" : "kernel");
|
||||
#ifdef SMP
|
||||
printf("cpunumber = %d\n", cpunumber());
|
||||
printf("cpuid = %d\n", cpuid);
|
||||
#endif
|
||||
if (type == T_PAGEFLT) {
|
||||
printf("fault virtual address = 0x%x\n", eva);
|
||||
@ -840,19 +836,12 @@ trap_fatal(frame)
|
||||
void
|
||||
dblfault_handler()
|
||||
{
|
||||
#ifdef SMP
|
||||
int x = cpunumber();
|
||||
#endif
|
||||
|
||||
printf("\nFatal double fault:\n");
|
||||
#ifdef SMP
|
||||
printf("eip = 0x%x\n", SMPcommon_tss_ptr[x]->tss_eip);
|
||||
printf("esp = 0x%x\n", SMPcommon_tss_ptr[x]->tss_esp);
|
||||
printf("ebp = 0x%x\n", SMPcommon_tss_ptr[x]->tss_ebp);
|
||||
#else
|
||||
printf("eip = 0x%x\n", common_tss.tss_eip);
|
||||
printf("esp = 0x%x\n", common_tss.tss_esp);
|
||||
printf("ebp = 0x%x\n", common_tss.tss_ebp);
|
||||
#ifdef SMP
|
||||
printf("cpuid = %d\n", cpuid);
|
||||
#endif
|
||||
panic("double fault");
|
||||
}
|
||||
|
@ -35,7 +35,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||
* $Id: machdep.c,v 1.44 1997/06/09 13:38:21 kato Exp $
|
||||
* $Id: machdep.c,v 1.45 1997/06/15 16:35:13 kato Exp $
|
||||
*/
|
||||
|
||||
#include "apm.h"
|
||||
@ -229,12 +229,6 @@ cpu_startup(dummy)
|
||||
* Good {morning,afternoon,evening,night}.
|
||||
*/
|
||||
printf(version);
|
||||
#ifdef SMP
|
||||
#if defined(LATE_START)
|
||||
mp_start(); /* fire up the APs and APICs */
|
||||
#endif /* LATE_START */
|
||||
mp_announce();
|
||||
#endif /* SMP */
|
||||
earlysetcpuclass();
|
||||
startrtclock();
|
||||
printcpuinfo();
|
||||
@ -370,23 +364,6 @@ cpu_startup(dummy)
|
||||
u_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr,
|
||||
(maxproc*UPAGES*PAGE_SIZE), FALSE);
|
||||
|
||||
#if defined(SMP) && defined(SMP_PRIVPAGES)
|
||||
/* Per-cpu pages.. (the story so far is... subject to change)
|
||||
* ========= For the per-cpu data page ========
|
||||
* 1 private data page
|
||||
* 1 PDE (per-cpu PTD entry page)
|
||||
* 1 PT (per-cpu page table page)
|
||||
* ============ For the idle loop =============
|
||||
* 2 UPAGEs (per-cpu idle procs)
|
||||
* 1 PTD (for per-cpu equiv of IdlePTD)
|
||||
* ============================================
|
||||
* = total of 6 pages per cpu. The BSP reuses the ones allocated
|
||||
* by locore.s during boot to remove special cases at runtime.
|
||||
*/
|
||||
ppage_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr,
|
||||
(NCPU*6*PAGE_SIZE), FALSE);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Finally, allocate mbuf pool. Since mclrefcnt is an off-size
|
||||
* we use the more space efficient malloc in place of kmem_alloc.
|
||||
@ -430,6 +407,14 @@ cpu_startup(dummy)
|
||||
printf("avail memory = %d (%dK bytes)\n", ptoa(cnt.v_free_count),
|
||||
ptoa(cnt.v_free_count) / 1024);
|
||||
|
||||
#ifdef SMP
|
||||
/*
|
||||
* OK, enough kmem_alloc/malloc state should be up, lets get on with it!
|
||||
*/
|
||||
mp_start(); /* fire up the APs and APICs */
|
||||
mp_announce();
|
||||
#endif /* SMP */
|
||||
|
||||
/*
|
||||
* Set up buffers, so they can be used to read disk labels.
|
||||
*/
|
||||
@ -815,8 +800,7 @@ struct region_descriptor r_gdt, r_idt;
|
||||
#endif
|
||||
|
||||
#ifdef SMP
|
||||
struct i386tss SMPcommon_tss[NCPU]; /* One tss per cpu */
|
||||
struct i386tss *SMPcommon_tss_ptr[NCPU]; /* for the benefit of asmp code */
|
||||
extern struct i386tss common_tss; /* One tss per cpu */
|
||||
#else
|
||||
struct i386tss common_tss;
|
||||
#endif
|
||||
@ -893,11 +877,7 @@ struct soft_segment_descriptor gdt_segs[
|
||||
0 /* limit granularity (byte/page units)*/ },
|
||||
/* GPROC0_SEL 6 Proc 0 Tss Descriptor */
|
||||
{
|
||||
#ifdef SMP
|
||||
(int) &SMPcommon_tss[0],/* segment base address */
|
||||
#else
|
||||
(int) &common_tss, /* segment base address */
|
||||
#endif
|
||||
sizeof(struct i386tss)-1,/* length - all address space */
|
||||
SDT_SYS386TSS, /* segment type */
|
||||
0, /* segment descriptor priority level */
|
||||
@ -1090,12 +1070,11 @@ init386(first)
|
||||
|
||||
#ifdef SMP
|
||||
/*
|
||||
* Oh puke!
|
||||
* Spin these up now. init_secondary() grabs them. We could use
|
||||
* #for(x,y,z) / #endfor cpp directives if they existed.
|
||||
*/
|
||||
for (x = 0; x < NCPU; x++) {
|
||||
SMPcommon_tss_ptr[x] = &SMPcommon_tss[x];
|
||||
gdt_segs[NGDT + x] = gdt_segs[GPROC0_SEL];
|
||||
gdt_segs[NGDT + x].ssd_base = (int) SMPcommon_tss_ptr[x];
|
||||
ssdtosd(&gdt_segs[NGDT + x], &gdt[NGDT + x].sd);
|
||||
}
|
||||
#endif
|
||||
@ -1301,6 +1280,11 @@ init386(first)
|
||||
Maxmem = idp->id_msize / 4;
|
||||
#endif
|
||||
|
||||
#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);
|
||||
|
||||
@ -1436,40 +1420,18 @@ init386(first)
|
||||
avail_end + off, VM_PROT_ALL, TRUE);
|
||||
msgbufmapped = 1;
|
||||
|
||||
#ifdef SMP
|
||||
/* look for the MP hardware */
|
||||
mp_probe();
|
||||
|
||||
/* make the initial tss so cpu can get interrupt stack on syscall! */
|
||||
for(x = 0; x < NCPU; x++) {
|
||||
SMPcommon_tss[x].tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE;
|
||||
SMPcommon_tss[x].tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ;
|
||||
SMPcommon_tss[x].tss_ioopt = (sizeof SMPcommon_tss[x]) << 16;
|
||||
}
|
||||
#if 0
|
||||
/** XXX FIXME:
|
||||
* We can't access the LOCAL APIC till mp_enable() runs. Since
|
||||
* this is run by the BSP, cpunumber() should always equal 0 anyway.
|
||||
*/
|
||||
gsel_tss = GSEL(NGDT + cpunumber(), SEL_KPL);
|
||||
#else
|
||||
gsel_tss = GSEL(NGDT /** + 0 */, SEL_KPL);
|
||||
#endif /** 0 */
|
||||
ltr(gsel_tss);
|
||||
#else
|
||||
/* make an initial tss so cpu can get interrupt stack on syscall! */
|
||||
common_tss.tss_esp0 = (int) proc0.p_addr + UPAGES*PAGE_SIZE;
|
||||
common_tss.tss_ss0 = GSEL(GDATA_SEL, SEL_KPL) ;
|
||||
common_tss.tss_ioopt = (sizeof common_tss) << 16;
|
||||
gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
|
||||
ltr(gsel_tss);
|
||||
#endif /* SMP */
|
||||
|
||||
dblfault_tss.tss_esp = dblfault_tss.tss_esp0 = dblfault_tss.tss_esp1 =
|
||||
dblfault_tss.tss_esp2 = (int) &dblfault_stack[sizeof(dblfault_stack)];
|
||||
dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 =
|
||||
dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL);
|
||||
dblfault_tss.tss_cr3 = IdlePTD;
|
||||
dblfault_tss.tss_cr3 = (int)IdlePTD;
|
||||
dblfault_tss.tss_eip = (int) dblfault_handler;
|
||||
dblfault_tss.tss_eflags = PSL_KERNEL;
|
||||
dblfault_tss.tss_ds = dblfault_tss.tss_es = dblfault_tss.tss_fs =
|
||||
@ -1503,14 +1465,8 @@ init386(first)
|
||||
|
||||
/* setup proc 0's pcb */
|
||||
proc0.p_addr->u_pcb.pcb_flags = 0;
|
||||
proc0.p_addr->u_pcb.pcb_cr3 = IdlePTD;
|
||||
proc0.p_addr->u_pcb.pcb_cr3 = (int)IdlePTD;
|
||||
proc0.p_addr->u_pcb.pcb_mpnest = 1;
|
||||
|
||||
#ifdef SMP
|
||||
#if !defined(LATE_START)
|
||||
mp_start(); /* fire up the APs and APICs */
|
||||
#endif /* LATE_START */
|
||||
#endif /* SMP */
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -32,7 +32,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)npx.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: npx.c,v 1.19 1997/05/31 12:43:17 kato Exp $
|
||||
* $Id: npx.c,v 1.20 1997/06/02 15:45:40 kato Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
@ -63,6 +63,7 @@
|
||||
#include <machine/clock.h>
|
||||
#include <machine/specialreg.h>
|
||||
#if defined(APIC_IO)
|
||||
#include <machine/smp.h>
|
||||
#include <machine/apic.h>
|
||||
#include <machine/mpapic.h>
|
||||
#endif /* APIC_IO */
|
||||
@ -144,10 +145,8 @@ SYSCTL_INT(_hw,HW_FLOATINGPT, floatingpoint,
|
||||
"Floatingpoint instructions executed in hardware");
|
||||
|
||||
static u_int npx0_imask = SWI_CLOCK_MASK;
|
||||
#ifdef SMP
|
||||
#define npxproc (SMPnpxproc[cpunumber()])
|
||||
struct proc *SMPnpxproc[NCPU];
|
||||
#else
|
||||
|
||||
#ifndef SMP /* XXX per-cpu on smp */
|
||||
struct proc *npxproc;
|
||||
#endif
|
||||
|
||||
@ -176,8 +175,8 @@ asm
|
||||
ss
|
||||
incl " __XSTRING(CNAME(npx_intrs_while_probing)) "
|
||||
pushl %eax
|
||||
movl " __XSTRING(CNAME(apic_base)) ",%eax # EOI to local APIC
|
||||
movl $0,0xb0(,%eax,1) # movl $0, APIC_EOI(%eax)
|
||||
movl $lapic_eoi,%eax # EOI to local APIC
|
||||
movl $0,(%eax) # movl $0, APIC_EOI(%eax)
|
||||
movb $0,%al
|
||||
#ifdef PC98
|
||||
outb %al,$0xf8 # clear BUSY# latch
|
||||
|
Loading…
Reference in New Issue
Block a user