]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
arch/*: Introduce function for validating a single address
authorKha Dinh <khadinh@g.skku.edu>
Wed, 11 Oct 2023 17:12:18 +0000 (17:12 +0000)
committerRazvan Deaconescu <razvand@unikraft.io>
Fri, 20 Oct 2023 16:35:55 +0000 (19:35 +0300)
Introduced a common API for checking a single vaddr/paddr,
where each each architecture may implement differently.

Signed-off-by: Kha Dinh <khadinh@g.skku.edu>
Reviewed-by: Sergiu Moga <sergiu@unikraft.io>
Reviewed-by: Michalis Pappas <michalis@unikraft.io>
Reviewed-by: Razvan Virtan <virtanrazvan@gmail.com>
Approved-by: Razvan Deaconescu <razvand@unikraft.io>
GitHub-Closes: #1091

arch/arm/arm64/include/uk/asm/paging.h
arch/x86/x86_64/include/uk/asm/paging.h
include/uk/arch/paging.h
plat/common/include/x86/paging.h

index bdc9c5db3beb23a5afc8c0a2ad5e4404974257d9..19b58ddd508e42e046fa0b31292cadd141ce4402 100644 (file)
@@ -202,7 +202,11 @@ static inline __paddr_t PT_Lx_PTE_SET_PADDR(__pte_t pte, unsigned int lvl,
        return pte | paddr;
 }
 
+static inline int ukarch_paddr_isvalid(__paddr_t addr)
 {
+       return ARM64_PADDR_VALID(addr);
+}
+
 static inline int ukarch_paddr_range_isvalid(__paddr_t start, __sz len)
 {
        __paddr_t end = start + len - 1;
@@ -214,6 +218,11 @@ static inline int ukarch_paddr_range_isvalid(__paddr_t start, __sz len)
        return (ARM64_PADDR_VALID(end)) && (ARM64_PADDR_VALID(start));
 }
 
+static inline int ukarch_vaddr_isvalid(__vaddr_t addr)
+{
+       return ARM64_VADDR_VALID(addr);
+}
+
 static inline int ukarch_vaddr_range_isvalid(__vaddr_t start, __sz len)
 {
        __vaddr_t end = start + len - 1;
index e94f197587fc7d36998d43e0927ac52ea883f4a4..83141d1bebc4d00fa78eacdbef79eddeee5c3457 100644 (file)
@@ -128,7 +128,11 @@ struct ukarch_pagetable {
        ((__vaddr_t)(((__ssz)(vaddr) << (64 - X86_VADDR_BITS)) >>       \
                (64 - X86_VADDR_BITS)))
 
+static inline int ukarch_vaddr_isvalid(__vaddr_t addr)
 {
+       return X86_VADDR_CANONICALIZE(addr) == addr;
+}
+
 static inline int ukarch_vaddr_range_isvalid(__vaddr_t start, __sz len)
 {
        __vaddr_t end = start + len - 1;
index c7f7ae54394e192468d8214e921db539e03abd5a..49dab19ee61aacfb938b8eb6eab050420993a7dc 100644 (file)
@@ -375,8 +375,13 @@ int PAGE_Lx_IS(__pte_t pte, unsigned int lvl);
  */
 int ukarch_vaddr_range_isvalid(__vaddr_t start, __sz len);
 
-#define ukarch_vaddr_isvalid(vaddr)                            \
-       ukarch_vaddr_range_isvalid(vaddr, vaddr)
+/**
+ * Tests if a virtual address is valid on the current architecture.
+ *
+ * @param addr the virtual address to test
+ * @return a non-zero value if the address is supported
+ */
+int ukarch_vaddr_isvalid(__vaddr_t addr);
 
 /**
  * Tests if a certain range of physical addresses is valid on the current
@@ -390,8 +395,13 @@ int ukarch_vaddr_range_isvalid(__vaddr_t start, __sz len);
  */
 int ukarch_paddr_range_isvalid(__paddr_t start, __sz len);
 
-#define ukarch_paddr_isvalid(paddr)                            \
-       ukarch_paddr_range_isvalid(paddr, paddr)
+/**
+ * Tests if a physical address is valid on the current architecture.
+ *
+ * @param addr the physical address to test
+ * @return a non-zero value if the address is supported
+ */
+int ukarch_paddr_isvalid(__paddr_t addr);
 
 /**
  * Reads a page table entry from the given page table.
index 32884d413dbc1d37740389e6f7d256a3dc2da784..6a01494bdd477c053c00ed46bc8e5b68745b9054 100644 (file)
@@ -246,7 +246,11 @@ static __paddr_t x86_pg_maxphysaddr;
 
 #define X86_PG_VALID_PADDR(paddr)      ((paddr) <= x86_pg_maxphysaddr)
 
+int ukarch_paddr_isvalid(__paddr_t addr)
 {
+       return X86_PG_VALID_PADDR(addr);
+}
+
 int ukarch_paddr_range_isvalid(__paddr_t start, __sz len)
 {
        __paddr_t end = start + len - 1;