From f541851c79dc661beff358c02ad92f803571f7f2 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 14 Apr 2008 14:10:11 +0100 Subject: [PATCH] hvmloader: Small cleanups. Signed-off-by: Keir Fraser --- tools/firmware/hvmloader/hvmloader.c | 14 +--------- tools/firmware/hvmloader/util.c | 38 ++++++++++++++++++++-------- tools/firmware/hvmloader/util.h | 4 +++ 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c index f27191cf29..4410455134 100644 --- a/tools/firmware/hvmloader/hvmloader.c +++ b/tools/firmware/hvmloader/hvmloader.c @@ -108,14 +108,6 @@ cirrus_check(void) return inb(0x3C5) == 0x12; } -static void -wrmsr(uint32_t idx, uint64_t v) -{ - __asm__ __volatile__ ( - "wrmsr" - : : "c" (idx), "a" ((uint32_t)v), "d" ((uint32_t)(v>>32)) ); -} - static void init_hypercalls(void) { @@ -131,11 +123,7 @@ init_hypercalls(void) *(uint32_t *)(signature + 8) = edx; signature[12] = '\0'; - if ( strcmp("XenVMMXenVMM", signature) || (eax < 0x40000002) ) - { - printf("FATAL: Xen hypervisor not detected\n"); - __asm__ __volatile__( "ud2" ); - } + BUG_ON(strcmp("XenVMMXenVMM", signature) || (eax < 0x40000002)); /* Fill in hypercall transfer pages. */ cpuid(0x40000002, &eax, &ebx, &ecx, &edx); diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index b57575fe9a..37f40ef2fa 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -27,39 +27,57 @@ #include #include +void wrmsr(uint32_t idx, uint64_t v) +{ + asm volatile ( + "wrmsr" + : : "c" (idx), "a" ((uint32_t)v), "d" ((uint32_t)(v>>32)) ); +} + +uint64_t rdmsr(uint32_t idx) +{ + uint32_t lo, hi; + + asm volatile ( + "rdmsr" + : "=a" (lo), "=d" (hi) : "c" (idx) ); + + return (lo | ((uint64_t)hi << 32)); +} + void outb(uint16_t addr, uint8_t val) { - __asm__ __volatile__ ( "outb %%al, %%dx" : : "d" (addr), "a" (val) ); + asm volatile ( "outb %%al, %%dx" : : "d" (addr), "a" (val) ); } void outw(uint16_t addr, uint16_t val) { - __asm__ __volatile__ ( "outw %%ax, %%dx" : : "d" (addr), "a" (val) ); + asm volatile ( "outw %%ax, %%dx" : : "d" (addr), "a" (val) ); } void outl(uint16_t addr, uint32_t val) { - __asm__ __volatile__ ( "outl %%eax, %%dx" : : "d" (addr), "a" (val) ); + asm volatile ( "outl %%eax, %%dx" : : "d" (addr), "a" (val) ); } uint8_t inb(uint16_t addr) { uint8_t val; - __asm__ __volatile__ ( "inb %%dx,%%al" : "=a" (val) : "d" (addr) ); + asm volatile ( "inb %%dx,%%al" : "=a" (val) : "d" (addr) ); return val; } uint16_t inw(uint16_t addr) { uint16_t val; - __asm__ __volatile__ ( "inw %%dx,%%ax" : "=a" (val) : "d" (addr) ); + asm volatile ( "inw %%dx,%%ax" : "=a" (val) : "d" (addr) ); return val; } uint32_t inl(uint16_t addr) { uint32_t val; - __asm__ __volatile__ ( "inl %%dx,%%eax" : "=a" (val) : "d" (addr) ); + asm volatile ( "inl %%dx,%%eax" : "=a" (val) : "d" (addr) ); return val; } @@ -118,7 +136,7 @@ void *memcpy(void *dest, const void *src, unsigned n) { int t0, t1, t2; - __asm__ __volatile__ ( + asm volatile ( "cld\n" "rep; movsl\n" "testb $2,%b4\n" @@ -219,7 +237,7 @@ memcmp(const void *s1, const void *s2, unsigned n) void cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { - __asm__ __volatile__ ( + asm volatile ( "cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (idx) ); @@ -516,14 +534,14 @@ void __assert_failed(char *assertion, char *file, int line) printf("HVMLoader assertion '%s' failed at %s:%d\n", assertion, file, line); for ( ; ; ) - __asm__ __volatile__ ( "ud2" ); + asm volatile ( "ud2" ); } void __bug(char *file, int line) { printf("HVMLoader bug at %s:%d\n", file, line); for ( ; ; ) - __asm__ __volatile__ ( "ud2" ); + asm volatile ( "ud2" ); } static int validate_hvm_info(struct hvm_info_table *t) diff --git a/tools/firmware/hvmloader/util.h b/tools/firmware/hvmloader/util.h index ac06983d9b..846335208f 100644 --- a/tools/firmware/hvmloader/util.h +++ b/tools/firmware/hvmloader/util.h @@ -19,6 +19,10 @@ void __bug(char *file, int line) __attribute__((noreturn)); #define BUG_ON(p) do { if (p) BUG(); } while (0) #define BUILD_BUG_ON(p) ((void)sizeof(char[1 - 2 * !!(p)])) +/* MSR access */ +void wrmsr(uint32_t idx, uint64_t v); +uint64_t rdmsr(uint32_t idx); + /* I/O output */ void outb(uint16_t addr, uint8_t val); void outw(uint16_t addr, uint16_t val); -- 2.39.5