stick mpstack in cpu structure
This commit is contained in:
parent
bf3903612d
commit
a44ee3cde8
|
@ -14,7 +14,7 @@
|
||||||
* mp.c puts the correct %esp in start-4, and the place to jump
|
* mp.c puts the correct %esp in start-4, and the place to jump
|
||||||
* to in start-8.
|
* to in start-8.
|
||||||
*
|
*
|
||||||
* Credit: Cliff Frey
|
* Credit: Cliff Frey and Plan 9
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.set PROT_MODE_CSEG,0x8 # code segment selector
|
.set PROT_MODE_CSEG,0x8 # code segment selector
|
||||||
|
|
14
mp.c
14
mp.c
|
@ -91,20 +91,18 @@ enum { /* LAPIC_TDCR */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define APBOOTCODE 0x7000 // XXX hack
|
#define APBOOTCODE 0x7000 // XXX hack
|
||||||
|
#define MPSTACK 512
|
||||||
|
|
||||||
static struct MP* mp; /* The MP floating point structure */
|
static struct MP* mp; // The MP floating point structure
|
||||||
static uint32_t *lapicaddr;
|
static uint32_t *lapicaddr;
|
||||||
static struct cpu {
|
static struct cpu {
|
||||||
uint8_t apicid; /* Local APIC ID */
|
uint8_t apicid; // Local APIC ID
|
||||||
int lintr[2]; /* Local APIC */
|
int lintr[2]; // Local APIC
|
||||||
|
char mpstack[MPSTACK]; // per-cpu start-up stack, only used to get into main()
|
||||||
} cpus[NCPU];
|
} cpus[NCPU];
|
||||||
static int ncpu;
|
static int ncpu;
|
||||||
static struct cpu *bcpu;
|
static struct cpu *bcpu;
|
||||||
|
|
||||||
// per-cpu start-up stack, only used to get into main()
|
|
||||||
#define MPSTACK 512
|
|
||||||
char mpstacks[NCPU * MPSTACK];
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lapic_read(int r)
|
lapic_read(int r)
|
||||||
{
|
{
|
||||||
|
@ -361,7 +359,7 @@ mp_init()
|
||||||
if (cpus+c == bcpu) continue;
|
if (cpus+c == bcpu) continue;
|
||||||
cprintf ("starting processor %d\n", c);
|
cprintf ("starting processor %d\n", c);
|
||||||
release_grant_spinlock(&kernel_lock, c);
|
release_grant_spinlock(&kernel_lock, c);
|
||||||
*(unsigned *)(APBOOTCODE-4) = (unsigned) mpstacks + (c + 1) * MPSTACK; // tell it what to use for %esp
|
*(unsigned *)(APBOOTCODE-4) = (unsigned) (cpus[c].mpstack) + MPSTACK; // tell it what to use for %esp
|
||||||
*(unsigned *)(APBOOTCODE-8) = (unsigned)&main; // tell it where to jump to
|
*(unsigned *)(APBOOTCODE-8) = (unsigned)&main; // tell it where to jump to
|
||||||
lapic_startap(cpus + c, (uint32_t) APBOOTCODE);
|
lapic_startap(cpus + c, (uint32_t) APBOOTCODE);
|
||||||
acquire_spinlock(&kernel_lock);
|
acquire_spinlock(&kernel_lock);
|
||||||
|
|
Loading…
Reference in a new issue