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 <[email protected]>:
> 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 <[email protected]>:
>
>> 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;
}