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
7 changes: 6 additions & 1 deletion arch/x86/pagetables.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ static inline void dump_pte(void *entry, mfn_t table, int level, int index) {
level, index, paddr, flags);
}

static inline bool is_canon_va(const void *va) {
const unsigned int sign_bits = BITS_PER_LONG - VA_BITS;
return _ptr(((long) va << sign_bits) >> sign_bits) == va;
}

static void dump_pagetable(mfn_t table, int level) {
pte_t *pt;

Expand Down Expand Up @@ -262,7 +267,7 @@ static void *_vmap(cr3_t *cr3_ptr, void *va, mfn_t mfn, unsigned int order,
mfn_t l1t_mfn, l2t_mfn, l3t_mfn;
pgentry_t *tab, *entry;

if (!va || (_ul(va) & ~PAGE_ORDER_TO_MASK(order)))
if (!va || (_ul(va) & ~PAGE_ORDER_TO_MASK(order)) || !is_canon_va(va))
return NULL;

dprintk("%s: va: 0x%p mfn: 0x%lx (order: %u)\n", __func__, va, mfn, order);
Expand Down
8 changes: 8 additions & 0 deletions include/arch/x86/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,14 @@ typedef enum pat_memory_type pat_memory_type_t;
typedef unsigned long paddr_t;
typedef unsigned long mfn_t;

#if defined(__x86_64__)
#define la57_enabled() 0 // TODO: 5 level paging unsupported for now
#define VA_BITS (la57_enabled() ? 57 : 48) /* Number of canonical address bits */
#else
#define la57_enabled() 0
#define VA_BITS 32
#endif

#define _paddr(addr) ((paddr_t) _ul(addr))

#define PADDR_INVALID (0UL)
Expand Down
2 changes: 1 addition & 1 deletion include/bitmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
#ifndef KTF_BITMAP_H
#define KTF_BITMAP_H

#include <compiler.h>
#include <lib.h>

#define BITS_PER_LONG (__SIZEOF_LONG__ * 8)
#define BITS_TO_LONGS(nbits) div_round_up(nbits, BITS_PER_LONG)

typedef struct {
Expand Down
1 change: 1 addition & 0 deletions include/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#define KTF_COMPILER_H

#define BITS_PER_BYTE 8
#define BITS_PER_LONG (__SIZEOF_LONG__ * 8)

#define _STR(x) #x
#define STR(x) _STR(x)
Expand Down