From ba6a17373e25962954ca318392193000dbe50089 Mon Sep 17 00:00:00 2001 From: uosfz Date: Mon, 17 Mar 2025 16:55:18 +0100 Subject: [PATCH] address _offset functions --- include/x86_64/address.h | 2 ++ src/x86_64/address.c | 8 ++++++++ src/x86_64/mem.c | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/x86_64/address.h b/include/x86_64/address.h index 09d6908..e5cc0b9 100644 --- a/include/x86_64/address.h +++ b/include/x86_64/address.h @@ -26,6 +26,7 @@ struct va va_from_vpn(struct vpn vpn); struct va va_from_vpn_with_offset(struct vpn vpn, uint64_t offset); uint64_t va_to_value(struct va va); uint64_t va_to_canonical(struct va va); +uint64_t va_offset(struct va va); struct vpn vpn_from_pagenum(uint64_t pagenum); struct vpn vpn_from_aligned_va(struct va va); @@ -37,6 +38,7 @@ struct pa pa_from_ppn(struct ppn ppn); struct pa pa_from_ppn_with_offset(struct ppn ppn, uint64_t offset); uint64_t pa_to_value(struct pa pa); void *pa_to_pointer(struct pa pa); +uint64_t pa_offset(struct pa pa); struct ppn ppn_from_pagenum(uint64_t pagenum); struct ppn ppn_from_aligned_pa(struct pa pa); diff --git a/src/x86_64/address.c b/src/x86_64/address.c index b64bb7f..d122371 100644 --- a/src/x86_64/address.c +++ b/src/x86_64/address.c @@ -41,6 +41,10 @@ uint64_t va_to_canonical(struct va va) { } } +uint64_t va_offset(struct va va) { + return va.value & 0xfff; +} + struct vpn vpn_from_pagenum(uint64_t pagenum) { ASSERT(pagenum < (1ull << 36)); return (struct vpn){ .pagenum = pagenum }; @@ -81,6 +85,10 @@ void *pa_to_pointer(struct pa pa) { return (void*)PHYS_TO_IDMAPPED(pa.value); } +uint64_t pa_offset(struct pa pa) { + return pa.value & 0xfff; +} + struct ppn ppn_from_pagenum(uint64_t pagenum) { ASSERT(pagenum < (1ull << 24)); return (struct ppn){ .pagenum = pagenum }; diff --git a/src/x86_64/mem.c b/src/x86_64/mem.c index 41c66ef..0e11b9f 100644 --- a/src/x86_64/mem.c +++ b/src/x86_64/mem.c @@ -192,7 +192,7 @@ bool pt_translate(struct va va, struct ppn cr3, struct pa *pa_out) { } struct pt_entry ent; pt_entry_unpack(*leaf_ptr, &ent); - *pa_out = pa_from_ppn_with_offset(ent.ppn, va_to_value(va) & 0xfff); // TODO offset func + *pa_out = pa_from_ppn_with_offset(ent.ppn, va_offset(va)); return true; }