From 0ea8f34d6b2d37cb5027a9cd8d143b0d6b701613 Mon Sep 17 00:00:00 2001
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Sat, 28 Oct 2023 13:05:33 +0200
Subject: 64bit: Fix locore build

To allow references to int_stack_base to be quite unconstrained, we need
to use 64bit register indexing.

CPU_NUMBER_NO_GS was missing a 64bit variant.

CPU_NUMBER_NO_STACK assumes being passed a 32bit register.
---
 i386/i386/cpu_number.h | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

(limited to 'i386')

diff --git a/i386/i386/cpu_number.h b/i386/i386/cpu_number.h
index 7ec3da5f..67c19e9b 100644
--- a/i386/i386/cpu_number.h
+++ b/i386/i386/cpu_number.h
@@ -47,6 +47,7 @@
 	shrl	$24, reg		;\
 	movl	%cs:CX(cpu_id_lut, reg), reg	;\
 
+#ifdef __i386__
 /* Never call CPU_NUMBER_NO_GS(%esi) */
 #define CPU_NUMBER_NO_GS(reg)		\
 	pushl	%esi		;\
@@ -63,7 +64,27 @@
 	popl	%ebx		;\
 	popl	%eax		;\
 	movl	%esi, reg	;\
-	popl	%esi		;\
+	popl	%esi
+#endif
+#ifdef __x86_64__
+/* Never call CPU_NUMBER_NO_GS(%esi) */
+#define CPU_NUMBER_NO_GS(reg)		\
+	pushq	%rsi		;\
+	pushq	%rax		;\
+	pushq	%rbx		;\
+	pushq	%rcx		;\
+	pushq	%rdx		;\
+	movl	$1, %eax	;\
+	cpuid			;\
+	shrl	$24, %ebx	;\
+	movl	%cs:CX(cpu_id_lut, %ebx), %esi	;\
+	popq	%rdx		;\
+	popq	%rcx		;\
+	popq	%rbx		;\
+	popq	%rax		;\
+	movl	%esi, reg	;\
+	popq	%rsi
+#endif
 
 #define CPU_NUMBER(reg)	\
 	movl    MY(CPU_ID), reg;
-- 
cgit v1.2.3