Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vmm: don't vmap non-canonical addresses #327

Merged
merged 1 commit into from
Nov 13, 2023
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
Loading