diff --git a/arch/x86/asm-offsets.c b/arch/x86/asm-offsets.c index 2eca586e..735e8ea5 100644 --- a/arch/x86/asm-offsets.c +++ b/arch/x86/asm-offsets.c @@ -76,5 +76,7 @@ void __asm_offset_header(void) { EMIT_DEFINE(kb_port1_irq, KB_PORT1_IRQ); EMIT_DEFINE(kb_port2_irq, KB_PORT2_IRQ); EMIT_DEFINE(apic_timer_irq, APIC_TIMER_IRQ); +#ifdef KTF_ACPICA EMIT_DEFINE(acpi_sci_irq, ACPI_SCI_IRQ); +#endif } diff --git a/arch/x86/pagetables.c b/arch/x86/pagetables.c index d8a120a7..92485b7c 100644 --- a/arch/x86/pagetables.c +++ b/arch/x86/pagetables.c @@ -175,11 +175,12 @@ static mfn_t get_pgentry_mfn(mfn_t tab_mfn, pt_index_t index, unsigned long flag return mfn; } -void *_vmap(cr3_t *cr3_ptr, void *va, mfn_t mfn, unsigned int order, +static void *_vmap(cr3_t *cr3_ptr, void *va, mfn_t mfn, unsigned int order, #if defined(__x86_64__) - unsigned long l4_flags, + unsigned long l4_flags, #endif - unsigned long l3_flags, unsigned long l2_flags, unsigned long l1_flags) { + unsigned long l3_flags, unsigned long l2_flags, + unsigned long l1_flags) { static spinlock_t lock = SPINLOCK_INIT; mfn_t l1t_mfn, l2t_mfn, l3t_mfn; pgentry_t *tab, *entry; diff --git a/drivers/acpi/acpica/osl.c b/drivers/acpi/acpica/osl.c index 77eb2369..b80bbdd5 100644 --- a/drivers/acpi/acpica/osl.c +++ b/drivers/acpi/acpica/osl.c @@ -305,8 +305,7 @@ void *AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length) { void *_va; if (!frame) { - _va = vmap_kern(mfn_to_virt_map(mfn), mfn, PAGE_ORDER_4K, L4_PROT, L3_PROT, - L2_PROT, L1_PROT); + _va = vmap_4k(mfn_to_virt_map(mfn), mfn, L1_PROT); if (!_va) { spin_unlock(&map_lock); return NULL; diff --git a/include/arch/x86/page.h b/include/arch/x86/page.h index a8f3560c..0844baa2 100644 --- a/include/arch/x86/page.h +++ b/include/arch/x86/page.h @@ -261,11 +261,13 @@ static inline void *kmap(mfn_t mfn, unsigned int order, } static inline void *vmap_1g(void *va, mfn_t mfn, unsigned long l3_flags) { - return vmap_kern(va, mfn, PAGE_ORDER_1G, L4_PROT, l3_flags, PT_NO_FLAGS, PT_NO_FLAGS); + return vmap_kern(va, mfn, PAGE_ORDER_1G, L4_PROT, l3_flags | _PAGE_PSE, PT_NO_FLAGS, + PT_NO_FLAGS); } static inline void *vmap_2m(void *va, mfn_t mfn, unsigned long l2_flags) { - return vmap_kern(va, mfn, PAGE_ORDER_2M, L4_PROT, L3_PROT, l2_flags, PT_NO_FLAGS); + return vmap_kern(va, mfn, PAGE_ORDER_2M, L4_PROT, L3_PROT, l2_flags | _PAGE_PSE, + PT_NO_FLAGS); } static inline void *vmap_4k(void *va, mfn_t mfn, unsigned long l1_flags) { @@ -273,11 +275,12 @@ static inline void *vmap_4k(void *va, mfn_t mfn, unsigned long l1_flags) { } static inline void *kmap_1g(mfn_t mfn, unsigned long l3_flags) { - return kmap(mfn, PAGE_ORDER_1G, L4_PROT, l3_flags, PT_NO_FLAGS, PT_NO_FLAGS); + return kmap(mfn, PAGE_ORDER_1G, L4_PROT, l3_flags | _PAGE_PSE, PT_NO_FLAGS, + PT_NO_FLAGS); } static inline void *kmap_2m(mfn_t mfn, unsigned long l2_flags) { - return kmap(mfn, PAGE_ORDER_2M, L4_PROT, L3_PROT, l2_flags, PT_NO_FLAGS); + return kmap(mfn, PAGE_ORDER_2M, L4_PROT, L3_PROT, l2_flags | _PAGE_PSE, PT_NO_FLAGS); } static inline void *kmap_4k(mfn_t mfn, unsigned long l1_flags) { @@ -287,15 +290,15 @@ static inline void *kmap_4k(mfn_t mfn, unsigned long l1_flags) { static inline void *vmap_user_1g(void *va, mfn_t mfn, unsigned long l3_flags) { unsigned long user = l3_flags & _PAGE_USER; - return vmap_user(va, mfn, PAGE_ORDER_1G, L4_PROT | user, l3_flags | user, PT_NO_FLAGS, - PT_NO_FLAGS); + return vmap_user(va, mfn, PAGE_ORDER_1G, L4_PROT | user, + l3_flags | (user | _PAGE_PSE), PT_NO_FLAGS, PT_NO_FLAGS); } static inline void *vmap_user_2m(void *va, mfn_t mfn, unsigned long l2_flags) { unsigned long user = l2_flags & _PAGE_USER; return vmap_user(va, mfn, PAGE_ORDER_2M, L4_PROT | user, L3_PROT | user, - l2_flags | user, PT_NO_FLAGS); + l2_flags | (user | _PAGE_PSE), PT_NO_FLAGS); } static inline void *vmap_user_4k(void *va, mfn_t mfn, unsigned long l1_flags) { diff --git a/include/mm/vmm.h b/include/mm/vmm.h index fbdb927c..114d4117 100644 --- a/include/mm/vmm.h +++ b/include/mm/vmm.h @@ -33,23 +33,24 @@ enum gfp_flags { GFP_IDENT = 0x00000004, GFP_KERNEL_MAP = 0x00000008, }; +typedef enum gfp_flags gfp_flags_t; /* External definitions */ -extern void *get_free_pages(unsigned int order, uint32_t flags); +extern void *get_free_pages(unsigned int order, gfp_flags_t flags); extern void put_pages(void *page, unsigned int order); /* Static definitions */ -static inline void *get_free_page(uint32_t flags) { +static inline void *get_free_page(gfp_flags_t flags) { return get_free_pages(PAGE_ORDER_4K, flags); } -static inline void *get_free_pages_top(unsigned int order, uint32_t flags) { +static inline void *get_free_pages_top(unsigned int order, gfp_flags_t flags) { return get_free_pages(order, flags) + (PAGE_SIZE << order); } -static inline void *get_free_page_top(uint32_t flags) { +static inline void *get_free_page_top(gfp_flags_t flags) { return get_free_page(flags) + PAGE_SIZE; } diff --git a/mm/vmm.c b/mm/vmm.c index fad57929..fedcd89c 100644 --- a/mm/vmm.c +++ b/mm/vmm.c @@ -30,7 +30,7 @@ #include #include -void *get_free_pages(unsigned int order, uint32_t flags) { +void *get_free_pages(unsigned int order, gfp_flags_t flags) { frame_t *frame = get_free_frames(order); void *va = NULL; mfn_t mfn;