]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
plat/common/x86: Add API for x86_64 MMIO operations
authorMichalis Pappas <michalis@unikraft.io>
Wed, 20 Sep 2023 15:31:20 +0000 (17:31 +0200)
committerRazvan Deaconescu <razvand@unikraft.io>
Fri, 20 Oct 2023 16:35:55 +0000 (19:35 +0300)
Until now the x86_64 API has only been providing port-based
access to the device's config space. Add implementation for
MMIO access.

Signed-off-by: Andrei Tudor Topală <topala.andrei@gmail.com>
Signed-off-by: Michalis Pappas <michalis@unikraft.io>
Reviewed-by: Marco Schlumpp <marco@unikraft.io>
Approved-by: Razvan Deaconescu <razvand@unikraft.io>
GitHub-Closes: #1115

plat/common/include/x86/cpu.h

index 535c9043cd628bcc05df161305bc3897a47a7e0b..437292bdde8504e5a0731eb79067e38faabafdfa 100644 (file)
@@ -97,6 +97,58 @@ static inline __u64 rdtsc(void)
        return (h << 32) | l;
 }
 
+/* accessing devices via memory */
+static inline __u8 readb(__u8 *addr)
+{
+       __u8 v;
+
+       __asm__ __volatile__("movb %1, %0" : "=q"(v) : "m"(*addr));
+       return v;
+}
+
+static inline __u16 readw(__u16 *addr)
+{
+       __u16 v;
+
+       __asm__ __volatile__("movw %1, %0" : "=r"(v) : "m"(*addr));
+       return v;
+}
+
+static inline __u32 readl(__u32 *addr)
+{
+       __u32 v;
+
+       __asm__ __volatile__("movl %1, %0" : "=r"(v) : "m"(*addr));
+       return v;
+}
+
+static inline __u64 readq(__u64 *addr)
+{
+       __u64 v;
+
+       __asm__ __volatile__("movq %1, %0" : "=r"(v) : "m"(*addr));
+       return v;
+}
+
+static inline void writeb(__u8 *addr, __u8 v)
+{
+       __asm__ __volatile__("movb %0, %1" : : "q"(v), "m"(*addr));
+}
+
+static inline void writew(__u16 *addr, __u16 v)
+{
+       __asm__ __volatile__("movw %0, %1" : : "r"(v), "m"(*addr));
+}
+
+static inline void writel(__u32 *addr, __u32 v)
+{
+       __asm__ __volatile__("movl %0, %1" : : "r"(v), "m"(*addr));
+}
+
+static inline void writeq(__u64 *addr, __u64 v)
+{
+       __asm__ __volatile__("movq %0, %1" : : "r"(v), "m"(*addr));
+}
 
 /* accessing devices via port space */
 static inline __u8 inb(__u16 port)