Skip to content

Commit

Permalink
vmm: don't vmap non-canonical addresses
Browse files Browse the repository at this point in the history
Moving over the BITS_PER_LONG from bitmap.h to compiler.h.
Shifting the sign bit to the highest position turns the pointer
into a negative number that will remain sign extended when shifting
it back down.

Signed-off-by: Johannes Wikner <[email protected]>
  • Loading branch information
sktt authored and wipawel committed Nov 13, 2023
1 parent a31cc7e commit 71752e2
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 2 deletions.
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

0 comments on commit 71752e2

Please sign in to comment.