mirror of
https://github.com/limine-bootloader/limine
synced 2024-12-24 14:56:49 +03:00
Change how smp works a little
This commit is contained in:
parent
6c0ba4104f
commit
f59a3d67d6
17
STIVALE2.md
17
STIVALE2.md
@ -378,10 +378,9 @@ This tag reports to the kernel info about the firmware.
|
||||
struct stivale2_struct_tag_smp {
|
||||
uint64_t identifier; // Identifier: 0x34d1d96339647025
|
||||
uint64_t next;
|
||||
uint64_t cpu_count; // Total number of logical CPUs (excluding BSP)
|
||||
uint64_t cpu_count; // Total number of logical CPUs (including BSP)
|
||||
struct stivale2_smp_info smp_info[]; // Array of smp_info structs, one per
|
||||
// additional logical processor, note
|
||||
// that the BSP does not have one.
|
||||
// logical processor, including BSP.
|
||||
} __attribute__((packed));
|
||||
```
|
||||
|
||||
@ -393,6 +392,8 @@ struct stivale2_smp_info {
|
||||
// once the goto_address field is loaded.
|
||||
// This MUST point to a valid stack of at least
|
||||
// 256 bytes in size, and 16-byte aligned.
|
||||
// target_stack is an unused field for the
|
||||
// struct describing the BSP (lapic_id == 0)
|
||||
uint64_t goto_address; // This address is polled by the started APs
|
||||
// until the kernel on another CPU performs an
|
||||
// atomic write to this field.
|
||||
@ -405,12 +406,18 @@ struct stivale2_smp_info {
|
||||
// then, goto_address is called (a bogus return
|
||||
// address is pushed onto the stack) and execution
|
||||
// is handed off.
|
||||
// All general purpose registers are cleared
|
||||
// except ESP/RSP, and RDI in 64-bit mode.
|
||||
// The CPU state will be the same as described
|
||||
// in kernel entry machine state, with the exception
|
||||
// of ESP/RSP and RDI/stack arg being set up as
|
||||
// above.
|
||||
// goto_address is an unused field for the
|
||||
// struct describing the BSP (lapic_id == 0)
|
||||
uint64_t extra_argument; // This field is here for the kernel to use
|
||||
// for whatever it wants. Writes here should
|
||||
// be performed before writing to goto_address
|
||||
// so that the receiving processor can safely
|
||||
// retrieve the data.
|
||||
// extra_argument is an unused field for the
|
||||
// struct describing the BSP (lapic_id == 0)
|
||||
} __attribute__((packed));
|
||||
```
|
||||
|
BIN
limine.bin
BIN
limine.bin
Binary file not shown.
@ -103,9 +103,17 @@ struct smp_information *init_smp(size_t *cpu_count,
|
||||
|
||||
struct madt_lapic *lapic = (void *)madt_ptr;
|
||||
|
||||
struct smp_information *info_struct =
|
||||
balloc_aligned(sizeof(struct smp_information), 1);
|
||||
|
||||
info_struct->acpi_processor_uid = lapic->acpi_processor_uid;
|
||||
info_struct->lapic_id = lapic->lapic_id;
|
||||
|
||||
// Do not try to restart the BSP
|
||||
if (lapic->lapic_id == 0)
|
||||
if (lapic->lapic_id == 0) {
|
||||
(*cpu_count)++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if we can actually try to start the AP
|
||||
if (!((lapic->flags & 1) ^ ((lapic->flags >> 1) & 1)))
|
||||
@ -113,12 +121,6 @@ struct smp_information *init_smp(size_t *cpu_count,
|
||||
|
||||
print("smp: Found candidate AP for bring-up. LAPIC ID: %u\n", lapic->lapic_id);
|
||||
|
||||
struct smp_information *info_struct =
|
||||
balloc_aligned(sizeof(struct smp_information), 1);
|
||||
|
||||
info_struct->acpi_processor_uid = lapic->acpi_processor_uid;
|
||||
info_struct->lapic_id = lapic->lapic_id;
|
||||
|
||||
// Try to start the AP
|
||||
if (!smp_start_ap(lapic->lapic_id, &gdtr, info_struct,
|
||||
longmode, lv5, (uint32_t)pagemap.top_level)) {
|
||||
@ -130,7 +132,7 @@ struct smp_information *init_smp(size_t *cpu_count,
|
||||
print("smp: Successfully brought up AP\n");
|
||||
|
||||
(*cpu_count)++;
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user