I'm trying to define the cpu_number() in multiprocessor. To do this, I tried to use CPUID assembly x86 instruction, to get the CPU SMP number. The function, in C, is this:
static inline char smp_processor_id(void) { char apic_id = 0; asm("mov $1, %%eax\n\t" "cpuid\n\t" "mov %%bh, %0\n\t" : "=g" (apic_id)); return apic_id; } In Linux, after executing this in a test source, It returns '8' But, when I try to execute It in Hurd, It shows a segmentation fault. I attach the test source file Can you help me? 2018-06-15 1:52 GMT+02:00 Almudena Garcia <liberamenso10...@gmail.com>: > Ok. I understand you. But then... how can I to define cpu_number() > function in multiprocessor? It isn't clear > > 2018-06-15 1:30 GMT+02:00 Amos Jeffries <squ...@treenet.co.nz>: > >> On 15/06/18 10:31, Almudena Garcia wrote: >> > Yes, I concluded the same a few hours ago. I tried to edit >> > kern/cpu_number.h, to add a new definition with many cores, at this form >> > >> > int master_cpu; /* 'master' processor - keeps time */ >> > >> > #if (NCPUS == 1) >> > /* cpu number is always 0 on a single processor system */ >> > #define cpu_number() (0) >> > >> > #define CPU_L1_SIZE (1 << CPU_L1_SHIFT) >> > >> > #else >> > #define cpu_number() (NCPUS) >> > >> >> I may be wrong, but that does not seem correct. >> >> The man page for cpu_number() state it to be "an unique CPU >> identification number for the CPU that this thread is running on". So it >> clearly can change at runtime if there are 2+ CPUs on the machine. >> >> Whereas NCPUS is being used by the precompiler as an integer with fixed >> value that can be known at pre-compile time. Implied by the "#if NCPUS > >> 1" statement which this version of the code omits. >> >> >> AYJ >> >> >
#include <stdio.h> static inline char smp_processor_id(void) { char apic_id = 0; asm("mov $1, %%eax\n\t" "cpuid\n\t" "mov %%bh, %0\n\t" : "=g" (apic_id)); return apic_id; } int main (void) { printf("%d\n", smp_processor_id()); return 0; }