summaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2023-09-27 23:59:42 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-09-27 23:59:42 +0200
commitd2c054bc665e85550b2b077b1dfbe25bfeda7b67 (patch)
treeab614e143ab7a4c83a15527988486b5871caf837 /i386
parent25ece371fb21dfd874187f623593064c476d9ca2 (diff)
percpu: simplify access in NCPUS==1 case
Diffstat (limited to 'i386')
-rw-r--r--i386/i386/cpu_number.h6
-rw-r--r--i386/i386/percpu.h15
2 files changed, 19 insertions, 2 deletions
diff --git a/i386/i386/cpu_number.h b/i386/i386/cpu_number.h
index 6ba46e4b..7ec3da5f 100644
--- a/i386/i386/cpu_number.h
+++ b/i386/i386/cpu_number.h
@@ -30,10 +30,10 @@
#ifndef _I386_CPU_NUMBER_H_
#define _I386_CPU_NUMBER_H_
-#define MY(stm) %gs:PERCPU_##stm
-
#if NCPUS > 1
+#define MY(stm) %gs:PERCPU_##stm
+
#ifdef __i386__
#define CX(addr, reg) addr(,reg,4)
#endif
@@ -86,6 +86,8 @@ static inline int cpu_number(void)
#else /* NCPUS == 1 */
+#define MY(stm) (percpu_array + PERCPU_##stm)
+
#define CPU_NUMBER_NO_STACK(reg)
#define CPU_NUMBER_NO_GS(reg)
#define CPU_NUMBER(reg)
diff --git a/i386/i386/percpu.h b/i386/i386/percpu.h
index d73cfc8d..86b0a315 100644
--- a/i386/i386/percpu.h
+++ b/i386/i386/percpu.h
@@ -20,6 +20,8 @@
struct percpu;
+#if NCPUS > 1
+
#define percpu_assign(stm, val) \
asm("mov %[src], %%gs:%c[offs]" \
: /* No outputs */ \
@@ -50,6 +52,19 @@ MACRO_BEGIN \
ptr_; \
MACRO_END
+#else
+
+#define percpu_assign(stm, val) \
+MACRO_BEGIN \
+ percpu_array[0].stm = val; \
+MACRO_END
+#define percpu_get(typ, stm) \
+ (percpu_array[0].stm)
+#define percpu_ptr(typ, stm) \
+ (&percpu_array[0].stm)
+
+#endif
+
#include <kern/processor.h>
#include <kern/thread.h>