From 7d57ddef634caaf2fa0225ede98468144a45e4b9 Mon Sep 17 00:00:00 2001 From: Pawel Wieczorkiewicz Date: Tue, 9 Feb 2021 10:30:27 +0100 Subject: [PATCH] rmode: add spin lock protecting long_to_real CS Signed-off-by: Pawel Wieczorkiewicz --- arch/x86/boot/head.S | 2 ++ arch/x86/real_mode_func.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/arch/x86/boot/head.S b/arch/x86/boot/head.S index d4b42d83..0e3813a7 100644 --- a/arch/x86/boot/head.S +++ b/arch/x86/boot/head.S @@ -85,6 +85,8 @@ GLOBAL(_start) ljmp $__KERN_CS64, $.Llong_mode ENTRY(prot_to_real) + /* FIXME: Add spinlock */ + lea (boot_gdt_ptr), %eax push %eax lea (boot_idt_ptr), %eax diff --git a/arch/x86/real_mode_func.c b/arch/x86/real_mode_func.c index 985c0767..8a787f6a 100644 --- a/arch/x86/real_mode_func.c +++ b/arch/x86/real_mode_func.c @@ -27,17 +27,22 @@ #include #include #include +#include #include extern void _long_to_real(const void *gdt_ptr, const void *idt_ptr); +static spinlock_t lock = SPINLOCK_INIT; + /* FIXME: add real mode calling functionality */ void long_to_real(void) { + spin_lock(&lock); percpu_t *percpu = get_percpu_page(smp_processor_id()); dprintk("%s: Before call\n", __func__); _long_to_real(&percpu->gdt_ptr, &percpu->idt_ptr); dprintk("%s: After call\n", __func__); + spin_unlock(&lock); } void init_real_mode(void) { init_rmode_traps(); }