diff --git a/arch/x86/entry.S b/arch/x86/entry.S index d2593d45..a5537721 100644 --- a/arch/x86/entry.S +++ b/arch/x86/entry.S @@ -78,10 +78,18 @@ ENTRY(entry_\sym) END_FUNC(entry_\sym) .endm +.macro MASK_USER_FLAGS + PUSHF + andl $~(USERMODE_FLAGS_MASK), (%_ASM_SP) + POPF +.endm + .macro interrupt_handler sym func ENTRY(asm_interrupt_handler_\sym) enter_from_usermode + MASK_USER_FLAGS + cld SAVE_ALL_REGS call \func diff --git a/arch/x86/segment.c b/arch/x86/segment.c index 565ca0da..d2b9de24 100644 --- a/arch/x86/segment.c +++ b/arch/x86/segment.c @@ -28,6 +28,7 @@ #include #include #include +#include extern uint8_t *_boot_stack_ist_top; extern uint8_t *_boot_stack_df_top; @@ -49,7 +50,7 @@ gdt_ptr_t __data_init boot_gdt_ptr = { .addr = _ul(&boot_gdt), }; -idt_entry_t __data_init boot_idt[256]; +idt_entry_t __data_init boot_idt[MAX_INT]; idt_ptr_t boot_idt_ptr __data_init = { .size = sizeof(boot_idt) - 1, @@ -78,7 +79,7 @@ gdt_ptr_t __data_rmode rmode_gdt_ptr = { .addr = _ul(&rmode_gdt), }; -idt_entry_t __data_rmode rmode_idt[256]; +idt_entry_t __data_rmode rmode_idt[MAX_INT]; idt_ptr_t rmode_idt_ptr __data_rmode = { .size = sizeof(rmode_idt) - 1, diff --git a/arch/x86/traps.c b/arch/x86/traps.c index 7f8bd970..b0561429 100644 --- a/arch/x86/traps.c +++ b/arch/x86/traps.c @@ -122,7 +122,7 @@ void init_traps(const cpu_t *cpu) { percpu->idt = get_free_page(GFP_KERNEL | GFP_USER); BUG_ON(!percpu->idt); - percpu->idt_ptr.size = (sizeof(percpu->idt) * MAX_INT) - 1; + percpu->idt_ptr.size = (sizeof(idt_entry_t) * MAX_INT) - 1; percpu->idt_ptr.addr = _ul(percpu->idt); /* clang-format off */ diff --git a/common/usermode.c b/common/usermode.c index 7c97937b..4e881e6f 100644 --- a/common/usermode.c +++ b/common/usermode.c @@ -83,11 +83,7 @@ static void init_syscall(void) { /* FIXME: Add compat support */ wrmsr(MSR_CSTAR, _ul(NULL)); - wrmsr(MSR_FMASK, X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | X86_EFLAGS_ZF | - X86_EFLAGS_SF | X86_EFLAGS_TF | X86_EFLAGS_IF | X86_EFLAGS_DF | - X86_EFLAGS_OF | X86_EFLAGS_ID | X86_EFLAGS_NT | X86_EFLAGS_RF | - X86_EFLAGS_AC | X86_EFLAGS_IOPL); - + wrmsr(MSR_FMASK, USERMODE_FLAGS_MASK); wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_SCE); } diff --git a/drivers/acpi/acpica/osl.c b/drivers/acpi/acpica/osl.c index 73dae607..77eb2369 100644 --- a/drivers/acpi/acpica/osl.c +++ b/drivers/acpi/acpica/osl.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "acpi.h" @@ -582,7 +583,7 @@ ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 InterruptLevel, ACPI_OSD_HANDLE if (acpi_irq_installed) return AE_ALREADY_EXISTS; - if (!Handler || InterruptLevel > ARRAY_SIZE(idt)) + if (!Handler || InterruptLevel > MAX_INT) return AE_BAD_PARAMETER; acpi_irq_num = InterruptLevel; @@ -605,7 +606,7 @@ ACPI_STATUS AcpiOsRemoveInterruptHandler(UINT32 InterruptLevel, if (!acpi_irq_installed) return AE_NOT_EXIST; - if (!Handler || InterruptLevel > ARRAY_SIZE(idt) || InterruptLevel != acpi_irq_num) + if (!Handler || InterruptLevel > MAX_INT || InterruptLevel != acpi_irq_num) return AE_BAD_PARAMETER; if (Handler != _ptr(get_intr_handler(&percpu->idt[acpi_irq_num]))) diff --git a/include/arch/x86/segment.h b/include/arch/x86/segment.h index 8ff3b4a8..056e7212 100644 --- a/include/arch/x86/segment.h +++ b/include/arch/x86/segment.h @@ -324,8 +324,6 @@ static inline uint64_t get_intr_handler(const struct x86_gate64 *gate) { } #endif -extern idt_entry_t idt[256]; -extern idt_ptr_t idt_ptr; #endif /* __ASSEMBLY__ */ #endif /* KTF_SEGMENT_H */ diff --git a/include/usermode.h b/include/usermode.h index cf0148c2..638ea170 100644 --- a/include/usermode.h +++ b/include/usermode.h @@ -30,6 +30,11 @@ #define SYSCALL_MMAP 2 #define SYSCALL_MUNMAP 3 +#define USERMODE_FLAGS_MASK \ + (X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | X86_EFLAGS_ZF | X86_EFLAGS_SF | \ + X86_EFLAGS_TF | X86_EFLAGS_IF | X86_EFLAGS_DF | X86_EFLAGS_OF | X86_EFLAGS_ID | \ + X86_EFLAGS_NT | X86_EFLAGS_RF | X86_EFLAGS_AC | X86_EFLAGS_IOPL) + #ifndef __ASSEMBLY__ #include #include