WIP-cta-hacks
diff --git a/kern/arch/x86/apic.c b/kern/arch/x86/apic.c
index 9eadd5b..bdf71f5 100644
--- a/kern/arch/x86/apic.c
+++ b/kern/arch/x86/apic.c
@@ -142,6 +142,15 @@
* the desired time. */
uint64_t ticks64 = (usec * __proc_global_info.bus_freq)
/ LAPIC_TIMER_DIVISOR_VAL / 1000000;
+
+ // XXX had a bus_freq that was too small. we used
+ // LAPIC_TIMER_DIVISOR_VAL and whatnot for the highest granularity or
+ // whatever, but this is really supposed to be based on bus freq.
+ // actually, 32 was supposed to be reasonable
+ // 12505216 = 12 MHz. that is probably wrong... (computed)
+ if (!ticks64)
+ ticks64 = 1;
+
uint32_t ticks32 = ((ticks64 >> 32) ? 0xffffffff : ticks64);
assert(ticks32 > 0);
diff --git a/kern/arch/x86/apic9.c b/kern/arch/x86/apic9.c
index e5eb11e..49ab773 100644
--- a/kern/arch/x86/apic9.c
+++ b/kern/arch/x86/apic9.c
@@ -172,6 +172,7 @@
printd("apicinit%d: already initialised\n", apicno);
return;
}
+ // XXX we don't even use the old LAPIC_BASE anymore...?
assert(pa == LAPIC_PBASE);
apic->useable = 1;
@@ -181,6 +182,14 @@
* akaros does its own remapping of hw <-> os coreid during smp_boot */
//X2APIC INIT
+ //XXX i think this is useless and wrong
+ //uh which core are we running on? this is core 0... and all this
+ //function does is mark the apic usable if it wasn't before?
+ //also, this is the first time we jhaven't had an mp table, right?
+ //which might fuck up all of the shit
+ // i.e. first time called from mpacpi or whatever
+ // looks OK
+ //apiconline does this too, which is the real one
msr_val = read_msr(IA32_APIC_BASE);
write_msr(IA32_APIC_BASE, msr_val | (3<<10));
}
@@ -248,11 +257,14 @@
printk("Bad apicno %d on HW core %d!!\n", apicno, hw_core_id());
return 0;
}
+ // XXX if we don't get this, we're fucked. how are we even running?
+ // leftover turds from pre-x2apic?
+ // (do we need the lapic again, for AMD?
apic = &xlapic[apicno];
/* The addr check tells us if it is an IOAPIC or not... */
if (!apic->useable || apic->addr) {
- printk("Unsuitable apicno %d on HW core %d!!\n", apicno,
- hw_core_id());
+ printk("Bad apic struct for apicno %d on HW core %d!! (useable %d, addr %p)\n",
+ apicno, hw_core_id(), apic->useable, apic->addr);
return 0;
}
/* Things that can only be done when on the processor owning the APIC,
diff --git a/kern/arch/x86/mp.c b/kern/arch/x86/mp.c
index 5733be9..4312287 100644
--- a/kern/arch/x86/mp.c
+++ b/kern/arch/x86/mp.c
@@ -455,6 +455,7 @@
return r;
#endif
r = sigscan(KADDR(0xe0000), 0x20000, signature);
+ // XXX found at 0
printk("Found MP table at %p\n", r);
if (r != NULL)
return r;
diff --git a/kern/arch/x86/mpacpi.c b/kern/arch/x86/mpacpi.c
index a5407a0..2fbaf7e 100644
--- a/kern/arch/x86/mpacpi.c
+++ b/kern/arch/x86/mpacpi.c
@@ -69,6 +69,28 @@
printd("apic proc %d/%d apicid %d %s\n", np - 1,
apic->machno, st->lapic.id, already);
break;
+ case ASlx2apic:
+ // XXX hacked version of above
+ printd("ASlx2apic %d\n", st->lx2apic.id);
+ /* this table is supposed to have all of them if it
+ * exists */
+ if (st->lx2apic.id > MaxAPICNO)
+ break;
+ apic = xlapic + st->lx2apic.id;
+ bp = (np++ == 0);
+ if (apic->useable) {
+ already = "(mp)";
+ } else if (ncleft != 0) {
+ ncleft--;
+ apicinit(st->lx2apic.id, mt->lapicpa, bp);
+ } else
+ already = "(off)";
+
+ // XXX machno is 0. looks like an old plan9 thing
+ printd("apic proc %d/%d apicid %d %s\n", np - 1,
+ apic->machno, st->lx2apic.id, already);
+ break;
+
case ASioapic:
printd("ASioapic %d\n", st->ioapic.id);
if (st->ioapic.id > Napic)
diff --git a/kern/arch/x86/topology.c b/kern/arch/x86/topology.c
index ea2a8c0..08101cf 100644
--- a/kern/arch/x86/topology.c
+++ b/kern/arch/x86/topology.c
@@ -110,11 +110,16 @@
for (int i = 0; i < apics->nchildren; i++) {
struct Apicst *temp = apics->children[i]->tbl;
- if (temp != NULL && temp->type == ASlapic)
+ // XXX
+ if (temp != NULL && (temp->type == ASlapic || temp->type == ASlx2apic))
num_cores++;
}
- if (num_cores < old_num_cores)
- warn("Topology found less cores than early MADT parsing!");
+ if (num_cores < old_num_cores) {
+ warn("Topology found less cores (%d) than early MADT parsing! (%d)", num_cores, old_num_cores);
+ // XXX fucked
+ if (!num_cores)
+ num_cores = 2;
+ }
/* Too many cores will be a problem for some data structures. */
if (num_cores > old_num_cores)
panic("Topology found more cores than early MADT parsing!");
@@ -174,9 +179,15 @@
for (int i = 0; i < apics->nchildren; i++) {
struct Apicst *temp = apics->children[i]->tbl;
- if (temp->type == ASlapic) {
+ switch (temp->type) {
+ case ASlapic:
if (temp->lapic.id > max_apic_id)
max_apic_id = temp->lapic.id;
+ break;
+ case ASlx2apic:
+ if (temp->lx2apic.id > max_apic_id)
+ max_apic_id = temp->lx2apic.id;
+ break;
}
}
}
@@ -201,8 +212,14 @@
for (int i = 0; i < apics->nchildren; i++) {
struct Apicst *temp = apics->children[i]->tbl;
- if (temp->type == ASlapic)
+ switch (temp->type) {
+ case ASlapic:
os_coreid_lookup[temp->lapic.id] = 0;
+ break;
+ case ASlx2apic:
+ os_coreid_lookup[temp->lx2apic.id] = 0;
+ break;
+ }
}
int os_coreid = 0;
@@ -380,6 +397,7 @@
build_flat_topology();
}
+// XXX busted on cta9. should be 2 sockets. probably ACPI vs cpuid?
void print_cpu_topology(void)
{
printk("num_numa: %d, num_sockets: %d, num_cpus: %d, num_cores: %d\n",
diff --git a/kern/drivers/dev/acpi.c b/kern/drivers/dev/acpi.c
index cdac431..e4719db 100644
--- a/kern/drivers/dev/acpi.c
+++ b/kern/drivers/dev/acpi.c
@@ -1672,6 +1672,7 @@
return NULL;
}
+// XXX wrong comment
/* This may be an overestimate, if some LAPICS are present but disabled */
static int madt_get_nr_cores(struct Sdthdr *madt)
{
@@ -1684,7 +1685,15 @@
for (p += 44; p < madt_end; p += entry_len) {
entry_len = p[1];
switch (p[0]) {
+ // XXX NASTY
case ASlapic:
+ if (l32get(p + 4) == 0)
+ break;
+ nr_cores++;
+ break;
+ case ASlx2apic:
+ if (l32get(p + 8) == 0)
+ break;
nr_cores++;
break;
default:
diff --git a/kern/src/init.c b/kern/src/init.c
index a5e6349..83d54b5 100644
--- a/kern/src/init.c
+++ b/kern/src/init.c
@@ -133,6 +133,8 @@
exception_table_init();
num_cores = get_early_num_cores();
+ // XXX
+ printk("EARLY NUM CORES %d\n", num_cores);
pmem_init(multiboot_kaddr);
kmalloc_init();
vmap_init();
diff --git a/kern/src/ns/devtab.c b/kern/src/ns/devtab.c
index e88df66..660c671 100644
--- a/kern/src/ns/devtab.c
+++ b/kern/src/ns/devtab.c
@@ -27,10 +27,12 @@
return;
}
for (i = 0; &devtab[i] < __devtabend; i++) {
+ printk("%s: #%s\n", __func__, devtab[i].name);
if (devtab[i].reset)
devtab[i].reset();
}
poperror();
+ printk("%s complete\n", __func__);
}
void devtabinit(void)
@@ -48,10 +50,12 @@
*/
printd("i %d, '%s', dev %p, init %p\n", i, devtab[i].name,
&devtab[i], devtab[i].init);
+ printk("%s: #%s\n", __func__, devtab[i].name);
if (devtab[i].init)
devtab[i].init();
}
poperror();
+ printk("%s complete\n", __func__);
}
void devtabshutdown(void)