Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions arch/x86/asm-offsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
7 changes: 4 additions & 3 deletions arch/x86/pagetables.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 1 addition & 2 deletions drivers/acpi/acpica/osl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
17 changes: 10 additions & 7 deletions include/arch/x86/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,23 +261,26 @@ 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) {
return vmap_kern(va, mfn, PAGE_ORDER_4K, L4_PROT, L3_PROT, L2_PROT, 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) {
Expand All @@ -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) {
Expand Down
9 changes: 5 additions & 4 deletions include/mm/vmm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion mm/vmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include <mm/pmm.h>
#include <mm/vmm.h>

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;
Expand Down