Skip to content

Commit 79ff1cf

Browse files
committed
smp,drivers,arch: use new CPU API for using detected CPUs
Signed-off-by: Pawel Wieczorkiewicz <[email protected]>
1 parent 59b1f71 commit 79ff1cf

File tree

19 files changed

+123
-123
lines changed

19 files changed

+123
-123
lines changed

arch/x86/apic.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
#include <apic.h>
2626
#include <console.h>
27+
#include <cpu.h>
2728
#include <drivers/pit.h>
2829
#include <ktf.h>
2930
#include <lib.h>
@@ -107,10 +108,10 @@ void apic_icr_write(const apic_icr_t *icr) {
107108

108109
apic_mode_t apic_get_mode(void) { return apic_mode; }
109110

110-
void init_apic(unsigned int cpu, apic_mode_t mode) {
111-
percpu_t *percpu = get_percpu_page(cpu);
111+
void init_apic(unsigned int cpu_id, apic_mode_t mode) {
112112
apic_base_t apic_base;
113113
apic_spiv_t spiv;
114+
cpu_t *cpu;
114115

115116
BUG_ON(mode < APIC_MODE_DISABLED);
116117

@@ -128,8 +129,8 @@ void init_apic(unsigned int cpu, apic_mode_t mode) {
128129
BUG();
129130
}
130131

131-
printk("CPU%u: Initializing APIC mode: %s -> %s\n", cpu, apic_mode_names[apic_mode],
132-
apic_mode_names[mode]);
132+
printk("CPU%u: Initializing APIC mode: %s -> %s\n", cpu_id,
133+
apic_mode_names[apic_mode], apic_mode_names[mode]);
133134

134135
/* Disable APIC */
135136
apic_base.en = apic_base.extd = 0;
@@ -146,8 +147,11 @@ void init_apic(unsigned int cpu, apic_mode_t mode) {
146147
}
147148

148149
apic_mode = mode;
149-
percpu->apic_base = apic_base;
150-
PERCPU_SET(bsp, apic_base.bsp);
150+
151+
cpu = !!apic_base.bsp ? get_bsp_cpu() : get_cpu(cpu_id);
152+
BUG_ON(!cpu || cpu->id != cpu_id);
153+
154+
cpu->percpu->apic_base = apic_base;
151155

152156
/* XAPIC requires MMIO accesses, thus the APIC_BASE page needs to be mapped.
153157
* X2APIC uses MSRs for accesses, so no mapping needed.

arch/x86/traps.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ static void init_gdt(percpu_t *percpu) {
119119
init_tss(percpu);
120120
}
121121

122-
void init_traps(unsigned int cpu) {
123-
percpu_t *percpu = get_percpu_page(cpu);
122+
void init_traps(const cpu_t *cpu) {
123+
percpu_t *percpu = cpu->percpu;
124124

125125
BUG_ON(!percpu);
126126

@@ -175,7 +175,7 @@ void init_traps(unsigned int cpu) {
175175

176176
init_gdt(percpu);
177177

178-
wrmsr(MSR_TSC_AUX, cpu);
178+
wrmsr(MSR_TSC_AUX, cpu->id);
179179
}
180180

181181
static void dump_general_regs(const struct cpu_regs *regs) {

common/acpi.c

Lines changed: 37 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2424
*/
2525
#include <acpi_ktf.h>
26+
#include <cpu.h>
2627
#include <ioapic.h>
27-
#include <percpu.h>
2828
#include <setup.h>
2929
#include <string.h>
3030

@@ -46,10 +46,6 @@ static const char *madt_int_trigger_names[] = {
4646
[ACPI_MADT_INT_TRIGGER_LT] = "Level",
4747
};
4848

49-
static unsigned nr_cpus;
50-
51-
unsigned acpi_get_nr_cpus(void) { return nr_cpus; }
52-
5349
#ifndef KTF_ACPICA
5450
#include <errno.h>
5551
#include <page.h>
@@ -232,7 +228,7 @@ static int process_fadt(void) {
232228
return 0;
233229
}
234230

235-
static int process_madt_entries(unsigned bsp_cpu_id) {
231+
static int process_madt_entries(void) {
236232
acpi_madt_t *madt = (acpi_madt_t *) acpi_find_table(MADT_SIGNATURE);
237233
acpi_madt_entry_t *entry;
238234
bus_t *isa_bus = NULL;
@@ -257,23 +253,23 @@ static int process_madt_entries(unsigned bsp_cpu_id) {
257253
switch (entry->type) {
258254
case ACPI_MADT_TYPE_LAPIC: {
259255
acpi_madt_processor_t *madt_cpu = (acpi_madt_processor_t *) entry->data;
260-
percpu_t *percpu;
261256
bool enabled;
262257

263258
/* Some systems report all CPUs, marked as disabled */
264259
enabled = !!(madt_cpu->flags & 0x1);
265260
if (!enabled)
266261
break;
267262

268-
percpu = get_percpu_page(madt_cpu->apic_proc_id);
263+
cpu_t *cpu = get_cpu(madt_cpu->apic_proc_id)
264+
?: add_cpu(madt_cpu->apic_proc_id, false, enabled);
265+
cpu->enabled = enabled;
266+
267+
percpu_t *percpu = cpu->percpu;
269268
percpu->cpu_id = madt_cpu->apic_proc_id;
270269
percpu->apic_id = madt_cpu->apic_id;
271-
percpu->bsp = !!(madt_cpu->apic_proc_id == bsp_cpu_id);
272-
percpu->enabled = enabled;
273270

274-
nr_cpus++;
275271
printk("ACPI: [MADT] APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n",
276-
madt_cpu->apic_proc_id, madt_cpu->apic_id, madt_cpu->flags);
272+
cpu->id, percpu->apic_id, madt_cpu->flags);
277273
break;
278274
}
279275
case ACPI_MADT_TYPE_IOAPIC: {
@@ -383,7 +379,7 @@ acpi_table_t *acpi_find_table(uint32_t signature) {
383379
return NULL;
384380
}
385381

386-
int init_acpi(unsigned bsp_cpu_id) {
382+
int init_acpi(void) {
387383
unsigned acpi_nr_tables;
388384
rsdt_t *rsdt = NULL;
389385
xsdt_t *xsdt = NULL;
@@ -437,7 +433,7 @@ int init_acpi(unsigned bsp_cpu_id) {
437433
if (rc < 0)
438434
return rc;
439435

440-
return process_madt_entries(bsp_cpu_id);
436+
return process_madt_entries();
441437
}
442438
#else /* KTF_ACPICA */
443439
#include "acpi.h"
@@ -486,24 +482,22 @@ static void madt_parser(ACPI_SUBTABLE_HEADER *entry, void *arg) {
486482
switch (entry->Type) {
487483
case ACPI_MADT_TYPE_LOCAL_APIC: {
488484
ACPI_MADT_LOCAL_APIC *lapic = (ACPI_MADT_LOCAL_APIC *) entry;
489-
uint32_t bsp_cpu_id = (uint32_t) _ul(arg);
490-
percpu_t *percpu;
491485
bool enabled;
492486

493487
/* Some systems report all CPUs, marked as disabled */
494488
enabled = !!(lapic->LapicFlags & 0x1);
495489
if (!enabled)
496490
break;
497491

498-
percpu = get_percpu_page(lapic->ProcessorId);
499-
percpu->cpu_id = lapic->ProcessorId;
492+
cpu_t *cpu =
493+
get_cpu(lapic->ProcessorId) ?: add_cpu(lapic->ProcessorId, false, enabled);
494+
cpu->enabled = enabled;
495+
496+
percpu_t *percpu = cpu->percpu;
500497
percpu->apic_id = lapic->Id;
501-
percpu->bsp = !!(lapic->ProcessorId == bsp_cpu_id);
502-
percpu->enabled = enabled;
503498

504-
nr_cpus++;
505-
printk("ACPI: [MADT] APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n",
506-
percpu->cpu_id, percpu->apic_id, lapic->LapicFlags);
499+
printk("ACPI: [MADT] APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n", cpu->id,
500+
percpu->apic_id, lapic->LapicFlags);
507501
break;
508502
}
509503
case ACPI_MADT_TYPE_IO_APIC: {
@@ -597,25 +591,23 @@ static void madt_parser(ACPI_SUBTABLE_HEADER *entry, void *arg) {
597591
}
598592
case ACPI_MADT_TYPE_LOCAL_SAPIC: {
599593
ACPI_MADT_LOCAL_SAPIC *slapic = (ACPI_MADT_LOCAL_SAPIC *) entry;
600-
percpu_t *percpu = get_percpu_page(slapic->ProcessorId);
601-
uint32_t bsp_cpu_id = (uint32_t) _ul(arg);
594+
bool enabled = !!(slapic->LapicFlags & 0x1);
595+
cpu_t *cpu =
596+
get_cpu(slapic->ProcessorId) ?: add_cpu(slapic->ProcessorId, false, enabled);
602597

603-
percpu->cpu_id = slapic->ProcessorId;
598+
cpu->enabled = enabled;
599+
600+
percpu_t *percpu = cpu->percpu;
604601
percpu->sapic_id = slapic->Id;
605602
percpu->sapic_eid = slapic->Eid;
606-
607603
percpu->sapic_uid = slapic->Uid;
608604
percpu->sapic_uid_str[0] = slapic->UidString[0];
609605

610-
percpu->bsp = !!(slapic->ProcessorId == bsp_cpu_id);
611-
percpu->enabled = !!(slapic->LapicFlags & 0x1);
612-
613-
if (percpu->enabled) {
614-
nr_cpus++;
606+
if (cpu->enabled) {
615607
printk("ACPI: [MADT] SAPIC Processor ID: %u, SAPIC ID: %u, SAPIC EID: %u, "
616608
"SAPIC UID: %u, SAPIC UID Str: %c Flags: %08x\n",
617-
percpu->cpu_id, slapic->Id, slapic->Eid, slapic->Uid,
618-
slapic->UidString[0], slapic->LapicFlags);
609+
cpu->id, slapic->Id, slapic->Eid, slapic->Uid, slapic->UidString[0],
610+
slapic->LapicFlags);
619611
}
620612
break;
621613
}
@@ -625,18 +617,17 @@ static void madt_parser(ACPI_SUBTABLE_HEADER *entry, void *arg) {
625617
}
626618
case ACPI_MADT_TYPE_LOCAL_X2APIC: {
627619
ACPI_MADT_LOCAL_X2APIC *x2lapic = (ACPI_MADT_LOCAL_X2APIC *) entry;
628-
percpu_t *percpu = get_percpu_page(x2lapic->Uid);
629-
uint32_t bsp_cpu_id = (uint32_t) _ul(arg);
620+
bool enabled = !!(x2lapic->LapicFlags & 0x1);
621+
cpu_t *cpu = get_cpu(x2lapic->Uid) ?: add_cpu(x2lapic->Uid, false, enabled);
622+
623+
cpu->enabled = enabled;
630624

631-
percpu->cpu_id = x2lapic->Uid;
625+
percpu_t *percpu = cpu->percpu;
632626
percpu->apic_id = x2lapic->LocalApicId;
633-
percpu->bsp = !!(x2lapic->Uid == bsp_cpu_id);
634-
percpu->enabled = !!(x2lapic->LapicFlags & 0x1);
635627

636-
if (percpu->enabled) {
637-
nr_cpus++;
628+
if (cpu->enabled) {
638629
printk("ACPI: [MADT] X2APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n",
639-
percpu->cpu_id, percpu->apic_id, x2lapic->LapicFlags);
630+
cpu->id, percpu->apic_id, x2lapic->LapicFlags);
640631
}
641632
break;
642633
}
@@ -703,7 +694,7 @@ static ACPI_STATUS init_fadt(void) {
703694
return AE_OK;
704695
}
705696

706-
static ACPI_STATUS init_madt(unsigned bsp_cpu_id) {
697+
static ACPI_STATUS init_madt(void) {
707698
ACPI_TABLE_MADT *madt = acpi_find_table(ACPI_SIG_MADT);
708699
ACPI_SUBTABLE_HEADER *subtbl = (void *) madt + sizeof(*madt);
709700

@@ -712,7 +703,7 @@ static ACPI_STATUS init_madt(unsigned bsp_cpu_id) {
712703

713704
uint32_t length = madt->Header.Length - sizeof(*madt);
714705

715-
acpi_walk_subtables(subtbl, length, madt_parser, (void *) _ul(bsp_cpu_id));
706+
acpi_walk_subtables(subtbl, length, madt_parser, NULL);
716707
return AE_OK;
717708
}
718709

@@ -733,7 +724,7 @@ void acpi_walk_subtables(ACPI_SUBTABLE_HEADER *entry, uint32_t length,
733724
}
734725
}
735726

736-
ACPI_STATUS init_acpi(unsigned bsp_cpu_id) {
727+
ACPI_STATUS init_acpi(void) {
737728
ACPI_STATUS status;
738729

739730
printk("Initializing ACPI support\n");
@@ -746,7 +737,7 @@ ACPI_STATUS init_acpi(unsigned bsp_cpu_id) {
746737
if (status != AE_OK)
747738
return status;
748739

749-
status = init_madt(bsp_cpu_id);
740+
status = init_madt();
750741
return status;
751742
}
752743

common/setup.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <apic.h>
2727
#include <cmdline.h>
2828
#include <console.h>
29+
#include <cpu.h>
2930
#include <cpuid.h>
3031
#include <drivers/keyboard.h>
3132
#include <ioapic.h>
@@ -63,11 +64,6 @@
6364

6465
boot_flags_t boot_flags;
6566

66-
static unsigned bsp_cpu_id = 0;
67-
68-
unsigned get_bsp_cpu_id(void) { return bsp_cpu_id; }
69-
void set_bsp_cpu_id(unsigned cpu_id) { bsp_cpu_id = cpu_id; }
70-
7167
#define QEMU_CONSOLE_PORT 0x0e9
7268

7369
static void __text_init init_console(void) {
@@ -204,24 +200,26 @@ void __noreturn __text_init kernel_start(uint32_t multiboot_magic,
204200

205201
init_percpu();
206202

207-
init_traps(get_bsp_cpu_id());
203+
cpu_t *bsp = init_cpus();
204+
205+
init_traps(bsp);
208206

209207
init_extables();
210208

211209
init_slab();
212210

213211
/* Try to initialize ACPI (and MADT) */
214212
#ifndef KTF_ACPICA
215-
if (init_acpi(get_bsp_cpu_id()) < 0) {
213+
if (init_acpi() < 0) {
216214
#else
217-
if (ACPI_FAILURE(init_acpi(get_bsp_cpu_id()))) {
215+
if (ACPI_FAILURE(init_acpi())) {
218216
#endif
219217
/* Fallback to MP tables when no ACPI */
220218
if (init_mptables() < 0)
221219
BUG();
222220
}
223221

224-
init_apic(get_bsp_cpu_id(), APIC_MODE_XAPIC);
222+
init_apic(bsp->id, APIC_MODE_XAPIC);
225223

226224
init_tasks();
227225

@@ -232,20 +230,20 @@ void __noreturn __text_init kernel_start(uint32_t multiboot_magic,
232230
init_pci();
233231

234232
/* Initialize console input */
235-
init_uart_input(get_bsp_cpu_id());
233+
init_uart_input(bsp);
236234

237235
/* Initialize timers */
238236
bool hpet_initialized = false;
239237
if (opt_hpet)
240-
hpet_initialized = init_hpet(get_bsp_cpu_id());
238+
hpet_initialized = init_hpet(bsp);
241239
if (!hpet_initialized && opt_pit)
242-
init_pit(get_bsp_cpu_id());
240+
init_pit(bsp);
243241
if (opt_apic_timer)
244242
init_apic_timer();
245243

246244
/* Initialize keyboard */
247245
if (opt_keyboard)
248-
init_keyboard(get_bsp_cpu_id());
246+
init_keyboard(bsp);
249247

250248
if (opt_fpu) {
251249
printk("Enabling FPU instructions support\n");

0 commit comments

Comments
 (0)