diff options
author | Damien Zammit <damien@zamaudio.com> | 2023-08-16 01:44:50 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-08-22 23:13:55 +0200 |
commit | 786b27ba49a28e6597f5859e46213328c271d047 (patch) | |
tree | bc69bde49b0265aee29b0fc5c88626cf9303d68f /i386 | |
parent | 8f6fb1be46ae4c56d85010f320372d61ceda034a (diff) | |
download | gnumach-786b27ba49a28e6597f5859e46213328c271d047.tar.gz gnumach-786b27ba49a28e6597f5859e46213328c271d047.tar.bz2 gnumach-786b27ba49a28e6597f5859e46213328c271d047.zip |
apic: Use cpuid to read the apic id for speed
Message-Id: <20230816014440.2322705-1-damien@zamaudio.com>
Diffstat (limited to 'i386')
-rw-r--r-- | i386/i386/apic.c | 11 | ||||
-rw-r--r-- | i386/i386/cpu_number.h | 20 | ||||
-rw-r--r-- | i386/i386/mp_desc.c | 3 |
3 files changed, 25 insertions, 9 deletions
diff --git a/i386/i386/apic.c b/i386/i386/apic.c index 2bb8e3f1..3a51f506 100644 --- a/i386/i386/apic.c +++ b/i386/i386/apic.c @@ -185,7 +185,11 @@ apic_get_num_ioapics(void) int apic_get_current_cpu(void) { - return (lapic->apic_id.r >> 24) & 0xff; + unsigned int eax, ebx, ecx, edx; + eax = 1; + ecx = 0; + cpuid(eax, ebx, ecx, edx); + return (ebx >> 24); } @@ -295,11 +299,6 @@ lapic_enable(void) cpu_intr_save(&flags); apic_id = apic_get_current_cpu(); - if (apic_id < 0) - { - printf("apic_get_current_cpu() failed, assuming BSP\n"); - apic_id = 0; - } dummy = lapic->dest_format.r; lapic->dest_format.r = 0xffffffff; /* flat model */ diff --git a/i386/i386/cpu_number.h b/i386/i386/cpu_number.h index c00896e8..df086370 100644 --- a/i386/i386/cpu_number.h +++ b/i386/i386/cpu_number.h @@ -39,12 +39,30 @@ #define CX(addr, reg) addr(,reg,8) #endif -#define CPU_NUMBER(reg) \ +#define CPU_NUMBER_NO_STACK(reg) \ movl %cs:lapic, reg ;\ movl %cs:APIC_ID(reg), reg ;\ shrl $24, reg ;\ movl %cs:CX(cpu_id_lut, reg), reg ;\ +/* Never call CPU_NUMBER(%esi) */ +#define CPU_NUMBER(reg) \ + pushl %esi ;\ + pushl %eax ;\ + pushl %ebx ;\ + pushl %ecx ;\ + pushl %edx ;\ + movl $1, %eax ;\ + cpuid ;\ + shrl $24, %ebx ;\ + movl %cs:CX(cpu_id_lut, %ebx), %esi ;\ + popl %edx ;\ + popl %ecx ;\ + popl %ebx ;\ + popl %eax ;\ + movl %esi, reg ;\ + popl %esi ;\ + #ifndef __ASSEMBLER__ #include "kern/cpu_number.h" int cpu_number(void); diff --git a/i386/i386/mp_desc.c b/i386/i386/mp_desc.c index 88fbb50a..f1a1f989 100644 --- a/i386/i386/mp_desc.c +++ b/i386/i386/mp_desc.c @@ -275,8 +275,7 @@ cpu_setup(int cpu) void cpu_ap_main() { - unsigned apic_id = (((ApicLocalUnit*)phystokv(lapic_addr))->apic_id.r >> 24) & 0xff; - int cpu = apic_get_cpu_kernel_id(apic_id); + int cpu = cpu_number(); do { cpu_pause(); |