1.text
2/*
3 * Taken from Libc
4 */
5.globl _cpu_number
6_cpu_number:
7#if defined(__x86_64__)
8        push    %rbp
9        mov     %rsp,%rbp
10        sub     $16,%rsp                // space to read IDTR
11
12        sidt    (%rsp)                  // store limit:base on stack
13        movw    (%rsp), %ax             // get limit
14        and     $0xfff, %rax            // mask off lower 12 bits to return
15
16        mov     %rbp,%rsp
17        pop     %rbp
18        ret
19#elif defined(__i386__)
20        push    %ebp
21	mov     %esp,%ebp
22	sub     $8, %esp                // space to read IDTR
23
24	sidt    (%esp)                  // store limit:base on stack
25	movw    (%esp), %ax             // get limit
26	and     $0xfff, %eax            // mask off lower 12 bits to return
27
28	mov     %ebp,%esp
29	pop     %ebp
30	ret
31#else
32#error Unsupported architecture
33#endif
34