From 6dda49f282f713c6504a2f79b94740de4caa89e0 Mon Sep 17 00:00:00 2001 From: Calascibetta Romain Date: Sun, 29 Mar 2026 17:28:02 +0200 Subject: [PATCH 1/4] Add .clang-format and a CI to lint our code --- .clang-format | 26 ++++++++++++++++++++++++++ .github/workflows/lint.yml | 21 +++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 .clang-format create mode 100644 .github/workflows/lint.yml diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..1f855b98c --- /dev/null +++ b/.clang-format @@ -0,0 +1,26 @@ +BasedOnStyle: LLVM +IndentWidth: 4 +ColumnLimit: 80 +UseTab: Never +BreakBeforeBraces: Linux + +AlignTrailingComments: false +AlignConsecutiveMacros: true +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false + +AllowAllArgumentsOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortFunctionsOnASingleLine: false +AllowShortIfStatementsOnASingleLine: false +AllowAllParametersOfDeclarationOnNextLine: false + +SortIncludes: false + +IndentCaseLabels: false +PointerAlignment: Right +ContinuationIndentWidth: 4 +MaxEmptyLinesToKeep: 2 +BraceWrapping: + AfterFunction: true +SpaceAfterCStyleCast: false diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..849bc25e1 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,21 @@ +name: clang-format Check +on: [push, pull_request] +jobs: + formatting-check: + name: Formatting Check + runs-on: ubuntu-latest + strategy: + matrix: + path: + - 'bindings' + - 'tests' + - 'include' + - 'tenders' + - 'elftool' + steps: + - uses: actions/checkout@v4 + - name: Run clang-format style check for Solo5. + uses: jidicula/clang-format-action@v4.16.0 + with: + clang-format-version: '22' + check-path: ${{ matrix.path }} From 38275a4a5ab7c71d8af294894374c34afe2b8746 Mon Sep 17 00:00:00 2001 From: Calascibetta Romain Date: Sun, 29 Mar 2026 17:28:26 +0200 Subject: [PATCH 2/4] Add .git-blame-ignore-revs --- .git-blame-ignore-revs | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..e69de29bb From 95165c5566cb37c7c3b9a9deb345ec2e8922c4fa Mon Sep 17 00:00:00 2001 From: Calascibetta Romain Date: Sun, 29 Mar 2026 17:30:26 +0200 Subject: [PATCH 3/4] Apply clang-format --- bindings/bindings.h | 32 +- bindings/cmdline.c | 26 +- bindings/cpu_aarch64.c | 33 +- bindings/cpu_aarch64.h | 38 +- bindings/cpu_ppc64.h | 23 +- bindings/cpu_x86_64.c | 56 +- bindings/cpu_x86_64.h | 197 ++- bindings/crt.c | 7 +- bindings/hvt/block.c | 6 +- bindings/hvt/net.c | 9 +- bindings/hvt/platform_lifecycle.c | 3 +- bindings/hvt/start.c | 16 +- bindings/hvt/tscclock.c | 3 +- bindings/lib.c | 82 +- bindings/mem.c | 12 +- bindings/muen/channel.c | 2 +- bindings/muen/channel.h | 6 +- bindings/muen/muen-block.c | 18 +- bindings/muen/muen-clock.c | 7 +- bindings/muen/muen-console.c | 19 +- bindings/muen/muen-net.c | 73 +- bindings/muen/muen-platform_lifecycle.c | 11 +- bindings/muen/muen-sinfo.c | 24 +- bindings/muen/mutimeinfo.h | 2 +- bindings/muen/reader.c | 43 +- bindings/muen/reader.h | 18 +- bindings/muen/sinfo.h | 10 +- bindings/muen/start.c | 16 +- bindings/muen/util.h | 2 +- bindings/muen/writer.c | 19 +- bindings/muen/writer.h | 10 +- bindings/printf.c | 1086 +++++++++-------- bindings/printf.h | 21 +- bindings/spt/bindings.h | 8 +- bindings/spt/block.c | 18 +- bindings/spt/net.c | 23 +- bindings/spt/start.c | 16 +- bindings/spt/sys_linux_aarch64.c | 101 +- bindings/spt/sys_linux_ppc64le.c | 113 +- bindings/spt/sys_linux_x86_64.c | 119 +- bindings/stub/stubs.c | 36 +- bindings/tls.c | 31 +- bindings/virtio/bindings.h | 2 +- bindings/virtio/clock_subr.c | 181 +-- bindings/virtio/clock_subr.h | 17 +- bindings/virtio/multiboot.h | 348 +++--- bindings/virtio/pci.c | 42 +- bindings/virtio/platform.c | 8 +- bindings/virtio/platform_intr.c | 14 +- bindings/virtio/pvclock.c | 63 +- bindings/virtio/serial.c | 12 +- bindings/virtio/start.c | 25 +- bindings/virtio/tscclock.c | 91 +- bindings/virtio/virtio_blk.c | 62 +- bindings/virtio/virtio_net.c | 100 +- bindings/virtio/virtio_pci.h | 32 +- bindings/virtio/virtio_ring.c | 14 +- bindings/virtio/virtio_ring.h | 138 +-- bindings/xen/bindings.h | 4 +- bindings/xen/console.c | 40 +- bindings/xen/evtchn.c | 24 +- bindings/xen/hypercall-x86_64.h | 106 +- bindings/xen/hypercall.h | 41 +- bindings/xen/platform.c | 39 +- bindings/xen/platform_intr.c | 27 +- bindings/xen/pvclock.c | 16 +- bindings/xen/start.c | 16 +- bindings/xen/stubs.c | 14 +- bindings/xen/time.c | 16 +- elftool/elftool.c | 137 +-- elftool/json.h | 739 ++++++----- include/elf_abi.h | 89 +- include/hvt_abi.h | 65 +- include/mft_abi.h | 62 +- include/solo5.h | 30 +- include/spt_abi.h | 12 +- include/xen/arch-arm.h | 232 ++-- include/xen/arch-arm/smccc.h | 10 +- include/xen/arch-x86/cpufeatureset.h | 420 ++++--- include/xen/arch-x86/cpuid.h | 15 +- include/xen/arch-x86/hvm/save.h | 176 +-- include/xen/arch-x86/hvm/start_info.h | 60 +- include/xen/arch-x86/pmu.h | 23 +- include/xen/arch-x86/xen-mca.h | 187 ++- include/xen/arch-x86/xen-x86_32.h | 115 +- include/xen/arch-x86/xen-x86_64.h | 99 +- include/xen/arch-x86/xen.h | 185 +-- include/xen/argo.h | 57 +- include/xen/callback.h | 22 +- include/xen/device_tree_defs.h | 21 +- include/xen/dom0_ops.h | 52 +- include/xen/domctl.h | 784 ++++++------ include/xen/elfnote.h | 36 +- include/xen/errno.h | 124 +- include/xen/event_channel.h | 50 +- include/xen/features.h | 26 +- include/xen/grant_table.h | 239 ++-- include/xen/hvm/dm_op.h | 78 +- include/xen/hvm/e820.h | 14 +- include/xen/hvm/hvm_info_table.h | 26 +- include/xen/hvm/hvm_op.h | 137 +-- include/xen/hvm/hvm_vcpu.h | 4 +- include/xen/hvm/hvm_xs_strings.h | 23 +- include/xen/hvm/ioreq.h | 70 +- include/xen/hvm/params.h | 94 +- include/xen/hvm/pvdrivers.h | 14 +- include/xen/hvm/save.h | 87 +- include/xen/io/blkif.h | 84 +- include/xen/io/cameraif.h | 144 +-- include/xen/io/console.h | 2 +- include/xen/io/displif.h | 63 +- include/xen/io/fbif.h | 68 +- include/xen/io/fsif.h | 108 +- include/xen/io/kbdif.h | 70 +- include/xen/io/libxenvchan.h | 77 +- include/xen/io/netif.h | 99 +- include/xen/io/pciif.h | 37 +- include/xen/io/protocols.h | 14 +- include/xen/io/pvcalls.h | 16 +- include/xen/io/ring.h | 470 +++---- include/xen/io/sndif.h | 178 +-- include/xen/io/tpmif.h | 24 +- include/xen/io/usbif.h | 186 +-- include/xen/io/vscsiif.h | 72 +- include/xen/io/xenbus.h | 16 +- include/xen/io/xs_wire.h | 55 +- include/xen/kexec.h | 51 +- include/xen/memory.h | 190 +-- include/xen/nmi.h | 22 +- include/xen/physdev.h | 112 +- include/xen/platform.h | 303 +++-- include/xen/pmu.h | 38 +- include/xen/sched.h | 32 +- include/xen/sysctl.h | 614 +++++----- include/xen/tmem.h | 48 +- include/xen/trace.h | 278 ++--- include/xen/vcpu.h | 45 +- include/xen/version.h | 12 +- include/xen/vm_event.h | 130 +- include/xen/xen.h | 364 +++--- include/xen/xencomm.h | 2 +- include/xen/xenoprof.h | 46 +- include/xen/xsm/flask_op.h | 50 +- tenders/common/cc.h | 28 +- tenders/common/elf.c | 166 +-- tenders/common/elf.h | 10 +- tenders/common/mft.c | 42 +- tenders/common/mft.h | 20 +- tenders/common/tap_attach.c | 5 +- tenders/hvt/hvt.h | 32 +- tenders/hvt/hvt_boot_info.c | 11 +- tenders/hvt/hvt_core.c | 37 +- tenders/hvt/hvt_cpu_aarch64.c | 14 +- tenders/hvt/hvt_cpu_aarch64.h | 109 +- tenders/hvt/hvt_cpu_x86_64.c | 45 +- tenders/hvt/hvt_cpu_x86_64.h | 199 ++- tenders/hvt/hvt_dumpcore_freebsd_x86_64.c | 15 +- tenders/hvt/hvt_dumpcore_kvm_x86_64.c | 5 +- tenders/hvt/hvt_freebsd.c | 59 +- tenders/hvt/hvt_freebsd.h | 4 +- tenders/hvt/hvt_freebsd_x86_64.c | 56 +- tenders/hvt/hvt_gdb.h | 16 +- tenders/hvt/hvt_gdb_freebsd_x86_64.c | 16 +- tenders/hvt/hvt_gdb_kvm_aarch64.c | 12 +- tenders/hvt/hvt_gdb_kvm_x86_64.c | 172 ++- tenders/hvt/hvt_gdb_openbsd_x86_64.c | 16 +- tenders/hvt/hvt_gdb_x86_64.h | 4 +- tenders/hvt/hvt_kvm.c | 17 +- tenders/hvt/hvt_kvm_aarch64.c | 183 ++- tenders/hvt/hvt_kvm_x86_64.c | 45 +- tenders/hvt/hvt_main.c | 29 +- tenders/hvt/hvt_module_blk.c | 97 +- tenders/hvt/hvt_module_dumpcore.c | 72 +- tenders/hvt/hvt_module_gdb.c | 71 +- tenders/hvt/hvt_module_net.c | 75 +- tenders/hvt/hvt_openbsd.c | 25 +- tenders/hvt/hvt_openbsd.h | 10 +- tenders/hvt/hvt_openbsd_x86_64.c | 107 +- tenders/hvt/queue.h | 972 +++++++-------- tenders/spt/spt.h | 15 +- tenders/spt/spt_core.c | 57 +- tenders/spt/spt_main.c | 25 +- tenders/spt/spt_module_block.c | 82 +- tenders/spt/spt_module_net.c | 56 +- tests/test_blk/test_blk.c | 15 +- tests/test_fpu/test_fpu.c | 62 +- .../test_mft_maxdevices/test_mft_maxdevices.c | 2 +- tests/test_net/test_net.c | 68 +- tests/test_net_mtu/test_net_mtu.c | 11 +- tests/test_notls/test_notls.c | 4 +- tests/test_output/test_output.c | 147 ++- tests/test_rnow/test_rnow.c | 2 +- tests/test_rnox/test_rnox.c | 2 +- tests/test_seccomp/test_seccomp.c | 23 +- tests/test_ssp/test_ssp.c | 2 +- tests/test_time/test_time.c | 14 +- tests/test_tls/test_tls.c | 17 +- tests/test_wnox/test_wnox.c | 2 +- tests/test_xnor/test_xnor.c | 2 +- tests/test_zeropage/test_zeropage.c | 2 +- 200 files changed, 8021 insertions(+), 8006 deletions(-) diff --git a/bindings/bindings.h b/bindings/bindings.h index 329c91377..3ccbf916a 100644 --- a/bindings/bindings.h +++ b/bindings/bindings.h @@ -24,7 +24,7 @@ * This header file is included by all bindings, and apart from the common * internal interfaces includes and defines all necessary C99 runtime * interfaces used by bindings. -*/ + */ #ifndef __BINDINGS_H__ #define __BINDINGS_H__ @@ -48,12 +48,12 @@ #endif /* alignment macros */ -#define ALIGN_4K __attribute__((aligned(0x1000))) +#define ALIGN_4K __attribute__((aligned(0x1000))) #define ALIGN_64_BIT __attribute__((aligned(0x8))) /* convenient macro stringification */ #define STR_EXPAND(y) #y -#define STR(x) STR_EXPAND(x) +#define STR(x) STR_EXPAND(x) /* abort.c */ void _assert_fail(const char *, const char *, const char *) @@ -61,15 +61,15 @@ void _assert_fail(const char *, const char *, const char *) void _abort(const char *, const char *, const char *, void *) __attribute__((noreturn)); -#define PANIC(s, r) \ - do { \ - _abort(__FILE__, STR(__LINE__), s, r); \ +#define PANIC(s, r) \ + do { \ + _abort(__FILE__, STR(__LINE__), s, r); \ } while (0) -#define assert(e) \ - do { \ - if (!(e)) \ - _assert_fail(__FILE__, STR(__LINE__), #e); \ +#define assert(e) \ + do { \ + if (!(e)) \ + _assert_fail(__FILE__, STR(__LINE__), #e); \ } while (0) /* cpu_.c: low-level CPU functions */ @@ -123,19 +123,19 @@ const char *cmdline_parse(const char *cmdline); /* log.c: */ typedef enum { - ERROR=0, - WARN, - INFO, + ERROR = 0, + WARN, + INFO, DEBUG, } log_level_t; int log(log_level_t level, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3))); + __attribute__((format(printf, 2, 3))); void log_set_level(log_level_t level); /* compiler-only memory "barrier" */ #define cc_barrier() __asm__ __volatile__("" : : : "memory") -#define NSEC_PER_SEC 1000000000ULL +#define NSEC_PER_SEC 1000000000ULL /* * Atomically test-and-set bit (nr) in (*bits). Fully synchronous. @@ -182,7 +182,7 @@ static inline bool sync_bt(int nr, const volatile void *bits) * Fully synchronous. */ static inline void atomic_sync_xchg(volatile unsigned long *ptr, - unsigned long val, unsigned long *result) + unsigned long val, unsigned long *result) { __atomic_exchange(ptr, &val, result, __ATOMIC_SEQ_CST); } diff --git a/bindings/cmdline.c b/bindings/cmdline.c index 6a62a8b95..424912569 100644 --- a/bindings/cmdline.c +++ b/bindings/cmdline.c @@ -38,34 +38,31 @@ const char *cmdline_parse(const char *cmdline) matched = false; /* --solo5:quiet is slightly misleading as errors are still logged. */ if (strncmp(p, opt_quiet, (sizeof(opt_quiet) - 1)) == 0 || - strncmp(p, opt_error, (sizeof(opt_error) - 1)) == 0) { + strncmp(p, opt_error, (sizeof(opt_error) - 1)) == 0) { _Static_assert(sizeof(opt_quiet) == sizeof(opt_error), - "sizeof(--solo5:quiet) != sizeof(--solo5:error"); - after = (const char *) (p + (sizeof(opt_quiet) - 1)); + "sizeof(--solo5:quiet) != sizeof(--solo5:error"); + after = (const char *)(p + (sizeof(opt_quiet) - 1)); if (isspace(*after) || *after == '\0') { log_set_level(ERROR); p += (sizeof(opt_quiet) - 1); matched = true; } - } - else if (strncmp(p, opt_warn, (sizeof(opt_warn) - 1)) == 0) { - after = (const char *) (p + (sizeof(opt_warn) - 1)); + } else if (strncmp(p, opt_warn, (sizeof(opt_warn) - 1)) == 0) { + after = (const char *)(p + (sizeof(opt_warn) - 1)); if (isspace(*after) || *after == '\0') { log_set_level(WARN); p += (sizeof(opt_warn) - 1); matched = true; } - } - else if (strncmp(p, opt_info, (sizeof(opt_info) - 1)) == 0) { - after = (const char *) (p + (sizeof(opt_info) - 1)); + } else if (strncmp(p, opt_info, (sizeof(opt_info) - 1)) == 0) { + after = (const char *)(p + (sizeof(opt_info) - 1)); if (isspace(*after) || *after == '\0') { log_set_level(INFO); p += (sizeof(opt_info) - 1); matched = true; } - } - else if (strncmp(p, opt_debug, (sizeof(opt_debug) - 1)) == 0) { - after = (const char *) (p + (sizeof(opt_debug) - 1)); + } else if (strncmp(p, opt_debug, (sizeof(opt_debug) - 1)) == 0) { + after = (const char *)(p + (sizeof(opt_debug) - 1)); if (isspace(*after) || *after == '\0') { log_set_level(DEBUG); p += (sizeof(opt_debug) - 1); @@ -75,11 +72,10 @@ const char *cmdline_parse(const char *cmdline) if (matched) { while (*p && isspace(*p)) p++; - } - else { + } else { break; } } - return (const char *) p; + return (const char *)p; } diff --git a/bindings/cpu_aarch64.c b/bindings/cpu_aarch64.c index f4125cb13..8abbeb8c7 100644 --- a/bindings/cpu_aarch64.c +++ b/bindings/cpu_aarch64.c @@ -31,19 +31,15 @@ struct regs { uint64_t esr_el1; }; -static const char *exception_modes[]= { - "Synchronous Abort", - "IRQ", - "FIQ", - "Error" -}; +static const char *exception_modes[] = {"Synchronous Abort", "IRQ", "FIQ", + "Error"}; void cpu_init(void) { __asm__ __volatile__("msr VBAR_EL1, %0" - : - : "r" ((uint64_t)&cpu_exception_vectors) - : "memory"); + : + : "r"((uint64_t)&cpu_exception_vectors) + : "memory"); } static void dump_registers(struct regs *regs) @@ -56,27 +52,26 @@ static void dump_registers(struct regs *regs) log(INFO, "\t LR : 0x%016lx\n", regs->lr); log(INFO, "\t PSTATE : 0x%016lx\n", regs->spsr_el1); - for (idx = 0; idx < 28; idx+=4) + for (idx = 0; idx < 28; idx += 4) log(INFO, "\t x%02d ~ x%02d: 0x%016lx 0x%016lx 0x%016lx 0x%016lx\n", idx, idx + 3, regs->xreg[idx], regs->xreg[idx + 1], regs->xreg[idx + 2], regs->xreg[idx + 3]); - log(INFO, "\t x28 ~ x29: 0x%016lx 0x%016lx\n", regs->xreg[28], regs->xreg[29]); + log(INFO, "\t x28 ~ x29: 0x%016lx 0x%016lx\n", regs->xreg[28], + regs->xreg[29]); } void cpu_trap_handler(struct regs *regs, int el, int mode, int is_valid) { const uint32_t exception_cls = ESR_EC(regs->esr_el1); - log(INFO, "Solo5: Trap: EL%d %s%s caught\n", - el, is_valid ? "" : "Invalid ", exception_modes[mode]); + log(INFO, "Solo5: Trap: EL%d %s%s caught\n", el, is_valid ? "" : "Invalid ", + exception_modes[mode]); - if (exception_cls == ESR_EC_DABT_LOW || - exception_cls == ESR_EC_DABT_CUR) { - uint64_t addr; - __asm__ __volatile__("mrs %0, FAR_EL1" - :"=&r"(addr) ::); - log(INFO, "Data Abort Address: 0x%016lx\n", addr); + if (exception_cls == ESR_EC_DABT_LOW || exception_cls == ESR_EC_DABT_CUR) { + uint64_t addr; + __asm__ __volatile__("mrs %0, FAR_EL1" : "=&r"(addr)::); + log(INFO, "Data Abort Address: 0x%016lx\n", addr); } dump_registers(regs); diff --git a/bindings/cpu_aarch64.h b/bindings/cpu_aarch64.h index f1514aa89..85579b20a 100644 --- a/bindings/cpu_aarch64.h +++ b/bindings/cpu_aarch64.h @@ -21,34 +21,34 @@ #define __CPU_AARCH64_H__ /* memory defines */ -#define PAGE_SIZE 4096 -#define PAGE_SHIFT 12 -#define PAGE_MASK ~(0xfff) +#define PAGE_SIZE 4096 +#define PAGE_SHIFT 12 +#define PAGE_MASK ~(0xfff) #ifndef _BITUL #ifdef ASM_FILE -#define _AC(X,Y) X -#define _AT(T,X) X +#define _AC(X, Y) X +#define _AT(T, X) X #else -#define __AC(X,Y) (X##Y) -#define _AC(X,Y) __AC(X,Y) -#define _AT(T,X) ((T)(X)) +#define __AC(X, Y) (X##Y) +#define _AC(X, Y) __AC(X, Y) +#define _AT(T, X) ((T)(X)) #endif -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) +#define _BITUL(x) (_AC(1, UL) << (x)) +#define _BITULL(x) (_AC(1, ULL) << (x)) #endif -#define ESR_EC_IABT_LOW _AC(0x20, UL) -#define ESR_EC_IABT_CUR _AC(0x21, UL) -#define ESR_EC_DABT_LOW _AC(0x24, UL) -#define ESR_EC_DABT_CUR _AC(0x25, UL) +#define ESR_EC_IABT_LOW _AC(0x20, UL) +#define ESR_EC_IABT_CUR _AC(0x21, UL) +#define ESR_EC_DABT_LOW _AC(0x24, UL) +#define ESR_EC_DABT_CUR _AC(0x25, UL) -#define ESR_EC_SHIFT _AC(26, UL) -#define ESR_EC_MASK (_AC(0x3F, UL) << ESR_EC_SHIFT) -#define ESR_EC(esr) (((esr) & ESR_EC_MASK) >> ESR_EC_SHIFT) +#define ESR_EC_SHIFT _AC(26, UL) +#define ESR_EC_MASK (_AC(0x3F, UL) << ESR_EC_SHIFT) +#define ESR_EC(esr) (((esr) & ESR_EC_MASK) >> ESR_EC_SHIFT) #ifndef ASM_FILE @@ -59,7 +59,7 @@ static inline uint64_t cpu_cntvct(void) { uint64_t val; - __asm__ __volatile__("mrs %0, cntvct_el0" : "=r" (val)::); + __asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val)::); return val; } @@ -71,7 +71,7 @@ static inline uint64_t mul64_32(uint64_t a, uint32_t b, uint8_t s) static inline void cpu_set_tls_base(uint64_t base) { - __asm__ __volatile("msr tpidr_el0, %0" :: "r"(base)); + __asm__ __volatile("msr tpidr_el0, %0" ::"r"(base)); } #endif /* __CPU_AARCH64_H__ */ diff --git a/bindings/cpu_ppc64.h b/bindings/cpu_ppc64.h index 9b323db61..cbe858b7d 100644 --- a/bindings/cpu_ppc64.h +++ b/bindings/cpu_ppc64.h @@ -21,12 +21,13 @@ #define __CPU_PPC64_H__ /* memory defines */ -#define PAGE_SIZE (64 * 1024) -#define PAGE_SHIFT 16 -#define PAGE_MASK ~(0xffff) +#define PAGE_SIZE (64 * 1024) +#define PAGE_SHIFT 16 +#define PAGE_MASK ~(0xffff) -#define CR0_SO (0x80000000 >> 3) /* summary overflow; - indicates syscall error */ +#define CR0_SO \ + (0x80000000 >> 3) /* summary overflow; \ + indicates syscall error */ #ifndef ASM_FILE @@ -37,22 +38,14 @@ static inline uint64_t cpu_cntvct(void) { uint64_t val; - __asm__ __volatile__( - "mfspr %0, 268\n" - : "=r" (val) - : - :); + __asm__ __volatile__("mfspr %0, 268\n" : "=r"(val) : :); return val; } static inline void cpu_set_tls_base(uint64_t base) { - __asm__ __volatile( - "mr 13, %0\n" - : - : "a" (base) - : "r13"); + __asm__ __volatile("mr 13, %0\n" : : "a"(base) : "r13"); } #endif /* !ASM_FILE */ diff --git a/bindings/cpu_x86_64.c b/bindings/cpu_x86_64.c index e76e533bd..7e8682ee1 100644 --- a/bindings/cpu_x86_64.c +++ b/bindings/cpu_x86_64.c @@ -39,21 +39,19 @@ static void gdt_init(void) volatile struct gdtptr gdtptr; gdtptr.limit = sizeof(cpu_gdt64) - 1; gdtptr.base = (uint64_t)&cpu_gdt64; - __asm__ __volatile__( - "lgdt (%0);\n" - "pushq %1;\n" - "pushq $1f;\n" - "lretq;\n" - "1:\n" - "movq %2, %%rax;\n" - "movl %%eax, %%ss;\n" - "movl %%eax, %%ds;\n" - "movl %%eax, %%es;\n" - : - : "r" (&gdtptr), - "n" (GDT_DESC_OFFSET(GDT_DESC_CODE)), - "n" (GDT_DESC_OFFSET(GDT_DESC_DATA)) - : "%rax"); + __asm__ __volatile__("lgdt (%0);\n" + "pushq %1;\n" + "pushq $1f;\n" + "lretq;\n" + "1:\n" + "movq %2, %%rax;\n" + "movl %%eax, %%ss;\n" + "movl %%eax, %%ds;\n" + "movl %%eax, %%es;\n" + : + : "r"(&gdtptr), "n"(GDT_DESC_OFFSET(GDT_DESC_CODE)), + "n"(GDT_DESC_OFFSET(GDT_DESC_DATA)) + : "%rax"); } static struct idt_gate_desc cpu_idt[IDT_NUM_ENTRIES] ALIGN_64_BIT; @@ -80,7 +78,8 @@ static void idt_init(void) * Load trap vectors. All traps run on IST2 (cpu_trap_stack), except for * the exceptions. */ -#define FILL_TRAP_GATE(num, ist) extern void cpu_trap_##num(void); \ +#define FILL_TRAP_GATE(num, ist) \ + extern void cpu_trap_##num(void); \ idt_fillgate(num, cpu_trap_##num, ist) FILL_TRAP_GATE(0, 2); FILL_TRAP_GATE(1, 2); @@ -105,7 +104,8 @@ static void idt_init(void) /* * Load irq vectors. All irqs run on IST1 (cpu_intr_stack). */ -#define FILL_IRQ_GATE(num, ist) extern void cpu_irq_##num(void); \ +#define FILL_IRQ_GATE(num, ist) \ + extern void cpu_irq_##num(void); \ idt_fillgate(32 + num, cpu_irq_##num, ist) FILL_IRQ_GATE(0, 1); FILL_IRQ_GATE(1, 1); @@ -126,15 +126,15 @@ static void idt_init(void) volatile struct idtptr idtptr; idtptr.limit = sizeof(cpu_idt) - 1; - idtptr.base = (uint64_t) &cpu_idt; - __asm__ __volatile__("lidt (%0)" :: "r" (&idtptr)); + idtptr.base = (uint64_t)&cpu_idt; + __asm__ __volatile__("lidt (%0)" ::"r"(&idtptr)); } static struct tss cpu_tss; static char cpu_intr_stack[4096]; /* IST1 */ static char cpu_trap_stack[4096]; /* IST2 */ -static char cpu_nmi_stack[4096]; /* IST3 */ +static char cpu_nmi_stack[4096]; /* IST3 */ static void tss_init(void) { @@ -155,7 +155,7 @@ static void tss_init(void) td->zero = 0; cc_barrier(); - __asm__ __volatile__("ltr %0" :: "r" ((unsigned short)(GDT_DESC_TSS_LO * 8))); + __asm__ __volatile__("ltr %0" ::"r"((unsigned short)(GDT_DESC_TSS_LO * 8))); } void cpu_init(void) @@ -166,14 +166,15 @@ void cpu_init(void) } static const char *traps[32] = { - "#DE", "#DB", "#NMI", "#BP", "#OF", "#BR", "#UD", "#NM", "#DF", "#9", "#TS", - "#NP", "#SS", "#GP", "#PF", "#15", "#MF", "#AC", "#MC", "#XM", "#VE", "#21", - "#22", "#23", "#24", "#25", "#26", "#27", "#28", "#29", "#30", "#31" -}; + "#DE", "#DB", "#NMI", "#BP", "#OF", "#BR", "#UD", "#NM", + "#DF", "#9", "#TS", "#NP", "#SS", "#GP", "#PF", "#15", + "#MF", "#AC", "#MC", "#XM", "#VE", "#21", "#22", "#23", + "#24", "#25", "#26", "#27", "#28", "#29", "#30", "#31"}; void cpu_trap_handler(uint64_t num, struct trap_regs *regs) { - log(INFO, "Solo5: trap: type=%s ec=0x%llx rip=0x%llx rsp=0x%llx rflags=0x%llx\n", + log(INFO, + "Solo5: trap: type=%s ec=0x%llx rip=0x%llx rsp=0x%llx rflags=0x%llx\n", traps[num], (unsigned long long)regs->ec, (unsigned long long)regs->rip, (unsigned long long)regs->rsp, (unsigned long long)regs->rflags); if (num == 14) @@ -201,5 +202,6 @@ void cpu_intr_enable(void) void cpu_halt(void) { __asm__ __volatile__("cli; hlt"); - for(;;); + for (;;) + ; } diff --git a/bindings/cpu_x86_64.h b/bindings/cpu_x86_64.h index ceb51897f..1f1fe347f 100644 --- a/bindings/cpu_x86_64.h +++ b/bindings/cpu_x86_64.h @@ -21,89 +21,89 @@ #ifndef _BITUL #ifdef ASM_FILE -#define _AC(X,Y) X -#define _AT(T,X) X +#define _AC(X, Y) X +#define _AT(T, X) X #else -#define __AC(X,Y) (X##Y) -#define _AC(X,Y) __AC(X,Y) -#define _AT(T,X) ((T)(X)) +#define __AC(X, Y) (X##Y) +#define _AC(X, Y) __AC(X, Y) +#define _AT(T, X) ((T)(X)) #endif -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) +#define _BITUL(x) (_AC(1, UL) << (x)) +#define _BITULL(x) (_AC(1, ULL) << (x)) #endif /* * Basic CPU control in CR0 */ -#define X86_CR0_PE_BIT 0 /* Protection Enable */ -#define X86_CR0_PE _BITUL(X86_CR0_PE_BIT) -#define X86_CR0_MP_BIT 1 /* Monitor Coprocessor */ -#define X86_CR0_MP _BITUL(X86_CR0_MP_BIT) -#define X86_CR0_EM_BIT 2 /* Emulation */ -#define X86_CR0_EM _BITUL(X86_CR0_EM_BIT) -#define X86_CR0_NE_BIT 5 /* Numeric Exception */ -#define X86_CR0_NE _BITUL(X86_CR0_NE_BIT) -#define X86_CR0_WP_BIT 16 /* Write Protect */ -#define X86_CR0_WP _BITUL(X86_CR0_WP_BIT) -#define X86_CR0_PG_BIT 31 /* Paging */ -#define X86_CR0_PG _BITUL(X86_CR0_PG_BIT) +#define X86_CR0_PE_BIT 0 /* Protection Enable */ +#define X86_CR0_PE _BITUL(X86_CR0_PE_BIT) +#define X86_CR0_MP_BIT 1 /* Monitor Coprocessor */ +#define X86_CR0_MP _BITUL(X86_CR0_MP_BIT) +#define X86_CR0_EM_BIT 2 /* Emulation */ +#define X86_CR0_EM _BITUL(X86_CR0_EM_BIT) +#define X86_CR0_NE_BIT 5 /* Numeric Exception */ +#define X86_CR0_NE _BITUL(X86_CR0_NE_BIT) +#define X86_CR0_WP_BIT 16 /* Write Protect */ +#define X86_CR0_WP _BITUL(X86_CR0_WP_BIT) +#define X86_CR0_PG_BIT 31 /* Paging */ +#define X86_CR0_PG _BITUL(X86_CR0_PG_BIT) /* * Intel CPU features in CR4 */ -#define X86_CR4_PAE_BIT 5 /* enable physical address extensions */ -#define X86_CR4_PAE _BITUL(X86_CR4_PAE_BIT) -#define X86_CR4_OSFXSR_BIT 9 /* OS support for FXSAVE/FXRSTOR */ -#define X86_CR4_OSFXSR _BITUL(X86_CR4_OSFXSR_BIT) -#define X86_CR4_OSXMMEXCPT_BIT 10 /* OS support for FP exceptions */ -#define X86_CR4_OSXMMEXCPT _BITUL(X86_CR4_OSXMMEXCPT_BIT) -#define X86_CR4_VMXE_BIT 13 /* VMX enabled */ -#define X86_CR4_VMXE _BITUL(X86_CR4_VMXE_BIT) +#define X86_CR4_PAE_BIT 5 /* enable physical address extensions */ +#define X86_CR4_PAE _BITUL(X86_CR4_PAE_BIT) +#define X86_CR4_OSFXSR_BIT 9 /* OS support for FXSAVE/FXRSTOR */ +#define X86_CR4_OSFXSR _BITUL(X86_CR4_OSFXSR_BIT) +#define X86_CR4_OSXMMEXCPT_BIT 10 /* OS support for FP exceptions */ +#define X86_CR4_OSXMMEXCPT _BITUL(X86_CR4_OSXMMEXCPT_BIT) +#define X86_CR4_VMXE_BIT 13 /* VMX enabled */ +#define X86_CR4_VMXE _BITUL(X86_CR4_VMXE_BIT) /* * Intel CPU features in EFER */ -#define X86_EFER_LME_BIT 8 /* Long mode enable (R/W) */ -#define X86_EFER_LME _BITUL(X86_EFER_LME_BIT) -#define X86_EFER_LMA_BIT 10 /* Long mode active (R/O) */ -#define X86_EFER_LMA _BITUL(X86_EFER_LMA_BIT) -#define X86_EFER_NXE_BIT 11 /* No-execute enable */ -#define X86_EFER_NXE _BITUL(X86_EFER_NXE_BIT) +#define X86_EFER_LME_BIT 8 /* Long mode enable (R/W) */ +#define X86_EFER_LME _BITUL(X86_EFER_LME_BIT) +#define X86_EFER_LMA_BIT 10 /* Long mode active (R/O) */ +#define X86_EFER_LMA _BITUL(X86_EFER_LMA_BIT) +#define X86_EFER_NXE_BIT 11 /* No-execute enable */ +#define X86_EFER_NXE _BITUL(X86_EFER_NXE_BIT) -#define PAGE_SIZE 4096 -#define PAGE_SHIFT 12 -#define PAGE_MASK ~(0xfff) +#define PAGE_SIZE 4096 +#define PAGE_SHIFT 12 +#define PAGE_MASK ~(0xfff) /* * Long-mode page table entries. */ -#define X86_PTE_P_BIT 0 /* Present */ -#define X86_PTE_P _BITUL(X86_PTE_P_BIT) -#define X86_PTE_W_BIT 1 /* Read/Write */ -#define X86_PTE_W _BITUL(X86_PTE_W_BIT) -#define X86_PTE_PS_BIT 7 /* Page Size */ -#define X86_PTE_PS _BITUL(X86_PTE_PS_BIT) -#define X86_PTE_XD_BIT 63 /* Execute disable */ -#define X86_PTE_XD _BITUL(X86_PTE_XD_BIT) +#define X86_PTE_P_BIT 0 /* Present */ +#define X86_PTE_P _BITUL(X86_PTE_P_BIT) +#define X86_PTE_W_BIT 1 /* Read/Write */ +#define X86_PTE_W _BITUL(X86_PTE_W_BIT) +#define X86_PTE_PS_BIT 7 /* Page Size */ +#define X86_PTE_PS _BITUL(X86_PTE_PS_BIT) +#define X86_PTE_XD_BIT 63 /* Execute disable */ +#define X86_PTE_XD _BITUL(X86_PTE_XD_BIT) /* * GDT layout * */ -#define GDT_DESC_NULL 0 -#define GDT_DESC_CODE 1 -#define GDT_DESC_DATA 2 -#define GDT_DESC_TSS_LO 3 -#define GDT_DESC_TSS_HI 4 -#define GDT_DESC_TSS GDT_DESC_TSS_LO +#define GDT_DESC_NULL 0 +#define GDT_DESC_CODE 1 +#define GDT_DESC_DATA 2 +#define GDT_DESC_TSS_LO 3 +#define GDT_DESC_TSS_HI 4 +#define GDT_DESC_TSS GDT_DESC_TSS_LO -#define GDT_DESC_OFFSET(n) ((n) * 0x8) -#define GDT_NUM_ENTRIES 5 +#define GDT_DESC_OFFSET(n) ((n) * 0x8) +#define GDT_NUM_ENTRIES 5 -#define GDT_DESC_CODE_VAL 0x00af99000000ffff -#define GDT_DESC_DATA_VAL 0x00cf93000000ffff +#define GDT_DESC_CODE_VAL 0x00af99000000ffff +#define GDT_DESC_DATA_VAL 0x00cf93000000ffff #ifndef ASM_FILE /* @@ -118,15 +118,15 @@ struct gdtptr { #define IDT_NUM_ENTRIES 48 struct idt_gate_desc { - uint64_t offset_lo:16; - uint64_t selector:16; - uint64_t ist:3; - uint64_t reserved:5; - uint64_t type:5; - uint64_t dpl:2; - uint64_t p:1; - uint64_t offset_hi:48; - uint64_t reserved1:32; + uint64_t offset_lo : 16; + uint64_t selector : 16; + uint64_t ist : 3; + uint64_t reserved : 5; + uint64_t type : 5; + uint64_t dpl : 2; + uint64_t p : 1; + uint64_t offset_hi : 48; + uint64_t reserved1 : 32; } __attribute__((packed)); struct idtptr { @@ -145,18 +145,18 @@ struct tss { } __attribute__((packed)); struct tss_desc { - uint64_t limit_lo:16; - uint64_t base_lo:24; - uint64_t type:5; - uint64_t dpl:2; - uint64_t p:1; - uint64_t limit_hi:4; - uint64_t unused:3; - uint64_t gran:1; - uint64_t base_hi:40; - uint64_t reserved:8; - uint64_t zero:5; - uint64_t reserved1:19; + uint64_t limit_lo : 16; + uint64_t base_lo : 24; + uint64_t type : 5; + uint64_t dpl : 2; + uint64_t p : 1; + uint64_t limit_hi : 4; + uint64_t unused : 3; + uint64_t gran : 1; + uint64_t base_hi : 40; + uint64_t reserved : 8; + uint64_t zero : 5; + uint64_t reserved1 : 19; } __attribute__((packed)); struct trap_regs { @@ -181,12 +181,10 @@ static inline uint64_t mul64_32(uint64_t a, uint32_t b, uint8_t s) { uint64_t prod; - __asm__ ( - "mul %%rdx ; " - "shrd %%cl, %%rdx, %%rax" - : "=a" (prod) - : "0" (a), "d" ((uint64_t)b), "Ic" (s) - ); + __asm__("mul %%rdx ; " + "shrd %%cl, %%rdx, %%rax" + : "=a"(prod) + : "0"(a), "d"((uint64_t)b), "Ic"(s)); return prod; } @@ -195,35 +193,35 @@ static inline uint64_t mul64_32(uint64_t a, uint32_t b, uint8_t s) static inline void outb(uint16_t port, uint8_t v) { - __asm__ __volatile__("outb %0,%1" : : "a" (v), "dN" (port)); + __asm__ __volatile__("outb %0,%1" : : "a"(v), "dN"(port)); } static inline void outw(uint16_t port, uint16_t v) { - __asm__ __volatile__("outw %0,%1" : : "a" (v), "dN" (port)); + __asm__ __volatile__("outw %0,%1" : : "a"(v), "dN"(port)); } static inline void outl(uint16_t port, uint32_t v) { - __asm__ __volatile__("outl %0,%1" : : "a" (v), "dN" (port)); + __asm__ __volatile__("outl %0,%1" : : "a"(v), "dN"(port)); } static inline uint8_t inb(uint16_t port) { uint8_t v; - __asm__ __volatile__("inb %1,%0" : "=a" (v) : "dN" (port)); + __asm__ __volatile__("inb %1,%0" : "=a"(v) : "dN"(port)); return v; } static inline uint16_t inw(uint16_t port) { uint16_t v; - __asm__ __volatile__("inw %1,%0" : "=a" (v) : "dN" (port)); + __asm__ __volatile__("inw %1,%0" : "=a"(v) : "dN"(port)); return v; } static inline uint32_t inl(uint16_t port) { uint32_t v; - __asm__ __volatile__("inl %1,%0" : "=a" (v) : "dN" (port)); + __asm__ __volatile__("inl %1,%0" : "=a"(v) : "dN"(port)); return v; } @@ -232,32 +230,27 @@ static inline uint64_t inq(uint16_t port_lo) uint16_t port_hi = port_lo + 4; uint32_t lo, hi; - __asm__ __volatile__("inl %1,%0" : "=a" (lo) : "dN" (port_lo)); - __asm__ __volatile__("inl %1,%0" : "=a" (hi) : "dN" (port_hi)); + __asm__ __volatile__("inl %1,%0" : "=a"(lo) : "dN"(port_lo)); + __asm__ __volatile__("inl %1,%0" : "=a"(hi) : "dN"(port_hi)); return ((uint64_t)lo) | ((uint64_t)hi << 32); } static inline void cpu_set_tls_base(uint64_t base) { - __asm__ __volatile("wrmsr" :: - "c" (0xc0000100), /* IA32_FS_BASE */ - "a" ((uint32_t)(base)), - "d" ((uint32_t)(base >> 32)) - ); + __asm__ __volatile("wrmsr" ::"c"(0xc0000100), /* IA32_FS_BASE */ + "a"((uint32_t)(base)), "d"((uint32_t)(base >> 32))); } -static inline void -x86_cpuid(uint32_t level, uint32_t *eax_out, uint32_t *ebx_out, - uint32_t *ecx_out, uint32_t *edx_out) +static inline void x86_cpuid(uint32_t level, uint32_t *eax_out, + uint32_t *ebx_out, uint32_t *ecx_out, + uint32_t *edx_out) { uint32_t eax_, ebx_, ecx_, edx_; - __asm__( - "cpuid" - : "=a" (eax_), "=b" (ebx_), "=c" (ecx_), "=d" (edx_) - : "0" (level) - ); + __asm__("cpuid" + : "=a"(eax_), "=b"(ebx_), "=c"(ecx_), "=d"(edx_) + : "0"(level)); *eax_out = eax_; *ebx_out = ebx_; *ecx_out = ecx_; diff --git a/bindings/crt.c b/bindings/crt.c index ff11a9a3f..9df012db7 100644 --- a/bindings/crt.c +++ b/bindings/crt.c @@ -32,11 +32,10 @@ uintptr_t SSP_GUARD_SYMBOL = 0x00deadbeef0d0a00; * detected. There is very little we can do here safely, so just print a * message and abort, taking care to make minimal use of the stack. */ -static const char -stack_chk_fail_message[] = "Solo5: ABORT: Stack corruption detected\n"; +static const char stack_chk_fail_message[] = + "Solo5: ABORT: Stack corruption detected\n"; -__attribute__((noreturn)) -void SSP_FAIL_SYMBOL(void) +__attribute__((noreturn)) void SSP_FAIL_SYMBOL(void) { platform_puts(stack_chk_fail_message, sizeof stack_chk_fail_message); platform_exit(SOLO5_EXIT_ABORT, NULL); diff --git a/bindings/hvt/block.c b/bindings/hvt/block.c index 738604fba..c72542e47 100644 --- a/bindings/hvt/block.c +++ b/bindings/hvt/block.c @@ -23,7 +23,7 @@ static const struct mft *mft; solo5_result_t solo5_block_write(solo5_handle_t handle, solo5_off_t offset, - const uint8_t *buf, size_t size) + const uint8_t *buf, size_t size) { const struct mft_entry *e = mft_get_by_index(mft, handle, MFT_DEV_BLOCK_BASIC); @@ -56,7 +56,7 @@ solo5_result_t solo5_block_write(solo5_handle_t handle, solo5_off_t offset, } solo5_result_t solo5_block_read(solo5_handle_t handle, solo5_off_t offset, - uint8_t *buf, size_t size) + uint8_t *buf, size_t size) { const struct mft_entry *e = mft_get_by_index(mft, handle, MFT_DEV_BLOCK_BASIC); @@ -89,7 +89,7 @@ solo5_result_t solo5_block_read(solo5_handle_t handle, solo5_off_t offset, } solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *handle, - struct solo5_block_info *info) + struct solo5_block_info *info) { unsigned index; const struct mft_entry *e = diff --git a/bindings/hvt/net.c b/bindings/hvt/net.c index 19f76abfd..28c3152be 100644 --- a/bindings/hvt/net.c +++ b/bindings/hvt/net.c @@ -23,7 +23,7 @@ static const struct mft *mft; solo5_result_t solo5_net_write(solo5_handle_t handle, const uint8_t *buf, - size_t size) + size_t size) { volatile struct hvt_hc_net_write wr; @@ -38,7 +38,7 @@ solo5_result_t solo5_net_write(solo5_handle_t handle, const uint8_t *buf, } solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, size_t size, - size_t *read_size) + size_t *read_size) { volatile struct hvt_hc_net_read rd; @@ -54,7 +54,7 @@ solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, size_t size, } solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *handle, - struct solo5_net_info *info) + struct solo5_net_info *info) { unsigned index; const struct mft_entry *e = @@ -65,8 +65,7 @@ solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *handle, *handle = index; info->mtu = e->u.net_basic.mtu; - memcpy(info->mac_address, e->u.net_basic.mac, - sizeof info->mac_address); + memcpy(info->mac_address, e->u.net_basic.mac, sizeof info->mac_address); return SOLO5_R_OK; } diff --git a/bindings/hvt/platform_lifecycle.c b/bindings/hvt/platform_lifecycle.c index 2e7b7ac26..c4860a652 100644 --- a/bindings/hvt/platform_lifecycle.c +++ b/bindings/hvt/platform_lifecycle.c @@ -33,5 +33,6 @@ void platform_exit(int status, void *cookie) h.cookie = cookie; hvt_do_hypercall(HVT_HYPERCALL_HALT, &h); - for(;;); + for (;;) + ; } diff --git a/bindings/hvt/start.c b/bindings/hvt/start.c index c1e27d7e8..0c38a93d3 100644 --- a/bindings/hvt/start.c +++ b/bindings/hvt/start.c @@ -59,14 +59,10 @@ DECLARE_ELF_INTERP * The "ABI1" Solo5 ELF note is declared in this module. * */ -ABI1_NOTE_DECLARE_BEGIN -{ - .abi_target = HVT_ABI_TARGET, - .abi_version = HVT_ABI_VERSION -} -ABI1_NOTE_DECLARE_END +ABI1_NOTE_DECLARE_BEGIN{.abi_target = HVT_ABI_TARGET, + .abi_version = HVT_ABI_VERSION} ABI1_NOTE_DECLARE_END -/* - * Pretend that we are an OpenBSD executable. See elf_abi.h for details. - */ -DECLARE_OPENBSD_NOTE + /* + * Pretend that we are an OpenBSD executable. See elf_abi.h for details. + */ + DECLARE_OPENBSD_NOTE diff --git a/bindings/hvt/tscclock.c b/bindings/hvt/tscclock.c index 65469b546..8611aa2bf 100644 --- a/bindings/hvt/tscclock.c +++ b/bindings/hvt/tscclock.c @@ -94,7 +94,8 @@ int tscclock_init(uint64_t tsc_freq) tsc_shift--; } while (tsc_shift > 0 && tsc_mult == 0L); assert(tsc_mult != 0L); - log(DEBUG, "Solo5: tscclock_init(): tsc_freq=%llu tsc_mult=%u tsc_shift=%u\n", + log(DEBUG, + "Solo5: tscclock_init(): tsc_freq=%llu tsc_mult=%u tsc_shift=%u\n", (unsigned long long)tsc_freq, tsc_mult, tsc_shift); /* diff --git a/bindings/lib.c b/bindings/lib.c index a91f72228..f2963132a 100644 --- a/bindings/lib.c +++ b/bindings/lib.c @@ -63,16 +63,19 @@ void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; - for (; n; n--, s++) *s = c; + for (; n; n--, s++) + *s = c; return dest; } -void *__attribute__ ((noinline)) memcpy(void *restrict dest, const void *restrict src, size_t n) +void *__attribute__((noinline)) memcpy(void *restrict dest, + const void *restrict src, size_t n) { unsigned char *d = dest; const unsigned char *s = src; - for (; n; n--) *d++ = *s++; + for (; n; n--) + *d++ = *s++; return dest; } @@ -84,27 +87,35 @@ void *memmove(void *dest, const void *src, size_t n) char *d = dest; const char *s = src; - if (d==s) return d; - if (s+n <= d || d+n <= s) return memcpy(d, s, n); + if (d == s) + return d; + if (s + n <= d || d + n <= s) + return memcpy(d, s, n); - if (d=WS; n-=WS, d+=WS, s+=WS) *(WT *)d = *(const WT *)s; + for (; n >= WS; n -= WS, d += WS, s += WS) + *(WT *)d = *(const WT *)s; } - for (; n; n--) *d++ = *s++; + for (; n; n--) + *d++ = *s++; } else { if ((uintptr_t)s % WS == (uintptr_t)d % WS) { - while ((uintptr_t)(d+n) % WS) { - if (!n--) return dest; + while ((uintptr_t)(d + n) % WS) { + if (!n--) + return dest; d[n] = s[n]; } - while (n>=WS) n-=WS, *(WT *)(d+n) = *(const WT *)(s+n); + while (n >= WS) + n -= WS, *(WT *)(d + n) = *(const WT *)(s + n); } - while (n) n--, d[n] = s[n]; + while (n) + n--, d[n] = s[n]; } return dest; @@ -112,14 +123,16 @@ void *memmove(void *dest, const void *src, size_t n) int memcmp(const void *vl, const void *vr, size_t n) { - const unsigned char *l=vl, *r=vr; - for (; n && *l == *r; n--, l++, r++); - return n ? *l-*r : 0; + const unsigned char *l = vl, *r = vr; + for (; n && *l == *r; n--, l++, r++) + ; + return n ? *l - *r : 0; } int strcmp(const char *l, const char *r) { - for (; *l==*r && *l; l++, r++); + for (; *l == *r && *l; l++, r++) + ; return *(const unsigned char *)l - *(const unsigned char *)r; } @@ -127,35 +140,42 @@ char *strcpy(char *restrict dest, const char *restrict src) { const unsigned char *s = (const unsigned char *)src; unsigned char *d = (unsigned char *)dest; - while ((*d++ = *s++)); + while ((*d++ = *s++)) + ; return dest; } -#define UCHAR_MAX 255 -#define ALIGN (sizeof(size_t)) -#define ONES ((size_t)-1/UCHAR_MAX) -#define HIGHS (ONES * (UCHAR_MAX/2+1)) -#define HASZERO(x) (((x)-ONES) & ~(x) & HIGHS) +#define UCHAR_MAX 255 +#define ALIGN (sizeof(size_t)) +#define ONES ((size_t)-1 / UCHAR_MAX) +#define HIGHS (ONES * (UCHAR_MAX / 2 + 1)) +#define HASZERO(x) (((x) - ONES) & ~(x) & HIGHS) size_t strlen(const char *s) { const char *a = s; const size_t *w; - for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a; - for (w = (const void *)s; !HASZERO(*w); w++); - for (s = (const void *)w; *s; s++); - return s-a; + for (; (uintptr_t)s % ALIGN; s++) + if (!*s) + return s - a; + for (w = (const void *)s; !HASZERO(*w); w++) + ; + for (s = (const void *)w; *s; s++) + ; + return s - a; } int isspace(int c) { - return c == ' ' || (unsigned)c-'\t' < 5; + return c == ' ' || (unsigned)c - '\t' < 5; } int strncmp(const char *_l, const char *_r, size_t n) { - const unsigned char *l=(const void *)_l, *r=(const void *)_r; - if (!n--) return 0; - for (; *l && *r && n && *l == *r ; l++, r++, n--); + const unsigned char *l = (const void *)_l, *r = (const void *)_r; + if (!n--) + return 0; + for (; *l && *r && n && *l == *r; l++, r++, n--) + ; return *l - *r; } diff --git a/bindings/mem.c b/bindings/mem.c index 55ec4bba2..0214a7f7f 100644 --- a/bindings/mem.c +++ b/bindings/mem.c @@ -54,17 +54,17 @@ void mem_init(void) PANIC("Not enough memory", NULL); log(INFO, "Solo5: Memory map: %llu MB addressable:\n", - (unsigned long long)mem_size >> 20); + (unsigned long long)mem_size >> 20); log(INFO, "Solo5: reserved @ (0x0 - 0x%llx)\n", - (unsigned long long)_stext-1); + (unsigned long long)_stext - 1); log(INFO, "Solo5: text @ (0x%llx - 0x%llx)\n", - (unsigned long long)_stext, (unsigned long long)_etext-1); + (unsigned long long)_stext, (unsigned long long)_etext - 1); log(INFO, "Solo5: rodata @ (0x%llx - 0x%llx)\n", - (unsigned long long)_etext, (unsigned long long)_erodata-1); + (unsigned long long)_etext, (unsigned long long)_erodata - 1); log(INFO, "Solo5: data @ (0x%llx - 0x%llx)\n", - (unsigned long long)_erodata, (unsigned long long)_end-1); + (unsigned long long)_erodata, (unsigned long long)_end - 1); log(INFO, "Solo5: heap >= 0x%llx < stack < 0x%llx\n", - (unsigned long long)heap_start, (unsigned long long)mem_size); + (unsigned long long)heap_start, (unsigned long long)mem_size); } /* diff --git a/bindings/muen/channel.c b/bindings/muen/channel.c index 4f31a3776..fda44ff46 100644 --- a/bindings/muen/channel.c +++ b/bindings/muen/channel.c @@ -20,7 +20,7 @@ #include "channel.h" -inline bool muen_channel_is_active(const struct muchannel * const channel) +inline bool muen_channel_is_active(const struct muchannel *const channel) { return channel->hdr.epoch != MUCHANNEL_NULL_EPOCH; } diff --git a/bindings/muen/channel.h b/bindings/muen/channel.h index 4753d7c05..1eda754c5 100644 --- a/bindings/muen/channel.h +++ b/bindings/muen/channel.h @@ -31,8 +31,8 @@ * IPC protocol (shmstream) as specified by 'SHMStream Version 2 IPC Interface'. */ -#define SHMSTREAM20 0x487312b6b79a9b6dULL -#define MUCHANNEL_NULL_EPOCH 0 +#define SHMSTREAM20 0x487312b6b79a9b6dULL +#define MUCHANNEL_NULL_EPOCH 0 struct muchannel_header { uint64_t transport; @@ -53,6 +53,6 @@ struct muchannel { /* * Returns True if the channe is currently active. */ -bool muen_channel_is_active(const struct muchannel * const channel); +bool muen_channel_is_active(const struct muchannel *const channel); #endif diff --git a/bindings/muen/muen-block.c b/bindings/muen/muen-block.c index 555cebcec..368a6f6a7 100644 --- a/bindings/muen/muen-block.c +++ b/bindings/muen/muen-block.c @@ -21,24 +21,26 @@ #include "bindings.h" solo5_result_t solo5_block_acquire(const char *name __attribute__((unused)), - solo5_handle_t *handle __attribute__((unused)), - struct solo5_block_info *info __attribute__((unused))) + solo5_handle_t *handle + __attribute__((unused)), + struct solo5_block_info *info + __attribute__((unused))) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_write(solo5_handle_t handle __attribute__((unused)), - solo5_off_t offset __attribute__((unused)), - const uint8_t *buf __attribute__((unused)), - size_t size __attribute__((unused))) + solo5_off_t offset __attribute__((unused)), + const uint8_t *buf __attribute__((unused)), + size_t size __attribute__((unused))) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_read(solo5_handle_t handle __attribute__((unused)), - solo5_off_t offset __attribute__((unused)), - uint8_t *buf __attribute__((unused)), - size_t size __attribute__((unused))) + solo5_off_t offset __attribute__((unused)), + uint8_t *buf __attribute__((unused)), + size_t size __attribute__((unused))) { return SOLO5_R_EUNSPEC; } diff --git a/bindings/muen/muen-clock.c b/bindings/muen/muen-clock.c index 134cc0b75..40c84836a 100644 --- a/bindings/muen/muen-clock.c +++ b/bindings/muen/muen-clock.c @@ -56,8 +56,8 @@ solo5_time_t solo5_clock_monotonic(void) void time_init(void) { uint64_t tsc_freq, tsc_time_base; - const struct muen_resource_type *const - region = muen_get_resource("time_info", MUEN_RES_MEMORY); + const struct muen_resource_type *const region = + muen_get_resource("time_info", MUEN_RES_MEMORY); if (!region) { log(ERROR, "Unable to retrieve Muen time info region\n"); @@ -70,8 +70,7 @@ void time_init(void) cc_barrier(); /* Wait until time information has been published */ - do - { + do { tsc_time_base = time_info->tsc_time_base; cc_barrier(); } while (tsc_time_base == 0); diff --git a/bindings/muen/muen-console.c b/bindings/muen/muen-console.c index b59d458aa..31f6f5ff2 100644 --- a/bindings/muen/muen-console.c +++ b/bindings/muen/muen-console.c @@ -51,8 +51,7 @@ int platform_puts(const char *buf, int n) int i; for (i = 0; i < n; i++) { - if (buf[i] && buf[i] != 0x0d) - { + if (buf[i] && buf[i] != 0x0d) { msg_buffer.data[msg_index] = buf[i]; if (msg_index == 55 || buf[i] == 0x0a) flush(); @@ -71,8 +70,8 @@ void solo5_console_write(const char *buf, size_t size) void console_init(void) { - const struct muen_resource_type *const - channel = muen_get_resource("debuglog", MUEN_RES_MEMORY); + const struct muen_resource_type *const channel = + muen_get_resource("debuglog", MUEN_RES_MEMORY); uint64_t epoch; if (!channel) { @@ -80,11 +79,13 @@ void console_init(void) } clear_buffer(); - epoch = muen_get_sched_start(); - channel_out = (struct muchannel *)(channel->data.mem.address); - muen_channel_init_writer(channel_out, DEBUGLOG_PROTO, sizeof(struct log_msg), - channel->data.mem.size, epoch); - log(INFO, "Solo5: Console: Muen Channel @ 0x%llx, size 0x%llx, epoch 0x%llx\n", + epoch = muen_get_sched_start(); + channel_out = (struct muchannel *)(channel->data.mem.address); + muen_channel_init_writer(channel_out, DEBUGLOG_PROTO, + sizeof(struct log_msg), channel->data.mem.size, + epoch); + log(INFO, + "Solo5: Console: Muen Channel @ 0x%llx, size 0x%llx, epoch 0x%llx\n", (unsigned long long)channel->data.mem.address, (unsigned long long)channel->data.mem.size, (unsigned long long)epoch); } diff --git a/bindings/muen/muen-net.c b/bindings/muen/muen-net.c index 7096a1640..015fe4b65 100644 --- a/bindings/muen/muen-net.c +++ b/bindings/muen/muen-net.c @@ -47,10 +47,10 @@ static struct muen_net_device net_devices[MFT_MAX_ENTRIES]; * Initialize Muen network device with given name. */ static bool muen_net_dev_init(const char *name, struct muen_net_device *device, - struct solo5_net_info *info); + struct solo5_net_info *info); -solo5_result_t solo5_net_write(solo5_handle_t handle, - const uint8_t *buf, size_t size) +solo5_result_t solo5_net_write(solo5_handle_t handle, const uint8_t *buf, + size_t size) { struct net_msg pkt; @@ -69,8 +69,8 @@ solo5_result_t solo5_net_write(solo5_handle_t handle, return SOLO5_R_OK; } -solo5_result_t solo5_net_read(solo5_handle_t handle, - uint8_t *buf, size_t size, size_t *read_size) +solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, size_t size, + size_t *read_size) { enum muchannel_reader_result result; struct net_msg pkt; @@ -93,12 +93,12 @@ solo5_result_t solo5_net_read(solo5_handle_t handle, } solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *h, - struct solo5_net_info *info) + struct solo5_net_info *info) { solo5_handle_t handle = 0; unsigned mft_index; - const struct mft_entry *mft_e = mft_get_by_name(muen_manifest, name, - MFT_DEV_NET_BASIC, &mft_index); + const struct mft_entry *mft_e = + mft_get_by_name(muen_manifest, name, MFT_DEV_NET_BASIC, &mft_index); if (mft_e == NULL) return SOLO5_R_EINVAL; @@ -120,9 +120,8 @@ solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *h, bool muen_net_pending_data(solo5_handle_t handle) { - return handle < MFT_MAX_ENTRIES - && net_devices[handle].acquired - && muen_channel_has_pending_data(net_devices[handle].net_in, + return handle < MFT_MAX_ENTRIES && net_devices[handle].acquired && + muen_channel_has_pending_data(net_devices[handle].net_in, &net_devices[handle].net_rdr); } @@ -134,14 +133,13 @@ static void generate_mac_addr(uint8_t *addr) uint64_t data; int i; - data = (muen_get_sched_start() << 32) | muen_get_sched_end(); + data = (muen_get_sched_start() << 32) | muen_get_sched_end(); data ^= tscclock_epochoffset(); - data = ((data << counter) | (data >> (dsize - counter))) + counter; + data = ((data << counter) | (data >> (dsize - counter))) + counter; counter = (counter + 1) % dsize; - for (i = 0; i < 6; i++) - { - addr[i] = subject_name[i]; + for (i = 0; i < 6; i++) { + addr[i] = subject_name[i]; addr[i] ^= (uint8_t)(data >> (i * 8)); } @@ -151,7 +149,7 @@ static void generate_mac_addr(uint8_t *addr) } static bool muen_net_dev_init(const char *name, struct muen_net_device *device, - struct solo5_net_info *info) + struct solo5_net_info *info) { assert(!device->acquired); const uint64_t epoch = muen_get_sched_start(); @@ -159,24 +157,24 @@ static bool muen_net_dev_init(const char *name, struct muen_net_device *device, char buffer[64]; const int retval = snprintf(buffer, sizeof buffer, "%s|out", name); assert(retval > 0 && (unsigned)retval < sizeof buffer); - const struct muen_resource_type *const - chan_out = muen_get_resource(buffer, MUEN_RES_MEMORY); - snprintf(buffer, sizeof buffer, "%s|in", name); - const struct muen_resource_type *const - chan_in = muen_get_resource(buffer, MUEN_RES_MEMORY); + const struct muen_resource_type *const chan_out = + muen_get_resource(buffer, MUEN_RES_MEMORY); + snprintf(buffer, sizeof buffer, "%s|in", name); + const struct muen_resource_type *const chan_in = + muen_get_resource(buffer, MUEN_RES_MEMORY); if (!chan_out) { log(WARN, "Solo5: Net: '%s': No output channel\n", name); return false; } if (chan_out->data.mem.kind != MUEN_MEM_SUBJ_CHANNEL) { - log(WARN, "Solo5: Net: '%s': Memory '%s' is not a channel\n", - name, chan_out->name.data); + log(WARN, "Solo5: Net: '%s': Memory '%s' is not a channel\n", name, + chan_out->name.data); return false; } if (!(chan_out->data.mem.flags & MEM_WRITABLE_FLAG)) { - log(WARN, "Solo5: Net: '%s': Output channel '%s' not writable\n", - name, chan_out->name.data); + log(WARN, "Solo5: Net: '%s': Output channel '%s' not writable\n", name, + chan_out->name.data); return false; } @@ -185,29 +183,30 @@ static bool muen_net_dev_init(const char *name, struct muen_net_device *device, return false; } if (chan_in->data.mem.kind != MUEN_MEM_SUBJ_CHANNEL) { - log(WARN, "Solo5: Net: '%s': Memory '%s' is not a channel\n", - name, chan_in->name.data); + log(WARN, "Solo5: Net: '%s': Memory '%s' is not a channel\n", name, + chan_in->name.data); return false; } if (chan_in->data.mem.flags & MEM_WRITABLE_FLAG) { - log(DEBUG, "Solo5: Net: '%s': Input channel '%s' is writable\n", - name, chan_in->name.data); + log(DEBUG, "Solo5: Net: '%s': Input channel '%s' is writable\n", name, + chan_in->name.data); } device->net_out = (struct muchannel *)(chan_out->data.mem.address); - muen_channel_init_writer(device->net_out, MUENNET_PROTO, sizeof(struct net_msg), - chan_out->data.mem.size, epoch); + muen_channel_init_writer(device->net_out, MUENNET_PROTO, + sizeof(struct net_msg), chan_out->data.mem.size, + epoch); log(INFO, "Solo5: Net: '%s': Muen shared memory stream, protocol 0x%llx\n", name, MUENNET_PROTO); - log(INFO, "Solo5: Net: '%s': Output channel @ 0x%llx, size 0x%llx, epoch 0x%llx\n", - name, - (unsigned long long)chan_out->data.mem.address, + log(INFO, + "Solo5: Net: '%s': Output channel @ 0x%llx, size 0x%llx, epoch " + "0x%llx\n", + name, (unsigned long long)chan_out->data.mem.address, (unsigned long long)chan_out->data.mem.size, (unsigned long long)epoch); device->net_in = (struct muchannel *)(chan_in->data.mem.address); muen_channel_init_reader(&device->net_rdr, MUENNET_PROTO); - log(INFO, "Solo5: Net: '%s': Input channel @ 0x%llx, size 0x%llx\n", - name, + log(INFO, "Solo5: Net: '%s': Input channel @ 0x%llx, size 0x%llx\n", name, (unsigned long long)chan_in->data.mem.address, (unsigned long long)chan_in->data.mem.size); diff --git a/bindings/muen/muen-platform_lifecycle.c b/bindings/muen/muen-platform_lifecycle.c index ba603d233..6c39726f0 100644 --- a/bindings/muen/muen-platform_lifecycle.c +++ b/bindings/muen/muen-platform_lifecycle.c @@ -27,14 +27,14 @@ extern const struct mft1_note __solo5_mft1_note; void trigger_exit_event() { - const struct muen_resource_type *const - event = muen_get_resource("solo5_exit", MUEN_RES_EVENT); + const struct muen_resource_type *const event = + muen_get_resource("solo5_exit", MUEN_RES_EVENT); if (!event) { return; } - __asm__ __volatile__("vmcall": : "a"(event->data.number) : "memory"); + __asm__ __volatile__("vmcall" : : "a"(event->data.number) : "memory"); } void platform_init(const void *arg) @@ -56,11 +56,12 @@ void platform_init(const void *arg) } void platform_exit(int status __attribute__((unused)), - void *cookie __attribute__((unused))) + void *cookie __attribute__((unused))) { const char msg[] = "Solo5: Halted\n"; platform_puts(msg, strlen(msg)); trigger_exit_event(); __asm__ __volatile__("cli; hlt"); - for (;;); + for (;;) + ; } diff --git a/bindings/muen/muen-sinfo.c b/bindings/muen/muen-sinfo.c index adf9031d8..773cf337f 100644 --- a/bindings/muen/muen-sinfo.c +++ b/bindings/muen/muen-sinfo.c @@ -38,8 +38,7 @@ static volatile struct scheduling_info_type *sched_info = bool muen_names_equal(const struct muen_name_type *const n1, const char *const n2) { - return n1->length == strlen(n2) - && strncmp(n1->data, n2, n1->length) == 0; + return n1->length == strlen(n2) && strncmp(n1->data, n2, n1->length) == 0; } struct iterator { @@ -64,8 +63,8 @@ static bool iterate_resources(struct iterator *const iter) iter->res++; iter->idx++; } - return iter->idx < sinfo->resource_count - && iter->res->kind != MUEN_RES_NONE; + return iter->idx < sinfo->resource_count && + iter->res->kind != MUEN_RES_NONE; } inline bool muen_check_magic(void) @@ -73,7 +72,7 @@ inline bool muen_check_magic(void) return sinfo->magic == MUEN_SUBJECT_INFO_MAGIC; } -const char * muen_get_subject_name(void) +const char *muen_get_subject_name(void) { if (!muen_check_magic()) return NULL; @@ -87,10 +86,10 @@ const char * muen_get_subject_name(void) return subject_name; } -const struct muen_resource_type * -muen_get_resource(const char *const name, enum muen_resource_kind kind) +const struct muen_resource_type *muen_get_resource(const char *const name, + enum muen_resource_kind kind) { - struct iterator i = { NULL, 0 }; + struct iterator i = {NULL, 0}; while (iterate_resources(&i)) if (i.res->kind == kind && muen_names_equal(&i.res->name, name)) @@ -99,13 +98,12 @@ muen_get_resource(const char *const name, enum muen_resource_kind kind) return NULL; } -const struct muen_device_type * muen_get_device(const uint16_t sid) +const struct muen_device_type *muen_get_device(const uint16_t sid) { - struct iterator i = { NULL, 0 }; + struct iterator i = {NULL, 0}; while (iterate_resources(&i)) - if (i.res->kind == MUEN_RES_DEVICE && - i.res->data.dev.sid == sid) + if (i.res->kind == MUEN_RES_DEVICE && i.res->data.dev.sid == sid) return &i.res->data.dev; return NULL; @@ -113,7 +111,7 @@ const struct muen_device_type * muen_get_device(const uint16_t sid) bool muen_for_each_resource(resource_cb func, void *data) { - struct iterator i = { NULL, 0 }; + struct iterator i = {NULL, 0}; while (iterate_resources(&i)) if (!func(i.res, data)) diff --git a/bindings/muen/mutimeinfo.h b/bindings/muen/mutimeinfo.h index 87caf7c6c..3d661f455 100644 --- a/bindings/muen/mutimeinfo.h +++ b/bindings/muen/mutimeinfo.h @@ -24,7 +24,7 @@ struct time_info_type { uint64_t tsc_time_base; uint64_t tsc_tick_rate_hz; - int64_t timezone_microsecs; + int64_t timezone_microsecs; } __attribute__((packed)); #endif diff --git a/bindings/muen/reader.c b/bindings/muen/reader.c index 20bbc5d66..3a22829a1 100644 --- a/bindings/muen/reader.c +++ b/bindings/muen/reader.c @@ -21,17 +21,17 @@ #include "reader.h" #include "util.h" -static bool has_epoch_changed(const struct muchannel * const channel, - const struct muchannel_reader * const reader) +static bool has_epoch_changed(const struct muchannel *const channel, + const struct muchannel_reader *const reader) { uint64_t epoch; serialized_copy(&channel->hdr.epoch, &epoch); return reader->epoch != epoch; } -static enum muchannel_reader_result synchronize( - const struct muchannel * const channel, - struct muchannel_reader *reader) +static enum muchannel_reader_result +synchronize(const struct muchannel *const channel, + struct muchannel_reader *reader) { enum muchannel_reader_result result; uint64_t proto, transport; @@ -39,8 +39,7 @@ static enum muchannel_reader_result synchronize( serialized_copy(&channel->hdr.protocol, &proto); serialized_copy(&channel->hdr.transport, &transport); - if (reader->protocol == proto && SHMSTREAM20 == transport) - { + if (reader->protocol == proto && SHMSTREAM20 == transport) { serialized_copy(&channel->hdr.epoch, &reader->epoch); serialized_copy(&channel->hdr.size, &reader->size); serialized_copy(&channel->hdr.elements, &reader->elements); @@ -53,7 +52,8 @@ static enum muchannel_reader_result synchronize( return result; } -void muen_channel_init_reader(struct muchannel_reader *reader, uint64_t protocol) +void muen_channel_init_reader(struct muchannel_reader *reader, + uint64_t protocol) { reader->epoch = MUCHANNEL_NULL_EPOCH; reader->protocol = protocol; @@ -62,10 +62,9 @@ void muen_channel_init_reader(struct muchannel_reader *reader, uint64_t protocol reader->rc = 0; } -enum muchannel_reader_result muen_channel_read( - const struct muchannel * const channel, - struct muchannel_reader *reader, - void *element) +enum muchannel_reader_result +muen_channel_read(const struct muchannel *const channel, + struct muchannel_reader *reader, void *element) { uint64_t epoch, pos, wc, wsc; enum muchannel_reader_result result; @@ -73,18 +72,15 @@ enum muchannel_reader_result muen_channel_read( if (muen_channel_is_active(channel)) { if (reader->epoch == MUCHANNEL_NULL_EPOCH || - has_epoch_changed(channel, reader)) + has_epoch_changed(channel, reader)) return synchronize(channel, reader); serialized_copy(&channel->hdr.wc, &wc); if (reader->rc == wc) result = MUCHANNEL_NO_DATA; - else if (wc - reader->rc > reader->elements) - { + else if (wc - reader->rc > reader->elements) { result = MUCHANNEL_OVERRUN_DETECTED; - } - else - { + } else { pos = reader->rc % reader->elements * reader->size; memcpy(element, channel->data + pos, reader->size); cc_barrier(); @@ -110,14 +106,14 @@ enum muchannel_reader_result muen_channel_read( return result; } -void muen_channel_drain(const struct muchannel * const channel, - struct muchannel_reader *reader) +void muen_channel_drain(const struct muchannel *const channel, + struct muchannel_reader *reader) { serialized_copy(&channel->hdr.wc, &reader->rc); } -bool muen_channel_has_pending_data(const struct muchannel * const channel, - struct muchannel_reader * reader) +bool muen_channel_has_pending_data(const struct muchannel *const channel, + struct muchannel_reader *reader) { enum muchannel_reader_result res; uint64_t wc; @@ -126,8 +122,7 @@ bool muen_channel_has_pending_data(const struct muchannel * const channel, return false; } if (MUCHANNEL_NULL_EPOCH == reader->epoch || - has_epoch_changed(channel, reader)) - { + has_epoch_changed(channel, reader)) { res = synchronize(channel, reader); if (MUCHANNEL_INCOMPATIBLE_INTERFACE == res) { return false; diff --git a/bindings/muen/reader.h b/bindings/muen/reader.h index 5bf7c733a..fbc1c65d0 100644 --- a/bindings/muen/reader.h +++ b/bindings/muen/reader.h @@ -43,26 +43,26 @@ struct muchannel_reader { /* * Initialize reader with given protocol. */ -void muen_channel_init_reader(struct muchannel_reader *reader, uint64_t protocol); +void muen_channel_init_reader(struct muchannel_reader *reader, + uint64_t protocol); /* * Read next element from given channel. */ -enum muchannel_reader_result muen_channel_read( - const struct muchannel * const channel, - struct muchannel_reader *reader, - void *element); +enum muchannel_reader_result +muen_channel_read(const struct muchannel *const channel, + struct muchannel_reader *reader, void *element); /* * Drain all current channel elements. */ -void muen_channel_drain(const struct muchannel * const channel, - struct muchannel_reader *reader); +void muen_channel_drain(const struct muchannel *const channel, + struct muchannel_reader *reader); /* * Returns True if there is pending data in the channel. */ -bool muen_channel_has_pending_data(const struct muchannel * const channel, - struct muchannel_reader *reader); +bool muen_channel_has_pending_data(const struct muchannel *const channel, + struct muchannel_reader *reader); #endif diff --git a/bindings/muen/sinfo.h b/bindings/muen/sinfo.h index 1757c7101..b4e9c98f2 100644 --- a/bindings/muen/sinfo.h +++ b/bindings/muen/sinfo.h @@ -21,7 +21,7 @@ #ifndef __MUEN_SINFO_H__ #define __MUEN_SINFO_H__ -#define MUEN_SUBJECT_INFO_MAGIC 0x04006f666e69756dULL +#define MUEN_SUBJECT_INFO_MAGIC 0x04006f666e69756dULL #define MAX_RESOURCE_COUNT 255 #define MAX_NAME_LENGTH 63 @@ -31,7 +31,7 @@ #define MEM_WRITABLE_FLAG (1 << 0) #define MEM_EXECUTABLE_FLAG (1 << 1) -#define DEV_MSI_FLAG (1 << 0) +#define DEV_MSI_FLAG (1 << 0) /* * Muen subject information API. @@ -92,7 +92,7 @@ struct muen_memregion_type { /* Required for explicit padding */ #define largest_variant_size sizeof(struct muen_memregion_type) -#define device_type_size 7 +#define device_type_size 7 /* Structure holding information about a PCI device */ struct muen_device_type { @@ -167,7 +167,7 @@ bool muen_check_magic(void); * * The function returns NULL if the subject name cannot be retrieved. */ -const char * muen_get_subject_name(void); +const char *muen_get_subject_name(void); /* * Return resource with given name and kind. @@ -183,7 +183,7 @@ muen_get_resource(const char *const name, enum muen_resource_kind kind); * The function returns null if no device information for the specified device * exists. */ -const struct muen_device_type * muen_get_device(const uint16_t sid); +const struct muen_device_type *muen_get_device(const uint16_t sid); /* * Resource callback. diff --git a/bindings/muen/start.c b/bindings/muen/start.c index 69a8c6ea5..3a684bef5 100644 --- a/bindings/muen/start.c +++ b/bindings/muen/start.c @@ -60,14 +60,10 @@ DECLARE_ELF_INTERP * * Solo5/Muen uses ABI version 2 as of Muen commit 2a64844. */ -ABI1_NOTE_DECLARE_BEGIN -{ - .abi_target = MUEN_ABI_TARGET, - .abi_version = 3 -} -ABI1_NOTE_DECLARE_END +ABI1_NOTE_DECLARE_BEGIN{.abi_target = MUEN_ABI_TARGET, + .abi_version = 3} ABI1_NOTE_DECLARE_END -/* - * Pretend that we are an OpenBSD executable. See elf_abi.h for details. - */ -DECLARE_OPENBSD_NOTE + /* + * Pretend that we are an OpenBSD executable. See elf_abi.h for details. + */ + DECLARE_OPENBSD_NOTE diff --git a/bindings/muen/util.h b/bindings/muen/util.h index 02540f876..2a863d6ce 100644 --- a/bindings/muen/util.h +++ b/bindings/muen/util.h @@ -23,7 +23,7 @@ #include "bindings.h" -static inline void serialized_copy(const uint64_t * const src, uint64_t *dst) +static inline void serialized_copy(const uint64_t *const src, uint64_t *dst) { cc_barrier(); *dst = *src; diff --git a/bindings/muen/writer.c b/bindings/muen/writer.c index b13377ca3..8ea52e3a5 100644 --- a/bindings/muen/writer.c +++ b/bindings/muen/writer.c @@ -22,9 +22,10 @@ #include "writer.h" #include "util.h" -void muen_channel_init_writer(struct muchannel *channel, const uint64_t protocol, - const uint64_t element_size, const uint64_t channel_size, - const uint64_t epoch) +void muen_channel_init_writer(struct muchannel *channel, + const uint64_t protocol, + const uint64_t element_size, + const uint64_t channel_size, const uint64_t epoch) { uint64_t data_size; @@ -34,11 +35,11 @@ void muen_channel_init_writer(struct muchannel *channel, const uint64_t protocol memset(channel->data, 0, data_size); channel->hdr.transport = SHMSTREAM20; - channel->hdr.protocol = protocol; - channel->hdr.size = element_size; - channel->hdr.elements = data_size / element_size; - channel->hdr.wsc = 0; - channel->hdr.wc = 0; + channel->hdr.protocol = protocol; + channel->hdr.size = element_size; + channel->hdr.elements = data_size / element_size; + channel->hdr.wsc = 0; + channel->hdr.wc = 0; serialized_copy(&epoch, &channel->hdr.epoch); } @@ -49,7 +50,7 @@ void muen_channel_deactivate(struct muchannel *channel) cc_barrier(); } -void muen_channel_write(struct muchannel *channel, const void * const element) +void muen_channel_write(struct muchannel *channel, const void *const element) { uint64_t wc, pos, size; diff --git a/bindings/muen/writer.h b/bindings/muen/writer.h index 90a8256ed..8e81553a1 100644 --- a/bindings/muen/writer.h +++ b/bindings/muen/writer.h @@ -26,9 +26,11 @@ /** * Initialize channel with given parameters. */ -void muen_channel_init_writer(struct muchannel *channel, const uint64_t protocol, - const uint64_t element_size, const uint64_t channel_size, - const uint64_t epoch); +void muen_channel_init_writer(struct muchannel *channel, + const uint64_t protocol, + const uint64_t element_size, + const uint64_t channel_size, + const uint64_t epoch); /** * Deactivate channel. @@ -38,6 +40,6 @@ void muen_channel_deactivate(struct muchannel *channel); /** * Write element to given channel. */ -void muen_channel_write(struct muchannel *channel, const void * const element); +void muen_channel_write(struct muchannel *channel, const void *const element); #endif diff --git a/bindings/printf.c b/bindings/printf.c index 7b003295d..026d90f7e 100644 --- a/bindings/printf.c +++ b/bindings/printf.c @@ -22,11 +22,12 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // -// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on -// embedded systems with a very limited resources. These routines are thread -// safe and reentrant! -// Use this instead of the bloated standard/newlib printf cause these use -// malloc for printf (and may not be thread safe). +// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for +// speed on +// embedded systems with a very limited resources. These routines are +// thread safe and reentrant! Use this instead of the bloated +// standard/newlib printf cause these use malloc for printf (and may not +// be thread safe). // /////////////////////////////////////////////////////////////////////////////// @@ -53,14 +54,14 @@ // numeric number including padded zeros (dynamically created on stack) // default: 32 byte #ifndef PRINTF_NTOA_BUFFER_SIZE -#define PRINTF_NTOA_BUFFER_SIZE 32U +#define PRINTF_NTOA_BUFFER_SIZE 32U #endif // 'ftoa' conversion buffer size, this must be big enough to hold one converted // float number including padded zeros (dynamically created on stack) // default: 32 byte #ifndef PRINTF_FTOA_BUFFER_SIZE -#define PRINTF_FTOA_BUFFER_SIZE 32U +#define PRINTF_FTOA_BUFFER_SIZE 32U #endif // support for the floating point type (%f) @@ -85,54 +86,61 @@ /////////////////////////////////////////////////////////////////////////////// // internal flag definitions -#define FLAGS_ZEROPAD (1U << 0U) -#define FLAGS_LEFT (1U << 1U) -#define FLAGS_PLUS (1U << 2U) -#define FLAGS_SPACE (1U << 3U) -#define FLAGS_HASH (1U << 4U) -#define FLAGS_UPPERCASE (1U << 5U) -#define FLAGS_CHAR (1U << 6U) -#define FLAGS_SHORT (1U << 7U) -#define FLAGS_LONG (1U << 8U) -#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) #define FLAGS_PRECISION (1U << 10U) // output function type -typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen); +typedef void (*out_fct_type)(char character, void *buffer, size_t idx, + size_t maxlen); // wrapper (used as buffer) for output function type typedef struct { - void (*fct)(char character, void* arg); - void* arg; + void (*fct)(char character, void *arg); + void *arg; } out_fct_wrap_type; // internal buffer output -static inline void _out_buffer(char character, void* buffer, size_t idx, size_t maxlen) +static inline void _out_buffer(char character, void *buffer, size_t idx, + size_t maxlen) { - if (idx < maxlen) { - ((char*)buffer)[idx] = character; - } + if (idx < maxlen) { + ((char *)buffer)[idx] = character; + } } // internal null output -static inline void _out_null(char character, void* buffer, size_t idx, size_t maxlen) +static inline void _out_null(char character, void *buffer, size_t idx, + size_t maxlen) { - (void)character; (void)buffer; (void)idx; (void)maxlen; + (void)character; + (void)buffer; + (void)idx; + (void)maxlen; } // internal secure strlen // \return The length of the string (excluding the terminating 0) // limited by 'max' size if non-zero -static inline unsigned int _strnlen_s(const char* str, size_t maxsize) +static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { - const char* s; - for (s = str; *s && maxsize--; ++s); - return (unsigned int)(s - str); + const char *s; + for (s = str; *s && maxsize--; ++s) + ; + return (unsigned int)(s - str); } @@ -140,583 +148,639 @@ static inline unsigned int _strnlen_s(const char* str, size_t maxsize) // \return true if char is a digit static inline bool _is_digit(char ch) { - return (ch >= '0') && (ch <= '9'); + return (ch >= '0') && (ch <= '9'); } // internal ASCII string to unsigned int conversion -static unsigned int _atoi(const char** str) +static unsigned int _atoi(const char **str) { - unsigned int i = 0U; - while (_is_digit(**str)) { - i = i * 10U + (unsigned int)(*((*str)++) - '0'); - } - return i; + unsigned int i = 0U; + while (_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; } // internal itoa format -static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen, char* buf, size_t len, bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) +static size_t _ntoa_format(out_fct_type out, char *buffer, size_t idx, + size_t maxlen, char *buf, size_t len, bool negative, + unsigned int base, unsigned int prec, + unsigned int width, unsigned int flags) { - const size_t start_idx = idx; + const size_t start_idx = idx; - // pad leading zeros - if (!(flags & FLAGS_LEFT)) { - if (width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { - width--; - } - while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = '0'; - } - while ((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = '0'; - } - } - - // handle hash - if (flags & FLAGS_HASH) { - if (!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { - len--; - if (len && (base == 16U)) { - len--; - } - } - if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = 'x'; - } - else if ((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = 'X'; + // pad leading zeros + if (!(flags & FLAGS_LEFT)) { + if (width && (flags & FLAGS_ZEROPAD) && + (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while ((flags & FLAGS_ZEROPAD) && (len < width) && + (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } } - else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { - buf[len++] = 'b'; + + // handle hash + if (flags & FLAGS_HASH) { + if (!(flags & FLAGS_PRECISION) && len && + ((len == prec) || (len == width))) { + len--; + if (len && (base == 16U)) { + len--; + } + } + if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && + (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } else if ((base == 16U) && (flags & FLAGS_UPPERCASE) && + (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'b'; + } + if (len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } } + if (len < PRINTF_NTOA_BUFFER_SIZE) { - buf[len++] = '0'; + if (negative) { + buf[len++] = '-'; + } else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } } - } - if (len < PRINTF_NTOA_BUFFER_SIZE) { - if (negative) { - buf[len++] = '-'; - } - else if (flags & FLAGS_PLUS) { - buf[len++] = '+'; // ignore the space if the '+' exists - } - else if (flags & FLAGS_SPACE) { - buf[len++] = ' '; + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } } - } - // pad spaces up to given width - if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { - for (size_t i = len; i < width; i++) { - out(' ', buffer, idx++, maxlen); + // reverse string + for (size_t i = 0U; i < len; i++) { + out(buf[len - i - 1U], buffer, idx++, maxlen); } - } - - // reverse string - for (size_t i = 0U; i < len; i++) { - out(buf[len - i - 1U], buffer, idx++, maxlen); - } - // append pad spaces up to given width - if (flags & FLAGS_LEFT) { - while (idx - start_idx < width) { - out(' ', buffer, idx++, maxlen); + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } } - } - return idx; + return idx; } // internal itoa for 'long' type -static size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) +static size_t _ntoa_long(out_fct_type out, char *buffer, size_t idx, + size_t maxlen, unsigned long value, bool negative, + unsigned long base, unsigned int prec, + unsigned int width, unsigned int flags) { - char buf[PRINTF_NTOA_BUFFER_SIZE]; - size_t len = 0U; - - // no hash for 0 values - if (!value) { - flags &= ~FLAGS_HASH; - } - - // write if precision != 0 and value is != 0 - if (!(flags & FLAGS_PRECISION) || value) { - do { - const char digit = (char)(value % base); - buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; - value /= base; - } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); - } - - return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = + digit < 10 ? '0' + digit + : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, + (unsigned int)base, prec, width, flags); } // internal itoa for 'long long' type #if defined(PRINTF_SUPPORT_LONG_LONG) -static size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long long value, bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) +static size_t _ntoa_long_long(out_fct_type out, char *buffer, size_t idx, + size_t maxlen, unsigned long long value, + bool negative, unsigned long long base, + unsigned int prec, unsigned int width, + unsigned int flags) { - char buf[PRINTF_NTOA_BUFFER_SIZE]; - size_t len = 0U; - - // no hash for 0 values - if (!value) { - flags &= ~FLAGS_HASH; - } - - // write if precision != 0 and value is != 0 - if (!(flags & FLAGS_PRECISION) || value) { - do { - const char digit = (char)(value % base); - buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; - value /= base; - } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); - } - - return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = + digit < 10 ? '0' + digit + : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, + (unsigned int)base, prec, width, flags); } -#endif // PRINTF_SUPPORT_LONG_LONG +#endif // PRINTF_SUPPORT_LONG_LONG #if defined(PRINTF_SUPPORT_FLOAT) -static size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags) +static size_t _ftoa(out_fct_type out, char *buffer, size_t idx, size_t maxlen, + double value, unsigned int prec, unsigned int width, + unsigned int flags) { - const size_t start_idx = idx; + const size_t start_idx = idx; - char buf[PRINTF_FTOA_BUFFER_SIZE]; - size_t len = 0U; - double diff = 0.0; + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; - // if input is larger than thres_max, revert to exponential - const double thres_max = (double)0x7FFFFFFF; + // if input is larger than thres_max, revert to exponential + const double thres_max = (double)0x7FFFFFFF; - // powers of 10 - static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + // powers of 10 + static const double pow10[] = {1, 10, 100, 1000, + 10000, 100000, 1000000, 10000000, + 100000000, 1000000000}; - // test for NaN - if (value != value) { - out('n', buffer, idx++, maxlen); - out('a', buffer, idx++, maxlen); - out('n', buffer, idx++, maxlen); - return idx; - } - - // test for negative - bool negative = false; - if (value < 0) { - negative = true; - value = 0 - value; - } - - // set default precision to 6, if not set explicitly - if (!(flags & FLAGS_PRECISION)) { - prec = 6U; - } - // limit precision to 9, cause a prec >= 10 can lead to overflow errors - while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { - buf[len++] = '0'; - prec--; - } - - int whole = (int)value; - double tmp = (value - whole) * pow10[prec]; - unsigned long frac = (unsigned long)tmp; - diff = tmp - frac; - - if (diff > 0.5) { - ++frac; - // handle rollover, e.g. case 0.99 with prec 1 is 1.0 - if (frac >= pow10[prec]) { - frac = 0; - ++whole; - } - } - else if (diff < 0.5) { - } - else if ((frac == 0U) || (frac & 1U)) { - // if halfway, round up if odd OR if last digit is 0 - ++frac; - } - - // TBD: for very large numbers switch back to native sprintf for exponentials. Anyone want to write code to replace this? - // Normal printf behavior is to print EVERY whole number digit which can be 100s of characters overflowing your buffers == bad - if (value > thres_max) { - return 0U; - } - - if (prec == 0U) { - diff = value - (double)whole; - if (diff > 0.5) { - // greater than 0.5, round up, e.g. 1.6 -> 2 - ++whole; + // test for NaN + if (value != value) { + out('n', buffer, idx++, maxlen); + out('a', buffer, idx++, maxlen); + out('n', buffer, idx++, maxlen); + return idx; } - else if ((diff == 0.5) && (whole & 1)) { - // exactly 0.5 and ODD, then round up - // 1.5 -> 2, but 2.5 -> 2 - ++whole; - } - } - else { - unsigned int count = prec; - // now do fractional part, as an unsigned number - while (len < PRINTF_FTOA_BUFFER_SIZE) { - --count; - buf[len++] = (char)(48U + (frac % 10U)); - if (!(frac /= 10U)) { - break; - } + + // test for negative + bool negative = false; + if (value < 0) { + negative = true; + value = 0 - value; } - // add extra 0s - while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { - buf[len++] = '0'; + + // set default precision to 6, if not set explicitly + if (!(flags & FLAGS_PRECISION)) { + prec = 6U; } - if (len < PRINTF_FTOA_BUFFER_SIZE) { - // add decimal - buf[len++] = '.'; + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { + buf[len++] = '0'; + prec--; } - } - // do whole part, number is reversed - while (len < PRINTF_FTOA_BUFFER_SIZE) { - buf[len++] = (char)(48 + (whole % 10)); - if (!(whole /= 10)) { - break; - } - } + int whole = (int)value; + double tmp = (value - whole) * pow10[prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; - // pad leading zeros - if (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { - if (width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { - width--; - } - while ((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { - buf[len++] = '0'; + if (diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if (frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } else if (diff < 0.5) { + } else if ((frac == 0U) || (frac & 1U)) { + // if halfway, round up if odd OR if last digit is 0 + ++frac; + } + + // TBD: for very large numbers switch back to native sprintf for + // exponentials. Anyone want to write code to replace this? Normal printf + // behavior is to print EVERY whole number digit which can be 100s of + // characters overflowing your buffers == bad + if (value > thres_max) { + return 0U; + } + + if (prec == 0U) { + diff = value - (double)whole; + if (diff > 0.5) { + // greater than 0.5, round up, e.g. 1.6 -> 2 + ++whole; + } else if ((diff == 0.5) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while (len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if (!(frac /= 10U)) { + break; + } + } + // add extra 0s + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if (len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } } - } - if (len < PRINTF_FTOA_BUFFER_SIZE) { - if (negative) { - buf[len++] = '-'; + // do whole part, number is reversed + while (len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if (!(whole /= 10)) { + break; + } } - else if (flags & FLAGS_PLUS) { - buf[len++] = '+'; // ignore the space if the '+' exists + + // pad leading zeros + if (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { + if (width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while ((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } } - else if (flags & FLAGS_SPACE) { - buf[len++] = ' '; + + if (len < PRINTF_FTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } } - } - // pad spaces up to given width - if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { - for (size_t i = len; i < width; i++) { - out(' ', buffer, idx++, maxlen); + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } } - } - // reverse string - for (size_t i = 0U; i < len; i++) { - out(buf[len - i - 1U], buffer, idx++, maxlen); - } + // reverse string + for (size_t i = 0U; i < len; i++) { + out(buf[len - i - 1U], buffer, idx++, maxlen); + } - // append pad spaces up to given width - if (flags & FLAGS_LEFT) { - while (idx - start_idx < width) { - out(' ', buffer, idx++, maxlen); + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } } - } - return idx; + return idx; } -#endif // PRINTF_SUPPORT_FLOAT +#endif // PRINTF_SUPPORT_FLOAT // internal vsnprintf -static int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va) +static int _vsnprintf(out_fct_type out, char *buffer, const size_t maxlen, + const char *format, va_list va) { - unsigned int flags, width, precision, n; - size_t idx = 0U; - - if (!buffer) { - // use null output function - out = _out_null; - } - - while (*format) - { - // format specifier? %[flags][width][.precision][length] - if (*format != '%') { - // no - out(*format, buffer, idx++, maxlen); - format++; - continue; - } - else { - // yes, evaluate it - format++; - } - - // evaluate flags - flags = 0U; - do { - switch (*format) { - case '0': flags |= FLAGS_ZEROPAD; format++; n = 1U; break; - case '-': flags |= FLAGS_LEFT; format++; n = 1U; break; - case '+': flags |= FLAGS_PLUS; format++; n = 1U; break; - case ' ': flags |= FLAGS_SPACE; format++; n = 1U; break; - case '#': flags |= FLAGS_HASH; format++; n = 1U; break; - default : n = 0U; break; - } - } while (n); - - // evaluate width field - width = 0U; - if (_is_digit(*format)) { - width = _atoi(&format); - } - else if (*format == '*') { - const int w = va_arg(va, int); - if (w < 0) { - flags |= FLAGS_LEFT; // reverse padding - width = (unsigned int)-w; - } - else { - width = (unsigned int)w; - } - format++; - } - - // evaluate precision field - precision = 0U; - if (*format == '.') { - flags |= FLAGS_PRECISION; - format++; - if (_is_digit(*format)) { - precision = _atoi(&format); - } - else if (*format == '*') { - const int prec = (int)va_arg(va, int); - precision = prec > 0 ? (unsigned int)prec : 0U; - format++; - } - } - - // evaluate length field - switch (*format) { - case 'l' : - flags |= FLAGS_LONG; - format++; - if (*format == 'l') { - flags |= FLAGS_LONG_LONG; - format++; - } - break; - case 'h' : - flags |= FLAGS_SHORT; - format++; - if (*format == 'h') { - flags |= FLAGS_CHAR; - format++; + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if (!buffer) { + // use null output function + out = _out_null; + } + + while (*format) { + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } else { + // yes, evaluate it + format++; } - break; -#if defined(PRINTF_SUPPORT_PTRDIFF_T) - case 't' : - flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); - format++; - break; -#endif - case 'j' : - flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); - format++; - break; - case 'z' : - flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); - format++; - break; - default : - break; - } - // evaluate specifier - switch (*format) { - case 'd' : - case 'i' : - case 'u' : - case 'x' : - case 'X' : - case 'o' : - case 'b' : { - // set the base - unsigned int base; - if (*format == 'x' || *format == 'X') { - base = 16U; - } - else if (*format == 'o') { - base = 8U; - } - else if (*format == 'b') { - base = 2U; - } - else { - base = 10U; - flags &= ~FLAGS_HASH; // no hash for dec format - } - // uppercase - if (*format == 'X') { - flags |= FLAGS_UPPERCASE; + // evaluate flags + flags = 0U; + do { + switch (*format) { + case '0': + flags |= FLAGS_ZEROPAD; + format++; + n = 1U; + break; + case '-': + flags |= FLAGS_LEFT; + format++; + n = 1U; + break; + case '+': + flags |= FLAGS_PLUS; + format++; + n = 1U; + break; + case ' ': + flags |= FLAGS_SPACE; + format++; + n = 1U; + break; + case '#': + flags |= FLAGS_HASH; + format++; + n = 1U; + break; + default: + n = 0U; + break; + } + } while (n); + + // evaluate width field + width = 0U; + if (_is_digit(*format)) { + width = _atoi(&format); + } else if (*format == '*') { + const int w = va_arg(va, int); + if (w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int)-w; + } else { + width = (unsigned int)w; + } + format++; } - // no plus or space flag for u, x, X, o, b - if ((*format != 'i') && (*format != 'd')) { - flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + // evaluate precision field + precision = 0U; + if (*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if (_is_digit(*format)) { + precision = _atoi(&format); + } else if (*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + format++; + } } - // ignore '0' flag when precision is given - if (flags & FLAGS_PRECISION) { - flags &= ~FLAGS_ZEROPAD; + // evaluate length field + switch (*format) { + case 'l': + flags |= FLAGS_LONG; + format++; + if (*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h': + flags |= FLAGS_SHORT; + format++; + if (*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't': + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG + : FLAGS_LONG_LONG); + format++; + break; +#endif + case 'j': + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG + : FLAGS_LONG_LONG); + format++; + break; + case 'z': + flags |= + (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default: + break; } - // convert the integer - if ((*format == 'i') || (*format == 'd')) { - // signed - if (flags & FLAGS_LONG_LONG) { + // evaluate specifier + switch (*format) { + case 'd': + case 'i': + case 'u': + case 'x': + case 'X': + case 'o': + case 'b': { + // set the base + unsigned int base; + if (*format == 'x' || *format == 'X') { + base = 16U; + } else if (*format == 'o') { + base = 8U; + } else if (*format == 'b') { + base = 2U; + } else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if (*format == 'X') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if ((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if (flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if ((*format == 'i') || (*format == 'd')) { + // signed + if (flags & FLAGS_LONG_LONG) { #if defined(PRINTF_SUPPORT_LONG_LONG) - const long long value = va_arg(va, long long); - idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); + const long long value = va_arg(va, long long); + idx = _ntoa_long_long( + out, buffer, idx, maxlen, + (unsigned long long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); #endif - } - else if (flags & FLAGS_LONG) { - const long value = va_arg(va, long); - idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); - } - else { - const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) : va_arg(va, int); - idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); - } - } - else { - // unsigned - if (flags & FLAGS_LONG_LONG) { + } else if (flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = _ntoa_long( + out, buffer, idx, maxlen, + (unsigned long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); + } else { + const int value = + (flags & FLAGS_CHAR) ? (char)va_arg(va, int) + : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) + : va_arg(va, int); + idx = _ntoa_long( + out, buffer, idx, maxlen, + (unsigned int)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); + } + } else { + // unsigned + if (flags & FLAGS_LONG_LONG) { #if defined(PRINTF_SUPPORT_LONG_LONG) - idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); + idx = _ntoa_long_long(out, buffer, idx, maxlen, + va_arg(va, unsigned long long), false, + base, precision, width, flags); #endif - } - else if (flags & FLAGS_LONG) { - idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); - } - else { - const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); - idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); - } + } else if (flags & FLAGS_LONG) { + idx = _ntoa_long(out, buffer, idx, maxlen, + va_arg(va, unsigned long), false, base, + precision, width, flags); + } else { + const unsigned int value = + (flags & FLAGS_CHAR) + ? (unsigned char)va_arg(va, unsigned int) + : (flags & FLAGS_SHORT) + ? (unsigned short int)va_arg(va, unsigned int) + : va_arg(va, unsigned int); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, + base, precision, width, flags); + } + } + format++; + break; } - format++; - break; - } #if defined(PRINTF_SUPPORT_FLOAT) - case 'f' : - case 'F' : - idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); - format++; - break; -#endif // PRINTF_SUPPORT_FLOAT - case 'c' : { - unsigned int l = 1U; - // pre padding - if (!(flags & FLAGS_LEFT)) { - while (l++ < width) { - out(' ', buffer, idx++, maxlen); - } - } - // char output - out((char)va_arg(va, int), buffer, idx++, maxlen); - // post padding - if (flags & FLAGS_LEFT) { - while (l++ < width) { - out(' ', buffer, idx++, maxlen); - } + case 'f': + case 'F': + idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, + width, flags); + format++; + break; +#endif // PRINTF_SUPPORT_FLOAT + case 'c': { + unsigned int l = 1U; + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, maxlen); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; } - format++; - break; - } - - case 's' : { - char* p = va_arg(va, char*); - unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); - // pre padding - if (flags & FLAGS_PRECISION) { - l = (l < precision ? l : precision); - } - if (!(flags & FLAGS_LEFT)) { - while (l++ < width) { - out(' ', buffer, idx++, maxlen); - } - } - // string output - while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { - out(*(p++), buffer, idx++, maxlen); - } - // post padding - if (flags & FLAGS_LEFT) { - while (l++ < width) { - out(' ', buffer, idx++, maxlen); - } + + case 's': { + char *p = va_arg(va, char *); + unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); + // pre padding + if (flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; } - format++; - break; - } - case 'p' : { - width = sizeof(void*) * 2U; - flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; + case 'p': { + width = sizeof(void *) * 2U; + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; #if defined(PRINTF_SUPPORT_LONG_LONG) - const bool is_ll = sizeof(uintptr_t) == sizeof(long long); - if (is_ll) { - idx = _ntoa_long_long(out, buffer, idx, maxlen, (uintptr_t)va_arg(va, void*), false, 16U, precision, width, flags); - } - else { + const bool is_ll = sizeof(uintptr_t) == sizeof(long long); + if (is_ll) { + idx = _ntoa_long_long(out, buffer, idx, maxlen, + (uintptr_t)va_arg(va, void *), false, 16U, + precision, width, flags); + } else { #endif - idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)((uintptr_t)va_arg(va, void*)), false, 16U, precision, width, flags); + idx = _ntoa_long(out, buffer, idx, maxlen, + (unsigned long)((uintptr_t)va_arg(va, void *)), + false, 16U, precision, width, flags); #if defined(PRINTF_SUPPORT_LONG_LONG) - } + } #endif - format++; - break; - } - - case '%' : - out('%', buffer, idx++, maxlen); - format++; - break; - - default : - out(*format, buffer, idx++, maxlen); - format++; - break; + format++; + break; + } + + case '%': + out('%', buffer, idx++, maxlen); + format++; + break; + + default: + out(*format, buffer, idx++, maxlen); + format++; + break; + } } - } - // termination - out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); - // return written chars without terminating \0 - return (int)idx; + // return written chars without terminating \0 + return (int)idx; } /////////////////////////////////////////////////////////////////////////////// -int snprintf(char* buffer, size_t count, const char* format, ...) +int snprintf(char *buffer, size_t count, const char *format, ...) { - va_list va; - va_start(va, format); - const int ret = _vsnprintf(_out_buffer, buffer, count, format, va); - va_end(va); - return ret; + va_list va; + va_start(va, format); + const int ret = _vsnprintf(_out_buffer, buffer, count, format, va); + va_end(va); + return ret; } -int vsnprintf(char* buffer, size_t count, const char* format, va_list va) +int vsnprintf(char *buffer, size_t count, const char *format, va_list va) { - return _vsnprintf(_out_buffer, buffer, count, format, va); + return _vsnprintf(_out_buffer, buffer, count, format, va); } diff --git a/bindings/printf.h b/bindings/printf.h index 1579ab35c..35d89d472 100644 --- a/bindings/printf.h +++ b/bindings/printf.h @@ -10,10 +10,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -22,7 +22,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // -// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on +// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed +// on // embedded systems with a very limited resources. // Use this instead of bloated standard/newlib printf. // These routines are thread safe and reentrant. @@ -44,13 +45,15 @@ extern "C" { /** * Tiny snprintf/vsnprintf implementation * \param buffer A pointer to the buffer where to store the formatted string - * \param count The maximum number of characters to store in the buffer, including a terminating null character + * \param count The maximum number of characters to store in the buffer, + * including a terminating null character * \param format A string that specifies the format of the output - * \return The number of characters that are WRITTEN into the buffer, not counting the terminating null character - * If the formatted string is truncated the buffer size (count) is returned + * \return The number of characters that are WRITTEN into the buffer, not + * counting the terminating null character If the formatted string is truncated + * the buffer size (count) is returned */ -int snprintf(char* buffer, size_t count, const char* format, ...); -int vsnprintf(char* buffer, size_t count, const char* format, va_list va); +int snprintf(char *buffer, size_t count, const char *format, ...); +int vsnprintf(char *buffer, size_t count, const char *format, va_list va); #ifdef __cplusplus @@ -58,4 +61,4 @@ int vsnprintf(char* buffer, size_t count, const char* format, va_list va); #endif -#endif // _PRINTF_H_ +#endif // _PRINTF_H_ diff --git a/bindings/spt/bindings.h b/bindings/spt/bindings.h index c65d00628..4e199e1a5 100644 --- a/bindings/spt/bindings.h +++ b/bindings/spt/bindings.h @@ -50,12 +50,12 @@ struct sys_itimerspec { struct sys_timespec it_value; }; -#define SYS_CLOCK_REALTIME 0 +#define SYS_CLOCK_REALTIME 0 #define SYS_CLOCK_MONOTONIC 1 long sys_clock_gettime(const long which, void *ts); -#define SYS_EINTR -4 +#define SYS_EINTR -4 #define SYS_EAGAIN -11 /* @@ -73,13 +73,13 @@ struct sys_epoll_event { } EPOLL_PACKED; long sys_epoll_pwait(long epfd, void *events, long maxevents, long timeout, - void *sigmask, long sigsetsize); + void *sigmask, long sigsetsize); #define SYS_TFD_TIMER_ABSTIME (1 << 0) long sys_timerfd_settime(long fd, long flags, const void *utmr, void *otmr); -#define SYS_ARCH_SET_FS 0x1002 +#define SYS_ARCH_SET_FS 0x1002 long sys_arch_prctl(long code, long addr); diff --git a/bindings/spt/block.c b/bindings/spt/block.c index cdc2b940e..bebc3dd2b 100644 --- a/bindings/spt/block.c +++ b/bindings/spt/block.c @@ -28,7 +28,7 @@ void block_init(struct spt_boot_info *bi) } solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *handle, - struct solo5_block_info *info) + struct solo5_block_info *info) { unsigned index; const struct mft_entry *e = @@ -44,7 +44,7 @@ solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *handle, } solo5_result_t solo5_block_read(solo5_handle_t handle, solo5_off_t offset, - uint8_t *buf, size_t size) + uint8_t *buf, size_t size) { const struct mft_entry *e = mft_get_by_index(mft, handle, MFT_DEV_BLOCK_BASIC); @@ -55,11 +55,11 @@ solo5_result_t solo5_block_read(solo5_handle_t handle, solo5_off_t offset, * Note that reads beyond capacity are additionally enforced by the * tender's seccomp policy. */ - if(size != e->u.block_basic.block_size) + if (size != e->u.block_basic.block_size) return SOLO5_R_EINVAL; - if(offset & (e->u.block_basic.block_size - 1)) + if (offset & (e->u.block_basic.block_size - 1)) return SOLO5_R_EINVAL; - if(offset > (e->u.block_basic.capacity - e->u.block_basic.block_size)) + if (offset > (e->u.block_basic.capacity - e->u.block_basic.block_size)) return SOLO5_R_EINVAL; long nbytes = sys_pread64(e->b.hostfd, (char *)buf, size, offset); @@ -68,7 +68,7 @@ solo5_result_t solo5_block_read(solo5_handle_t handle, solo5_off_t offset, } solo5_result_t solo5_block_write(solo5_handle_t handle, solo5_off_t offset, - const uint8_t *buf, size_t size) + const uint8_t *buf, size_t size) { const struct mft_entry *e = mft_get_by_index(mft, handle, MFT_DEV_BLOCK_BASIC); @@ -79,11 +79,11 @@ solo5_result_t solo5_block_write(solo5_handle_t handle, solo5_off_t offset, * Note that writes beyond capacity are additionally enforced by the * tender's seccomp policy. */ - if(size != e->u.block_basic.block_size) + if (size != e->u.block_basic.block_size) return SOLO5_R_EINVAL; - if(offset & (e->u.block_basic.block_size - 1)) + if (offset & (e->u.block_basic.block_size - 1)) return SOLO5_R_EINVAL; - if(offset > (e->u.block_basic.capacity - e->u.block_basic.block_size)) + if (offset > (e->u.block_basic.capacity - e->u.block_basic.block_size)) return SOLO5_R_EINVAL; long nbytes = sys_pwrite64(e->b.hostfd, (const char *)buf, size, offset); diff --git a/bindings/spt/net.c b/bindings/spt/net.c index a993e7abd..4f7138cf8 100644 --- a/bindings/spt/net.c +++ b/bindings/spt/net.c @@ -39,7 +39,7 @@ void net_init(struct spt_boot_info *bi) } solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *handle, - struct solo5_net_info *info) + struct solo5_net_info *info) { unsigned index; const struct mft_entry *e = @@ -50,13 +50,12 @@ solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *handle, *handle = index; info->mtu = e->u.net_basic.mtu; - memcpy(info->mac_address, e->u.net_basic.mac, - sizeof info->mac_address); + memcpy(info->mac_address, e->u.net_basic.mac, sizeof info->mac_address); return SOLO5_R_OK; } solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, size_t size, - size_t *read_size) + size_t *read_size) { const struct mft_entry *e = mft_get_by_index(mft, handle, MFT_DEV_NET_BASIC); @@ -76,7 +75,7 @@ solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, size_t size, } solo5_result_t solo5_net_write(solo5_handle_t handle, const uint8_t *buf, - size_t size) + size_t size) { const struct mft_entry *e = mft_get_by_index(mft, handle, MFT_DEV_NET_BASIC); @@ -100,12 +99,9 @@ void solo5_yield(solo5_time_t deadline, solo5_handle_set_t *ready_set) struct sys_epoll_event revents[nevents]; solo5_handle_set_t tmp_ready_set = 0; struct sys_itimerspec it = { - .it_interval = { 0 }, - .it_value = { - .tv_sec = deadline / 1000000000ULL, - .tv_nsec = deadline % 1000000000ULL - } - }; + .it_interval = {0}, + .it_value = {.tv_sec = deadline / 1000000000ULL, + .tv_nsec = deadline % 1000000000ULL}}; /* * Ensure that it.it_value is always non-zero, otherwise the following * epoll_wait() will hang if there are no other descriptors in the waitset @@ -117,7 +113,8 @@ void solo5_yield(solo5_time_t deadline, solo5_handle_set_t *ready_set) * we can just pass the deadline into the timerfd as an absolute timeout, * saving a clock_gettime() call in the process. */ - assert(sys_timerfd_settime(timerfd, SYS_TFD_TIMER_ABSTIME, &it, NULL) != -1); + assert(sys_timerfd_settime(timerfd, SYS_TFD_TIMER_ABSTIME, &it, NULL) != + -1); /* * We can always safely restart this call on EINTR, since the internal * timerfd is independent of its invocation. @@ -129,7 +126,7 @@ void solo5_yield(solo5_time_t deadline, solo5_handle_set_t *ready_set) int orig_nrevents = nrevents; for (int i = 0; i < orig_nrevents; i++) if (revents[i].data == SPT_INTERNAL_TIMERFD) - nrevents -= 1; /* Disregard in total reported events */ + nrevents -= 1; /* Disregard in total reported events */ else tmp_ready_set |= 1ULL << revents[i].data; } diff --git a/bindings/spt/start.c b/bindings/spt/start.c index 52b2e5c1c..c7c169fa8 100644 --- a/bindings/spt/start.c +++ b/bindings/spt/start.c @@ -55,14 +55,10 @@ DECLARE_ELF_INTERP /* * The "ABI1" Solo5 ELF note is declared in this module. */ -ABI1_NOTE_DECLARE_BEGIN -{ - .abi_target = SPT_ABI_TARGET, - .abi_version = SPT_ABI_VERSION -} -ABI1_NOTE_DECLARE_END +ABI1_NOTE_DECLARE_BEGIN{.abi_target = SPT_ABI_TARGET, + .abi_version = SPT_ABI_VERSION} ABI1_NOTE_DECLARE_END -/* - * Pretend that we are an OpenBSD executable. See elf_abi.h for details. - */ -DECLARE_OPENBSD_NOTE + /* + * Pretend that we are an OpenBSD executable. See elf_abi.h for details. + */ + DECLARE_OPENBSD_NOTE diff --git a/bindings/spt/sys_linux_aarch64.c b/bindings/spt/sys_linux_aarch64.c index 984ee9230..d8954d7f1 100644 --- a/bindings/spt/sys_linux_aarch64.c +++ b/bindings/spt/sys_linux_aarch64.c @@ -30,13 +30,13 @@ * also consider explicitly inlining these functions. */ -#define SYS_read 63 -#define SYS_write 64 -#define SYS_pread64 67 -#define SYS_pwrite64 68 -#define SYS_clock_gettime 113 -#define SYS_exit_group 94 -#define SYS_epoll_pwait 22 +#define SYS_read 63 +#define SYS_write 64 +#define SYS_pread64 67 +#define SYS_pwrite64 68 +#define SYS_clock_gettime 113 +#define SYS_exit_group 94 +#define SYS_epoll_pwait 22 #define SYS_timerfd_settime 86 long sys_read(long fd, void *buf, long size) @@ -46,12 +46,10 @@ long sys_read(long fd, void *buf, long size) register long x1 __asm__("x1") = (long)buf; register long x2 __asm__("x2") = size; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0), "r" (x1), "r" (x2) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0), "r"(x1), "r"(x2) + : "memory", "cc"); return x0; } @@ -63,12 +61,10 @@ long sys_write(long fd, const void *buf, long size) register long x1 __asm__("x1") = (long)buf; register long x2 __asm__("x2") = size; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0), "r" (x1), "r" (x2) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0), "r"(x1), "r"(x2) + : "memory", "cc"); return x0; } @@ -81,12 +77,10 @@ long sys_pread64(long fd, void *buf, long size, long pos) register long x2 __asm__("x2") = size; register long x3 __asm__("x3") = pos; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0), "r" (x1), "r" (x2), "r" (x3) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3) + : "memory", "cc"); return x0; } @@ -99,12 +93,10 @@ long sys_pwrite64(long fd, const void *buf, long size, long pos) register long x2 __asm__("x2") = size; register long x3 __asm__("x3") = pos; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0), "r" (x1), "r" (x2), "r" (x3) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3) + : "memory", "cc"); return x0; } @@ -114,14 +106,13 @@ void sys_exit_group(long status) register long x8 __asm__("x8") = SYS_exit_group; register long x0 __asm__("x0") = status; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0) + : "memory", "cc"); - for(;;); + for (;;) + ; } long sys_clock_gettime(const long which, void *ts) @@ -130,18 +121,16 @@ long sys_clock_gettime(const long which, void *ts) register long x0 __asm__("x0") = which; register long x1 __asm__("x1") = (long)ts; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0), "r" (x1) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0), "r"(x1) + : "memory", "cc"); return x0; } long sys_epoll_pwait(long epfd, void *events, long maxevents, long timeout, - void *sigmask, long sigsetsize) + void *sigmask, long sigsetsize) { register long x8 __asm__("x8") = SYS_epoll_pwait; register long x0 __asm__("x0") = epfd; @@ -151,13 +140,11 @@ long sys_epoll_pwait(long epfd, void *events, long maxevents, long timeout, register long x4 __asm__("x4") = (long)sigmask; register long x5 __asm__("x5") = sigsetsize; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0), "r" (x1), "r" (x2), "r" (x3), "r" (x4), - "r" (x5) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), + "r"(x5) + : "memory", "cc"); return x0; } @@ -170,12 +157,10 @@ long sys_timerfd_settime(long fd, long flags, const void *utmr, void *otmr) register long x2 __asm__("x2") = (long)utmr; register long x3 __asm__("x3") = (long)otmr; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) - : "r" (x8), "r" (x0), "r" (x1), "r" (x2), "r" (x3) - : "memory", "cc" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x0), "r"(x1), "r"(x2), "r"(x3) + : "memory", "cc"); return x0; } diff --git a/bindings/spt/sys_linux_ppc64le.c b/bindings/spt/sys_linux_ppc64le.c index 358fd3f2a..06a4baa58 100644 --- a/bindings/spt/sys_linux_ppc64le.c +++ b/bindings/spt/sys_linux_ppc64le.c @@ -27,13 +27,13 @@ * (void *). */ -#define SYS_read 3 -#define SYS_write 4 -#define SYS_pread64 179 -#define SYS_pwrite64 180 -#define SYS_clock_gettime 246 -#define SYS_exit_group 234 -#define SYS_epoll_pwait 303 +#define SYS_read 3 +#define SYS_write 4 +#define SYS_pread64 179 +#define SYS_pwrite64 180 +#define SYS_clock_gettime 246 +#define SYS_exit_group 234 +#define SYS_epoll_pwait 303 #define SYS_timerfd_settime 311 long sys_read(long fd, void *buf, long size) @@ -44,13 +44,11 @@ long sys_read(long fd, void *buf, long size) register long r5 __asm__("r5") = size; long cr; - __asm__ __volatile__ ( - "sc\n\t" - "mfcr %1" - : "=r" (r3), "=&r" (cr) - : "r" (r0), "r" (r3), "r" (r4), "r" (r5) - : "memory", "cc" - ); + __asm__ __volatile__("sc\n\t" + "mfcr %1" + : "=r"(r3), "=&r"(cr) + : "r"(r0), "r"(r3), "r"(r4), "r"(r5) + : "memory", "cc"); if (cr & CR0_SO) r3 = -r3; @@ -65,13 +63,11 @@ long sys_write(long fd, const void *buf, long size) register long r5 __asm__("r5") = size; long cr; - __asm__ __volatile__ ( - "sc\n\t" - "mfcr %1" - : "=r" (r3), "=&r" (cr) - : "r" (r0), "r" (r3), "r" (r4), "r" (r5) - : "memory", "cc" - ); + __asm__ __volatile__("sc\n\t" + "mfcr %1" + : "=r"(r3), "=&r"(cr) + : "r"(r0), "r"(r3), "r"(r4), "r"(r5) + : "memory", "cc"); if (cr & CR0_SO) r3 = -r3; @@ -87,13 +83,11 @@ long sys_pread64(long fd, void *buf, long size, long pos) register long r6 __asm__("r6") = pos; long cr; - __asm__ __volatile__ ( - "sc\n\t" - "mfcr %1" - : "=r" (r3), "=&r" (cr) - : "r" (r0), "r" (r3), "r" (r4), "r" (r5), "r" (r6) - : "memory", "cc" - ); + __asm__ __volatile__("sc\n\t" + "mfcr %1" + : "=r"(r3), "=&r"(cr) + : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6) + : "memory", "cc"); if (cr & CR0_SO) r3 = -r3; @@ -109,13 +103,11 @@ long sys_pwrite64(long fd, const void *buf, long size, long pos) register long r6 __asm__("r6") = pos; long cr; - __asm__ __volatile__ ( - "sc\n\t" - "mfcr %1" - : "=r" (r3), "=&r" (cr) - : "r" (r0), "r" (r3), "r" (r4), "r" (r5), "r" (r6) - : "memory", "cc" - ); + __asm__ __volatile__("sc\n\t" + "mfcr %1" + : "=r"(r3), "=&r"(cr) + : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6) + : "memory", "cc"); if (cr & CR0_SO) r3 = -r3; @@ -126,14 +118,10 @@ void sys_exit_group(long status) { register long r0 __asm__("r0") = SYS_exit_group; register long r3 __asm__("r3") = status; - __asm__ __volatile__ ( - "sc" - : "=r" (r0) - : "r" (r0), "r" (r3) - : "memory", "cc" - ); - - for(;;); + __asm__ __volatile__("sc" : "=r"(r0) : "r"(r0), "r"(r3) : "memory", "cc"); + + for (;;) + ; } long sys_clock_gettime(const long which, void *ts) @@ -143,13 +131,11 @@ long sys_clock_gettime(const long which, void *ts) register long r4 __asm__("r4") = (long)ts; long cr; - __asm__ __volatile__ ( - "sc\n\t" - "mfcr %1" - : "=r" (r3), "=&r" (cr) - : "r" (r0), "r" (r3), "r" (r4) - : "memory", "cc" - ); + __asm__ __volatile__("sc\n\t" + "mfcr %1" + : "=r"(r3), "=&r"(cr) + : "r"(r0), "r"(r3), "r"(r4) + : "memory", "cc"); if (cr & CR0_SO) r3 = -r3; @@ -157,7 +143,7 @@ long sys_clock_gettime(const long which, void *ts) } long sys_epoll_pwait(long epfd, void *events, long maxevents, long timeout, - void *sigmask, long sigsetsize) + void *sigmask, long sigsetsize) { register long r0 __asm__("r0") = SYS_epoll_pwait; @@ -169,13 +155,12 @@ long sys_epoll_pwait(long epfd, void *events, long maxevents, long timeout, register long r8 __asm__("r8") = sigsetsize; long cr; - __asm__ __volatile__ ( - "sc\n\t" - "mfcr %1" - : "=r" (r3), "=&r" (cr) - : "r" (r0), "r" (r3), "r" (r4), "r" (r5), "r" (r6), "r" (r7), "r" (r8) - : "memory", "cc" - ); + __asm__ __volatile__("sc\n\t" + "mfcr %1" + : "=r"(r3), "=&r"(cr) + : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), + "r"(r8) + : "memory", "cc"); if (cr & CR0_SO) r3 = -r3; @@ -191,13 +176,11 @@ long sys_timerfd_settime(long fd, long flags, const void *utmr, void *otmr) register long r6 __asm__("r6") = (long)otmr; long cr; - __asm__ __volatile__ ( - "sc\n\t" - "mfcr %1" - : "=r" (r3), "=&r" (cr) - : "r" (r0), "r" (r3), "r" (r4), "r" (r5), "r" (r6) - : "memory", "cc" - ); + __asm__ __volatile__("sc\n\t" + "mfcr %1" + : "=r"(r3), "=&r"(cr) + : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6) + : "memory", "cc"); if (cr & CR0_SO) r3 = -r3; diff --git a/bindings/spt/sys_linux_x86_64.c b/bindings/spt/sys_linux_x86_64.c index 532877753..e7047209d 100644 --- a/bindings/spt/sys_linux_x86_64.c +++ b/bindings/spt/sys_linux_x86_64.c @@ -30,26 +30,24 @@ * also consider explicitly inlining these functions. */ -#define SYS_read 0 -#define SYS_write 1 -#define SYS_pread64 17 -#define SYS_pwrite64 18 -#define SYS_arch_prctl 158 -#define SYS_clock_gettime 228 -#define SYS_exit_group 231 -#define SYS_epoll_pwait 281 +#define SYS_read 0 +#define SYS_write 1 +#define SYS_pread64 17 +#define SYS_pwrite64 18 +#define SYS_arch_prctl 158 +#define SYS_clock_gettime 228 +#define SYS_exit_group 231 +#define SYS_epoll_pwait 281 #define SYS_timerfd_settime 286 long sys_read(long fd, void *buf, long size) { long ret; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_read), "D" (fd), "S" (buf), "d" (size) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_read), "D"(fd), "S"(buf), "d"(size) + : "rcx", "r11", "memory"); return ret; } @@ -58,12 +56,10 @@ long sys_write(long fd, const void *buf, long size) { long ret; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_write), "D" (fd), "S" (buf), "d" (size) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_write), "D"(fd), "S"(buf), "d"(size) + : "rcx", "r11", "memory"); return ret; } @@ -73,12 +69,11 @@ long sys_pread64(long fd, void *buf, long size, long pos) long ret; register long r10 __asm__("r10") = pos; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_pread64), "D" (fd), "S" (buf), "d" (size), "r" (r10) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_pread64), "D"(fd), "S"(buf), "d"(size), + "r"(r10) + : "rcx", "r11", "memory"); return ret; } @@ -88,57 +83,51 @@ long sys_pwrite64(long fd, const void *buf, long size, long pos) long ret; register long r10 __asm__("r10") = pos; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_pwrite64), "D" (fd), "S" (buf), "d" (size), "r" (r10) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_pwrite64), "D"(fd), "S"(buf), "d"(size), + "r"(r10) + : "rcx", "r11", "memory"); return ret; } void sys_exit_group(long status) { - __asm__ __volatile__ ( - "syscall" - : - : "a" (SYS_exit_group), "D" (status) - : "rcx", "r11", "memory" - ); - - for(;;); + __asm__ __volatile__("syscall" + : + : "a"(SYS_exit_group), "D"(status) + : "rcx", "r11", "memory"); + + for (;;) + ; } long sys_clock_gettime(const long which, void *ts) { int ret; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_clock_gettime), "D" (which), "S" (ts) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_clock_gettime), "D"(which), "S"(ts) + : "rcx", "r11", "memory"); return ret; } long sys_epoll_pwait(long epfd, void *events, long maxevents, long timeout, - void *sigmask, long sigsetsize) + void *sigmask, long sigsetsize) { long ret; register long r10 __asm__("r10") = timeout; register long r8 __asm__("r8") = (long)sigmask; register long r9 __asm__("r9") = sigsetsize; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_epoll_pwait), "D" (epfd), "S" (events), "d" (maxevents), - "r" (r10), "r" (r8), "r" (r9) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_epoll_pwait), "D"(epfd), "S"(events), + "d"(maxevents), "r"(r10), "r"(r8), "r"(r9) + : "rcx", "r11", "memory"); return ret; } @@ -148,13 +137,11 @@ long sys_timerfd_settime(long fd, long flags, const void *utmr, void *otmr) long ret; register long r10 __asm__("r10") = (long)otmr; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_timerfd_settime), "D" (fd), "S" (flags), "d" (utmr), - "r" (r10) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_timerfd_settime), "D"(fd), "S"(flags), + "d"(utmr), "r"(r10) + : "rcx", "r11", "memory"); return ret; } @@ -163,12 +150,10 @@ long sys_arch_prctl(long code, long addr) { long ret; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) - : "a" (SYS_arch_prctl), "D" (code), "S" (addr) - : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(SYS_arch_prctl), "D"(code), "S"(addr) + : "rcx", "r11", "memory"); return ret; } diff --git a/bindings/stub/stubs.c b/bindings/stub/stubs.c index 8ed631e91..cff2fc4cb 100644 --- a/bindings/stub/stubs.c +++ b/bindings/stub/stubs.c @@ -32,14 +32,16 @@ void _start(const void *arg U) { - for(;;); + for (;;) + ; } uintptr_t SSP_GUARD_SYMBOL; void SSP_FAIL_SYMBOL(void) { - for(;;); + for (;;) + ; } DECLARE_ELF_INTERP @@ -48,19 +50,25 @@ void solo5_console_write(const char *buf U, size_t size U) { } -void solo5_exit(int status U) { - for(;;); +void solo5_exit(int status U) +{ + for (;;) + ; } -void solo5_abort(void) { - for(;;); +void solo5_abort(void) +{ + for (;;) + ; } -solo5_time_t solo5_clock_monotonic(void) { +solo5_time_t solo5_clock_monotonic(void) +{ return ~0; } -solo5_time_t solo5_clock_wall(void) { +solo5_time_t solo5_clock_wall(void) +{ return ~0; } @@ -70,37 +78,37 @@ void solo5_yield(solo5_time_t deadline U, solo5_handle_set_t *ready_set U) } solo5_result_t solo5_net_acquire(const char *name U, solo5_handle_t *handle U, - struct solo5_net_info *info U) + struct solo5_net_info *info U) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_net_write(solo5_handle_t handle U, const uint8_t *buf U, - size_t size U) + size_t size U) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_net_read(solo5_handle_t handle U, uint8_t *buf U, - size_t size U, size_t *read_size U) + size_t size U, size_t *read_size U) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_acquire(const char *name U, solo5_handle_t *handle U, - struct solo5_block_info *info U) + struct solo5_block_info *info U) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_write(solo5_handle_t handle U, solo5_off_t offset U, - const uint8_t *buf U, size_t size U) + const uint8_t *buf U, size_t size U) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_read(solo5_handle_t handle U, solo5_off_t offset U, - uint8_t *buf U, size_t size U) + uint8_t *buf U, size_t size U) { return SOLO5_R_EUNSPEC; } diff --git a/bindings/tls.c b/bindings/tls.c index 617c4e1e2..60f2f1262 100644 --- a/bindings/tls.c +++ b/bindings/tls.c @@ -22,30 +22,30 @@ /* _stdata is the address begining of the "not bss" thread variables block */ extern char _stdata[]; -#define TDATA ((void*)_stdata) +#define TDATA ((void *)_stdata) /* _ltdata and _ltbss are the lengths of the tdata and tbss blocks */ extern char _ltdata[], _ltbss[]; #define LTDATA ((size_t)_ltdata) -#define LTBSS ((size_t)_ltbss) +#define LTBSS ((size_t)_ltbss) /* The following define the overhead to the tdata and tbss blocks * It's processor related */ #if defined(__x86_64__) || defined(__powerpc64__) - /* Variant II */ - struct tcb { - void* tp; - }; +/* Variant II */ +struct tcb { + void *tp; +}; - #define PPC64_TLS_OFFSET 0x7000 +#define PPC64_TLS_OFFSET 0x7000 #elif defined(__aarch64__) - /* Variant I */ - struct tcb { - void* tp; - void* pad; - }; +/* Variant I */ +struct tcb { + void *tp; + void *pad; +}; #else #error Unsupported architecture @@ -88,14 +88,15 @@ uintptr_t _solo5_tls_data_offset(uintptr_t tls) solo5_result_t solo5_tls_init(uintptr_t tls) { - if ((void*)tls == NULL) return SOLO5_R_EINVAL; + if ((void *)tls == NULL) + return SOLO5_R_EINVAL; /* set tp at its proper place in the TLS block */ - uintptr_t *tmp = (uintptr_t*)solo5_tls_tp_offset(tls); + uintptr_t *tmp = (uintptr_t *)solo5_tls_tp_offset(tls); *tmp = (uintptr_t)tmp; /* copy the .tdata values */ - memcpy((void*)_solo5_tls_data_offset(tls), TDATA, LTDATA); + memcpy((void *)_solo5_tls_data_offset(tls), TDATA, LTDATA); return SOLO5_R_OK; } diff --git a/bindings/virtio/bindings.h b/bindings/virtio/bindings.h index 726e82684..d5db4307e 100644 --- a/bindings/virtio/bindings.h +++ b/bindings/virtio/bindings.h @@ -23,7 +23,7 @@ * * This header file includes (supersedes) the common bindings.h for the virtio * implementation. -*/ + */ #ifndef __VIRTIO_BINDINGS_H__ #define __VIRTIO_BINDINGS_H__ diff --git a/bindings/virtio/clock_subr.c b/bindings/virtio/clock_subr.c index ac7dbf71e..5fe3d9cee 100644 --- a/bindings/virtio/clock_subr.c +++ b/bindings/virtio/clock_subr.c @@ -91,31 +91,39 @@ #include "clock_subr.h" /* Some handy constants. */ -#define SECS_PER_MINUTE 60 -#define SECS_PER_HOUR 3600 -#define SECS_PER_DAY 86400 -#define DAYS_PER_COMMON_YEAR 365 -#define DAYS_PER_LEAP_YEAR 366 -#define SECS_PER_COMMON_YEAR (SECS_PER_DAY * DAYS_PER_COMMON_YEAR) -#define SECS_PER_LEAP_YEAR (SECS_PER_DAY * DAYS_PER_LEAP_YEAR) +#define SECS_PER_MINUTE 60 +#define SECS_PER_HOUR 3600 +#define SECS_PER_DAY 86400 +#define DAYS_PER_COMMON_YEAR 365 +#define DAYS_PER_LEAP_YEAR 366 +#define SECS_PER_COMMON_YEAR (SECS_PER_DAY * DAYS_PER_COMMON_YEAR) +#define SECS_PER_LEAP_YEAR (SECS_PER_DAY * DAYS_PER_LEAP_YEAR) /* Traditional POSIX base year */ -#define POSIX_BASE_YEAR 1970 +#define POSIX_BASE_YEAR 1970 /* Some handy functions */ -static int -days_in_month(int m) +static int days_in_month(int m) { - switch (m) { - case 2: - return 28; - case 4: case 6: case 9: case 11: - return 30; - case 1: case 3: case 5: case 7: case 8: case 10: case 12: - return 31; - default: - return -1; - } + switch (m) { + case 2: + return 28; + case 4: + case 6: + case 9: + case 11: + return 30; + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + return 31; + default: + return -1; + } } /* @@ -126,22 +134,20 @@ days_in_month(int m) * ((year % 400) == 0) ) * It is otherwise equivalent. */ -static int -is_leap_year(uint64_t year) +static int is_leap_year(uint64_t year) { - if ((year & 3) != 0) - return 0; + if ((year & 3) != 0) + return 0; - if ((year % 100) != 0) - return 1; + if ((year % 100) != 0) + return 1; - return (year % 400) == 0; + return (year % 400) == 0; } -static int -days_per_year(uint64_t year) +static int days_per_year(uint64_t year) { - return is_leap_year(year) ? DAYS_PER_LEAP_YEAR : DAYS_PER_COMMON_YEAR; + return is_leap_year(year) ? DAYS_PER_LEAP_YEAR : DAYS_PER_COMMON_YEAR; } /* @@ -150,74 +156,71 @@ days_per_year(uint64_t year) * Derived from arch/hp300/hp300/clock.c */ -#define FEBRUARY 2 +#define FEBRUARY 2 /* for easier alignment: * time from the epoch to 2000 (there were 7 leap years): */ -#define DAYSTO2000 (365*30+7) +#define DAYSTO2000 (365 * 30 + 7) /* 4 year intervals include 1 leap year */ -#define DAYS4YEARS (365*4+1) +#define DAYS4YEARS (365 * 4 + 1) /* 100 year intervals include 24 leap years */ -#define DAYS100YEARS (365*100+24) +#define DAYS100YEARS (365 * 100 + 24) /* 400 year intervals include 97 leap years */ -#define DAYS400YEARS (365*400+97) +#define DAYS400YEARS (365 * 400 + 97) -uint64_t -clock_ymdhms_to_secs(struct bmk_clock_ymdhms *dt) +uint64_t clock_ymdhms_to_secs(struct bmk_clock_ymdhms *dt) { - uint64_t secs, i, year, days; - - year = dt->dt_year; - - /* - * Compute days since start of time - * First from years, then from months. - */ - if (year < POSIX_BASE_YEAR) - return 0; - days = 0; - if (is_leap_year(year) && dt->dt_mon > FEBRUARY) - days++; - - if (year < 2000) { - /* simple way for early years */ - for (i = POSIX_BASE_YEAR; i < year; i++) - days += days_per_year(i); - } else { - /* years are properly aligned */ - days += DAYSTO2000; - year -= 2000; - - i = year / 400; - days += i * DAYS400YEARS; - year -= i * 400; - - i = year / 100; - days += i * DAYS100YEARS; - year -= i * 100; - - i = year / 4; - days += i * DAYS4YEARS; - year -= i * 4; - - for (i = dt->dt_year-year; i < dt->dt_year; i++) - days += days_per_year(i); - } - - - /* Months */ - for (i = 1; i < dt->dt_mon; i++) - days += days_in_month(i); - days += (dt->dt_day - 1); - - /* Add hours, minutes, seconds. */ - secs = (((uint64_t)days - * 24 + dt->dt_hour) - * 60 + dt->dt_min) - * 60 + dt->dt_sec; - - return secs; + uint64_t secs, i, year, days; + + year = dt->dt_year; + + /* + * Compute days since start of time + * First from years, then from months. + */ + if (year < POSIX_BASE_YEAR) + return 0; + days = 0; + if (is_leap_year(year) && dt->dt_mon > FEBRUARY) + days++; + + if (year < 2000) { + /* simple way for early years */ + for (i = POSIX_BASE_YEAR; i < year; i++) + days += days_per_year(i); + } else { + /* years are properly aligned */ + days += DAYSTO2000; + year -= 2000; + + i = year / 400; + days += i * DAYS400YEARS; + year -= i * 400; + + i = year / 100; + days += i * DAYS100YEARS; + year -= i * 100; + + i = year / 4; + days += i * DAYS4YEARS; + year -= i * 4; + + for (i = dt->dt_year - year; i < dt->dt_year; i++) + days += days_per_year(i); + } + + + /* Months */ + for (i = 1; i < dt->dt_mon; i++) + days += days_in_month(i); + days += (dt->dt_day - 1); + + /* Add hours, minutes, seconds. */ + secs = (((uint64_t)days * 24 + dt->dt_hour) * 60 + dt->dt_min) * 60 + + dt->dt_sec; + + return secs; } diff --git a/bindings/virtio/clock_subr.h b/bindings/virtio/clock_subr.h index e4cfee158..b138a3b4e 100644 --- a/bindings/virtio/clock_subr.h +++ b/bindings/virtio/clock_subr.h @@ -54,12 +54,12 @@ * "POSIX time" to/from "YY/MM/DD/hh/mm/ss" */ struct bmk_clock_ymdhms { - uint64_t dt_year; - uint8_t dt_mon; - uint8_t dt_day; - uint8_t dt_hour; - uint8_t dt_min; - uint8_t dt_sec; + uint64_t dt_year; + uint8_t dt_mon; + uint8_t dt_day; + uint8_t dt_hour; + uint8_t dt_min; + uint8_t dt_sec; }; uint64_t clock_ymdhms_to_secs(struct bmk_clock_ymdhms *); @@ -67,10 +67,9 @@ uint64_t clock_ymdhms_to_secs(struct bmk_clock_ymdhms *); /* * BCD to binary. */ -static inline unsigned int -bcdtobin(unsigned int bcd) +static inline unsigned int bcdtobin(unsigned int bcd) { - return ((bcd >> 4) & 0x0f) * 10 + (bcd & 0x0f); + return ((bcd >> 4) & 0x0f) * 10 + (bcd & 0x0f); } #endif /* _BMK_CLOCK_SUBR_H_ */ diff --git a/bindings/virtio/multiboot.h b/bindings/virtio/multiboot.h index fa4db904f..d92f4e9d7 100644 --- a/bindings/virtio/multiboot.h +++ b/bindings/virtio/multiboot.h @@ -34,259 +34,249 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY - * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR - * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ #ifndef MULTIBOOT_HEADER #define MULTIBOOT_HEADER 1 /* How many bytes from the start of the file we search for the header. */ -#define MULTIBOOT_SEARCH 8192 -#define MULTIBOOT_HEADER_ALIGN 4 +#define MULTIBOOT_SEARCH 8192 +#define MULTIBOOT_HEADER_ALIGN 4 /* The magic field should contain this. */ -#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 +#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 /* This should be in %eax. */ -#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 +#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 /* Alignment of multiboot modules. */ -#define MULTIBOOT_MOD_ALIGN 0x00001000 +#define MULTIBOOT_MOD_ALIGN 0x00001000 /* Alignment of the multiboot info structure. */ -#define MULTIBOOT_INFO_ALIGN 0x00000004 +#define MULTIBOOT_INFO_ALIGN 0x00000004 /* Flags set in the 'flags' member of the multiboot header. */ /* Align all boot modules on i386 page (4KB) boundaries. */ -#define MULTIBOOT_PAGE_ALIGN 0x00000001 +#define MULTIBOOT_PAGE_ALIGN 0x00000001 /* Must pass memory information to OS. */ -#define MULTIBOOT_MEMORY_INFO 0x00000002 +#define MULTIBOOT_MEMORY_INFO 0x00000002 /* Must pass video information to OS. */ -#define MULTIBOOT_VIDEO_MODE 0x00000004 +#define MULTIBOOT_VIDEO_MODE 0x00000004 /* This flag indicates the use of the address fields in the header. */ -#define MULTIBOOT_AOUT_KLUDGE 0x00010000 +#define MULTIBOOT_AOUT_KLUDGE 0x00010000 /* Flags to be set in the 'flags' member of the multiboot info structure. */ /* is there basic lower/upper memory information? */ -#define MULTIBOOT_INFO_MEMORY 0x00000001 +#define MULTIBOOT_INFO_MEMORY 0x00000001 /* is there a boot device set? */ -#define MULTIBOOT_INFO_BOOTDEV 0x00000002 +#define MULTIBOOT_INFO_BOOTDEV 0x00000002 /* is the command-line defined? */ -#define MULTIBOOT_INFO_CMDLINE 0x00000004 +#define MULTIBOOT_INFO_CMDLINE 0x00000004 /* are there modules to do something with? */ -#define MULTIBOOT_INFO_MODS 0x00000008 +#define MULTIBOOT_INFO_MODS 0x00000008 /* These next two are mutually exclusive */ /* is there a symbol table loaded? */ -#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010 +#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010 /* is there an ELF section header table? */ -#define MULTIBOOT_INFO_ELF_SHDR 0X00000020 +#define MULTIBOOT_INFO_ELF_SHDR 0X00000020 /* is there a full memory map? */ -#define MULTIBOOT_INFO_MEM_MAP 0x00000040 +#define MULTIBOOT_INFO_MEM_MAP 0x00000040 /* Is there drive info? */ -#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080 +#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080 /* Is there a config table? */ -#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100 +#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100 /* Is there a boot loader name? */ -#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200 +#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200 /* Is there a APM table? */ -#define MULTIBOOT_INFO_APM_TABLE 0x00000400 +#define MULTIBOOT_INFO_APM_TABLE 0x00000400 /* Is there video information? */ -#define MULTIBOOT_INFO_VBE_INFO 0x00000800 -#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000 +#define MULTIBOOT_INFO_VBE_INFO 0x00000800 +#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000 #ifndef ASM_FILE -typedef unsigned char multiboot_uint8_t; -typedef unsigned short multiboot_uint16_t; -typedef unsigned int multiboot_uint32_t; -typedef unsigned long long multiboot_uint64_t; - -struct multiboot_header -{ - /* Must be MULTIBOOT_MAGIC - see above. */ - multiboot_uint32_t magic; - - /* Feature flags. */ - multiboot_uint32_t flags; - - /* The above fields plus this one must equal 0 mod 2^32. */ - multiboot_uint32_t checksum; - - /* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */ - multiboot_uint32_t header_addr; - multiboot_uint32_t load_addr; - multiboot_uint32_t load_end_addr; - multiboot_uint32_t bss_end_addr; - multiboot_uint32_t entry_addr; - - /* These are only valid if MULTIBOOT_VIDEO_MODE is set. */ - multiboot_uint32_t mode_type; - multiboot_uint32_t width; - multiboot_uint32_t height; - multiboot_uint32_t depth; +typedef unsigned char multiboot_uint8_t; +typedef unsigned short multiboot_uint16_t; +typedef unsigned int multiboot_uint32_t; +typedef unsigned long long multiboot_uint64_t; + +struct multiboot_header { + /* Must be MULTIBOOT_MAGIC - see above. */ + multiboot_uint32_t magic; + + /* Feature flags. */ + multiboot_uint32_t flags; + + /* The above fields plus this one must equal 0 mod 2^32. */ + multiboot_uint32_t checksum; + + /* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */ + multiboot_uint32_t header_addr; + multiboot_uint32_t load_addr; + multiboot_uint32_t load_end_addr; + multiboot_uint32_t bss_end_addr; + multiboot_uint32_t entry_addr; + + /* These are only valid if MULTIBOOT_VIDEO_MODE is set. */ + multiboot_uint32_t mode_type; + multiboot_uint32_t width; + multiboot_uint32_t height; + multiboot_uint32_t depth; }; /* The symbol table for a.out. */ -struct multiboot_aout_symbol_table -{ - multiboot_uint32_t tabsize; - multiboot_uint32_t strsize; - multiboot_uint32_t addr; - multiboot_uint32_t reserved; +struct multiboot_aout_symbol_table { + multiboot_uint32_t tabsize; + multiboot_uint32_t strsize; + multiboot_uint32_t addr; + multiboot_uint32_t reserved; }; typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t; /* The section header table for ELF. */ -struct multiboot_elf_section_header_table -{ - multiboot_uint32_t num; - multiboot_uint32_t size; - multiboot_uint32_t addr; - multiboot_uint32_t shndx; +struct multiboot_elf_section_header_table { + multiboot_uint32_t num; + multiboot_uint32_t size; + multiboot_uint32_t addr; + multiboot_uint32_t shndx; }; -typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t; - -struct multiboot_info -{ - /* Multiboot info version number */ - multiboot_uint32_t flags; - - /* Available memory from BIOS */ - multiboot_uint32_t mem_lower; - multiboot_uint32_t mem_upper; - - /* "root" partition */ - multiboot_uint32_t boot_device; - - /* Kernel command line */ - multiboot_uint32_t cmdline; - - /* Boot-Module list */ - multiboot_uint32_t mods_count; - multiboot_uint32_t mods_addr; - - union - { - multiboot_aout_symbol_table_t aout_sym; - multiboot_elf_section_header_table_t elf_sec; - } u; - - /* Memory Mapping buffer */ - multiboot_uint32_t mmap_length; - multiboot_uint32_t mmap_addr; - - /* Drive Info buffer */ - multiboot_uint32_t drives_length; - multiboot_uint32_t drives_addr; - - /* ROM configuration table */ - multiboot_uint32_t config_table; - - /* Boot Loader Name */ - multiboot_uint32_t boot_loader_name; - - /* APM table */ - multiboot_uint32_t apm_table; - - /* Video */ - multiboot_uint32_t vbe_control_info; - multiboot_uint32_t vbe_mode_info; - multiboot_uint16_t vbe_mode; - multiboot_uint16_t vbe_interface_seg; - multiboot_uint16_t vbe_interface_off; - multiboot_uint16_t vbe_interface_len; - - multiboot_uint64_t framebuffer_addr; - multiboot_uint32_t framebuffer_pitch; - multiboot_uint32_t framebuffer_width; - multiboot_uint32_t framebuffer_height; - multiboot_uint8_t framebuffer_bpp; -#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 -#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 -#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 - multiboot_uint8_t framebuffer_type; - union - { - struct - { - multiboot_uint32_t framebuffer_palette_addr; - multiboot_uint16_t framebuffer_palette_num_colors; +typedef struct multiboot_elf_section_header_table + multiboot_elf_section_header_table_t; + +struct multiboot_info { + /* Multiboot info version number */ + multiboot_uint32_t flags; + + /* Available memory from BIOS */ + multiboot_uint32_t mem_lower; + multiboot_uint32_t mem_upper; + + /* "root" partition */ + multiboot_uint32_t boot_device; + + /* Kernel command line */ + multiboot_uint32_t cmdline; + + /* Boot-Module list */ + multiboot_uint32_t mods_count; + multiboot_uint32_t mods_addr; + + union { + multiboot_aout_symbol_table_t aout_sym; + multiboot_elf_section_header_table_t elf_sec; + } u; + + /* Memory Mapping buffer */ + multiboot_uint32_t mmap_length; + multiboot_uint32_t mmap_addr; + + /* Drive Info buffer */ + multiboot_uint32_t drives_length; + multiboot_uint32_t drives_addr; + + /* ROM configuration table */ + multiboot_uint32_t config_table; + + /* Boot Loader Name */ + multiboot_uint32_t boot_loader_name; + + /* APM table */ + multiboot_uint32_t apm_table; + + /* Video */ + multiboot_uint32_t vbe_control_info; + multiboot_uint32_t vbe_mode_info; + multiboot_uint16_t vbe_mode; + multiboot_uint16_t vbe_interface_seg; + multiboot_uint16_t vbe_interface_off; + multiboot_uint16_t vbe_interface_len; + + multiboot_uint64_t framebuffer_addr; + multiboot_uint32_t framebuffer_pitch; + multiboot_uint32_t framebuffer_width; + multiboot_uint32_t framebuffer_height; + multiboot_uint8_t framebuffer_bpp; +#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 +#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 +#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 + multiboot_uint8_t framebuffer_type; + union { + struct { + multiboot_uint32_t framebuffer_palette_addr; + multiboot_uint16_t framebuffer_palette_num_colors; + }; + struct { + multiboot_uint8_t framebuffer_red_field_position; + multiboot_uint8_t framebuffer_red_mask_size; + multiboot_uint8_t framebuffer_green_field_position; + multiboot_uint8_t framebuffer_green_mask_size; + multiboot_uint8_t framebuffer_blue_field_position; + multiboot_uint8_t framebuffer_blue_mask_size; + }; }; - struct - { - multiboot_uint8_t framebuffer_red_field_position; - multiboot_uint8_t framebuffer_red_mask_size; - multiboot_uint8_t framebuffer_green_field_position; - multiboot_uint8_t framebuffer_green_mask_size; - multiboot_uint8_t framebuffer_blue_field_position; - multiboot_uint8_t framebuffer_blue_mask_size; - }; - }; }; typedef struct multiboot_info multiboot_info_t; -struct multiboot_color -{ - multiboot_uint8_t red; - multiboot_uint8_t green; - multiboot_uint8_t blue; +struct multiboot_color { + multiboot_uint8_t red; + multiboot_uint8_t green; + multiboot_uint8_t blue; }; -struct multiboot_mmap_entry -{ - multiboot_uint32_t size; - multiboot_uint64_t addr; - multiboot_uint64_t len; -#define MULTIBOOT_MEMORY_AVAILABLE 1 -#define MULTIBOOT_MEMORY_RESERVED 2 -#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 -#define MULTIBOOT_MEMORY_NVS 4 -#define MULTIBOOT_MEMORY_BADRAM 5 - multiboot_uint32_t type; +struct multiboot_mmap_entry { + multiboot_uint32_t size; + multiboot_uint64_t addr; + multiboot_uint64_t len; +#define MULTIBOOT_MEMORY_AVAILABLE 1 +#define MULTIBOOT_MEMORY_RESERVED 2 +#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 +#define MULTIBOOT_MEMORY_NVS 4 +#define MULTIBOOT_MEMORY_BADRAM 5 + multiboot_uint32_t type; } __attribute__((packed)); typedef struct multiboot_mmap_entry multiboot_memory_map_t; -struct multiboot_mod_list -{ - /* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */ - multiboot_uint32_t mod_start; - multiboot_uint32_t mod_end; +struct multiboot_mod_list { + /* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */ + multiboot_uint32_t mod_start; + multiboot_uint32_t mod_end; - /* Module command line */ - multiboot_uint32_t cmdline; + /* Module command line */ + multiboot_uint32_t cmdline; - /* padding to take it to 16 bytes (must be zero) */ - multiboot_uint32_t pad; + /* padding to take it to 16 bytes (must be zero) */ + multiboot_uint32_t pad; }; typedef struct multiboot_mod_list multiboot_module_t; /* APM BIOS info. */ -struct multiboot_apm_info -{ - multiboot_uint16_t version; - multiboot_uint16_t cseg; - multiboot_uint32_t offset; - multiboot_uint16_t cseg_16; - multiboot_uint16_t dseg; - multiboot_uint16_t flags; - multiboot_uint16_t cseg_len; - multiboot_uint16_t cseg_16_len; - multiboot_uint16_t dseg_len; +struct multiboot_apm_info { + multiboot_uint16_t version; + multiboot_uint16_t cseg; + multiboot_uint32_t offset; + multiboot_uint16_t cseg_16; + multiboot_uint16_t dseg; + multiboot_uint16_t flags; + multiboot_uint16_t cseg_len; + multiboot_uint16_t cseg_16_len; + multiboot_uint16_t dseg_len; }; #endif /* ! ASM_FILE */ diff --git a/bindings/virtio/pci.c b/bindings/virtio/pci.c index a754e4860..a6a762260 100644 --- a/bindings/virtio/pci.c +++ b/bindings/virtio/pci.c @@ -24,16 +24,16 @@ #define PCI_CONFIG_DATA 0xCFC /* 8 bits for bus number, 5 bits for devices */ -#define PCI_MAX_BUSES (1 << 8) +#define PCI_MAX_BUSES (1 << 8) #define PCI_MAX_DEVICES (1 << 5) #define PCI_BUS_SHIFT (16) #define PCI_DEVICE_SHIFT (11) #define PCI_ENABLE_BIT (1 << 31) -#define PCI_CONF_SUBSYS_ID 0x2c -#define PCI_CONF_SUBSYS_ID_SHFT 16 -#define PCI_CONF_SUBSYS_ID_MASK 0xffff +#define PCI_CONF_SUBSYS_ID 0x2c +#define PCI_CONF_SUBSYS_ID_SHFT 16 +#define PCI_CONF_SUBSYS_ID_MASK 0xffff #define PCI_CONF_IRQ 0x3c #define PCI_CONF_IRQ_SHFT 0x0 @@ -44,13 +44,14 @@ #define PCI_CONF_IOBAR_MASK ~0x3 -#define PCI_CONF_READ(type, ret, a, s) do { \ - uint32_t _conf_data; \ - outl(PCI_CONFIG_ADDR, (a) | PCI_CONF_##s); \ - _conf_data = ((inl(PCI_CONFIG_DATA) >> PCI_CONF_##s##_SHFT) \ - & PCI_CONF_##s##_MASK); \ - *(ret) = (type) _conf_data; \ -} while (0) +#define PCI_CONF_READ(type, ret, a, s) \ + do { \ + uint32_t _conf_data; \ + outl(PCI_CONFIG_ADDR, (a) | PCI_CONF_##s); \ + _conf_data = ((inl(PCI_CONFIG_DATA) >> PCI_CONF_##s##_SHFT) & \ + PCI_CONF_##s##_MASK); \ + *(ret) = (type)_conf_data; \ + } while (0) /* in tenders/common/mft.c: @@ -70,14 +71,16 @@ static int virtio_config(struct pci_config_info *pci) { switch (pci->subsys_id) { case PCI_CONF_SUBSYS_NET: - log(INFO, "Solo5: PCI:%02x:%02x: virtio-net device, base=0x%x, irq=%u\n", + log(INFO, + "Solo5: PCI:%02x:%02x: virtio-net device, base=0x%x, irq=%u\n", pci->bus, pci->dev, pci->base, pci->irq); if (virtio_config_network(pci, mft_index) != 0) return -1; mft_index++; break; case PCI_CONF_SUBSYS_BLK: - log(INFO, "Solo5: PCI:%02x:%02x: virtio-block device, base=0x%x, irq=%u\n", + log(INFO, + "Solo5: PCI:%02x:%02x: virtio-block device, base=0x%x, irq=%u\n", pci->bus, pci->dev, pci->base, pci->irq); if (virtio_config_block(pci, mft_index) != 0) return -1; @@ -97,14 +100,14 @@ static int virtio_config(struct pci_config_info *pci) /* * Every PCI device found in pci_enumerate is attempted to be assigned to a - * device from the application manifest in the order in which they are found. This - * order is given by the PCI slot number which is controlled in + * device from the application manifest in the order in which they are found. + * This order is given by the PCI slot number which is controlled in * solo5-virtio-run.sh. - * + * * This funtion can fail if the type of a device just found does not match the * type of the next expected device in the manifest. Devices whose type (e.g., * virtio_scsi) is unknown is just skipped. - * + * * Returns 0 on success, -1 otherwise. */ int pci_enumerate(void) @@ -117,9 +120,8 @@ int pci_enumerate(void) uint32_t config_addr, config_data; struct pci_config_info pci; - config_addr = (PCI_ENABLE_BIT) - | (bus << PCI_BUS_SHIFT) - | (dev << PCI_DEVICE_SHIFT); + config_addr = (PCI_ENABLE_BIT) | (bus << PCI_BUS_SHIFT) | + (dev << PCI_DEVICE_SHIFT); outl(PCI_CONFIG_ADDR, config_addr); config_data = inl(PCI_CONFIG_DATA); diff --git a/bindings/virtio/platform.c b/bindings/virtio/platform.c index c9ae42f47..9f2a5640a 100644 --- a/bindings/virtio/platform.c +++ b/bindings/virtio/platform.c @@ -22,7 +22,7 @@ static char cmdline[8192]; -#define PLATFORM_MEM_START 0x100000 +#define PLATFORM_MEM_START 0x100000 #define PLATFORM_MAX_MEM_SIZE 0x40000000 static uint64_t mem_size; @@ -67,10 +67,10 @@ void platform_init(const void *arg) uint32_t offset; for (offset = 0; offset < mi->mmap_length; - offset += m->size + sizeof(m->size)) { + offset += m->size + sizeof(m->size)) { m = (void *)(uintptr_t)(mi->mmap_addr + offset); if (m->addr == PLATFORM_MEM_START && - m->type == MULTIBOOT_MEMORY_AVAILABLE) { + m->type == MULTIBOOT_MEMORY_AVAILABLE) { break; } } @@ -98,7 +98,7 @@ uint64_t platform_mem_size(void) } void platform_exit(int status __attribute__((unused)), - void *cookie __attribute__((unused))) + void *cookie __attribute__((unused))) { /* * Poke the QEMU "isa-debug-exit" device to "shutdown". Should be harmless diff --git a/bindings/virtio/platform_intr.c b/bindings/virtio/platform_intr.c index 15915b021..2f855bee5 100644 --- a/bindings/virtio/platform_intr.c +++ b/bindings/virtio/platform_intr.c @@ -20,8 +20,8 @@ #include "bindings.h" -#define PIC1 0x20 /* IO base address for master PIC */ -#define PIC2 0xA0 /* IO base address for slave PIC */ +#define PIC1 0x20 /* IO base address for master PIC */ +#define PIC2 0xA0 /* IO base address for slave PIC */ #define PIC1_COMMAND PIC1 #define PIC1_DATA (PIC1 + 1) #define PIC2_COMMAND PIC2 @@ -42,7 +42,9 @@ #define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */ #define ICW4_SFN 0x10 /* Special fully nested (not) */ -#define io_wait() do { } while (0) +#define io_wait() \ + do { \ + } while (0) /* * arguments: @@ -59,9 +61,9 @@ static void PIC_remap(int offset1, int offset2) a2 = inb(PIC2_DATA); /* start init seq (cascade) */ - outb(PIC1_COMMAND, ICW1_INIT+ICW1_ICW4); + outb(PIC1_COMMAND, ICW1_INIT + ICW1_ICW4); io_wait(); - outb(PIC2_COMMAND, ICW1_INIT+ICW1_ICW4); + outb(PIC2_COMMAND, ICW1_INIT + ICW1_ICW4); io_wait(); /* ICW2: Master PIC vector off */ outb(PIC1_DATA, offset1); @@ -81,7 +83,7 @@ static void PIC_remap(int offset1, int offset2) outb(PIC2_DATA, ICW4_8086); io_wait(); - outb(PIC1_DATA, a1); /* restore saved masks. */ + outb(PIC1_DATA, a1); /* restore saved masks. */ outb(PIC2_DATA, a2); } diff --git a/bindings/virtio/pvclock.c b/bindings/virtio/pvclock.c index 1d6ff9ca9..2d184df9b 100644 --- a/bindings/virtio/pvclock.c +++ b/bindings/virtio/pvclock.c @@ -77,21 +77,22 @@ struct pvclock_wall_clock { static volatile struct pvclock_vcpu_time_info pvclock_ti; static volatile struct pvclock_wall_clock pvclock_wc; -uint64_t pvclock_monotonic(void) { +uint64_t pvclock_monotonic(void) +{ uint32_t version; uint64_t delta, time_now; do { version = pvclock_ti.version; - __asm__ ("mfence" ::: "memory"); + __asm__("mfence" ::: "memory"); delta = cpu_rdtsc() - pvclock_ti.tsc_timestamp; if (pvclock_ti.tsc_shift < 0) delta >>= -pvclock_ti.tsc_shift; else delta <<= pvclock_ti.tsc_shift; time_now = mul64_32(delta, pvclock_ti.tsc_to_system_mul, 32) + - pvclock_ti.system_time; - __asm__ ("mfence" ::: "memory"); + pvclock_ti.system_time; + __asm__("mfence" ::: "memory"); } while ((pvclock_ti.version & 1) || (pvclock_ti.version != version)); return time_now; @@ -102,21 +103,22 @@ uint64_t pvclock_monotonic(void) { */ static uint64_t pvclock_read_wall_clock(void) { - uint32_t version; - uint64_t wc_boot; - - do { - version = pvclock_wc.version; - __asm__ ("mfence" ::: "memory"); - wc_boot = pvclock_wc.sec * NSEC_PER_SEC; - wc_boot += pvclock_wc.nsec; - __asm__ ("mfence" ::: "memory"); - } while ((pvclock_wc.version & 1) || (pvclock_wc.version != version)); - - return wc_boot; + uint32_t version; + uint64_t wc_boot; + + do { + version = pvclock_wc.version; + __asm__("mfence" ::: "memory"); + wc_boot = pvclock_wc.sec * NSEC_PER_SEC; + wc_boot += pvclock_wc.nsec; + __asm__("mfence" ::: "memory"); + } while ((pvclock_wc.version & 1) || (pvclock_wc.version != version)); + + return wc_boot; } -int pvclock_init(void) { +int pvclock_init(void) +{ uint32_t eax, ebx, ecx, edx; uint32_t msr_kvm_system_time, msr_kvm_wall_clock; @@ -128,27 +130,21 @@ int pvclock_init(void) { if (eax & (1 << 3)) { msr_kvm_system_time = 0x4b564d01; msr_kvm_wall_clock = 0x4b564d00; - } - else if (eax & (1 << 0)) { + } else if (eax & (1 << 0)) { msr_kvm_system_time = 0x12; msr_kvm_wall_clock = 0x11; - } - else { + } else { return 1; } log(INFO, "Solo5: Clock source: KVM paravirtualized clock\n"); - __asm__ __volatile("wrmsr" :: - "c" (msr_kvm_system_time), - "a" ((uint32_t)((uintptr_t)&pvclock_ti | 0x1)), - "d" ((uint32_t)((uintptr_t)&pvclock_ti >> 32)) - ); - __asm__ __volatile("wrmsr" :: - "c" (msr_kvm_wall_clock), - "a" ((uint32_t)((uintptr_t)&pvclock_wc)), - "d" ((uint32_t)((uintptr_t)&pvclock_wc >> 32)) - ); + __asm__ __volatile("wrmsr" ::"c"(msr_kvm_system_time), + "a"((uint32_t)((uintptr_t)&pvclock_ti | 0x1)), + "d"((uint32_t)((uintptr_t)&pvclock_ti >> 32))); + __asm__ __volatile("wrmsr" ::"c"(msr_kvm_wall_clock), + "a"((uint32_t)((uintptr_t)&pvclock_wc)), + "d"((uint32_t)((uintptr_t)&pvclock_wc >> 32))); /* Initialise epoch offset using wall clock time */ wc_epochoffset = pvclock_read_wall_clock(); @@ -158,6 +154,7 @@ int pvclock_init(void) { /* * Return epoch offset (wall time offset to monotonic clock start). */ -uint64_t pvclock_epochoffset(void) { - return wc_epochoffset; +uint64_t pvclock_epochoffset(void) +{ + return wc_epochoffset; } diff --git a/bindings/virtio/serial.c b/bindings/virtio/serial.c index 287364ec4..d16d1df3f 100644 --- a/bindings/virtio/serial.c +++ b/bindings/virtio/serial.c @@ -36,17 +36,17 @@ void serial_init(void) { - outb(COM1_INTR, 0x00); /* Disable all interrupts */ - outb(COM1_CTRL, DLAB); /* Enable DLAB (set baud rate divisor) */ - outb(COM1_DIV_LO, 0x01); /* Set divisor to 1 (lo byte) 115200 baud */ - outb(COM1_DIV_HI, 0x00); /* (hi byte) */ - outb(COM1_CTRL, PROT); /* Set 8N1, clear DLAB */ + outb(COM1_INTR, 0x00); /* Disable all interrupts */ + outb(COM1_CTRL, DLAB); /* Enable DLAB (set baud rate divisor) */ + outb(COM1_DIV_LO, 0x01); /* Set divisor to 1 (lo byte) 115200 baud */ + outb(COM1_DIV_HI, 0x00); /* (hi byte) */ + outb(COM1_CTRL, PROT); /* Set 8N1, clear DLAB */ } static int serial_tx_empty(void) { - return inb(COM1_STATUS) & 0x20; + return inb(COM1_STATUS) & 0x20; } static void serial_write(char a) diff --git a/bindings/virtio/start.c b/bindings/virtio/start.c index 7e8689b68..3137f707d 100644 --- a/bindings/virtio/start.c +++ b/bindings/virtio/start.c @@ -63,7 +63,8 @@ static void mft_check_all_acquired() for (unsigned i = 0; i != virtio_manifest->entries; i++) { if (i > 0 && !virtio_manifest->e[i].attached) { log(WARN, "Solo5: Device '%s' of type %s not attached.", - virtio_manifest->e[i].name, mft_type_to_string(virtio_manifest->e[i].type)); + virtio_manifest->e[i].name, + mft_type_to_string(virtio_manifest->e[i].type)); fail = true; } } @@ -102,9 +103,11 @@ static void _start2(void *arg __attribute__((unused))) * Attach the first entry if its type is really MFT_RESERVED_FIRST. * Abort otherwise. */ - const struct mft_entry *e = mft_get_by_index(virtio_manifest, 0, MFT_RESERVED_FIRST); + const struct mft_entry *e = + mft_get_by_index(virtio_manifest, 0, MFT_RESERVED_FIRST); if (e == NULL) { - log(ERROR, "Solo5: first entry in manifest is not of type MFT_RESERVED_FIRST\n"); + log(ERROR, "Solo5: first entry in manifest is not of type " + "MFT_RESERVED_FIRST\n"); solo5_abort(); } @@ -133,14 +136,10 @@ DECLARE_ELF_INTERP * Virtio does not have an ABI contract (in the Solo5 sense) or use a tender, * so the ABI version here is always 1. */ -ABI1_NOTE_DECLARE_BEGIN -{ - .abi_target = VIRTIO_ABI_TARGET, - .abi_version = 1 -} -ABI1_NOTE_DECLARE_END +ABI1_NOTE_DECLARE_BEGIN{.abi_target = VIRTIO_ABI_TARGET, + .abi_version = 1} ABI1_NOTE_DECLARE_END -/* - * Pretend that we are an OpenBSD executable. See elf_abi.h for details. - */ -DECLARE_OPENBSD_NOTE + /* + * Pretend that we are an OpenBSD executable. See elf_abi.h for details. + */ + DECLARE_OPENBSD_NOTE diff --git a/bindings/virtio/tscclock.c b/bindings/virtio/tscclock.c index 3889e42c8..ac6cfe2cd 100644 --- a/bindings/virtio/tscclock.c +++ b/bindings/virtio/tscclock.c @@ -48,27 +48,27 @@ #include "bindings.h" #include "clock_subr.h" -#define TIMER_CNTR 0x40 -#define TIMER_MODE 0x43 -#define TIMER_SEL0 0x00 -#define TIMER_LATCH 0x00 -#define TIMER_RATEGEN 0x04 -#define TIMER_ONESHOT 0x08 -#define TIMER_16BIT 0x30 -#define TIMER_HZ 1193182 - -#define RTC_COMMAND 0x70 -#define RTC_DATA 0x71 -#define RTC_NMI_DISABLE (1<<8) -#define RTC_NMI_ENABLE 0 -#define RTC_SEC 0x00 -#define RTC_MIN 0x02 -#define RTC_HOUR 0x04 -#define RTC_DAY 0x07 -#define RTC_MONTH 0x08 -#define RTC_YEAR 0x09 -#define RTC_STATUS_A 0x0a -#define RTC_UIP (1<<7) +#define TIMER_CNTR 0x40 +#define TIMER_MODE 0x43 +#define TIMER_SEL0 0x00 +#define TIMER_LATCH 0x00 +#define TIMER_RATEGEN 0x04 +#define TIMER_ONESHOT 0x08 +#define TIMER_16BIT 0x30 +#define TIMER_HZ 1193182 + +#define RTC_COMMAND 0x70 +#define RTC_DATA 0x71 +#define RTC_NMI_DISABLE (1 << 8) +#define RTC_NMI_ENABLE 0 +#define RTC_SEC 0x00 +#define RTC_MIN 0x02 +#define RTC_HOUR 0x04 +#define RTC_DAY 0x07 +#define RTC_MONTH 0x08 +#define RTC_YEAR 0x09 +#define RTC_STATUS_A 0x0a +#define RTC_UIP (1 << 7) /* * TSC clock specific. @@ -89,14 +89,15 @@ static uint32_t tsc_mult; * f = NSEC_PER_SEC / TIMER_HZ (0.31) fixed point. * pit_mult = 1 / f (1.32) fixed point. */ -static const uint32_t pit_mult - = (1ULL << 63) / ((NSEC_PER_SEC << 31) / TIMER_HZ); +static const uint32_t pit_mult = + (1ULL << 63) / ((NSEC_PER_SEC << 31) / TIMER_HZ); /* * Read the current i8254 channel 0 tick count. */ -static unsigned int i8254_gettick(void) { +static unsigned int i8254_gettick(void) +{ uint16_t rdval; outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH); @@ -109,14 +110,15 @@ static unsigned int i8254_gettick(void) { * Delay for approximately n microseconds using the i8254 channel 0 counter. * Timer must be programmed appropriately before calling this function. */ -static void i8254_delay(unsigned int n) { +static void i8254_delay(unsigned int n) +{ unsigned int cur_tick, initial_tick; int remaining; const unsigned long timer_rval = TIMER_HZ / 100; initial_tick = i8254_gettick(); - remaining = (unsigned long long) n * TIMER_HZ / 1000000; + remaining = (unsigned long long)n * TIMER_HZ / 1000000; while (remaining > 1) { cur_tick = i8254_gettick(); @@ -131,7 +133,8 @@ static void i8254_delay(unsigned int n) { /* * Read a RTC register. Due to PC platform braindead-ness also disables NMI. */ -static inline uint8_t rtc_read(uint8_t reg) { +static inline uint8_t rtc_read(uint8_t reg) +{ outb(RTC_COMMAND, reg | RTC_NMI_DISABLE); return inb(RTC_DATA); @@ -141,7 +144,8 @@ static inline uint8_t rtc_read(uint8_t reg) { * Return current RTC time. Note that due to waiting for the update cycle to * complete, this call may take some time. */ -uint64_t rtc_gettimeofday(void) { +uint64_t rtc_gettimeofday(void) +{ struct bmk_clock_ymdhms dt; cpu_intr_disable(); @@ -168,7 +172,8 @@ uint64_t rtc_gettimeofday(void) { /* * Beturn monotonic time using TSC clock. */ -uint64_t tscclock_monotonic(void) { +uint64_t tscclock_monotonic(void) +{ uint64_t tsc_now, tsc_delta; /* @@ -185,7 +190,8 @@ uint64_t tscclock_monotonic(void) { /* * Calibrate TSC and initialise TSC clock. */ -int tscclock_init(void) { +int tscclock_init(void) +{ uint64_t tsc_freq; /* Initialise i8254 timer channel 0 to mode 2 at 100 Hz */ @@ -231,14 +237,15 @@ int tscclock_init(void) { * Minimum delta to sleep using PIT. Programming seems to have an overhead of * 3-4us, but play it safe here. */ -#define PIT_MIN_DELTA 16 +#define PIT_MIN_DELTA 16 /* * Returns early if any interrupts are serviced, or if the requested delay is * too short. Must be called with interrupts disabled, will enable interrupts * "atomically" during idle loop. */ -void cpu_block(uint64_t until) { +void cpu_block(uint64_t until) +{ uint64_t now, delta_ns; uint64_t delta_ticks; unsigned int ticks; @@ -267,10 +274,9 @@ void cpu_block(uint64_t until) { * the hopes that we might get new work and can do something * else than spin. */ - __asm__ __volatile__( - "sti;\n" - "nop;\n" /* ints are enabled 1 instr after sti */ - "cli;\n"); + __asm__ __volatile__("sti;\n" + "nop;\n" /* ints are enabled 1 instr after sti */ + "cli;\n"); return; } @@ -299,11 +305,10 @@ void cpu_block(uint64_t until) { * able to distinguish if the interrupt was the PIT interrupt * and no other, but this will do for now. */ - d = cpu_intr_depth; - cpu_intr_depth = 0; - __asm__ __volatile__( - "sti;\n" - "hlt;\n" - "cli;\n"); - cpu_intr_depth = d; + d = cpu_intr_depth; + cpu_intr_depth = 0; + __asm__ __volatile__("sti;\n" + "hlt;\n" + "cli;\n"); + cpu_intr_depth = d; } diff --git a/bindings/virtio/virtio_blk.c b/bindings/virtio/virtio_blk.c index 0a375e2ae..962997fab 100644 --- a/bindings/virtio/virtio_blk.c +++ b/bindings/virtio/virtio_blk.c @@ -36,7 +36,7 @@ #define VIRTIO_BLK_S_IOERR 1 #define VIRTIO_BLK_S_UNSUPP 2 -#define VIRTIO_BLK_SECTOR_SIZE 512 +#define VIRTIO_BLK_SECTOR_SIZE 512 struct virtio_blk_hdr { uint32_t type; @@ -44,7 +44,7 @@ struct virtio_blk_hdr { uint64_t sector; }; -#define VIRTQ_BLK 0 +#define VIRTQ_BLK 0 struct virtio_blk_desc { uint16_t pci_base; /* base in PCI config space */ struct virtq blkq; @@ -52,17 +52,15 @@ struct virtio_blk_desc { uint16_t sector_size; }; -#define VIRTIO_BLK_MAX_ENTRIES MFT_MAX_ENTRIES +#define VIRTIO_BLK_MAX_ENTRIES MFT_MAX_ENTRIES static struct virtio_blk_desc bd_table[VIRTIO_BLK_MAX_ENTRIES]; static unsigned bd_num_entries = 0; extern struct mft *virtio_manifest; /* Returns the index to the head of the buffers chain. */ -static uint16_t virtio_blk_op(struct virtio_blk_desc *bd, - uint32_t type, - uint64_t sector, - void *data, size_t len) +static uint16_t virtio_blk_op(struct virtio_blk_desc *bd, uint32_t type, + uint64_t sector, void *data, size_t len) { uint16_t mask = bd->blkq.num - 1; struct virtio_blk_hdr hdr; @@ -112,10 +110,8 @@ static uint16_t virtio_blk_op(struct virtio_blk_desc *bd, * time. That is true as long as we use only synchronous IO calls, and if * there is just a sync call at a time (which is true for solo5). */ -static int virtio_blk_op_sync(struct virtio_blk_desc *bd, - uint32_t type, - uint64_t sector, - void *data, size_t len) +static int virtio_blk_op_sync(struct virtio_blk_desc *bd, uint32_t type, + uint64_t sector, void *data, size_t len) { uint16_t mask = bd->blkq.num - 1; uint16_t head; @@ -154,7 +150,7 @@ static int virtio_blk_op_sync(struct virtio_blk_desc *bd, } static void virtio_blk_config(struct virtio_blk_desc *bd, - struct pci_config_info *pci) + struct pci_config_info *pci) { uint8_t ready_for_init = VIRTIO_PCI_STATUS_ACK | VIRTIO_PCI_STATUS_DRIVER; uint32_t host_features, guest_features; @@ -172,14 +168,14 @@ static void virtio_blk_config(struct virtio_blk_desc *bd, bd->sector_size = VIRTIO_BLK_SECTOR_SIZE; bd->sectors = inq(pci->base + VIRTIO_PCI_CONFIG_OFF); - log(INFO, "Solo5: PCI:%02x:%02x: configured, capacity=%llu sectors, " + log(INFO, + "Solo5: PCI:%02x:%02x: configured, capacity=%llu sectors, " "features=0x%x\n", - pci->bus, pci->dev, (unsigned long long)bd->sectors, - host_features); + pci->bus, pci->dev, (unsigned long long)bd->sectors, host_features); virtq_init_rings(pci->base, &bd->blkq, 0); - pgs = (((bd->blkq.num * sizeof (struct io_buffer)) - 1) >> PAGE_SHIFT) + 1; + pgs = (((bd->blkq.num * sizeof(struct io_buffer)) - 1) >> PAGE_SHIFT) + 1; bd->blkq.bufs = mem_ialloc_pages(pgs); assert(bd->blkq.bufs); memset(bd->blkq.bufs, 0, pgs << PAGE_SHIFT); @@ -202,21 +198,23 @@ static void virtio_blk_config(struct virtio_blk_desc *bd, outb(pci->base + VIRTIO_PCI_STATUS, VIRTIO_PCI_STATUS_DRIVER_OK); } -int virtio_config_block(struct pci_config_info *pci,solo5_handle_t mft_index) +int virtio_config_block(struct pci_config_info *pci, solo5_handle_t mft_index) { unsigned bd_index = bd_num_entries; if (bd_index >= VIRTIO_BLK_MAX_ENTRIES) { - log(WARN, "Solo5: Virtio blk: PCI:%02x:%02x not configured: " - "too many devices.\n", pci->bus, pci->dev); + log(WARN, + "Solo5: Virtio blk: PCI:%02x:%02x not configured: " + "too many devices.\n", + pci->bus, pci->dev); return -1; } - struct mft_entry *e = mft_get_by_index(virtio_manifest, mft_index, - MFT_DEV_BLOCK_BASIC); + struct mft_entry *e = + mft_get_by_index(virtio_manifest, mft_index, MFT_DEV_BLOCK_BASIC); if (e == NULL) { log(WARN, "Solo5: Virtio blk: PCI:%02x:%02x not in manifest\n", - pci->bus, pci->dev); + pci->bus, pci->dev); return -1; } @@ -233,11 +231,11 @@ int virtio_config_block(struct pci_config_info *pci,solo5_handle_t mft_index) } solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *h, - struct solo5_block_info *info) + struct solo5_block_info *info) { unsigned mft_index; - struct mft_entry *e = mft_get_by_name(virtio_manifest, name, - MFT_DEV_BLOCK_BASIC, &mft_index); + struct mft_entry *e = + mft_get_by_name(virtio_manifest, name, MFT_DEV_BLOCK_BASIC, &mft_index); if (e == NULL) return SOLO5_R_EINVAL; assert(e->attached); @@ -251,9 +249,10 @@ solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *h, } solo5_result_t solo5_block_write(solo5_handle_t h, solo5_off_t offset, - const uint8_t *buf, size_t size) + const uint8_t *buf, size_t size) { - struct mft_entry *e = mft_get_by_index(virtio_manifest, h, MFT_DEV_BLOCK_BASIC); + struct mft_entry *e = + mft_get_by_index(virtio_manifest, h, MFT_DEV_BLOCK_BASIC); if (e == NULL) return SOLO5_R_EINVAL; assert(e->attached); @@ -279,16 +278,17 @@ solo5_result_t solo5_block_write(solo5_handle_t h, solo5_off_t offset, */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-qual" - int rv = virtio_blk_op_sync(bd, VIRTIO_BLK_T_OUT, sector, - (uint8_t *)buf, size); + int rv = + virtio_blk_op_sync(bd, VIRTIO_BLK_T_OUT, sector, (uint8_t *)buf, size); #pragma GCC diagnostic pop return (rv == 0) ? SOLO5_R_OK : SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_read(solo5_handle_t h, solo5_off_t offset, - uint8_t *buf, size_t size) + uint8_t *buf, size_t size) { - struct mft_entry *e = mft_get_by_index(virtio_manifest, h, MFT_DEV_BLOCK_BASIC); + struct mft_entry *e = + mft_get_by_index(virtio_manifest, h, MFT_DEV_BLOCK_BASIC); if (e == NULL) return SOLO5_R_EINVAL; assert(e->attached); diff --git a/bindings/virtio/virtio_net.c b/bindings/virtio/virtio_net.c index 65c98e510..9e7df8039 100644 --- a/bindings/virtio/virtio_net.c +++ b/bindings/virtio/virtio_net.c @@ -24,9 +24,9 @@ /* The feature bitmap for virtio net */ #define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */ -#define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */ -#define VIRTIO_NET_F_MTU (1 << 3) -#define VIRTIO_NET_F_MAC (1 << 5) /* Host has given MAC address. */ +#define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */ +#define VIRTIO_NET_F_MTU (1 << 3) +#define VIRTIO_NET_F_MAC (1 << 5) /* Host has given MAC address. */ #define PKT_BUFFER_LEN 1526 #define VIRTIO_NET_MTU 1500 @@ -42,7 +42,7 @@ struct virtio_net_desc { solo5_handle_t handle; }; -#define VIRTIO_NET_MAX_ENTRIES MFT_MAX_ENTRIES +#define VIRTIO_NET_MAX_ENTRIES MFT_MAX_ENTRIES static struct virtio_net_desc nd_table[VIRTIO_NET_MAX_ENTRIES]; static unsigned nd_num_entries = 0; @@ -61,19 +61,19 @@ typedef uint64_t virtio_set_t; * specify GSO or CSUM features, you can simply ignore the header. */ struct __attribute__((__packed__)) virtio_net_hdr { -#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 /* Use csum_start, csum_offset */ -#define VIRTIO_NET_HDR_F_DATA_VALID 2 /* Csum is valid */ +#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 /* Use csum_start, csum_offset */ +#define VIRTIO_NET_HDR_F_DATA_VALID 2 /* Csum is valid */ uint8_t flags; -#define VIRTIO_NET_HDR_GSO_NONE 0 /* Not a GSO frame */ -#define VIRTIO_NET_HDR_GSO_TCPV4 1 /* GSO frame, IPv4 TCP (TSO) */ -#define VIRTIO_NET_HDR_GSO_UDP 3 /* GSO frame, IPv4 UDP (UFO) */ -#define VIRTIO_NET_HDR_GSO_TCPV6 4 /* GSO frame, IPv6 TCP */ -#define VIRTIO_NET_HDR_GSO_ECN 0x80 /* TCP has ECN set */ +#define VIRTIO_NET_HDR_GSO_NONE 0 /* Not a GSO frame */ +#define VIRTIO_NET_HDR_GSO_TCPV4 1 /* GSO frame, IPv4 TCP (TSO) */ +#define VIRTIO_NET_HDR_GSO_UDP 3 /* GSO frame, IPv4 UDP (UFO) */ +#define VIRTIO_NET_HDR_GSO_TCPV6 4 /* GSO frame, IPv6 TCP */ +#define VIRTIO_NET_HDR_GSO_ECN 0x80 /* TCP has ECN set */ uint8_t gso_type; - uint16_t hdr_len; /* Ethernet + IP + tcp/udp hdrs */ - uint16_t gso_size; /* Bytes to append to hdr_len per frame */ - uint16_t csum_start; /* Position to start checksumming from */ - uint16_t csum_offset; /* Offset after that to place checksum */ + uint16_t hdr_len; /* Ethernet + IP + tcp/udp hdrs */ + uint16_t gso_size; /* Bytes to append to hdr_len per frame */ + uint16_t csum_start; /* Position to start checksumming from */ + uint16_t csum_offset; /* Offset after that to place checksum */ }; static char virtio_net_mac_str[18]; @@ -119,8 +119,8 @@ static void recv_setup(struct virtio_net_desc *nd) } /* performance note: we perform a copy into the xmit buffer */ -int virtio_net_xmit_packet(struct virtio_net_desc *nd, - const void *data, size_t len) +int virtio_net_xmit_packet(struct virtio_net_desc *nd, const void *data, + size_t len) { uint16_t mask = nd->xmitq.num - 1; uint16_t head; @@ -142,7 +142,7 @@ int virtio_net_xmit_packet(struct virtio_net_desc *nd, ; virtio_rmb(); for (; nd->xmitq.last_used != nd->xmitq.used->idx; - nd->xmitq.last_used++) + nd->xmitq.last_used++) nd->xmitq.num_avail += 2; } @@ -219,20 +219,15 @@ static void virtio_net_config(struct virtio_net_desc *nd, So we read 16 bit at offset 10. */ if (host_features & VIRTIO_NET_F_MTU) { - nd->mtu = inw(pci->base + VIRTIO_PCI_CONFIG_OFF + 6 + 2 + 2); + nd->mtu = inw(pci->base + VIRTIO_PCI_CONFIG_OFF + 6 + 2 + 2); } else - nd->mtu = VIRTIO_NET_MTU; - - snprintf(virtio_net_mac_str, - sizeof(virtio_net_mac_str), - "%02x:%02x:%02x:%02x:%02x:%02x", - nd->net_mac[0], - nd->net_mac[1], - nd->net_mac[2], - nd->net_mac[3], - nd->net_mac[4], - nd->net_mac[5]); - log(INFO, "Solo5: PCI:%02x:%02x: configured, mac=%s, mtu=%d, features=0x%x\n", + nd->mtu = VIRTIO_NET_MTU; + + snprintf(virtio_net_mac_str, sizeof(virtio_net_mac_str), + "%02x:%02x:%02x:%02x:%02x:%02x", nd->net_mac[0], nd->net_mac[1], + nd->net_mac[2], nd->net_mac[3], nd->net_mac[4], nd->net_mac[5]); + log(INFO, + "Solo5: PCI:%02x:%02x: configured, mac=%s, mtu=%d, features=0x%x\n", pci->bus, pci->dev, virtio_net_mac_str, nd->mtu, host_features); /* @@ -244,12 +239,12 @@ static void virtio_net_config(struct virtio_net_desc *nd, virtq_init_rings(pci->base, &nd->recvq, VIRTQ_RECV); virtq_init_rings(pci->base, &nd->xmitq, VIRTQ_XMIT); - pgs = (((nd->recvq.num * sizeof (struct io_buffer)) - 1) >> PAGE_SHIFT) + 1; + pgs = (((nd->recvq.num * sizeof(struct io_buffer)) - 1) >> PAGE_SHIFT) + 1; nd->recvq.bufs = mem_ialloc_pages(pgs); assert(nd->recvq.bufs); memset(nd->recvq.bufs, 0, pgs << PAGE_SHIFT); - pgs = (((nd->recvq.num * sizeof (struct io_buffer)) - 1) >> PAGE_SHIFT) + 1; + pgs = (((nd->recvq.num * sizeof(struct io_buffer)) - 1) >> PAGE_SHIFT) + 1; nd->xmitq.bufs = mem_ialloc_pages(pgs); assert(nd->xmitq.bufs); memset(nd->xmitq.bufs, 0, pgs << PAGE_SHIFT); @@ -313,7 +308,7 @@ static void virtio_net_pkt_poll(virtio_set_t *ready_set) /* Get the data from the next_avail (top-most) receive buffer/descriptor in * the available ring. */ static uint8_t *virtio_net_recv_pkt_get(struct virtio_net_desc *nd, - size_t *size) + size_t *size) { uint16_t mask = nd->recvq.num - 1; struct virtq_used_elem *e; @@ -330,7 +325,7 @@ static uint8_t *virtio_net_recv_pkt_get(struct virtio_net_desc *nd, e = &(nd->recvq.used->ring[nd->recvq.last_used & mask]); desc_idx = e->id; - buf = (struct io_buffer *) nd->recvq.desc[desc_idx].addr; + buf = (struct io_buffer *)nd->recvq.desc[desc_idx].addr; buf->len = e->len; /* Remove the virtio_net_hdr */ @@ -344,11 +339,13 @@ static void virtio_net_recv_pkt_put(struct virtio_net_desc *nd) { uint16_t mask = nd->recvq.num - 1; nd->recvq.bufs[nd->recvq.next_avail & mask].len = PKT_BUFFER_LEN; - nd->recvq.bufs[nd->recvq.next_avail & mask].extra_flags = VIRTQ_DESC_F_WRITE; + nd->recvq.bufs[nd->recvq.next_avail & mask].extra_flags = + VIRTQ_DESC_F_WRITE; /* This sets the returned descriptor to be ready for incoming packets, and * advances the next_avail index. */ - assert(virtq_add_descriptor_chain(&nd->recvq, nd->recvq.next_avail & mask, 1) == 0); + assert(virtq_add_descriptor_chain(&nd->recvq, nd->recvq.next_avail & mask, + 1) == 0); virtio_mb(); if (virtq_notify_needed(&nd->recvq)) outw(nd->pci_base + VIRTIO_PCI_QUEUE_NOTIFY, VIRTQ_RECV); @@ -359,16 +356,18 @@ int virtio_config_network(struct pci_config_info *pci, solo5_handle_t mft_index) unsigned nd_index = nd_num_entries; if (nd_index >= MFT_MAX_ENTRIES) { - log(WARN, "Solo5: Virtio net: PCI:%02x:%02x not configured: " - "too many devices\n", pci->bus, pci->dev); + log(WARN, + "Solo5: Virtio net: PCI:%02x:%02x not configured: " + "too many devices\n", + pci->bus, pci->dev); return -1; } - struct mft_entry *e = mft_get_by_index(virtio_manifest, - mft_index, MFT_DEV_NET_BASIC); + struct mft_entry *e = + mft_get_by_index(virtio_manifest, mft_index, MFT_DEV_NET_BASIC); if (e == NULL) { log(WARN, "Solo5: Virtio net: PCI:%02x:%02x not in manifest\n", - pci->bus, pci->dev); + pci->bus, pci->dev); return -1; } @@ -390,7 +389,7 @@ int virtio_config_network(struct pci_config_info *pci, solo5_handle_t mft_index) } solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *h, - struct solo5_net_info *info) + struct solo5_net_info *info) { unsigned mft_index; struct mft_entry *mft_e; @@ -398,7 +397,8 @@ solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *h, if (!net_configured) return SOLO5_R_EUNSPEC; - mft_e = mft_get_by_name(virtio_manifest, name, MFT_DEV_NET_BASIC, &mft_index); + mft_e = + mft_get_by_name(virtio_manifest, name, MFT_DEV_NET_BASIC, &mft_index); if (mft_e == NULL) return SOLO5_R_EINVAL; @@ -461,9 +461,10 @@ void solo5_yield(solo5_time_t deadline, solo5_handle_set_t *ready_set) } solo5_result_t solo5_net_write(solo5_handle_t h, const uint8_t *buf, - size_t size) + size_t size) { - struct mft_entry *e = mft_get_by_index(virtio_manifest, h, MFT_DEV_NET_BASIC); + struct mft_entry *e = + mft_get_by_index(virtio_manifest, h, MFT_DEV_NET_BASIC); if (e == NULL) return SOLO5_R_EINVAL; @@ -476,7 +477,7 @@ solo5_result_t solo5_net_write(solo5_handle_t h, const uint8_t *buf, /* Returns 0 if a packet was read, -1 if there is there is no pending packet. */ static int virtio_net_recv(struct virtio_net_desc *nd, uint8_t *buf, - size_t size, size_t *read_size) + size_t size, size_t *read_size) { uint8_t *pkt; size_t len = size; @@ -526,9 +527,10 @@ static int virtio_net_recv(struct virtio_net_desc *nd, uint8_t *buf, } solo5_result_t solo5_net_read(solo5_handle_t h, uint8_t *buf, size_t size, - size_t *read_size) + size_t *read_size) { - struct mft_entry *e = mft_get_by_index(virtio_manifest, h, MFT_DEV_NET_BASIC); + struct mft_entry *e = + mft_get_by_index(virtio_manifest, h, MFT_DEV_NET_BASIC); if (e == NULL) return SOLO5_R_EINVAL; diff --git a/bindings/virtio/virtio_pci.h b/bindings/virtio/virtio_pci.h index ac32aa0b6..be0ed7b8a 100644 --- a/bindings/virtio/virtio_pci.h +++ b/bindings/virtio/virtio_pci.h @@ -22,37 +22,37 @@ #define VIRTIO_PCI_H /* virtio config space layout */ -#define VIRTIO_PCI_HOST_FEATURES 0 /* 32-bit r/o */ -#define VIRTIO_PCI_GUEST_FEATURES 4 /* 32-bit r/w */ -#define VIRTIO_PCI_QUEUE_PFN 8 /* 32-bit r/w */ -#define VIRTIO_PCI_QUEUE_SIZE 12 /* 16-bit r/o */ -#define VIRTIO_PCI_QUEUE_SEL 14 /* 16-bit r/w */ -#define VIRTIO_PCI_QUEUE_NOTIFY 16 /* 16-bit r/w */ +#define VIRTIO_PCI_HOST_FEATURES 0 /* 32-bit r/o */ +#define VIRTIO_PCI_GUEST_FEATURES 4 /* 32-bit r/w */ +#define VIRTIO_PCI_QUEUE_PFN 8 /* 32-bit r/w */ +#define VIRTIO_PCI_QUEUE_SIZE 12 /* 16-bit r/o */ +#define VIRTIO_PCI_QUEUE_SEL 14 /* 16-bit r/w */ +#define VIRTIO_PCI_QUEUE_NOTIFY 16 /* 16-bit r/w */ /* How many bits to shift physical queue address written to QUEUE_PFN. * 12 is historical, and due to x86 page size. */ -#define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12 +#define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12 /* The status register lets us tell the device where we are in * initialization */ -#define VIRTIO_PCI_STATUS 18 /* 8-bit r/w */ -#define VIRTIO_PCI_STATUS_ACK 0x1 /* we recognize device as virtio */ -#define VIRTIO_PCI_STATUS_DRIVER 0x2 /* we want to drive it */ -#define VIRTIO_PCI_STATUS_DRIVER_OK 0x4 /* initialization is complete */ -#define VIRTIO_PCI_STATUS_FAIL 0x80 /* tell device something's wrong */ +#define VIRTIO_PCI_STATUS 18 /* 8-bit r/w */ +#define VIRTIO_PCI_STATUS_ACK 0x1 /* we recognize device as virtio */ +#define VIRTIO_PCI_STATUS_DRIVER 0x2 /* we want to drive it */ +#define VIRTIO_PCI_STATUS_DRIVER_OK 0x4 /* initialization is complete */ +#define VIRTIO_PCI_STATUS_FAIL 0x80 /* tell device something's wrong */ /* Reading the value will return the current contents of the interrupt * status register and will also clear it. This is effectively a * read-and-acknowledge. */ -#define VIRTIO_PCI_ISR 19 /* 8-bit r/o */ -#define VIRTIO_PCI_ISR_HAS_INTR 0x1 /* interrupt is for this device */ -#define VIRTIO_PCI_ISR_CONFIG 0x2 /* config change bit */ +#define VIRTIO_PCI_ISR 19 /* 8-bit r/o */ +#define VIRTIO_PCI_ISR_HAS_INTR 0x1 /* interrupt is for this device */ +#define VIRTIO_PCI_ISR_CONFIG 0x2 /* config change bit */ /* xxx assuming msi is not configured */ -#define VIRTIO_PCI_CONFIG_OFF 20 +#define VIRTIO_PCI_CONFIG_OFF 20 #endif diff --git a/bindings/virtio/virtio_ring.c b/bindings/virtio/virtio_ring.c index ee28e12c8..5e64b8d32 100644 --- a/bindings/virtio/virtio_ring.c +++ b/bindings/virtio/virtio_ring.c @@ -34,9 +34,7 @@ * starting at index head. * Make sure the vq-bufs are cleaned before using them again. */ -int virtq_add_descriptor_chain(struct virtq *vq, - uint16_t head, - uint16_t num) +int virtq_add_descriptor_chain(struct virtq *vq, uint16_t head, uint16_t num) { uint16_t mask = vq->num - 1; struct virtq_desc *desc; @@ -61,8 +59,8 @@ int virtq_add_descriptor_chain(struct virtq *vq, * the interrupt handler we can just cast this pointer back into a * 'struct io_buffer'. */ - assert(vq->bufs[i].data == (uint8_t *) &vq->bufs[i]); - desc->addr = (uint64_t) vq->bufs[i].data; + assert(vq->bufs[i].data == (uint8_t *)&vq->bufs[i]); + desc->addr = (uint64_t)vq->bufs[i].data; desc->len = vq->bufs[i].len; desc->flags = VIRTQ_DESC_F_NEXT | vq->bufs[i].extra_flags; @@ -92,7 +90,7 @@ void virtq_init_rings(uint16_t pci_base, struct virtq *vq, int selector) { uint8_t *data; size_t pgs; - + outw(pci_base + VIRTIO_PCI_QUEUE_SEL, selector); vq->last_used = vq->next_avail = 0; vq->uses_event_idx = 0; @@ -111,6 +109,6 @@ void virtq_init_rings(uint16_t pci_base, struct virtq *vq, int selector) vq->used = (struct virtq_used *)(data + VIRTQ_OFF_USED(vq->num)); outw(pci_base + VIRTIO_PCI_QUEUE_SEL, selector); - outl(pci_base + VIRTIO_PCI_QUEUE_PFN, (uint64_t) data - >> VIRTIO_PCI_QUEUE_ADDR_SHIFT); + outl(pci_base + VIRTIO_PCI_QUEUE_PFN, + (uint64_t)data >> VIRTIO_PCI_QUEUE_ADDR_SHIFT); } diff --git a/bindings/virtio/virtio_ring.h b/bindings/virtio/virtio_ring.h index ce5c2f82f..88402935a 100644 --- a/bindings/virtio/virtio_ring.h +++ b/bindings/virtio/virtio_ring.h @@ -18,8 +18,8 @@ * 3. Neither the name of IBM nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL @@ -47,77 +47,77 @@ typedef uint32_t le32; typedef uint64_t le64; /* This marks a buffer as continuing via the next field. */ -#define VIRTQ_DESC_F_NEXT 1 +#define VIRTQ_DESC_F_NEXT 1 /* This marks a buffer as write-only (otherwise read-only). */ -#define VIRTQ_DESC_F_WRITE 2 +#define VIRTQ_DESC_F_WRITE 2 /* This means the buffer contains a list of buffer descriptors. */ -#define VIRTQ_DESC_F_INDIRECT 4 +#define VIRTQ_DESC_F_INDIRECT 4 /* The device uses this in used->flags to advise the driver: don't kick me * when you add a buffer. It's unreliable, so it's simply an * optimization. */ -#define VIRTQ_USED_F_NO_NOTIFY 1 +#define VIRTQ_USED_F_NO_NOTIFY 1 /* The driver uses this in avail->flags to advise the device: don't * interrupt me when you consume a buffer. It's unreliable, so it's * simply an optimization. */ -#define VIRTQ_AVAIL_F_NO_INTERRUPT 1 +#define VIRTQ_AVAIL_F_NO_INTERRUPT 1 /* Support for indirect descriptors */ -#define VIRTIO_F_INDIRECT_DESC 28 +#define VIRTIO_F_INDIRECT_DESC 28 /* Support for avail_event and used_event fields */ -#define VIRTIO_F_EVENT_IDX 29 +#define VIRTIO_F_EVENT_IDX 29 /* Arbitrary descriptor layouts. */ -#define VIRTIO_F_ANY_LAYOUT 27 +#define VIRTIO_F_ANY_LAYOUT 27 #define VIRTQ_OFF_DESC(q) 0 #define VIRTQ_OFF_AVAIL(q) ((q) * sizeof(struct virtq_desc)) -#define VIRTQ_OFF_AVAIL_RING(q) (VIRTQ_OFF_AVAIL(q) \ - + sizeof(struct virtq_avail)) -#define VIRTQ_OFF_PADDING(q) (VIRTQ_OFF_AVAIL_RING(q) \ - + (sizeof(le16) * (q)) \ - + sizeof(le16)) /* used_event */ +#define VIRTQ_OFF_AVAIL_RING(q) \ + (VIRTQ_OFF_AVAIL(q) + sizeof(struct virtq_avail)) +#define VIRTQ_OFF_PADDING(q) \ + (VIRTQ_OFF_AVAIL_RING(q) + (sizeof(le16) * (q)) + \ + sizeof(le16)) /* used_event */ #define VIRTQ_OFF_USED(q) ((VIRTQ_OFF_PADDING(q) + PAGE_SIZE - 1) & PAGE_MASK) #define VIRTQ_OFF_USED_RING(q) (VIRTQ_OFF_USED(q) + sizeof(struct virtq_used)) -#define VIRTQ_SIZE(q) (VIRTQ_OFF_USED_RING(q) \ - + (sizeof(struct virtq_used_elem) * (q)) \ - + sizeof(le16)) /* avail_event */ +#define VIRTQ_SIZE(q) \ + (VIRTQ_OFF_USED_RING(q) + (sizeof(struct virtq_used_elem) * (q)) + \ + sizeof(le16)) /* avail_event */ /* Virtqueue descriptors: 16 bytes. * These can chain together via "next". */ struct virtq_desc { - /* Address (guest-physical). */ - le64 addr; - /* Length. */ - le32 len; - /* The flags as indicated above. */ - le16 flags; - /* We chain unused descriptors via this, too */ - le16 next; + /* Address (guest-physical). */ + le64 addr; + /* Length. */ + le32 len; + /* The flags as indicated above. */ + le16 flags; + /* We chain unused descriptors via this, too */ + le16 next; }; struct virtq_avail { - le16 flags; - le16 idx; - le16 ring[]; - /* Only if VIRTIO_F_EVENT_IDX: le16 used_event; */ + le16 flags; + le16 idx; + le16 ring[]; + /* Only if VIRTIO_F_EVENT_IDX: le16 used_event; */ }; /* le32 is used here for ids for padding reasons. */ struct virtq_used_elem { - /* Index of start of used descriptor chain. */ - le32 id; - /* Total length of the descriptor chain which was written to. */ - le32 len; + /* Index of start of used descriptor chain. */ + le32 id; + /* Total length of the descriptor chain which was written to. */ + le32 len; }; struct virtq_used { - le16 flags; - volatile le16 idx; - struct virtq_used_elem ring[]; - /* Only if VIRTIO_F_EVENT_IDX: le16 avail_event; */ + le16 flags; + volatile le16 idx; + struct virtq_used_elem ring[]; + /* Only if VIRTIO_F_EVENT_IDX: le16 avail_event; */ }; /* This is the max buffer length per descriptor. */ @@ -140,41 +140,42 @@ struct io_buffer { }; struct virtq { - unsigned int num; + unsigned int num; - struct virtq_desc *desc; - struct virtq_avail *avail; - struct virtq_used *used; - struct io_buffer *bufs; + struct virtq_desc *desc; + struct virtq_avail *avail; + struct virtq_used *used; + struct io_buffer *bufs; - /* Keep track of available (free) descriptors */ - uint16_t num_avail; + /* Keep track of available (free) descriptors */ + uint16_t num_avail; - /* Indexes in the descriptors array */ - uint16_t last_used; - uint16_t next_avail; + /* Indexes in the descriptors array */ + uint16_t last_used; + uint16_t next_avail; - /* VIRTIO_F_EVENT_IDX support */ - uint8_t uses_event_idx; - uint16_t last_notified_idx; + /* VIRTIO_F_EVENT_IDX support */ + uint8_t uses_event_idx; + uint16_t last_notified_idx; }; -static inline int virtq_need_event(uint16_t event_idx, uint16_t new_idx, uint16_t old_idx) +static inline int virtq_need_event(uint16_t event_idx, uint16_t new_idx, + uint16_t old_idx) { - return (uint16_t)(new_idx - event_idx - 1) < (uint16_t)(new_idx - old_idx); + return (uint16_t)(new_idx - event_idx - 1) < (uint16_t)(new_idx - old_idx); } /* Get location of event indices (only with VIRTIO_F_EVENT_IDX) */ static inline le16 *virtq_used_event(struct virtq *vq) { - /* For backwards compat, used event index is at *end* of avail ring. */ - return &vq->avail->ring[vq->num]; + /* For backwards compat, used event index is at *end* of avail ring. */ + return &vq->avail->ring[vq->num]; } static inline le16 *virtq_avail_event(struct virtq *vq) { - /* For backwards compat, avail event index is at *end* of used ring. */ - return (le16 *)&vq->used->ring[vq->num]; + /* For backwards compat, avail event index is at *end* of used ring. */ + return (le16 *)&vq->used->ring[vq->num]; } /* @@ -186,25 +187,24 @@ static inline le16 *virtq_avail_event(struct virtq *vq) */ static inline int virtq_notify_needed(struct virtq *vq) { - if (vq->uses_event_idx) { - uint16_t old = vq->last_notified_idx; - uint16_t new = vq->avail->idx; - vq->last_notified_idx = new; - virtio_mb(); - return virtq_need_event(*virtq_avail_event(vq), new, old); - } - return !(vq->used->flags & VIRTQ_USED_F_NO_NOTIFY); + if (vq->uses_event_idx) { + uint16_t old = vq->last_notified_idx; + uint16_t new = vq->avail->idx; + vq->last_notified_idx = new; + virtio_mb(); + return virtq_need_event(*virtq_avail_event(vq), new, old); + } + return !(vq->used->flags & VIRTQ_USED_F_NO_NOTIFY); } /* * Create a descriptor chain starting at index head, using vq->bufs also - * starting at index head. Num is the number of descriptors (and number of bufs). + * starting at index head. Num is the number of descriptors (and number of + * bufs). * * Returns 0 on success. */ -int virtq_add_descriptor_chain(struct virtq *vq, - uint16_t head, - uint16_t num); +int virtq_add_descriptor_chain(struct virtq *vq, uint16_t head, uint16_t num); void virtq_init_rings(uint16_t pci_base, struct virtq *vq, int selector); diff --git a/bindings/xen/bindings.h b/bindings/xen/bindings.h index ba65aaf81..0d14091c6 100644 --- a/bindings/xen/bindings.h +++ b/bindings/xen/bindings.h @@ -23,7 +23,7 @@ * * This header file includes (supersedes) the common bindings.h for the Xen * implementation. -*/ + */ #ifndef __XEN_BINDINGS_H__ #define __XEN_BINDINGS_H__ @@ -47,7 +47,7 @@ uint64_t pvclock_epochoffset(void); void time_init(void); /* evtchn.c: Xen event channel interface */ -typedef void(*evtchn_handler_fn_t)(evtchn_port_t, void *); +typedef void (*evtchn_handler_fn_t)(evtchn_port_t, void *); void evtchn_init(void); void evtchn_register_handler(evtchn_port_t, evtchn_handler_fn_t, void *); diff --git a/bindings/xen/console.c b/bindings/xen/console.c index 19fff1ba5..cb0cce0e3 100644 --- a/bindings/xen/console.c +++ b/bindings/xen/console.c @@ -29,22 +29,23 @@ * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #include "bindings.h" @@ -77,12 +78,11 @@ static size_t console_write_some(const char *buf, size_t len) * twice if we overrun the ring, too bad. */ if (buf[s] == '\n') { if (!wrote_cr) { - console_ring->out[prod++ & (sizeof(console_ring->out) - 1)] \ - = '\r'; + console_ring->out[prod++ & (sizeof(console_ring->out) - 1)] = + '\r'; wrote_cr = true; continue; - } - else { + } else { wrote_cr = false; } } @@ -105,8 +105,7 @@ void console_write(const char *buf, size_t len) size_t written = 0; XENCONS_RING_IDX cons = LOAD_ACQUIRE(&console_ring->out_cons); - do - { + do { /* Try and put some data into the ring. */ written += console_write_some(&buf[written], len - written); @@ -117,8 +116,7 @@ void console_write(const char *buf, size_t len) * If we have more to write, the ring must have filled up. Wait for * more space. */ - if (written < len) - { + if (written < len) { while (ACCESS_ONCE(console_ring->out_cons) == cons) hypercall_yield(); } @@ -150,5 +148,5 @@ void console_init(void) * up and running early in the boot process. */ log(INFO, "Solo5: Xen console: port 0x%x, ring @0x%p\n", console_evtchn, - console_ring); + console_ring); } diff --git a/bindings/xen/evtchn.c b/bindings/xen/evtchn.c index 63b7c6821..ab996681c 100644 --- a/bindings/xen/evtchn.c +++ b/bindings/xen/evtchn.c @@ -41,15 +41,13 @@ struct evtchn_handler { static struct evtchn_handler evtchn_handlers[EVTCHN_PORT_MAX + 1]; void evtchn_register_handler(evtchn_port_t port, evtchn_handler_fn_t handler, - void *arg) + void *arg) { assert(port <= EVTCHN_PORT_MAX); assert(evtchn_handlers[port].handler == NULL); cpu_intr_disable(); - evtchn_handlers[port] = (struct evtchn_handler){ - .handler = handler, - .arg = arg - }; + evtchn_handlers[port] = + (struct evtchn_handler){.handler = handler, .arg = arg}; cpu_intr_enable(); } @@ -58,7 +56,7 @@ evtchn_port_t evtchn_bind_virq(uint32_t virq) evtchn_port_t port; int rc = hypercall_evtchn_bind_virq(virq, 0, &port); - assert (rc == 0); + assert(rc == 0); return port; } @@ -92,7 +90,7 @@ void evtchn_unmask(evtchn_port_t port) } static int evtchn_vector_handler(void *arg __attribute__((unused))) -__attribute__((used)); + __attribute__((used)); /* * Called in interrupt context. @@ -132,8 +130,8 @@ static int evtchn_vector_handler(void *arg __attribute__((unused))) * that we continue processing events if new ones are triggered while * we're in the loop. */ - while ((pending_l2 = - (s->evtchn_pending[l1i] & ~s->evtchn_mask[l1i])) != 0) { + while ((pending_l2 = (s->evtchn_pending[l1i] & ~s->evtchn_mask[l1i])) != + 0) { xen_ulong_t l2i = ffs(pending_l2); evtchn_port_t port = (l1i * (sizeof(xen_ulong_t) * 8)) + l2i; @@ -159,7 +157,7 @@ static int evtchn_vector_handler(void *arg __attribute__((unused))) * work. */ int solo5__xen_evtchn_vector_handler(void *) -__attribute__((alias("evtchn_vector_handler"), weak)); + __attribute__((alias("evtchn_vector_handler"), weak)); void evtchn_init(void) { @@ -168,12 +166,12 @@ void evtchn_init(void) /* * Start with all event channels masked. */ - for(unsigned e = 0; e < EVTCHN_2L_NR_CHANNELS; e++) + for (unsigned e = 0; e < EVTCHN_2L_NR_CHANNELS; e++) atomic_sync_bts(e, &s->evtchn_mask[0]); /* - * Register to receive event channel upcalls from Xen via IPI vector #32 which - * corresponds to IRQ 0 as understood by intr.c. + * Register to receive event channel upcalls from Xen via IPI vector #32 + * which corresponds to IRQ 0 as understood by intr.c. */ intr_register_irq(0, solo5__xen_evtchn_vector_handler, NULL); int rc = hypercall_set_evtchn_upcall_vector(0, 32); diff --git a/bindings/xen/hypercall-x86_64.h b/bindings/xen/hypercall-x86_64.h index 749e8a482..7340acfe0 100644 --- a/bindings/xen/hypercall-x86_64.h +++ b/bindings/xen/hypercall-x86_64.h @@ -29,22 +29,23 @@ * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __XEN_HYPERCALL_X86_64_H__ @@ -56,55 +57,50 @@ * Inputs: %rdi, %rsi, %rdx, %r10, %r8, %r9 (arguments 1-6) */ -#define _hypercall64_1(type, hcall, a1) \ - ({ \ - long __res, __ign1; \ - __asm__ __volatile__ ( \ - "call HYPERCALL_PAGE + %c[offset]" \ - : "=a" (__res), "=D" (__ign1) \ - : [offset] "i" (hcall * 32), \ - "1" ((long)(a1)) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall64_1(type, hcall, a1) \ + ({ \ + long __res, __ign1; \ + __asm__ __volatile__("call HYPERCALL_PAGE + %c[offset]" \ + : "=a"(__res), "=D"(__ign1) \ + : [offset] "i"(hcall * 32), "1"((long)(a1)) \ + : "memory"); \ + (type) __res; \ }) -#define _hypercall64_2(type, hcall, a1, a2) \ - ({ \ - long __res, __ign1, __ign2; \ - __asm__ __volatile__ ( \ - "call HYPERCALL_PAGE + %c[offset]" \ - : "=a" (__res), "=D" (__ign1), "=S" (__ign2) \ - : [offset] "i" (hcall * 32), \ - "1" ((long)(a1)), "2" ((long)(a2)) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall64_2(type, hcall, a1, a2) \ + ({ \ + long __res, __ign1, __ign2; \ + __asm__ __volatile__("call HYPERCALL_PAGE + %c[offset]" \ + : "=a"(__res), "=D"(__ign1), "=S"(__ign2) \ + : [offset] "i"(hcall * 32), "1"((long)(a1)), \ + "2"((long)(a2)) \ + : "memory"); \ + (type) __res; \ }) -#define _hypercall64_3(type, hcall, a1, a2, a3) \ - ({ \ - long __res, __ign1, __ign2, __ign3; \ - __asm__ __volatile__ ( \ - "call HYPERCALL_PAGE + %c[offset]" \ - : "=a" (__res), "=D" (__ign1), "=S" (__ign2), "=d" (__ign3) \ - : [offset] "i" (hcall * 32), \ - "1" ((long)(a1)), "2" ((long)(a2)), "3" ((long)(a3)) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall64_3(type, hcall, a1, a2, a3) \ + ({ \ + long __res, __ign1, __ign2, __ign3; \ + __asm__ __volatile__("call HYPERCALL_PAGE + %c[offset]" \ + : "=a"(__res), "=D"(__ign1), "=S"(__ign2), \ + "=d"(__ign3) \ + : [offset] "i"(hcall * 32), "1"((long)(a1)), \ + "2"((long)(a2)), "3"((long)(a3)) \ + : "memory"); \ + (type) __res; \ }) -#define _hypercall64_4(type, hcall, a1, a2, a3, a4) \ - ({ \ - long __res, __ign1, __ign2, __ign3, __ign4; \ - register long _a4 __asm__ ("r10") = ((long)(a4)); \ - __asm__ __volatile__ ( \ - "call HYPERCALL_PAGE + %c[offset]" \ - : "=a" (__res), "=D" (__ign1), "=S" (__ign2), "=d" (__ign3),\ - "=&r" (__ign4) \ - : [offset] "i" (hcall * 32), \ - "1" ((long)(a1)), "2" ((long)(a2)), "3" ((long)(a3)), \ - "4" (_a4) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall64_4(type, hcall, a1, a2, a3, a4) \ + ({ \ + long __res, __ign1, __ign2, __ign3, __ign4; \ + register long _a4 __asm__("r10") = ((long)(a4)); \ + __asm__ __volatile__("call HYPERCALL_PAGE + %c[offset]" \ + : "=a"(__res), "=D"(__ign1), "=S"(__ign2), \ + "=d"(__ign3), "=&r"(__ign4) \ + : [offset] "i"(hcall * 32), "1"((long)(a1)), \ + "2"((long)(a2)), "3"((long)(a3)), "4"(_a4) \ + : "memory"); \ + (type) __res; \ }) #endif /* __XEN_HYPERCALL_X86_64_H__ */ diff --git a/bindings/xen/hypercall.h b/bindings/xen/hypercall.h index aa1a96c01..121802049 100644 --- a/bindings/xen/hypercall.h +++ b/bindings/xen/hypercall.h @@ -67,12 +67,9 @@ static inline long hypercall__hvm_op(unsigned int cmd, void *arg) * Higher level hypercall helpers, type-safe. */ static inline int hypercall_evtchn_bind_virq(uint32_t virq, uint32_t vcpu, - evtchn_port_t *port) + evtchn_port_t *port) { - evtchn_bind_virq_t op = { - .virq = virq, - .vcpu = vcpu - }; + evtchn_bind_virq_t op = {.virq = virq, .vcpu = vcpu}; int rc = hypercall__event_channel_op(EVTCHNOP_bind_virq, &op); if (rc == 0) @@ -87,19 +84,14 @@ static inline int hypercall_evtchn_send(evtchn_port_t port) static inline void hypercall_evtchn_unmask(evtchn_port_t port) { - evtchn_unmask_t op = { - .port = port - }; + evtchn_unmask_t op = {.port = port}; (void)hypercall__event_channel_op(EVTCHNOP_unmask, &op); } static inline int hypercall_hvm_get_param(unsigned int idx, uint64_t *value) { - xen_hvm_param_t p = { - .domid = DOMID_SELF, - .index = idx - }; + xen_hvm_param_t p = {.domid = DOMID_SELF, .index = idx}; int rc = hypercall__hvm_op(HVMOP_get_param, &p); if (rc == 0) @@ -109,35 +101,26 @@ static inline int hypercall_hvm_get_param(unsigned int idx, uint64_t *value) static inline int hypercall_hvm_set_param(unsigned int idx, uint64_t value) { - xen_hvm_param_t p = { - .domid = DOMID_SELF, - .index = idx, - .value = value - }; + xen_hvm_param_t p = {.domid = DOMID_SELF, .index = idx, .value = value}; return hypercall__hvm_op(HVMOP_set_param, &p); } static inline int hypercall_physmap_add_shared_info(unsigned int idx, - uint64_t gpfn) + uint64_t gpfn) { - xen_add_to_physmap_t add = { - .domid = DOMID_SELF, - .space = XENMAPSPACE_shared_info, - .idx = idx, - .gpfn = gpfn - }; + xen_add_to_physmap_t add = {.domid = DOMID_SELF, + .space = XENMAPSPACE_shared_info, + .idx = idx, + .gpfn = gpfn}; return hypercall__memory_op(XENMEM_add_to_physmap, &add); } static inline int hypercall_set_evtchn_upcall_vector(uint32_t vcpu, - uint8_t vector) + uint8_t vector) { - xen_hvm_evtchn_upcall_vector_t op = { - .vcpu = vcpu, - .vector = vector - }; + xen_hvm_evtchn_upcall_vector_t op = {.vcpu = vcpu, .vector = vector}; return hypercall__hvm_op(HVMOP_set_evtchn_upcall_vector, &op); } diff --git a/bindings/xen/platform.c b/bindings/xen/platform.c index d7edb4ec7..4656d53bb 100644 --- a/bindings/xen/platform.c +++ b/bindings/xen/platform.c @@ -34,14 +34,14 @@ * below. */ uint8_t HYPERVISOR_SHARED_INFO[PAGE_SIZE] -__attribute__((aligned(PAGE_SIZE))) = { 0 }; + __attribute__((aligned(PAGE_SIZE))) = {0}; /* * Private ABI to allow direct access to the shared_info structures * by Mirage/Xen. May change or go away without warning. */ extern uint8_t *solo5__xen_HYPERVISOR_SHARED_INFO -__attribute__((alias("HYPERVISOR_SHARED_INFO"))); + __attribute__((alias("HYPERVISOR_SHARED_INFO"))); /* * Declared in hypercall_page.S, needed for hypercall_init(). @@ -53,7 +53,7 @@ static char cmdline[8192]; /* * Low 1MB is unused as on other targets, we place page tables in this space. */ -#define PLATFORM_MEM_START 0x100000UL +#define PLATFORM_MEM_START 0x100000UL #define PLATFORM_PAGETABLE_START 0x10000UL /* @@ -152,8 +152,7 @@ static void pagetable_init(void) */ *e = l1e_addr | X86_PTE_P | X86_PTE_W; l1e_addr += PAGE_SIZE; - } - else { + } else { *e = paddr | X86_PTE_P | X86_PTE_W | X86_PTE_PS | X86_PTE_XD; } @@ -188,11 +187,7 @@ static void pagetable_init(void) /* * Switch to new page tables. */ - __asm__ __volatile__( - "mov %0, %%cr3" - : : "a" (l4e_addr) - : "memory" - ); + __asm__ __volatile__("mov %0, %%cr3" : : "a"(l4e_addr) : "memory"); } static void hypercall_init(void) @@ -201,12 +196,11 @@ static void hypercall_init(void) bool found = false; for (base = XEN_CPUID_FIRST_LEAF; base < XEN_CPUID_FIRST_LEAF + 0x100000; - base += 0x100) { + base += 0x100) { x86_cpuid(base, &eax, &ebx, &ecx, &edx); if ((ebx == XEN_CPUID_SIGNATURE_EBX) && - (ecx == XEN_CPUID_SIGNATURE_ECX) && - (edx == XEN_CPUID_SIGNATURE_EDX) && - ((eax - base) >= 2)) { + (ecx == XEN_CPUID_SIGNATURE_ECX) && + (edx == XEN_CPUID_SIGNATURE_EDX) && ((eax - base) >= 2)) { found = true; break; } @@ -214,11 +208,9 @@ static void hypercall_init(void) assert(found); x86_cpuid(base + 2, &eax, &ebx, &ecx, &edx); - __asm__ __volatile("wrmsr" :: - "c" (base), - "a" ((uint32_t)((uintptr_t)&HYPERCALL_PAGE)), - "d" ((uint32_t)((uintptr_t)&HYPERCALL_PAGE >> 32)) - ); + __asm__ __volatile("wrmsr" ::"c"(base), + "a"((uint32_t)((uintptr_t)&HYPERCALL_PAGE)), + "d"((uint32_t)((uintptr_t)&HYPERCALL_PAGE >> 32))); cc_barrier(); /* @@ -266,8 +258,7 @@ static void parse_hvm_start_info(const void *arg) log(WARN, "Solo5: warning: command line too long, truncated\n"); } memcpy(cmdline, hvm_cmdline, cmdline_len); - } - else { + } else { cmdline[0] = 0; } } @@ -276,7 +267,7 @@ void platform_init(const void *arg) { bool is_direct_pvh_boot; - if (*((const uint32_t*)arg) == XEN_HVM_START_MAGIC_VALUE) + if (*((const uint32_t *)arg) == XEN_HVM_START_MAGIC_VALUE) is_direct_pvh_boot = true; else is_direct_pvh_boot = false; @@ -332,8 +323,8 @@ void platform_init(const void *arg) /* * Map the hypervisor shared_info page. */ - int rc = hypercall_physmap_add_shared_info(0, - (uintptr_t)&HYPERVISOR_SHARED_INFO >> PAGE_SHIFT); + int rc = hypercall_physmap_add_shared_info( + 0, (uintptr_t)&HYPERVISOR_SHARED_INFO >> PAGE_SHIFT); assert(rc == 0); /* diff --git a/bindings/xen/platform_intr.c b/bindings/xen/platform_intr.c index 4e8d6a2ab..04e44b903 100644 --- a/bindings/xen/platform_intr.c +++ b/bindings/xen/platform_intr.c @@ -30,13 +30,13 @@ #define MSR_IA32_APIC_BASE_MASK (0xffffffUL << 12) #define APIC_BASE 0xfee00000UL -#define DECLARE_MMIO32_REG(name, addr) \ - static uint32_t * const name = (uint32_t *)(addr) +#define DECLARE_MMIO32_REG(name, addr) \ + static uint32_t *const name = (uint32_t *)(addr) DECLARE_MMIO32_REG(APIC_VERSION, APIC_BASE + 0x30); -DECLARE_MMIO32_REG(APIC_SVR, APIC_BASE + 0xf0); -#define APIC_SVR_ENABLE (1U << 8) -DECLARE_MMIO32_REG(APIC_EOI, APIC_BASE + 0xb0); +DECLARE_MMIO32_REG(APIC_SVR, APIC_BASE + 0xf0); +#define APIC_SVR_ENABLE (1U << 8) +DECLARE_MMIO32_REG(APIC_EOI, APIC_BASE + 0xb0); static inline uint32_t mmio_readl(const uint32_t *addr) { @@ -52,23 +52,14 @@ static inline uint64_t rdmsrq(uint32_t base) { uint32_t low, high; - __asm__ __volatile__( - "rdmsr" : - "=a" (low), - "=d" (high) : - "c" (base) - ); + __asm__ __volatile__("rdmsr" : "=a"(low), "=d"(high) : "c"(base)); return ((uint64_t)high << 32) | low; } static inline void wrmsrq(uint32_t base, uint64_t val) { - __asm__ __volatile__( - "wrmsr" :: - "c" (base), - "a" ((uint32_t)val), - "d" ((uint32_t)(val >> 32)) - ); + __asm__ __volatile__("wrmsr" ::"c"(base), "a"((uint32_t)val), + "d"((uint32_t)(val >> 32))); } static int spurious_vector_handler(void *arg __attribute__((unused))) @@ -91,7 +82,7 @@ void platform_intr_init(void) wrmsrq(MSR_IA32_APIC_BASE, apic_base | MSR_IA32_APIC_BASE_ENABLE); apic_base = rdmsrq(MSR_IA32_APIC_BASE); if (!(apic_base & MSR_IA32_APIC_BASE_ENABLE) || - ((apic_base & MSR_IA32_APIC_BASE_MASK) != APIC_BASE)) { + ((apic_base & MSR_IA32_APIC_BASE_MASK) != APIC_BASE)) { log(ERROR, "Solo5: Could not enable APIC or not present\n"); assert(false); } diff --git a/bindings/xen/pvclock.c b/bindings/xen/pvclock.c index f8c1a228e..7ca337aa1 100644 --- a/bindings/xen/pvclock.c +++ b/bindings/xen/pvclock.c @@ -82,15 +82,15 @@ uint64_t pvclock_monotonic(void) do { version = pvclock_ti->version; - __asm__ ("mfence" ::: "memory"); + __asm__("mfence" ::: "memory"); delta = cpu_rdtsc() - pvclock_ti->tsc_timestamp; if (pvclock_ti->tsc_shift < 0) delta >>= -pvclock_ti->tsc_shift; else delta <<= pvclock_ti->tsc_shift; time_now = mul64_32(delta, pvclock_ti->tsc_to_system_mul, 32) + - pvclock_ti->system_time; - __asm__ ("mfence" ::: "memory"); + pvclock_ti->system_time; + __asm__("mfence" ::: "memory"); } while ((pvclock_ti->version & 1) || (pvclock_ti->version != version)); return time_now; @@ -106,16 +106,17 @@ static uint64_t pvclock_read_wall_clock(void) do { version = pvclock_wc->version; - __asm__ ("mfence" ::: "memory"); + __asm__("mfence" ::: "memory"); wc_boot = pvclock_wc->sec * NSEC_PER_SEC; wc_boot += pvclock_wc->nsec; - __asm__ ("mfence" ::: "memory"); + __asm__("mfence" ::: "memory"); } while ((pvclock_wc->version & 1) || (pvclock_wc->version != version)); return wc_boot; } -int pvclock_init(void) { +int pvclock_init(void) +{ struct shared_info *s = SHARED_INFO(); struct vcpu_info *vi = VCPU0_INFO(); pvclock_ti = (struct pvclock_vcpu_time_info *)&vi->time; @@ -130,6 +131,7 @@ int pvclock_init(void) { /* * Return epoch offset (wall time offset to monotonic clock start). */ -uint64_t pvclock_epochoffset(void) { +uint64_t pvclock_epochoffset(void) +{ return wc_epochoffset; } diff --git a/bindings/xen/start.c b/bindings/xen/start.c index e68d6dca7..714e9925f 100644 --- a/bindings/xen/start.c +++ b/bindings/xen/start.c @@ -92,14 +92,10 @@ DECLARE_ELF_INTERP * Xen does not have an ABI contract (in the Solo5 sense) or use a tender, * so the ABI version here is always 1. */ -ABI1_NOTE_DECLARE_BEGIN -{ - .abi_target = XEN_ABI_TARGET, - .abi_version = 1 -} -ABI1_NOTE_DECLARE_END +ABI1_NOTE_DECLARE_BEGIN{.abi_target = XEN_ABI_TARGET, + .abi_version = 1} ABI1_NOTE_DECLARE_END -/* - * Pretend that we are an OpenBSD executable. See elf_abi.h for details. - */ -DECLARE_OPENBSD_NOTE + /* + * Pretend that we are an OpenBSD executable. See elf_abi.h for details. + */ + DECLARE_OPENBSD_NOTE diff --git a/bindings/xen/stubs.c b/bindings/xen/stubs.c index 4735521b6..d644b6cea 100644 --- a/bindings/xen/stubs.c +++ b/bindings/xen/stubs.c @@ -27,37 +27,37 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *handle, - struct solo5_net_info *info) + struct solo5_net_info *info) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_net_write(solo5_handle_t handle, const uint8_t *buf, - size_t size) + size_t size) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, size_t size, - size_t *read_size) + size_t *read_size) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *handle, - struct solo5_block_info *info) + struct solo5_block_info *info) { return SOLO5_R_EUNSPEC; } solo5_result_t solo5_block_write(solo5_handle_t handle, solo5_off_t offset, - const uint8_t *buf, size_t size) + const uint8_t *buf, size_t size) { return SOLO5_R_EUNSPEC; } -solo5_result_t solo5_block_read(solo5_handle_t handle,solo5_off_t offset, - uint8_t *buf, size_t size) +solo5_result_t solo5_block_read(solo5_handle_t handle, solo5_off_t offset, + uint8_t *buf, size_t size) { return SOLO5_R_EUNSPEC; } diff --git a/bindings/xen/time.c b/bindings/xen/time.c index e891f1bc7..d8c3eae35 100644 --- a/bindings/xen/time.c +++ b/bindings/xen/time.c @@ -38,9 +38,8 @@ solo5_time_t solo5_clock_wall(void) /* * Called in interrupt context. */ -static void -time_event_handler(evtchn_port_t port __attribute__((unused)), - void *arg __attribute__((unused))) +static void time_event_handler(evtchn_port_t port __attribute__((unused)), + void *arg __attribute__((unused))) { timer_fired = true; } @@ -64,14 +63,13 @@ void solo5_yield(solo5_time_t deadline, solo5_handle_set_t *ready_set) * Further, order is important here; we must check that the timer * event has not fired immediately before going into halt state. */ - while(true) { - __asm__ __volatile__ ("cli" : : : "memory"); + while (true) { + __asm__ __volatile__("cli" : : : "memory"); if (timer_fired) { - __asm__ __volatile__ ("sti"); + __asm__ __volatile__("sti"); break; - } - else { - __asm__ __volatile__ ("sti; hlt"); + } else { + __asm__ __volatile__("sti; hlt"); } } } diff --git a/elftool/elftool.c b/elftool/elftool.c index 252f5bd39..a9f6f9d13 100644 --- a/elftool/elftool.c +++ b/elftool/elftool.c @@ -52,27 +52,36 @@ static const char *jtypestr(enum jtypes t) { switch (t) { - case jnull: return "NULL"; - case jtrue: return "BOOLEAN"; - case jfalse: return "BOOLEAN"; - case jstring: return "STRING"; - case jarray: return "ARRAY"; - case jobject: return "OBJECT"; - case jint: return "INTEGER"; - case jreal: return "REAL"; - default: return "UNKNOWN"; + case jnull: + return "NULL"; + case jtrue: + return "BOOLEAN"; + case jfalse: + return "BOOLEAN"; + case jstring: + return "STRING"; + case jarray: + return "ARRAY"; + case jobject: + return "OBJECT"; + case jint: + return "INTEGER"; + case jreal: + return "REAL"; + default: + return "UNKNOWN"; } } static void jexpect(enum jtypes t, jvalue *v, const char *filename, - const char *loc) + const char *loc) { if (v->d != t) errx(1, "%s:%zu: %s: expected %s, got %s", filename, v->line, loc, - jtypestr(t), jtypestr(v->d)); + jtypestr(t), jtypestr(v->d)); } -static const char out_header[] = \ +static const char out_header[] = "/* Generated by solo5-elftool version %s, do not edit */\n\n" "#define MFT_ENTRIES %d\n" "#include \"mft_abi.h\"\n" @@ -83,13 +92,11 @@ static const char out_header[] = \ " .e = {\n" " { .name = \"\", .type = MFT_RESERVED_FIRST },\n"; -static const char out_entry[] = \ - " { .name = \"%s\", .type = MFT_DEV_%s },\n"; +static const char out_entry[] = " { .name = \"%s\", .type = MFT_DEV_%s },\n"; -static const char out_footer[] = \ - " }\n" - "}\n" - "MFT1_NOTE_DECLARE_END\n"; +static const char out_footer[] = " }\n" + "}\n" + "MFT1_NOTE_DECLARE_END\n"; static void usage(const char *prog) { @@ -98,9 +105,10 @@ static void usage(const char *prog) fprintf(stderr, "COMMAND is:\n"); fprintf(stderr, " gen-manifest SOURCE OUTPUT:\n"); fprintf(stderr, " Generate application manifest from SOURCE, " - "writing to OUTPUT.\n"); + "writing to OUTPUT.\n"); fprintf(stderr, " query-abi BINARY:\n"); - fprintf(stderr, " Display the ABI target and version from BINARY.\n"); + fprintf(stderr, + " Display the ABI target and version from BINARY.\n"); fprintf(stderr, " query-manifest BINARY:\n"); fprintf(stderr, " Display the application manifest from BINARY.\n"); exit(EXIT_FAILURE); @@ -129,26 +137,23 @@ static int elftool_gen_mft(const char *source, const char *output) */ int entries = 1; - for(jvalue **i = root->u.v; *i; ++i) { + for (jvalue **i = root->u.v; *i; ++i) { if (strcmp((*i)->n, "type") == 0) { jexpect(jstring, *i, source, ".type"); jtype = *i; - } - else if (strcmp((*i)->n, "version") == 0) { + } else if (strcmp((*i)->n, "version") == 0) { jexpect(jint, *i, source, ".version"); jversion = *i; - } - else if (strcmp((*i)->n, "devices") == 0) { + } else if (strcmp((*i)->n, "devices") == 0) { jexpect(jarray, *i, source, ".devices"); for (jvalue **j = (*i)->u.v; *j; ++j) { jexpect(jobject, *j, source, ".devices[]"); entries++; } jdevices = *i; - } - else + } else errx(1, "%s:%zu: (root): unknown key: %s", source, (*i)->line, - (*i)->n); + (*i)->n); } if (jtype == NULL) @@ -160,18 +165,18 @@ static int elftool_gen_mft(const char *source, const char *output) if (strcmp("solo5.manifest", jtype->u.s) != 0) errx(1, "%s:%zu: .type: invalid value, expected \"solo5.manifest\"", - source, jtype->line); + source, jtype->line); if (jversion->u.i != MFT_VERSION) - errx(1, "%s:%zu: .version: invalid version %lld, expected %d", - source, jversion->line, jversion->u.i, MFT_VERSION); + errx(1, "%s:%zu: .version: invalid version %lld, expected %d", source, + jversion->line, jversion->u.i, MFT_VERSION); if (entries > MFT_MAX_ENTRIES) /* * Subtract one from MFT_MAX_ENTRIES in the error message. The caller * shouldn't be bothered with the implicit MFT_RESERVED_FIRST entry in * the error message. */ - errx(1, "%s:%zu: .devices[]: too many entries, maximum %d", - source, jdevices->line, MFT_MAX_ENTRIES - 1); + errx(1, "%s:%zu: .devices[]: too many entries, maximum %d", source, + jdevices->line, MFT_MAX_ENTRIES - 1); fprintf(ofp, out_header, SOLO5_VERSION, entries, entries); for (jvalue **i = jdevices->u.v; *i; ++i) { @@ -181,27 +186,25 @@ static int elftool_gen_mft(const char *source, const char *output) if (strcmp((*j)->n, "name") == 0) { jexpect(jstring, *j, source, ".devices[...]"); jdevname = *j; - } - else if (strcmp((*j)->n, "type") == 0) { + } else if (strcmp((*j)->n, "type") == 0) { jexpect(jstring, *j, source, ".devices[...]"); jdevtype = *j; - } - else + } else errx(1, "%s:%zu: .devices[...]: unknown key: %s", source, - (*j)->line, (*j)->n); + (*j)->line, (*j)->n); } if (jdevname == NULL) errx(1, "%s:%zu: .devices[...]: missing .name", source, (*i)->line); if (jdevname->u.s[0] == 0) errx(1, "%s:%zu: .devices[...]: .name may not be empty", source, - jdevname->line); + jdevname->line); if (strlen(jdevname->u.s) > MFT_NAME_MAX) errx(1, "%s:%zu: .devices[...]: name too long", source, - jdevname->line); + jdevname->line); for (char *p = jdevname->u.s; *p; p++) if (!isalnum((unsigned char)*p)) errx(1, "%s:%zu: .devices[...]: name is not alphanumeric", - source, jdevname->line); + source, jdevname->line); if (jdevtype == NULL) errx(1, "%s:%zu: .devices[...]: missing .type", source, (*i)->line); fprintf(ofp, out_entry, jdevname->u.s, jdevtype->u.s); @@ -224,7 +227,7 @@ static int elftool_query_mft(const char *binary) struct mft *mft; size_t mft_size; if (elf_load_note(bin_fd, binary, MFT1_NOTE_TYPE, MFT1_NOTE_ALIGN, - MFT1_NOTE_MAX_SIZE, (void **)&mft, &mft_size) == -1) { + MFT1_NOTE_MAX_SIZE, (void **)&mft, &mft_size) == -1) { warnx("%s: No Solo5 manifest found in executable", binary); close(bin_fd); return EXIT_FAILURE; @@ -239,15 +242,16 @@ static int elftool_query_mft(const char *binary) printf("{\n" " \"type\": \"solo5.manifest\",\n" " \"version\": %u,\n" - " \"devices\": [\n", MFT_VERSION); + " \"devices\": [\n", + MFT_VERSION); for (unsigned i = 0; i != mft->entries; i++) { if (mft->e[i].type >= MFT_RESERVED_FIRST) continue; - printf(" { \"name\": \"%s\", \"type\": \"%s\" }%s\n", - mft->e[i].name, mft_type_to_string(mft->e[i].type), - (i == (mft->entries -1) ? "" : ",")); + printf(" { \"name\": \"%s\", \"type\": \"%s\" }%s\n", mft->e[i].name, + mft_type_to_string(mft->e[i].type), + (i == (mft->entries - 1) ? "" : ",")); } printf(" ]\n" @@ -259,21 +263,21 @@ static int elftool_query_mft(const char *binary) static const char *abi_target_to_string(int abi_target) { - switch(abi_target) { - case HVT_ABI_TARGET: - return "hvt"; - case SPT_ABI_TARGET: - return "spt"; - case VIRTIO_ABI_TARGET: - return "virtio"; - case MUEN_ABI_TARGET: - return "muen"; - case GENODE_ABI_TARGET: - return "genode"; - case XEN_ABI_TARGET: - return "xen"; - default: - return "unknown"; + switch (abi_target) { + case HVT_ABI_TARGET: + return "hvt"; + case SPT_ABI_TARGET: + return "spt"; + case VIRTIO_ABI_TARGET: + return "virtio"; + case MUEN_ABI_TARGET: + return "muen"; + case GENODE_ABI_TARGET: + return "genode"; + case XEN_ABI_TARGET: + return "xen"; + default: + return "unknown"; } } @@ -288,7 +292,7 @@ static int elftool_query_abi(const char *binary) struct abi1_info *abi1; size_t abi1_size; if (elf_load_note(bin_fd, binary, ABI1_NOTE_TYPE, ABI1_NOTE_ALIGN, - ABI1_NOTE_MAX_SIZE, (void **)&abi1, &abi1_size) == -1) { + ABI1_NOTE_MAX_SIZE, (void **)&abi1, &abi1_size) == -1) { warnx("%s: No Solo5 ABI information found in executable", binary); close(bin_fd); return EXIT_FAILURE; @@ -318,17 +322,14 @@ int main(int argc, char *argv[]) if (argc != 4) usage(prog); return elftool_gen_mft(argv[2], argv[3]); - } - else if (strcmp(argv[1], "query-manifest") == 0) { + } else if (strcmp(argv[1], "query-manifest") == 0) { if (argc != 3) usage(prog); return elftool_query_mft(argv[2]); - } - else if (strcmp(argv[1], "query-abi") == 0) { + } else if (strcmp(argv[1], "query-abi") == 0) { if (argc != 3) usage(prog); return elftool_query_abi(argv[2]); - } - else + } else usage(prog); } diff --git a/elftool/json.h b/elftool/json.h index 46786d35d..e442e823f 100644 --- a/elftool/json.h +++ b/elftool/json.h @@ -12,9 +12,9 @@ * The following license applies to this file: * * == License == - * + * * Copyright ⓒ 2014, 2015 Robert S. Krzaczek. - * + * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * “Software”), to deal in the Software without restriction, including @@ -22,10 +22,10 @@ * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: - * + * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -33,14 +33,14 @@ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * + * * == Other Copyrights == - * + * * While the code presented in *sanity.h* and *sanity.c* is original, it * is certainly inspired by the excellent book, “The Practice of * Programming” by Brian W. Kernighan and Rob Pike. Quoting from that * source: - * + * * [quote,'http://cm.bell-labs.com/cm/cs/tpop/[The Practice Of Programming]'] * _____________________________________________________________________ * You may use this code for any purpose, as long as you leave the @@ -72,15 +72,15 @@ /** The different types of values in our JSON parser. Unlike the * standard, we discriminate between integer and real values. */ enum jtypes { - jnull, /**< The JSON "null" value. */ - jtrue, /**< Just a simple "true" value. */ - jfalse, /**< Just a simple "false" value. */ - jstring, /**< Just your run of the mill string. */ - jnumber, /**< A JSON number (still just a string). */ - jarray, /**< A vector of values. */ - jobject, /**< An assoc. array of names and arbitrary values. */ - jint, /**< A JSON number parsed into a native integer. */ - jreal, /**< A JSON number parsed into a long double. */ + jnull, /**< The JSON "null" value. */ + jtrue, /**< Just a simple "true" value. */ + jfalse, /**< Just a simple "false" value. */ + jstring, /**< Just your run of the mill string. */ + jnumber, /**< A JSON number (still just a string). */ + jarray, /**< A vector of values. */ + jobject, /**< An assoc. array of names and arbitrary values. */ + jint, /**< A JSON number parsed into a native integer. */ + jreal, /**< A JSON number parsed into a long double. */ }; /** A jvalue represents the different values found in a parse of a @@ -144,10 +144,10 @@ typedef struct jvalue { } jvalue; extern jvalue *jnew(void); -extern jvalue *jclear( jvalue * ); -extern void jdel( jvalue * ); -extern jvalue *jparse( FILE *fp ); -extern jvalue *jupdate( jvalue * ); +extern jvalue *jclear(jvalue *); +extern void jdel(jvalue *); +extern jvalue *jparse(FILE *fp); +extern jvalue *jupdate(jvalue *); #if 0 /* UNUSED */ extern int jdump( FILE *fp, const jvalue *j ); #endif @@ -197,15 +197,15 @@ typedef struct ptrvec { #if 0 /* UNUSED */ extern ptrvec *pvnew(void); #endif -extern ptrvec *pvclear( ptrvec * ); -extern void **pvfinal( ptrvec * ); +extern ptrvec *pvclear(ptrvec *); +extern void **pvfinal(ptrvec *); #if 0 /* UNUSED */ extern void pvdel( ptrvec * ); #endif -extern void **pvdup( const ptrvec * ); -extern ptrvec *pvsize( ptrvec *, size_t ); -extern ptrvec *pvensure( ptrvec *, size_t ); -extern ptrvec *pvadd( ptrvec *, void * ); +extern void **pvdup(const ptrvec *); +extern ptrvec *pvsize(ptrvec *, size_t); +extern ptrvec *pvensure(ptrvec *, size_t); +extern ptrvec *pvadd(ptrvec *, void *); #endif @@ -246,23 +246,23 @@ extern ptrvec *pvadd( ptrvec *, void * ); * call twclear(). twfinal() combines both twdup() and twclear(). */ typedef struct twine { - char *p; /**< null terminated C string data */ - size_t len; /**< size of the string, not counting null */ - size_t sz; /**< size of the underlying buffer */ + char *p; /**< null terminated C string data */ + size_t len; /**< size of the string, not counting null */ + size_t sz; /**< size of the underlying buffer */ } twine; #if 0 /* UNUSED */ extern twine *twnew(void); #endif -extern twine *twclear( twine * ); -extern char *twfinal( twine * ); +extern twine *twclear(twine *); +extern char *twfinal(twine *); #if 0 /* UNUSED */ extern void twdel( twine * ); #endif -extern char *twdup( const twine * ); +extern char *twdup(const twine *); -extern twine *twsize( twine *, size_t ); +extern twine *twsize(twine *, size_t); #if 0 /* UNUSED */ extern twine *twset( twine *, const char *, size_t ); @@ -272,8 +272,8 @@ extern twine *twsetz( twine *, const char * ); #if 0 /* UNUSED */ extern twine *twadd( twine *, const twine * ); #endif -extern twine *twaddc( twine *, char ); -extern twine *twaddu( twine *, uint32_t ); +extern twine *twaddc(twine *, char); +extern twine *twaddu(twine *, uint32_t); #if 0 /* UNUSED */ extern twine *twaddz( twine *, const char * ); #endif @@ -287,14 +287,14 @@ extern twine *twaddz( twine *, const char * ); /* While this code is original, it is certainly inspired by the * excellent book, "The Practice of Programming" by Brian W. Kernighan * and Rob Pike. - * + * * Quoting from the book: "You may use this code for any purpose, as * long as you leave the copyright notice and book citation attached. * Copyright © 1999 Lucent Technologies. All rights reserved. Mon Mar * 19 13:59:27 EST 2001" */ -extern void *emalloc( size_t ); -extern void *erealloc( void *, size_t ); +extern void *emalloc(size_t); +extern void *erealloc(void *, size_t); #if 0 /* UNUSED */ extern char *estrdup( const char * ); #endif @@ -305,24 +305,22 @@ extern char *estrdup( const char * ); /** Allocate some number of bytes from the system and return a pointer * to them, or exit. */ -void * -emalloc( size_t nb ) +void *emalloc(size_t nb) { - void *p = malloc( nb ); - if( !p ) - err( 1, "unable to allocate %zu bytes", nb ); + void *p = malloc(nb); + if (!p) + err(1, "unable to allocate %zu bytes", nb); return p; } /** Change an allocated buffer to another size, returning a pointer to * the new buffer. If the buffer could not be grown, an error is * displayed and the process exits (this function does not return). */ -void * -erealloc( void *ptr, size_t nb ) +void *erealloc(void *ptr, size_t nb) { - void *p = realloc( ptr, nb ); - if( !p ) - err( 1, "unable to reallocate %zu bytes", nb ); + void *p = realloc(ptr, nb); + if (!p) + err(1, "unable to reallocate %zu bytes", nb); return p; } @@ -363,14 +361,13 @@ pvnew(void) * entirely heap-based objects (typically obtained from pvnew()), * pvclear() is useful at tne end of functions that use a stack-based * ptrvec object. */ -ptrvec * -pvclear( ptrvec *pv ) +ptrvec *pvclear(ptrvec *pv) { - if( !pv ) - return 0; - if( pv->p ) - free( pv->p ); - *pv = (ptrvec){ 0 }; + if (!pv) + return 0; + if (pv->p) + free(pv->p); + *pv = (ptrvec){0}; return pv; } @@ -378,21 +375,20 @@ pvclear( ptrvec *pv ) * in our ptrvec. Unlike our member p, this one will be allocated from * the heap and contains just enough space to hold the current * contents of p including its terminating null. */ -void ** -pvdup( const ptrvec *pv ) +void **pvdup(const ptrvec *pv) { void **v; - if( !pv ) { - v = emalloc( sizeof( *v )); - *v = 0; + if (!pv) { + v = emalloc(sizeof(*v)); + *v = 0; } else { - size_t nb = sizeof( void* ) * ( pv->len + 1 ); - v = emalloc( nb ); - if( pv->p ) - memcpy( v, pv->p, nb ); - else - memset( v, 0, nb ); + size_t nb = sizeof(void *) * (pv->len + 1); + v = emalloc(nb); + if (pv->p) + memcpy(v, pv->p, nb); + else + memset(v, 0, nb); } return v; @@ -402,11 +398,10 @@ pvdup( const ptrvec *pv ) * Return a null terminated void** ready for storage somewhere, and * kill our own storage so that the next thing to come along can use * our memory. */ -void ** -pvfinal( ptrvec *pv ) +void **pvfinal(ptrvec *pv) { - void **v = pvdup( pv ); - pvclear( pv ); + void **v = pvdup(pv); + pvclear(pv); return v; } @@ -424,16 +419,15 @@ pvdel( ptrvec *pv ) /** Force the supplied ptrvec to contain exactly some number of * pointers. */ -ptrvec * -pvsize( ptrvec *pv, size_t sz ) +ptrvec *pvsize(ptrvec *pv, size_t sz) { - if( !sz ) - return pvclear( pv ); + if (!sz) + return pvclear(pv); - pv->p = erealloc( pv->p, ( pv->sz = sz ) * sizeof( *pv->p )); - if( pv->len >= pv->sz ) { - pv->len = pv->sz - 1; - pv->p[ pv->len ] = 0; + pv->p = erealloc(pv->p, (pv->sz = sz) * sizeof(*pv->p)); + if (pv->len >= pv->sz) { + pv->len = pv->sz - 1; + pv->p[pv->len] = 0; } return pv; } @@ -442,43 +436,41 @@ pvsize( ptrvec *pv, size_t sz ) * pointers. If it doesn't, the region of pointers in the ptrvec are * reallocated. Unlike pvsize(), pvensure() grows the ptrvec in a way * that hopefully avoids constant reallocations. */ -ptrvec * -pvensure( ptrvec *pv, size_t sz ) +ptrvec *pvensure(ptrvec *pv, size_t sz) { size_t newsz; - - if( !pv ) - return 0; - else if( !sz || sz <= pv->sz ) - return pv; - else if( !pv->sz && sz <= pv_initial_size ) - return pvsize( pv, pv_initial_size ); + + if (!pv) + return 0; + else if (!sz || sz <= pv->sz) + return pv; + else if (!pv->sz && sz <= pv_initial_size) + return pvsize(pv, pv_initial_size); /* Choose the next size up for this ptrvec as either 150% of its current size, or if that's not big enough, 150% of the requested size. Either is meant to add enough padding so that we hopefully don't come back here too soon. */ newsz = pv->sz * 3 / 2; - if( newsz < sz ) - newsz = sz * 3 / 2; + if (newsz < sz) + newsz = sz * 3 / 2; /* Imperfect, but should catch most overflows, when newsz has rolled past SIZE_MAX. */ - if( newsz < pv->sz ) - errx( 1, "ptrvec overflow" ); + if (newsz < pv->sz) + errx(1, "ptrvec overflow"); - return pvsize( pv, newsz ); + return pvsize(pv, newsz); } /** Add a pointer to the end of the set of pointers managed in this * ptrvec. The size of the region is managed. The sz might grow a lot, * but len will only ever grow by one. */ -ptrvec * -pvadd( ptrvec *pv, void *v ) +ptrvec *pvadd(ptrvec *pv, void *v) { - pvensure( pv, pv->len + 2 ); - pv->p[ pv->len++ ] = v; - pv->p[ pv->len ] = 0; + pvensure(pv, pv->len + 2); + pv->p[pv->len++] = v; + pv->p[pv->len] = 0; return pv; } @@ -520,33 +512,30 @@ twdel( twine *t ) * for twine structure defined on the stack, for example. Also, it's * a severe way to clear a twine of current data, but useful if * you've got to return memory. */ -twine * -twclear( twine *t ) +twine *twclear(twine *t) { - if( t->p ) - free( t->p ); - *t = (twine){ 0 }; + if (t->p) + free(t->p); + *t = (twine){0}; return t; } /** Return a pure C string that is a copy of the string we've been * building in our twine. Unlike our string, this one will be * allocated from the heap and contains just enough space to hold it. */ -char * -twdup( const twine *t ) +char *twdup(const twine *t) { - char *p = emalloc( t->len + 1 ); - return strcpy( p, t->p ? t->p : "" ); + char *p = emalloc(t->len + 1); + return strcpy(p, t->p ? t->p : ""); } /** A wrapper for the common case at the end of working with twine. * Return a C string ready for storage somewhere, and kill our own * storage so that the next thing to come along can use our memory. */ -char * -twfinal( twine *t ) +char *twfinal(twine *t) { - char *p = twdup( t ); - twclear( t ); + char *p = twdup(t); + twclear(t); return p; } @@ -557,16 +546,15 @@ twfinal( twine *t ) * because if you've added once, you're likely to add again, but if * you have a size in mind in advance, you probably don't need to * grow it soon. */ -twine * -twsize( twine *t, size_t nb ) +twine *twsize(twine *t, size_t nb) { - if( !nb ) - return twclear( t ); + if (!nb) + return twclear(t); - t->p = erealloc( t->p, t->sz = nb ); - if( t->len >= t->sz ) { + t->p = erealloc(t->p, t->sz = nb); + if (t->len >= t->sz) { t->len = t->sz - 1; - t->p[ t->len ] = 0; + t->p[t->len] = 0; } return t; } @@ -636,23 +624,22 @@ twset( twine *t, const char *z, size_t nb ) * sure to add the null in yourself to \a sz. The 1.5X growth factor * is meant to balance between calling realloc too often, but not * wasting memory like mad like some libraries do. */ -static twine * -twensure( twine *t, size_t sz ) +static twine *twensure(twine *t, size_t sz) { size_t newsz; - if( !sz || sz <= t->sz ) + if (!sz || sz <= t->sz) return t; - if( sz <= tw_initial_size ) - return twsize( t, tw_initial_size ); + if (sz <= tw_initial_size) + return twsize(t, tw_initial_size); newsz = t->sz * 3 / 2; - if( newsz < sz ) + if (newsz < sz) newsz = sz * 3 / 2; - if( newsz < t->sz ) - errx( 1, "twine overflow" ); + if (newsz < t->sz) + errx(1, "twine overflow"); - return twsize( t, newsz ); + return twsize(t, newsz); } /** Add a single plain character to our twine. This will grow the @@ -660,10 +647,9 @@ twensure( twine *t, size_t sz ) * functions, if we can't get the memory we need, we just error and * die. In this application, there's no point in trying to recover * from an out of memory error. */ -twine * -twaddc( twine *t, char c ) +twine *twaddc(twine *t, char c) { - twensure( t, t->len + 2 ); + twensure(t, t->len + 2); char *p = t->p + t->len; *p++ = c; *p++ = 0; @@ -699,38 +685,37 @@ twadd( twine *dst, const twine *src ) * simplistic, and I think it's not quite comforming (apparently * there's UTF-8 and there'S CESU and one has intentional omissions * the other doesn't? */ -twine * -twaddu( twine *t, uint32_t c ) +twine *twaddu(twine *t, uint32_t c) { - if( c <= 0x007f ) - twaddc( t, c ); - else if( c <= 0x07ff ) { - twaddc( t, 0xc0 | ( c >> 6 )); - twaddc( t, 0x80 | ( c & 0x3f )); - } else if( c <= 0xffff ) { - twaddc( t, 0xe0 | ( c >> 12 )); - twaddc( t, 0x80 | ( c >> 6 & 0x3f )); - twaddc( t, 0x80 | ( c & 0x3f )); - } else if( c <= 0x1fffff ) { - twaddc( t, 0xf0 | ( c >> 18 )); - twaddc( t, 0x80 | ( c >> 12 & 0x3f )); - twaddc( t, 0x80 | ( c >> 6 & 0x3f )); - twaddc( t, 0x80 | ( c & 0x3f )); - } else if( c <= 0x3ffffff ) { - twaddc( t, 0xf8 | ( c >> 24 )); - twaddc( t, 0x80 | ( c >> 18 & 0x3f )); - twaddc( t, 0x80 | ( c >> 12 & 0x3f )); - twaddc( t, 0x80 | ( c >> 6 & 0x3f )); - twaddc( t, 0x80 | ( c & 0x3f )); - } else if( c <= 0x7ffffff ) { - twaddc( t, 0xfc | ( c >> 30 )); - twaddc( t, 0x80 | ( c >> 24 & 0x3f )); - twaddc( t, 0x80 | ( c >> 18 & 0x3f )); - twaddc( t, 0x80 | ( c >> 12 & 0x3f )); - twaddc( t, 0x80 | ( c >> 6 & 0x3f )); - twaddc( t, 0x80 | ( c & 0x3f )); + if (c <= 0x007f) + twaddc(t, c); + else if (c <= 0x07ff) { + twaddc(t, 0xc0 | (c >> 6)); + twaddc(t, 0x80 | (c & 0x3f)); + } else if (c <= 0xffff) { + twaddc(t, 0xe0 | (c >> 12)); + twaddc(t, 0x80 | (c >> 6 & 0x3f)); + twaddc(t, 0x80 | (c & 0x3f)); + } else if (c <= 0x1fffff) { + twaddc(t, 0xf0 | (c >> 18)); + twaddc(t, 0x80 | (c >> 12 & 0x3f)); + twaddc(t, 0x80 | (c >> 6 & 0x3f)); + twaddc(t, 0x80 | (c & 0x3f)); + } else if (c <= 0x3ffffff) { + twaddc(t, 0xf8 | (c >> 24)); + twaddc(t, 0x80 | (c >> 18 & 0x3f)); + twaddc(t, 0x80 | (c >> 12 & 0x3f)); + twaddc(t, 0x80 | (c >> 6 & 0x3f)); + twaddc(t, 0x80 | (c & 0x3f)); + } else if (c <= 0x7ffffff) { + twaddc(t, 0xfc | (c >> 30)); + twaddc(t, 0x80 | (c >> 24 & 0x3f)); + twaddc(t, 0x80 | (c >> 18 & 0x3f)); + twaddc(t, 0x80 | (c >> 12 & 0x3f)); + twaddc(t, 0x80 | (c >> 6 & 0x3f)); + twaddc(t, 0x80 | (c & 0x3f)); } else - errx(1, "unicode code point cannot be >0x7ffffff" ); + errx(1, "unicode code point cannot be >0x7ffffff"); return t; } @@ -742,11 +727,11 @@ twaddu( twine *t, uint32_t c ) * #line when a newline appears on the file stream. Initialize this * with a file stream opened for reading, and set #line to 1. */ typedef struct ifile { - FILE *fp; /**< Input file stream */ - size_t line; /**< Line number */ + FILE *fp; /**< Input file stream */ + size_t line; /**< Line number */ } ifile; -static jvalue *readvalue( ifile * ); +static jvalue *readvalue(ifile *); /* When we're running single threaded, use the faster getc_unlocked(3) * that doesn't enforce thread safety; otherwise, use the regular @@ -754,24 +739,22 @@ static jvalue *readvalue( ifile * ); * once a file stream is passed to the JSON parser, _even if_ we were * multithreaded, this is the only code that should be reading from * the stream. But, still, let's try to play by the rules. */ -inline static int -jgetc( FILE *f ) +inline static int jgetc(FILE *f) { #ifdef _REENTRANT - return getc( f ); + return getc(f); #else - return getc_unlocked( f ); + return getc_unlocked(f); #endif } /** Returns the next character in the open input stream under \a f, * and bump the line counter in \a f when appropriate. Errors can * always be reported using line. */ -static int -getch( ifile *f ) +static int getch(ifile *f) { - int c = jgetc( f->fp ); - if( c == '\n' ) + int c = jgetc(f->fp); + if (c == '\n') ++f->line; return c; } @@ -781,25 +764,23 @@ getch( ifile *f ) * stdio's can handle it, there is actually no guarantee that more * than a single character can ever be pushed back onto the file * stream. */ -static int -ungetch( ifile *f, char c ) +static int ungetch(ifile *f, char c) { - if( c == '\n' ) + if (c == '\n') --f->line; - return ungetc( c, f->fp ); + return ungetc(c, f->fp); } /** A wrapper around getch() that skips any leading whitespace before * the character eventually returned, or EOF. Rather than a * traditional parsing of whitespace, we limit ourselves to only the * ws characters defined in JSON. */ -static int -getchskip( ifile *f ) +static int getchskip(ifile *f) { int c; do { - c = getch( f ); - } while( c == ' ' || c == '\t' || c == '\n' || c == '\r' ); + c = getch(f); + } while (c == ' ' || c == '\t' || c == '\n' || c == '\r'); return c; } @@ -807,22 +788,20 @@ getchskip( ifile *f ) * non-whitespace character in the stream ready for reading. The * character returned is effectively a "peek" ahead at the next * character that will be obtained from getch(). */ -static int -skipws( ifile *f ) +static int skipws(ifile *f) { - int c = getchskip( f ); - if( c != EOF ) - ungetch( f, c ); + int c = getchskip(f); + if (c != EOF) + ungetch(f, c); return c; } /** Create and return a new jvalue, initialized to be a jnull. Does * not return if a new jvalue could not be allocated. */ -jvalue * -jnew(void) +jvalue *jnew(void) { - jvalue *j = emalloc( sizeof( *j )); - *j = (jvalue){ 0 }; + jvalue *j = emalloc(sizeof(*j)); + *j = (jvalue){0}; j->d = jnull; return j; } @@ -831,31 +810,30 @@ jnew(void) * everything it contains, leaving \j intact but set to jnull. * Normally, we'd set the various freed pointers to null explicitly, * but at the end of the function, we zero the entire structure. */ -jvalue * -jclear( jvalue *j ) +jvalue *jclear(jvalue *j) { - if( j ) { - free( j->n ); + if (j) { + free(j->n); - switch( j->d ) { + switch (j->d) { case jarray: case jobject: - if( j->u.v ) - for( jvalue **jv = j->u.v; *jv; ++jv ) - jdel( *jv ); - free( j->u.v ); + if (j->u.v) + for (jvalue **jv = j->u.v; *jv; ++jv) + jdel(*jv); + free(j->u.v); break; case jstring: case jnumber: - free( j->u.s ); + free(j->u.s); break; default: break; } - *j = (jvalue){ 0 }; + *j = (jvalue){0}; j->d = jnull; } @@ -865,10 +843,9 @@ jclear( jvalue *j ) /** Walk a tree of jvalue, or even just a single value, and free * everything it contains. Everything, even \a j itself, is freed. * When this is complete, \a j is no longer valid. */ -void -jdel( jvalue *j ) +void jdel(jvalue *j) { - free( jclear( j )); + free(jclear(j)); } /** Report an early EOF; that is, that the input stream ended before a @@ -876,10 +853,9 @@ jdel( jvalue *j ) * the usual errors like that will trigger this. There's no point in * reporting the line number, since this is an EOF. This is a * function of its own, since it happens so often. */ -static void -earlyeof(void) +static void earlyeof(void) { - errx(1, "premature EOF in JSON data" ); + errx(1, "premature EOF in JSON data"); } /** Almost all of our errors end with a line number and a message that @@ -894,29 +870,27 @@ earlyeof(void) * and reallocs under the hood. This approach sucks up a page on the * stack, but lets go of the space immediately and doesn't fragment * our heap further. */ -static void -ierr( const ifile *f, const char *msg, ... ) +static void ierr(const ifile *f, const char *msg, ...) { va_list ap; - char buf[ 512 ]; + char buf[512]; - va_start( ap, msg ); - vsnprintf( buf, sizeof( buf ), msg, ap ); - va_end( ap ); - errx(1, "%s on line %zu in JSON data", buf, f->line ); + va_start(ap, msg); + vsnprintf(buf, sizeof(buf), msg, ap); + va_end(ap); + errx(1, "%s on line %zu in JSON data", buf, f->line); } /** The next character read from \a f must be a double quote. */ -static bool -expectdq( ifile *f ) +static bool expectdq(ifile *f) { - int c = getch( f ); + int c = getch(f); - if( c == EOF ) { + if (c == EOF) { earlyeof(); return false; - } else if( c != '"' ) { - ierr( f, "missing quote from string" ); + } else if (c != '"') { + ierr(f, "missing quote from string"); return false; } else return true; @@ -927,82 +901,97 @@ expectdq( ifile *f ) * quotes) freshly allocated from the heap, or a null on error. When * null is returned, a diagnostic will have been sent to the standard * error stream. */ -static char * -readstring( ifile *f ) +static char *readstring(ifile *f) { - if( !expectdq( f )) + if (!expectdq(f)) return 0; - bool esc = false; /* the next character is escaped */ - bool oops = false; /* a bad string was seen? */ - unsigned int hex = 0; /* read this many chars as a hex - * Unicode code point */ + bool esc = false; /* the next character is escaped */ + bool oops = false; /* a bad string was seen? */ + unsigned int hex = 0; /* read this many chars as a hex + * Unicode code point */ unsigned int x = 0; - twine tw = (twine){ 0 }; + twine tw = (twine){0}; - while( !oops ) { - int c = getch( f ); + while (!oops) { + int c = getch(f); - if( c == EOF ) { + if (c == EOF) { earlyeof(); oops = true; - } else if( hex ) { - if( isxdigit( c )) { - if( isdigit( c )) - x = 16 * x + c - '0'; - else if( isupper( c )) - x = 16 * x + c - 'A' + 10; - else - x = 16 * x + c - 'a' + 10; - if( !--hex ) - twaddu( &tw, x ); + } else if (hex) { + if (isxdigit(c)) { + if (isdigit(c)) + x = 16 * x + c - '0'; + else if (isupper(c)) + x = 16 * x + c - 'A' + 10; + else + x = 16 * x + c - 'a' + 10; + if (!--hex) + twaddu(&tw, x); } else { - ierr( f, "expected hex digit" ); + ierr(f, "expected hex digit"); oops = true; } - } else if( esc ) { - switch( c ) { - case '"': twaddc( &tw, '"' ); break; - case '/': twaddc( &tw, '/' ); break; - case '\\': twaddc( &tw, '\\' ); break; - case 'b': twaddc( &tw, '\b' ); break; - case 'f': twaddc( &tw, '\f' ); break; - case 'n': twaddc( &tw, '\n' ); break; - case 'r': twaddc( &tw, '\r' ); break; - case 't': twaddc( &tw, '\t' ); break; + } else if (esc) { + switch (c) { + case '"': + twaddc(&tw, '"'); + break; + case '/': + twaddc(&tw, '/'); + break; + case '\\': + twaddc(&tw, '\\'); + break; + case 'b': + twaddc(&tw, '\b'); + break; + case 'f': + twaddc(&tw, '\f'); + break; + case 'n': + twaddc(&tw, '\n'); + break; + case 'r': + twaddc(&tw, '\r'); + break; + case 't': + twaddc(&tw, '\t'); + break; case 'u': x = 0; hex = 4; break; default: - ierr( f, "unknown escape code '\\%c'", (char)c ); + ierr(f, "unknown escape code '\\%c'", (char)c); oops = true; } esc = 0; - - } else if( c == '"' ) /* done parsing the string! bye! */ - return twfinal( &tw ); - else if( c == '\\' ) + } else if (c == '"') /* done parsing the string! bye! */ + return twfinal(&tw); + + else if (c == '\\') esc = 1; - else if( c >= ' ' ) - twaddc( &tw, c ); + else if (c >= ' ') + twaddc(&tw, c); - else if( isspace( c )) { - ierr( f, "unescaped whitespace" ); + else if (isspace(c)) { + ierr(f, "unescaped whitespace"); oops = true; } else { - ierr( f, "unknown byte (0x%02x)", c ); + ierr(f, "unknown byte (0x%02x)", c); oops = true; } } - twclear( &tw ); /* oops. bad string. give up and go - * home. */ + twclear(&tw); /* oops. bad string. give up and go + * home. */ return 0; } @@ -1012,10 +1001,9 @@ readstring( ifile *f ) * returned to the system, and returns 0, which readnumber() should * chain return back to its caller, indicating a failure. Because * this is only used by readnumber(), we'll mark it static. */ -static char * -readnumberfail( twine *tw ) +static char *readnumberfail(twine *tw) { - twclear( tw ); + twclear(tw); return 0; } @@ -1026,78 +1014,76 @@ readnumberfail( twine *tw ) * that would suffice, but instead, we'll do this the long way so * that we can catch errors in bogus numeric fields (e.g., * "123.456.789"). */ -static char * -readnumber( ifile *f ) +static char *readnumber(ifile *f) { int c; - twine tw = (twine){ 0 }; + twine tw = (twine){0}; - if(( c = getch( f )) == '-' ) /* sign bit */ - twaddc( &tw, c ); + if ((c = getch(f)) == '-') /* sign bit */ + twaddc(&tw, c); else - ungetch( f, c ); + ungetch(f, c); - if(( c = getch( f )) == '0' ) { /* integer */ - twaddc( &tw, c ); - c = getch( f ); - } else if( isdigit( c ) && c != '0' ) { + if ((c = getch(f)) == '0') { /* integer */ + twaddc(&tw, c); + c = getch(f); + } else if (isdigit(c) && c != '0') { do { - twaddc( &tw, c ); - c = getch( f ); - } while( isdigit( c )); + twaddc(&tw, c); + c = getch(f); + } while (isdigit(c)); } else { - ierr( f, "unexpected '%c'", c ); - return readnumberfail( &tw ); + ierr(f, "unexpected '%c'", c); + return readnumberfail(&tw); } - if( c == '.' ) /* fraction */ - do { - twaddc( &tw, c ); - c = getch( f ); - } while( isdigit( c )); - - if( c == 'e' || c == 'E' ) { /* exponent */ - twaddc( &tw, c ); - c = getch( f ); - if( c == '+' || c == '-' ) { - twaddc( &tw, c ); - c = getch( f ); - } - while( isdigit( c )) { - twaddc( &tw, c ); - c = getch( f ); - } + if (c == '.') /* fraction */ + do { + twaddc(&tw, c); + c = getch(f); + } while (isdigit(c)); + + if (c == 'e' || c == 'E') { /* exponent */ + twaddc(&tw, c); + c = getch(f); + if (c == '+' || c == '-') { + twaddc(&tw, c); + c = getch(f); + } + while (isdigit(c)) { + twaddc(&tw, c); + c = getch(f); + } } - if( c == ',' || c == ']' || c == '}' ) /* acceptable term */ - ungetch( f, c ); - else if( c != EOF && !isspace( c )) { /* unacceptable */ - ierr( f, "unexpected '%c'", c ); - return readnumberfail( &tw ); + if (c == ',' || c == ']' || c == '}') /* acceptable term */ + ungetch(f, c); + else if (c != EOF && !isspace(c)) { /* unacceptable */ + ierr(f, "unexpected '%c'", c); + return readnumberfail(&tw); } - return twfinal( &tw ); + return twfinal(&tw); } /** The next characters in the file stream \a f must match the ones * we've been given in the string \a s. */ -static bool -must( ifile *f, const char *s ) +static bool must(ifile *f, const char *s) { int c; const char *p = s; - while( *p && (( c = getch( f )) != EOF )) - if( *p++ != c ) + while (*p && ((c = getch(f)) != EOF)) + if (*p++ != c) break; - if( !*p ) + if (!*p) return true; - if( c == EOF ) + if (c == EOF) earlyeof(); else - ierr( f, "expected %s", s ); + ierr(f, "expected %s", s); return false; } @@ -1105,23 +1091,22 @@ must( ifile *f, const char *s ) /** With the stream pointing to a JSON string, read the object element * at this point. Returns a new jvalue, or null when there is an * error. */ -static jvalue * -readobjel( ifile *f ) +static jvalue *readobjel(ifile *f) { char *n; - if( !( n = readstring( f ))) + if (!(n = readstring(f))) return 0; - if( getchskip( f ) != ':' ) { - ierr( f, "expected colon in object element" ); - free( n ); + if (getchskip(f) != ':') { + ierr(f, "expected colon in object element"); + free(n); return 0; } - jvalue *j = readvalue( f ); - if( !j ) - free( n ); + jvalue *j = readvalue(f); + if (!j) + free(n); else j->n = n; return j; @@ -1134,13 +1119,12 @@ readobjel( ifile *f ) * it. Processing of the actual elements is pretty simple, actually. * Returns false when a parsing error is detected (which is * reported). */ -static bool -readseries( jvalue *j, ifile *f, enum jtypes t ) +static bool readseries(jvalue *j, ifile *f, enum jtypes t) { char term; - jvalue *(*reader)( ifile* ) = 0; /* reads an element */ + jvalue *(*reader)(ifile *) = 0; /* reads an element */ - switch( t ) { + switch (t) { case jarray: term = ']'; reader = readvalue; @@ -1150,43 +1134,43 @@ readseries( jvalue *j, ifile *f, enum jtypes t ) reader = readobjel; break; default: - ierr( f, "internal error jtype %d in readseries", (int)t ); + ierr(f, "internal error jtype %d in readseries", (int)t); return false; } /* Peeking ahead in the stream saw [ or { which is how we got called. So go ahead and throw it away. */ - getch( f ); + getch(f); - ptrvec pv = (ptrvec){ 0 }; - for( bool oops = false; !oops; ) { + ptrvec pv = (ptrvec){0}; + for (bool oops = false; !oops;) { jvalue *x = 0; - int c = skipws( f ); - - if( c == EOF ) { + int c = skipws(f); + + if (c == EOF) { earlyeof(); oops = true; - } else if( c == ',' ) { - if( pv.len == 0 ) { - ierr( f, "missing value before comma" ); + } else if (c == ',') { + if (pv.len == 0) { + ierr(f, "missing value before comma"); oops = true; } - getch( f ); /* consume the , */ + getch(f); /* consume the , */ - } else if( c == term ) { /* we're done! */ - getch( f ); /* consume the } */ - j->u.v = (jvalue**)pvfinal( &pv ); + } else if (c == term) { /* we're done! */ + getch(f); /* consume the } */ + j->u.v = (jvalue **)pvfinal(&pv); return true; - } else if( !( x = reader( f ))) + } else if (!(x = reader(f))) oops = true; else - pvadd( &pv, x ); + pvadd(&pv, x); } - pvclear( &pv ); + pvclear(&pv); return false; } @@ -1196,61 +1180,69 @@ readseries( jvalue *j, ifile *f, enum jtypes t ) * This function is recursive; if the value in \a f is an array or an * object, a properly nested jvalue tree is returned. Any leading * whitespace is skipped. */ -static jvalue * -readvalue( ifile *f ) +static jvalue *readvalue(ifile *f) { int c; jvalue *j = jnew(); j->line = f->line; - switch(( c = skipws( f ))) { + switch ((c = skipws(f))) { case EOF: earlyeof(); break; case 'f': - if( must( f, "false" )) { + if (must(f, "false")) { j->d = jfalse; return j; } break; case 'n': - if( must( f, "null" )) { + if (must(f, "null")) { j->d = jnull; return j; } break; case 't': - if( must( f, "true" )) { + if (must(f, "true")) { j->d = jtrue; return j; } break; case '{': - if( readseries( j, f, j->d = jobject )) + if (readseries(j, f, j->d = jobject)) return j; break; case '[': - if( readseries( j, f, j->d = jarray )) + if (readseries(j, f, j->d = jarray)) return j; break; case '"': - if(( j->u.s = readstring( f ))) { + if ((j->u.s = readstring(f))) { j->d = jstring; return j; } break; - case '-': case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - if(( j->u.s = readnumber( f ))) { + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if ((j->u.s = readnumber(f))) { j->d = jnumber; return j; } break; default: - ierr( f, "unexpected '%c'", (char)c ); + ierr(f, "unexpected '%c'", (char)c); } - jdel( j ); + jdel(j); return 0; } @@ -1262,14 +1254,13 @@ readvalue( ifile *f ) * standard, in that the outermost value of the stream at \a fp * isn't limited to being just an array or object, but can also be * any other JSON value. */ -jvalue * -jparse( FILE *fp ) +jvalue *jparse(FILE *fp) { - if( !fp ) + if (!fp) return 0; - ifile f = (ifile){ .fp = fp, .line = 1 }; - return readvalue( &f ); + ifile f = (ifile){.fp = fp, .line = 1}; + return readvalue(&f); } /** This is only used by jupdate, so we hide it static to this file. @@ -1285,16 +1276,15 @@ jparse( FILE *fp ) * readnumber() via jparse(), we don't bother testing on isdigit() # like a well behaved function would; otherwise, failing isdigit() # in the while loop would also be an immediate return false. */ -static bool -integerp( const char *str ) +static bool integerp(const char *str) { - if( *str == '-' || *str == '+' ) + if (*str == '-' || *str == '+') ++str; - while( *str ) - if( *str == '.' || *str == 'e' || *str == 'E' ) + while (*str) + if (*str == '.' || *str == 'e' || *str == 'E') return false; - else - ++str; + else + ++str; return true; } @@ -1305,24 +1295,23 @@ integerp( const char *str ) * caller doesn't need lossy conversions introduced by atof(). * Calling jupdate() effectively "finishes" the parse, converting * everything into native formats. */ -jvalue * -jupdate( jvalue *j ) +jvalue *jupdate(jvalue *j) { - if( j ) - switch( j->d ) { + if (j) + switch (j->d) { case jnumber: - if( integerp( j->u.s )) { - j->u.i = strtoll( j->u.s, 0, 10 ); + if (integerp(j->u.s)) { + j->u.i = strtoll(j->u.s, 0, 10); j->d = jint; } else { - j->u.r = strtold( j->u.s, 0 ); + j->u.r = strtold(j->u.s, 0); j->d = jreal; } break; case jarray: - case jobject: - for( jvalue **jv = j->u.v; *jv; ++jv ) - jupdate( *jv ); + case jobject: + for (jvalue **jv = j->u.v; *jv; ++jv) + jupdate(*jv); break; default: break; diff --git a/include/elf_abi.h b/include/elf_abi.h index 9e5e9f3d6..c2c4dff4e 100644 --- a/include/elf_abi.h +++ b/include/elf_abi.h @@ -66,16 +66,16 @@ struct abi1_nhdr { }; _Static_assert((sizeof(struct abi1_nhdr)) == - (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + 8), - "struct abi1_nhdr alignment issue"); + (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + 8), + "struct abi1_nhdr alignment issue"); /* * Defines the entire note (header, descriptor content). */ struct abi1_info { - uint32_t abi_target; /* Target ABI (enum abi_target) */ - uint32_t abi_version; /* Target ABI version */ - uint32_t reserved0; /* Reserved for future expansion */ + uint32_t abi_target; /* Target ABI (enum abi_target) */ + uint32_t abi_version; /* Target ABI version */ + uint32_t reserved0; /* Reserved for future expansion */ uint32_t reserved1; }; @@ -88,17 +88,25 @@ struct abi1_note { * Internal alignment of (i) within struct abi1_note. Must be passed to * elf_load_note() as note_align when loading. */ -#define ABI1_NOTE_ALIGN offsetof(struct { char c; struct abi1_info i; }, i) - -_Static_assert((offsetof(struct abi1_note, i) & (ABI1_NOTE_ALIGN - 1)) == 0, - "struct abi1_note.i is not aligned to a ABI1_NOTE_ALIGN boundary"); +#define ABI1_NOTE_ALIGN \ + offsetof( \ + struct { \ + char c; \ + struct abi1_info i; \ + }, \ + i) + +_Static_assert( + (offsetof(struct abi1_note, i) & (ABI1_NOTE_ALIGN - 1)) == 0, + "struct abi1_note.i is not aligned to a ABI1_NOTE_ALIGN boundary"); /* * Maximum descsz of ABI1 ELF note descriptor (content), including * internal alignment. */ -#define ABI1_NOTE_MAX_SIZE ((sizeof (struct abi1_note) - \ - sizeof (struct abi1_nhdr) + sizeof (struct abi1_info))) +#define ABI1_NOTE_MAX_SIZE \ + ((sizeof(struct abi1_note) - sizeof(struct abi1_nhdr) + \ + sizeof(struct abi1_info))) /* * Declare a Solo5 "ABI1" format NOTE. @@ -107,20 +115,19 @@ _Static_assert((offsetof(struct abi1_note, i) & (ABI1_NOTE_ALIGN - 1)) == 0, * boundary, but ELF64 toolchains seem happy with the current arrangement... * the specifications are mess). */ -#define ABI1_NOTE_DECLARE_BEGIN \ -const struct abi1_note __solo5_abi1_note \ -__attribute__ ((section (".note.solo5.abi"), aligned(4))) \ -= { \ - .h = { \ - .n_namesz = sizeof(ABI1_NOTE_NAME), \ - .n_descsz = (sizeof(struct abi1_note) - \ - sizeof(struct abi1_nhdr)), \ - .n_type = ABI1_NOTE_TYPE, \ - .n_name = ABI1_NOTE_NAME \ - }, \ - .i = - -#define ABI1_NOTE_DECLARE_END }; +#define ABI1_NOTE_DECLARE_BEGIN \ + const struct abi1_note __solo5_abi1_note \ + __attribute__((section(".note.solo5.abi"), aligned(4))) = { \ + .h = {.n_namesz = sizeof(ABI1_NOTE_NAME), \ + .n_descsz = \ + (sizeof(struct abi1_note) - sizeof(struct abi1_nhdr)), \ + .n_type = ABI1_NOTE_TYPE, \ + .n_name = ABI1_NOTE_NAME}, \ + .i = + +#define ABI1_NOTE_DECLARE_END \ + } \ + ; /* * Declare the contents of the .interp section / PT_INTERP. @@ -133,10 +140,10 @@ __attribute__ ((section (".note.solo5.abi"), aligned(4))) \ * presence of a valid ELF executable at "/nonexistent/solo5". * */ -#define DECLARE_ELF_INTERP \ -const char __fake_interp[24] \ -__attribute__ ((section (".interp"), aligned(8))) \ -= "/nonexistent/solo5/"; +#define DECLARE_ELF_INTERP \ + const char __fake_interp[24] \ + __attribute__((section(".interp"), aligned(8))) = \ + "/nonexistent/solo5/"; /* * This is the format of an OpenBSD "identification" NOTE (see elf(5) and @@ -147,9 +154,9 @@ __attribute__ ((section (".interp"), aligned(8))) \ struct openbsd_note { uint32_t n_namesz; /* Always 8 */ uint32_t n_descsz; /* Always 4 (sizeof data) */ - uint32_t n_type; /* Always 1 (NT_VERSION) */ - char n_name[8]; /* Always "OpenBSD\0" */ - uint32_t data; /* Always 0 / unused */ + uint32_t n_type; /* Always 1 (NT_VERSION) */ + char n_name[8]; /* Always "OpenBSD\0" */ + uint32_t data; /* Always 0 / unused */ }; /* @@ -166,15 +173,13 @@ struct openbsd_note { * the "pretend to be an OpenBSD executable" NOTE must go in the *first* * PT_NOTE. See the linker scripts for that. */ -#define DECLARE_OPENBSD_NOTE \ -const struct openbsd_note __solo5_openbsd_note \ -__attribute__ ((section (".note.solo5.not_openbsd"), aligned(4))) \ -= { \ - .n_namesz = 8, \ - .n_descsz = 4, \ - .n_type = 1, \ - .n_name = "OpenBSD", \ - .data = 0 \ -}; +#define DECLARE_OPENBSD_NOTE \ + const struct openbsd_note __solo5_openbsd_note \ + __attribute__((section(".note.solo5.not_openbsd"), aligned(4))) = { \ + .n_namesz = 8, \ + .n_descsz = 4, \ + .n_type = 1, \ + .n_name = "OpenBSD", \ + .data = 0}; #endif /* ELF_ABI_H */ diff --git a/include/hvt_abi.h b/include/hvt_abi.h index bc5f035d3..086363be4 100644 --- a/include/hvt_abi.h +++ b/include/hvt_abi.h @@ -54,12 +54,12 @@ */ #define HVT_HYPERCALL_PIO_BASE 0x500 -# ifdef HVT_HOST +#ifdef HVT_HOST /* * Non-dereferencable tender-side type representing a guest physical address. */ typedef uint64_t hvt_gpa_t; -# else +#else /* * On x86, 32-bit PIO is used as the hypercall mechanism. This only supports * sending 32-bit pointers; raise an assertion if a bigger pointer is used. @@ -69,16 +69,16 @@ typedef uint64_t hvt_gpa_t; */ static inline void hvt_do_hypercall(int n, volatile void *arg) { -# ifdef assert +#ifdef assert assert(((uint64_t)arg <= UINT32_MAX)); -# endif +#endif __asm__ __volatile__("outl %0, %1" - : - : "a" ((uint32_t)((uint64_t)arg)), - "d" ((uint16_t)(HVT_HYPERCALL_PIO_BASE + n)) - : "memory"); + : + : "a"((uint32_t)((uint64_t)arg)), + "d"((uint16_t)(HVT_HYPERCALL_PIO_BASE + n)) + : "memory"); } -# endif +#endif #elif defined(__aarch64__) /* @@ -88,7 +88,7 @@ static inline void hvt_do_hypercall(int n, volatile void *arg) * * MMIO start from 4GB, this value can be changed by AARCH64_MMIO_BASE. */ -#define HVT_HYPERCALL_MMIO_BASE (0x100000000UL) +#define HVT_HYPERCALL_MMIO_BASE (0x100000000UL) /* * On aarch64, the MMIO address must be 64-bit aligned, because we configured @@ -98,15 +98,15 @@ static inline void hvt_do_hypercall(int n, volatile void *arg) * So the real hypercall ID will be calculated as: * HVT_HYPERCALL_MMIO_BASE + (ID << 3). */ -#define HVT_HYPERCALL_ADDRESS(x) (HVT_HYPERCALL_MMIO_BASE + ((x) << 3)) -#define HVT_HYPERCALL_NR(x) (((x) - HVT_HYPERCALL_MMIO_BASE) >> 3) +#define HVT_HYPERCALL_ADDRESS(x) (HVT_HYPERCALL_MMIO_BASE + ((x) << 3)) +#define HVT_HYPERCALL_NR(x) (((x) - HVT_HYPERCALL_MMIO_BASE) >> 3) -# ifdef HVT_HOST +#ifdef HVT_HOST /* * Non-dereferencable tender-side type representing a guest physical address. */ typedef uint64_t hvt_gpa_t; -# else +#else /* * In order to keep consistency with x86_64, we limit this hypercall only * to support sending 32-bit pointers; raise an assertion if a bigger @@ -117,18 +117,18 @@ typedef uint64_t hvt_gpa_t; */ static inline void hvt_do_hypercall(int n, volatile void *arg) { -# ifdef assert +#ifdef assert assert(((uint64_t)arg <= UINT32_MAX)); -# endif - __asm__ __volatile__("str %w0, [%1]" - : - : "rZ" ((uint32_t)((uint64_t)arg)), - "r" ((uint64_t)HVT_HYPERCALL_ADDRESS(n)) - : "memory"); +#endif + __asm__ __volatile__("str %w0, [%1]" + : + : "rZ"((uint32_t)((uint64_t)arg)), + "r"((uint64_t)HVT_HYPERCALL_ADDRESS(n)) + : "memory"); } -# endif +#endif #else -# error Unsupported architecture +#error Unsupported architecture #endif /* @@ -141,9 +141,9 @@ static inline void hvt_do_hypercall(int n, volatile void *arg) * tender side. */ #ifdef HVT_HOST -# define HVT_GUEST_PTR(T) hvt_gpa_t +#define HVT_GUEST_PTR(T) hvt_gpa_t #else -# define HVT_GUEST_PTR(T) T +#define HVT_GUEST_PTR(T) T #endif /* @@ -151,11 +151,12 @@ static inline void hvt_do_hypercall(int n, volatile void *arg) * the guest entrypoint. */ struct hvt_boot_info { - uint64_t mem_size; /* Memory size in bytes */ - uint64_t kernel_end; /* Address of end of kernel */ - uint64_t cpu_cycle_freq; /* CPU cycle counter frequency, Hz */ - HVT_GUEST_PTR(const char *) cmdline;/* Address of command line (C string) */ - HVT_GUEST_PTR(const void *) mft; /* Address of application manifest */ + uint64_t mem_size; /* Memory size in bytes */ + uint64_t kernel_end; /* Address of end of kernel */ + uint64_t cpu_cycle_freq; /* CPU cycle counter frequency, Hz */ + HVT_GUEST_PTR(const char *) + cmdline; /* Address of command line (C string) */ + HVT_GUEST_PTR(const void *) mft; /* Address of application manifest */ }; /* @@ -169,7 +170,7 @@ struct hvt_boot_info { */ enum hvt_hypercall { /* HVT_HYPERCALL_RESERVED=0 */ - HVT_HYPERCALL_WALLTIME=1, + HVT_HYPERCALL_WALLTIME = 1, HVT_HYPERCALL_PUTS, HVT_HYPERCALL_POLL, HVT_HYPERCALL_BLOCK_WRITE, @@ -250,7 +251,7 @@ struct hvt_hc_net_read { /* HVT_HYPERCALL_POLL */ struct hvt_hc_poll { /* IN */ - uint64_t timeout_nsecs; /* Relative to time of call */ + uint64_t timeout_nsecs; /* Relative to time of call */ /* OUT */ uint64_t ready_set; diff --git a/include/mft_abi.h b/include/mft_abi.h index 537c7bc5f..2adb1b392 100644 --- a/include/mft_abi.h +++ b/include/mft_abi.h @@ -64,8 +64,8 @@ struct mft_net_basic { uint16_t mtu; }; -#define MFT_NAME_SIZE 68 /* Bytes, including string terminator */ -#define MFT_NAME_MAX 67 /* Characters */ +#define MFT_NAME_SIZE 68 /* Bytes, including string terminator */ +#define MFT_NAME_MAX 67 /* Characters */ /* * Manifest entry (struct mft.e[]). @@ -78,10 +78,10 @@ struct mft_entry { struct mft_net_basic net_basic; } u; union { - int hostfd; /* Backing host descriptor OR */ - void *data; /* backing object / structure */ + int hostfd; /* Backing host descriptor OR */ + void *data; /* backing object / structure */ } b; - bool attached; /* Device attached? */ + bool attached; /* Device attached? */ }; /* @@ -95,7 +95,7 @@ struct mft_entry { * depend on solo5.h here). */ _Static_assert(MFT_MAX_ENTRIES <= (sizeof(uint64_t) * 8), - "MFT_MAX_ENTRIES too large for solo5_handle_set_t"); + "MFT_MAX_ENTRIES too large for solo5_handle_set_t"); /* * MFT_ENTRIES is defined by elftool when a manifest is being *defined*. @@ -139,8 +139,8 @@ struct mft1_nhdr { }; _Static_assert((sizeof(struct mft1_nhdr)) == - (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + 8), - "struct mft1_nhdr alignment issue"); + (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + 8), + "struct mft1_nhdr alignment issue"); /* * Defines the entire note (header, descriptor content). @@ -154,18 +154,25 @@ struct mft1_note { * Internal alignment of (m) within struct mft1_note. Must be passed to * elf_load_note() as note_align when loading. */ -#define MFT1_NOTE_ALIGN offsetof(struct { char c; struct mft m; }, m) +#define MFT1_NOTE_ALIGN \ + offsetof( \ + struct { \ + char c; \ + struct mft m; \ + }, \ + m) -_Static_assert((offsetof(struct mft1_note, m) & (MFT1_NOTE_ALIGN - 1)) == 0, - "struct mft1_note.m is not aligned to a MFT1_NOTE_ALIGN boundary"); +_Static_assert( + (offsetof(struct mft1_note, m) & (MFT1_NOTE_ALIGN - 1)) == 0, + "struct mft1_note.m is not aligned to a MFT1_NOTE_ALIGN boundary"); /* * Maximum descsz of manifest ELF note descriptor (content), including * internal alignment. */ -#define MFT1_NOTE_MAX_SIZE ((sizeof (struct mft1_note) - \ - sizeof (struct mft1_nhdr)) + \ - (MFT_MAX_ENTRIES * sizeof (struct mft_entry))) +#define MFT1_NOTE_MAX_SIZE \ + ((sizeof(struct mft1_note) - sizeof(struct mft1_nhdr)) + \ + (MFT_MAX_ENTRIES * sizeof(struct mft_entry))) /* * Declare a Solo5 "MFT1" format NOTE. @@ -174,19 +181,18 @@ _Static_assert((offsetof(struct mft1_note, m) & (MFT1_NOTE_ALIGN - 1)) == 0, * boundary, but ELF64 toolchains seem happy with the current arrangement... * the specifications are mess). */ -#define MFT1_NOTE_DECLARE_BEGIN \ -const struct mft1_note __solo5_mft1_note \ -__attribute__ ((section (".note.solo5.manifest"), aligned(4))) \ -= { \ - .h = { \ - .n_namesz = sizeof(MFT1_NOTE_NAME), \ - .n_descsz = (sizeof(struct mft1_note) - \ - sizeof(struct mft1_nhdr)), \ - .n_type = MFT1_NOTE_TYPE, \ - .n_name = MFT1_NOTE_NAME \ - }, \ - .m = - -#define MFT1_NOTE_DECLARE_END }; +#define MFT1_NOTE_DECLARE_BEGIN \ + const struct mft1_note __solo5_mft1_note \ + __attribute__((section(".note.solo5.manifest"), aligned(4))) = { \ + .h = {.n_namesz = sizeof(MFT1_NOTE_NAME), \ + .n_descsz = \ + (sizeof(struct mft1_note) - sizeof(struct mft1_nhdr)), \ + .n_type = MFT1_NOTE_TYPE, \ + .n_name = MFT1_NOTE_NAME}, \ + .m = + +#define MFT1_NOTE_DECLARE_END \ + } \ + ; #endif /* MFT_ABI_H */ diff --git a/include/solo5.h b/include/solo5.h index a0bbd4e39..f62e914e2 100644 --- a/include/solo5.h +++ b/include/solo5.h @@ -110,9 +110,9 @@ int solo5_app_main(const struct solo5_start_info *info); * * Status values of 255 and above are reserved for use by Solo5. */ -#define SOLO5_EXIT_SUCCESS 0 -#define SOLO5_EXIT_FAILURE 1 -#define SOLO5_EXIT_ABORT 255 +#define SOLO5_EXIT_SUCCESS 0 +#define SOLO5_EXIT_FAILURE 1 +#define SOLO5_EXIT_ABORT 255 void solo5_exit(int status) __attribute__((noreturn)); @@ -248,15 +248,15 @@ void solo5_console_write(const char *buf, size_t size); /* * Ethernet address length in bytes. */ -#define SOLO5_NET_ALEN 6 +#define SOLO5_NET_ALEN 6 /* * Ethernet frame header (target, source, type) length in bytes. */ -#define SOLO5_NET_HLEN 14 +#define SOLO5_NET_HLEN 14 struct solo5_net_info { uint8_t mac_address[SOLO5_NET_ALEN]; - size_t mtu; /* Not including Ethernet header */ + size_t mtu; /* Not including Ethernet header */ }; /* @@ -267,7 +267,7 @@ struct solo5_net_info { * once for each device (name). Subsequent calls will return SOLO5_R_EINVAL. */ solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *handle, - struct solo5_net_info *info); + struct solo5_net_info *info); /* * Sends a single network packet to the network device identified by (handle), @@ -279,7 +279,7 @@ solo5_result_t solo5_net_acquire(const char *name, solo5_handle_t *handle, * SOLO5_NET_HLEN). The packet must include the ethernet frame header. */ solo5_result_t solo5_net_write(solo5_handle_t handle, const uint8_t *buf, - size_t size); + size_t size); /* * Receives a single network packet from the network device identified by @@ -291,8 +291,8 @@ solo5_result_t solo5_net_write(solo5_handle_t handle, const uint8_t *buf, * SOLO5_R_OK and the size of the received packet including the ethernet frame * header in (*read_size). */ -solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, - size_t size, size_t *read_size); +solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, size_t size, + size_t *read_size); /* * Block I/O. @@ -311,8 +311,8 @@ solo5_result_t solo5_net_read(solo5_handle_t handle, uint8_t *buf, typedef uint64_t solo5_off_t; struct solo5_block_info { - solo5_off_t capacity; /* Capacity of block device, bytes */ - solo5_off_t block_size; /* Minimum I/O unit (block size), bytes */ + solo5_off_t capacity; /* Capacity of block device, bytes */ + solo5_off_t block_size; /* Minimum I/O unit (block size), bytes */ }; /* @@ -323,7 +323,7 @@ struct solo5_block_info { * device (name). Subsequent calls will return SOLO5_R_EINVAL. */ solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *handle, - struct solo5_block_info *info); + struct solo5_block_info *info); /* * Writes data of (size) bytes from the buffer (*buf) to the block device @@ -337,7 +337,7 @@ solo5_result_t solo5_block_acquire(const char *name, solo5_handle_t *handle, * single block. */ solo5_result_t solo5_block_write(solo5_handle_t handle, solo5_off_t offset, - const uint8_t *buf, size_t size); + const uint8_t *buf, size_t size); /* * Reads data of (size) bytes into the buffer (*buf) from the block device @@ -351,6 +351,6 @@ solo5_result_t solo5_block_write(solo5_handle_t handle, solo5_off_t offset, * single block. */ solo5_result_t solo5_block_read(solo5_handle_t handle, solo5_off_t offset, - uint8_t *buf, size_t size); + uint8_t *buf, size_t size); #endif diff --git a/include/spt_abi.h b/include/spt_abi.h index 1d08e5bec..a78f788cc 100644 --- a/include/spt_abi.h +++ b/include/spt_abi.h @@ -50,12 +50,12 @@ * the guest entrypoint. */ struct spt_boot_info { - uint64_t mem_size; /* Memory size in bytes */ - uint64_t kernel_end; /* Address of end of kernel */ - const char *cmdline; /* Address of command line (C string) */ - const void *mft; /* Address of application manifest */ - int epollfd; /* epoll() set for yield() */ - int timerfd; /* internal timerfd for yield() */ + uint64_t mem_size; /* Memory size in bytes */ + uint64_t kernel_end; /* Address of end of kernel */ + const char *cmdline; /* Address of command line (C string) */ + const void *mft; /* Address of application manifest */ + int epollfd; /* epoll() set for yield() */ + int timerfd; /* internal timerfd for yield() */ }; /* diff --git a/include/xen/arch-arm.h b/include/xen/arch-arm.h index c365b1b39..202574608 100644 --- a/include/xen/arch-arm.h +++ b/include/xen/arch-arm.h @@ -163,17 +163,21 @@ * at Documentation/devicetree/bindings/arm/xen.txt. */ -#define XEN_HYPERCALL_TAG 0XEA1 +#define XEN_HYPERCALL_TAG 0XEA1 -#define int64_aligned_t int64_t __attribute__((aligned(8))) +#define int64_aligned_t int64_t __attribute__((aligned(8))) #define uint64_aligned_t uint64_t __attribute__((aligned(8))) #ifndef __ASSEMBLY__ -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef union { type *p; unsigned long q; } \ - __guest_handle_ ## name; \ - typedef union { type *p; uint64_aligned_t q; } \ - __guest_handle_64_ ## name +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef union { \ + type *p; \ + unsigned long q; \ + } __guest_handle_##name; \ + typedef union { \ + type *p; \ + uint64_aligned_t q; \ + } __guest_handle_64_##name /* * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field @@ -182,23 +186,23 @@ * XEN_GUEST_HANDLE_PARAM represents a guest pointer, when passed as an * hypercall argument. It is 4 bytes on aarch32 and 8 bytes on aarch64. */ -#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ - ___DEFINE_XEN_GUEST_HANDLE(name, type); \ +#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ + ___DEFINE_XEN_GUEST_HANDLE(name, type); \ ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) -#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) -#define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name -#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) -#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name -#define set_xen_guest_handle_raw(hnd, val) \ - do { \ - typeof(&(hnd)) _sxghr_tmp = &(hnd); \ - _sxghr_tmp->q = 0; \ - _sxghr_tmp->p = val; \ - } while ( 0 ) +#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) +#define __XEN_GUEST_HANDLE(name) __guest_handle_64_##name +#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_##name +#define set_xen_guest_handle_raw(hnd, val) \ + do { \ + typeof(&(hnd)) _sxghr_tmp = &(hnd); \ + _sxghr_tmp->q = 0; \ + _sxghr_tmp->p = val; \ + } while (0) #define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) typedef uint64_t xen_pfn_t; -#define PRI_xen_pfn PRIx64 +#define PRI_xen_pfn PRIx64 #define PRIu_xen_pfn PRIu64 /* @@ -213,65 +217,65 @@ typedef uint64_t xen_ulong_t; #if defined(__XEN__) || defined(__XEN_TOOLS__) #if defined(__GNUC__) && !defined(__STRICT_ANSI__) /* Anonymous union includes both 32- and 64-bit names (e.g., r0/x0). */ -# define __DECL_REG(n64, n32) union { \ - uint64_t n64; \ - uint32_t n32; \ +#define __DECL_REG(n64, n32) \ + union { \ + uint64_t n64; \ + uint32_t n32; \ } #else /* Non-gcc sources must always use the proper 64-bit name (e.g., x0). */ #define __DECL_REG(n64, n32) uint64_t n64 #endif -struct vcpu_guest_core_regs -{ +struct vcpu_guest_core_regs { /* Aarch64 Aarch32 */ - __DECL_REG(x0, r0_usr); - __DECL_REG(x1, r1_usr); - __DECL_REG(x2, r2_usr); - __DECL_REG(x3, r3_usr); - __DECL_REG(x4, r4_usr); - __DECL_REG(x5, r5_usr); - __DECL_REG(x6, r6_usr); - __DECL_REG(x7, r7_usr); - __DECL_REG(x8, r8_usr); - __DECL_REG(x9, r9_usr); - __DECL_REG(x10, r10_usr); - __DECL_REG(x11, r11_usr); - __DECL_REG(x12, r12_usr); - - __DECL_REG(x13, sp_usr); - __DECL_REG(x14, lr_usr); - - __DECL_REG(x15, __unused_sp_hyp); - - __DECL_REG(x16, lr_irq); - __DECL_REG(x17, sp_irq); - - __DECL_REG(x18, lr_svc); - __DECL_REG(x19, sp_svc); - - __DECL_REG(x20, lr_abt); - __DECL_REG(x21, sp_abt); - - __DECL_REG(x22, lr_und); - __DECL_REG(x23, sp_und); - - __DECL_REG(x24, r8_fiq); - __DECL_REG(x25, r9_fiq); - __DECL_REG(x26, r10_fiq); - __DECL_REG(x27, r11_fiq); - __DECL_REG(x28, r12_fiq); - - __DECL_REG(x29, sp_fiq); - __DECL_REG(x30, lr_fiq); + __DECL_REG(x0, r0_usr); + __DECL_REG(x1, r1_usr); + __DECL_REG(x2, r2_usr); + __DECL_REG(x3, r3_usr); + __DECL_REG(x4, r4_usr); + __DECL_REG(x5, r5_usr); + __DECL_REG(x6, r6_usr); + __DECL_REG(x7, r7_usr); + __DECL_REG(x8, r8_usr); + __DECL_REG(x9, r9_usr); + __DECL_REG(x10, r10_usr); + __DECL_REG(x11, r11_usr); + __DECL_REG(x12, r12_usr); + + __DECL_REG(x13, sp_usr); + __DECL_REG(x14, lr_usr); + + __DECL_REG(x15, __unused_sp_hyp); + + __DECL_REG(x16, lr_irq); + __DECL_REG(x17, sp_irq); + + __DECL_REG(x18, lr_svc); + __DECL_REG(x19, sp_svc); + + __DECL_REG(x20, lr_abt); + __DECL_REG(x21, sp_abt); + + __DECL_REG(x22, lr_und); + __DECL_REG(x23, sp_und); + + __DECL_REG(x24, r8_fiq); + __DECL_REG(x25, r9_fiq); + __DECL_REG(x26, r10_fiq); + __DECL_REG(x27, r11_fiq); + __DECL_REG(x28, r12_fiq); + + __DECL_REG(x29, sp_fiq); + __DECL_REG(x30, lr_fiq); /* Return address and mode */ - __DECL_REG(pc64, pc32); /* ELR_EL2 */ - uint32_t cpsr; /* SPSR_EL2 */ + __DECL_REG(pc64, pc32); /* ELR_EL2 */ + uint32_t cpsr; /* SPSR_EL2 */ union { - uint32_t spsr_el1; /* AArch64 */ - uint32_t spsr_svc; /* AArch32 */ + uint32_t spsr_el1; /* AArch64 */ + uint32_t spsr_svc; /* AArch32 */ }; /* AArch32 guests only */ @@ -287,11 +291,11 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_guest_core_regs_t); #undef __DECL_REG struct vcpu_guest_context { -#define _VGCF_online 0 -#define VGCF_online (1<<_VGCF_online) - uint32_t flags; /* VGCF_* */ +#define _VGCF_online 0 +#define VGCF_online (1 << _VGCF_online) + uint32_t flags; /* VGCF_* */ - struct vcpu_guest_core_regs user_regs; /* Core CPU registers */ + struct vcpu_guest_core_regs user_regs; /* Core CPU registers */ uint64_t sctlr; uint64_t ttbcr, ttbr0, ttbr1; @@ -303,12 +307,12 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); * struct xen_arch_domainconfig's ABI is covered by * XEN_DOMCTL_INTERFACE_VERSION. */ -#define XEN_DOMCTL_CONFIG_GIC_NATIVE 0 -#define XEN_DOMCTL_CONFIG_GIC_V2 1 -#define XEN_DOMCTL_CONFIG_GIC_V3 2 +#define XEN_DOMCTL_CONFIG_GIC_NATIVE 0 +#define XEN_DOMCTL_CONFIG_GIC_V2 1 +#define XEN_DOMCTL_CONFIG_GIC_V3 2 -#define XEN_DOMCTL_CONFIG_TEE_NONE 0 -#define XEN_DOMCTL_CONFIG_TEE_OPTEE 1 +#define XEN_DOMCTL_CONFIG_TEE_NONE 0 +#define XEN_DOMCTL_CONFIG_TEE_OPTEE 1 struct xen_arch_domainconfig { /* IN/OUT */ @@ -349,14 +353,14 @@ typedef uint64_t xen_callback_t; /* PSR bits (CPSR, SPSR) */ -#define PSR_THUMB (1<<5) /* Thumb Mode enable */ -#define PSR_FIQ_MASK (1<<6) /* Fast Interrupt mask */ -#define PSR_IRQ_MASK (1<<7) /* Interrupt mask */ -#define PSR_ABT_MASK (1<<8) /* Asynchronous Abort mask */ -#define PSR_BIG_ENDIAN (1<<9) /* arm32: Big Endian Mode */ -#define PSR_DBG_MASK (1<<9) /* arm64: Debug Exception mask */ -#define PSR_IT_MASK (0x0600fc00) /* Thumb If-Then Mask */ -#define PSR_JAZELLE (1<<24) /* Jazelle Mode */ +#define PSR_THUMB (1 << 5) /* Thumb Mode enable */ +#define PSR_FIQ_MASK (1 << 6) /* Fast Interrupt mask */ +#define PSR_IRQ_MASK (1 << 7) /* Interrupt mask */ +#define PSR_ABT_MASK (1 << 8) /* Asynchronous Abort mask */ +#define PSR_BIG_ENDIAN (1 << 9) /* arm32: Big Endian Mode */ +#define PSR_DBG_MASK (1 << 9) /* arm64: Debug Exception mask */ +#define PSR_IT_MASK (0x0600fc00) /* Thumb If-Then Mask */ +#define PSR_JAZELLE (1 << 24) /* Jazelle Mode */ /* 32 bit modes */ #define PSR_MODE_USR 0x10 @@ -379,10 +383,12 @@ typedef uint64_t xen_callback_t; #define PSR_MODE_EL1t 0x04 #define PSR_MODE_EL0t 0x00 -#define PSR_GUEST32_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_SVC) -#define PSR_GUEST64_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_EL1h) +#define PSR_GUEST32_INIT \ + (PSR_ABT_MASK | PSR_FIQ_MASK | PSR_IRQ_MASK | PSR_MODE_SVC) +#define PSR_GUEST64_INIT \ + (PSR_ABT_MASK | PSR_FIQ_MASK | PSR_IRQ_MASK | PSR_MODE_EL1h) -#define SCTLR_GUEST_INIT xen_mk_ullong(0x00c50078) +#define SCTLR_GUEST_INIT xen_mk_ullong(0x00c50078) /* * Virtual machine platform (memory layout, interrupts) @@ -400,27 +406,27 @@ typedef uint64_t xen_callback_t; */ /* vGIC v2 mappings */ -#define GUEST_GICD_BASE xen_mk_ullong(0x03001000) -#define GUEST_GICD_SIZE xen_mk_ullong(0x00001000) -#define GUEST_GICC_BASE xen_mk_ullong(0x03002000) -#define GUEST_GICC_SIZE xen_mk_ullong(0x00002000) +#define GUEST_GICD_BASE xen_mk_ullong(0x03001000) +#define GUEST_GICD_SIZE xen_mk_ullong(0x00001000) +#define GUEST_GICC_BASE xen_mk_ullong(0x03002000) +#define GUEST_GICC_SIZE xen_mk_ullong(0x00002000) /* vGIC v3 mappings */ -#define GUEST_GICV3_GICD_BASE xen_mk_ullong(0x03001000) -#define GUEST_GICV3_GICD_SIZE xen_mk_ullong(0x00010000) +#define GUEST_GICV3_GICD_BASE xen_mk_ullong(0x03001000) +#define GUEST_GICV3_GICD_SIZE xen_mk_ullong(0x00010000) -#define GUEST_GICV3_RDIST_REGIONS 1 +#define GUEST_GICV3_RDIST_REGIONS 1 -#define GUEST_GICV3_GICR0_BASE xen_mk_ullong(0x03020000) /* vCPU0..127 */ -#define GUEST_GICV3_GICR0_SIZE xen_mk_ullong(0x01000000) +#define GUEST_GICV3_GICR0_BASE xen_mk_ullong(0x03020000) /* vCPU0..127 */ +#define GUEST_GICV3_GICR0_SIZE xen_mk_ullong(0x01000000) /* ACPI tables physical address */ #define GUEST_ACPI_BASE xen_mk_ullong(0x20000000) #define GUEST_ACPI_SIZE xen_mk_ullong(0x02000000) /* PL011 mappings */ -#define GUEST_PL011_BASE xen_mk_ullong(0x22000000) -#define GUEST_PL011_SIZE xen_mk_ullong(0x00001000) +#define GUEST_PL011_BASE xen_mk_ullong(0x22000000) +#define GUEST_PL011_SIZE xen_mk_ullong(0x00001000) /* * 16MB == 4096 pages reserved for guest to use as a region to map its @@ -429,23 +435,23 @@ typedef uint64_t xen_callback_t; #define GUEST_GNTTAB_BASE xen_mk_ullong(0x38000000) #define GUEST_GNTTAB_SIZE xen_mk_ullong(0x01000000) -#define GUEST_MAGIC_BASE xen_mk_ullong(0x39000000) -#define GUEST_MAGIC_SIZE xen_mk_ullong(0x01000000) +#define GUEST_MAGIC_BASE xen_mk_ullong(0x39000000) +#define GUEST_MAGIC_SIZE xen_mk_ullong(0x01000000) -#define GUEST_RAM_BANKS 2 +#define GUEST_RAM_BANKS 2 -#define GUEST_RAM0_BASE xen_mk_ullong(0x40000000) /* 3GB of low RAM @ 1GB */ -#define GUEST_RAM0_SIZE xen_mk_ullong(0xc0000000) +#define GUEST_RAM0_BASE xen_mk_ullong(0x40000000) /* 3GB of low RAM @ 1GB */ +#define GUEST_RAM0_SIZE xen_mk_ullong(0xc0000000) -#define GUEST_RAM1_BASE xen_mk_ullong(0x0200000000) /* 1016GB of RAM @ 8GB */ -#define GUEST_RAM1_SIZE xen_mk_ullong(0xfe00000000) +#define GUEST_RAM1_BASE xen_mk_ullong(0x0200000000) /* 1016GB of RAM @ 8GB */ +#define GUEST_RAM1_SIZE xen_mk_ullong(0xfe00000000) -#define GUEST_RAM_BASE GUEST_RAM0_BASE /* Lowest RAM address */ +#define GUEST_RAM_BASE GUEST_RAM0_BASE /* Lowest RAM address */ /* Largest amount of actual RAM, not including holes */ -#define GUEST_RAM_MAX (GUEST_RAM0_SIZE + GUEST_RAM1_SIZE) +#define GUEST_RAM_MAX (GUEST_RAM0_SIZE + GUEST_RAM1_SIZE) /* Suitable for e.g. const uint64_t ramfoo[] = GUEST_RAM_BANK_FOOS; */ -#define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE, GUEST_RAM1_BASE } -#define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE, GUEST_RAM1_SIZE } +#define GUEST_RAM_BANK_BASES {GUEST_RAM0_BASE, GUEST_RAM1_BASE} +#define GUEST_RAM_BANK_SIZES {GUEST_RAM0_SIZE, GUEST_RAM1_SIZE} /* Current supported guest VCPUs */ #define GUEST_MAX_VCPUS 128 @@ -456,7 +462,7 @@ typedef uint64_t xen_callback_t; #define GUEST_TIMER_PHYS_NS_PPI 30 #define GUEST_EVTCHN_PPI 31 -#define GUEST_VPL011_SPI 32 +#define GUEST_VPL011_SPI 32 /* PSCI functions */ #define PSCI_cpu_suspend 0 @@ -468,7 +474,9 @@ typedef uint64_t xen_callback_t; #ifndef __ASSEMBLY__ /* Stub definition of PMU structure */ -typedef struct xen_pmu_arch { uint8_t dummy; } xen_pmu_arch_t; +typedef struct xen_pmu_arch { + uint8_t dummy; +} xen_pmu_arch_t; #endif #endif /* __XEN_PUBLIC_ARCH_ARM_H__ */ diff --git a/include/xen/arch-arm/smccc.h b/include/xen/arch-arm/smccc.h index 17dc6d882..e1c4bb1cc 100644 --- a/include/xen/arch-arm/smccc.h +++ b/include/xen/arch-arm/smccc.h @@ -43,16 +43,18 @@ #define XEN_SMCCC_MINOR_REVISION 1 /* Hypervisor Service UID. Randomly generated with uuidgen. */ -#define XEN_SMCCC_UID XEN_DEFINE_UUID(0xa71812dc, 0xc698, 0x4369, 0x9acf, \ - 0x79, 0xd1, 0x8d, 0xde, 0xe6, 0x67) +#define XEN_SMCCC_UID \ + XEN_DEFINE_UUID(0xa71812dc, 0xc698, 0x4369, 0x9acf, 0x79, 0xd1, 0x8d, \ + 0xde, 0xe6, 0x67) /* Standard Service Service Call version. */ #define SSSC_SMCCC_MAJOR_REVISION 0 #define SSSC_SMCCC_MINOR_REVISION 1 /* Standard Service Call UID. Randomly generated with uuidgen. */ -#define SSSC_SMCCC_UID XEN_DEFINE_UUID(0xf863386f, 0x4b39, 0x4cbd, 0x9220,\ - 0xce, 0x16, 0x41, 0xe5, 0x9f, 0x6f) +#define SSSC_SMCCC_UID \ + XEN_DEFINE_UUID(0xf863386f, 0x4b39, 0x4cbd, 0x9220, 0xce, 0x16, 0x41, \ + 0xe5, 0x9f, 0x6f) #endif /* __XEN_PUBLIC_ARCH_ARM_SMCCC_H__ */ diff --git a/include/xen/arch-x86/cpufeatureset.h b/include/xen/arch-x86/cpufeatureset.h index 2835688f1..ab5d011ba 100644 --- a/include/xen/arch-x86/cpufeatureset.h +++ b/include/xen/arch-x86/cpufeatureset.h @@ -59,210 +59,246 @@ enum { #ifdef XEN_CPUFEATURE -/* - * A featureset is a bitmap of x86 features, represented as a collection of - * 32bit words. - * - * Words are as specified in vendors programming manuals, and shall not - * contain any synthesied values. New words may be added to the end of - * featureset. - * - * All featureset words currently originate from leaves specified for the - * CPUID instruction, but this is not preclude other sources of information. - */ + /* + * A featureset is a bitmap of x86 features, represented as a collection of + * 32bit words. + * + * Words are as specified in vendors programming manuals, and shall not + * contain any synthesied values. New words may be added to the end of + * featureset. + * + * All featureset words currently originate from leaves specified for the + * CPUID instruction, but this is not preclude other sources of information. + */ -/* - * Attribute syntax: - * - * Attributes for a particular feature are provided as characters before the - * first space in the comment immediately following the feature value. Note - - * none of these attributes form part of the Xen public ABI. - * - * Special: '!' - * This bit has special properties and is not a straight indication of a - * piece of new functionality. Xen will handle these differently, - * and may override toolstack settings completely. - * - * Applicability to guests: 'A', 'S' or 'H' - * 'A' = All guests. - * 'S' = All HVM guests (not PV guests). - * 'H' = HVM HAP guests (not PV or HVM Shadow guests). - */ + /* + * Attribute syntax: + * + * Attributes for a particular feature are provided as characters before the + * first space in the comment immediately following the feature value. Note + * - none of these attributes form part of the Xen public ABI. + * + * Special: '!' + * This bit has special properties and is not a straight indication of a + * piece of new functionality. Xen will handle these differently, + * and may override toolstack settings completely. + * + * Applicability to guests: 'A', 'S' or 'H' + * 'A' = All guests. + * 'S' = All HVM guests (not PV guests). + * 'H' = HVM HAP guests (not PV or HVM Shadow guests). + */ -/* Intel-defined CPU features, CPUID level 0x00000001.edx, word 0 */ -XEN_CPUFEATURE(FPU, 0*32+ 0) /*A Onboard FPU */ -XEN_CPUFEATURE(VME, 0*32+ 1) /*S Virtual Mode Extensions */ -XEN_CPUFEATURE(DE, 0*32+ 2) /*A Debugging Extensions */ -XEN_CPUFEATURE(PSE, 0*32+ 3) /*S Page Size Extensions */ -XEN_CPUFEATURE(TSC, 0*32+ 4) /*A Time Stamp Counter */ -XEN_CPUFEATURE(MSR, 0*32+ 5) /*A Model-Specific Registers, RDMSR, WRMSR */ -XEN_CPUFEATURE(PAE, 0*32+ 6) /*A Physical Address Extensions */ -XEN_CPUFEATURE(MCE, 0*32+ 7) /*A Machine Check Architecture */ -XEN_CPUFEATURE(CX8, 0*32+ 8) /*A CMPXCHG8 instruction */ -XEN_CPUFEATURE(APIC, 0*32+ 9) /*!A Onboard APIC */ -XEN_CPUFEATURE(SEP, 0*32+11) /*A SYSENTER/SYSEXIT */ -XEN_CPUFEATURE(MTRR, 0*32+12) /*S Memory Type Range Registers */ -XEN_CPUFEATURE(PGE, 0*32+13) /*S Page Global Enable */ -XEN_CPUFEATURE(MCA, 0*32+14) /*A Machine Check Architecture */ -XEN_CPUFEATURE(CMOV, 0*32+15) /*A CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ -XEN_CPUFEATURE(PAT, 0*32+16) /*A Page Attribute Table */ -XEN_CPUFEATURE(PSE36, 0*32+17) /*S 36-bit PSEs */ -XEN_CPUFEATURE(CLFLUSH, 0*32+19) /*A CLFLUSH instruction */ -XEN_CPUFEATURE(DS, 0*32+21) /* Debug Store */ -XEN_CPUFEATURE(ACPI, 0*32+22) /*A ACPI via MSR */ -XEN_CPUFEATURE(MMX, 0*32+23) /*A Multimedia Extensions */ -XEN_CPUFEATURE(FXSR, 0*32+24) /*A FXSAVE and FXRSTOR instructions */ -XEN_CPUFEATURE(SSE, 0*32+25) /*A Streaming SIMD Extensions */ -XEN_CPUFEATURE(SSE2, 0*32+26) /*A Streaming SIMD Extensions-2 */ -XEN_CPUFEATURE(SS, 0*32+27) /*A CPU self snoop */ -XEN_CPUFEATURE(HTT, 0*32+28) /*!A Hyper-Threading Technology */ -XEN_CPUFEATURE(TM1, 0*32+29) /* Thermal Monitor 1 */ -XEN_CPUFEATURE(PBE, 0*32+31) /* Pending Break Enable */ + /* Intel-defined CPU features, CPUID level 0x00000001.edx, word 0 */ + XEN_CPUFEATURE(FPU, 0 * 32 + 0) /*A Onboard FPU */ + XEN_CPUFEATURE(VME, 0 * 32 + 1) /*S Virtual Mode Extensions */ + XEN_CPUFEATURE(DE, 0 * 32 + 2) /*A Debugging Extensions */ + XEN_CPUFEATURE(PSE, 0 * 32 + 3) /*S Page Size Extensions */ + XEN_CPUFEATURE(TSC, 0 * 32 + 4) /*A Time Stamp Counter */ + XEN_CPUFEATURE(MSR, + 0 * 32 + 5) /*A Model-Specific Registers, RDMSR, WRMSR */ + XEN_CPUFEATURE(PAE, 0 * 32 + 6) /*A Physical Address Extensions */ + XEN_CPUFEATURE(MCE, 0 * 32 + 7) /*A Machine Check Architecture */ + XEN_CPUFEATURE(CX8, 0 * 32 + 8) /*A CMPXCHG8 instruction */ + XEN_CPUFEATURE(APIC, 0 * 32 + 9) /*!A Onboard APIC */ + XEN_CPUFEATURE(SEP, 0 * 32 + 11) /*A SYSENTER/SYSEXIT */ + XEN_CPUFEATURE(MTRR, 0 * 32 + 12) /*S Memory Type Range Registers */ + XEN_CPUFEATURE(PGE, 0 * 32 + 13) /*S Page Global Enable */ + XEN_CPUFEATURE(MCA, 0 * 32 + 14) /*A Machine Check Architecture */ + XEN_CPUFEATURE( + CMOV, + 0 * 32 + + 15) /*A CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ + XEN_CPUFEATURE(PAT, 0 * 32 + 16) /*A Page Attribute Table */ + XEN_CPUFEATURE(PSE36, 0 * 32 + 17) /*S 36-bit PSEs */ + XEN_CPUFEATURE(CLFLUSH, 0 * 32 + 19) /*A CLFLUSH instruction */ + XEN_CPUFEATURE(DS, 0 * 32 + 21) /* Debug Store */ + XEN_CPUFEATURE(ACPI, 0 * 32 + 22) /*A ACPI via MSR */ + XEN_CPUFEATURE(MMX, 0 * 32 + 23) /*A Multimedia Extensions */ + XEN_CPUFEATURE(FXSR, 0 * 32 + 24) /*A FXSAVE and FXRSTOR instructions */ + XEN_CPUFEATURE(SSE, 0 * 32 + 25) /*A Streaming SIMD Extensions */ + XEN_CPUFEATURE(SSE2, 0 * 32 + 26) /*A Streaming SIMD Extensions-2 */ + XEN_CPUFEATURE(SS, 0 * 32 + 27) /*A CPU self snoop */ + XEN_CPUFEATURE(HTT, 0 * 32 + 28) /*!A Hyper-Threading Technology */ + XEN_CPUFEATURE(TM1, 0 * 32 + 29) /* Thermal Monitor 1 */ + XEN_CPUFEATURE(PBE, 0 * 32 + 31) /* Pending Break Enable */ -/* Intel-defined CPU features, CPUID level 0x00000001.ecx, word 1 */ -XEN_CPUFEATURE(SSE3, 1*32+ 0) /*A Streaming SIMD Extensions-3 */ -XEN_CPUFEATURE(PCLMULQDQ, 1*32+ 1) /*A Carry-less multiplication */ -XEN_CPUFEATURE(DTES64, 1*32+ 2) /* 64-bit Debug Store */ -XEN_CPUFEATURE(MONITOR, 1*32+ 3) /* Monitor/Mwait support */ -XEN_CPUFEATURE(DSCPL, 1*32+ 4) /* CPL Qualified Debug Store */ -XEN_CPUFEATURE(VMX, 1*32+ 5) /*S Virtual Machine Extensions */ -XEN_CPUFEATURE(SMX, 1*32+ 6) /* Safer Mode Extensions */ -XEN_CPUFEATURE(EIST, 1*32+ 7) /* Enhanced SpeedStep */ -XEN_CPUFEATURE(TM2, 1*32+ 8) /* Thermal Monitor 2 */ -XEN_CPUFEATURE(SSSE3, 1*32+ 9) /*A Supplemental Streaming SIMD Extensions-3 */ -XEN_CPUFEATURE(FMA, 1*32+12) /*A Fused Multiply Add */ -XEN_CPUFEATURE(CX16, 1*32+13) /*A CMPXCHG16B */ -XEN_CPUFEATURE(XTPR, 1*32+14) /* Send Task Priority Messages */ -XEN_CPUFEATURE(PDCM, 1*32+15) /* Perf/Debug Capability MSR */ -XEN_CPUFEATURE(PCID, 1*32+17) /*H Process Context ID */ -XEN_CPUFEATURE(DCA, 1*32+18) /* Direct Cache Access */ -XEN_CPUFEATURE(SSE4_1, 1*32+19) /*A Streaming SIMD Extensions 4.1 */ -XEN_CPUFEATURE(SSE4_2, 1*32+20) /*A Streaming SIMD Extensions 4.2 */ -XEN_CPUFEATURE(X2APIC, 1*32+21) /*!A Extended xAPIC */ -XEN_CPUFEATURE(MOVBE, 1*32+22) /*A movbe instruction */ -XEN_CPUFEATURE(POPCNT, 1*32+23) /*A POPCNT instruction */ -XEN_CPUFEATURE(TSC_DEADLINE, 1*32+24) /*S TSC Deadline Timer */ -XEN_CPUFEATURE(AESNI, 1*32+25) /*A AES instructions */ -XEN_CPUFEATURE(XSAVE, 1*32+26) /*A XSAVE/XRSTOR/XSETBV/XGETBV */ -XEN_CPUFEATURE(OSXSAVE, 1*32+27) /*! OSXSAVE */ -XEN_CPUFEATURE(AVX, 1*32+28) /*A Advanced Vector Extensions */ -XEN_CPUFEATURE(F16C, 1*32+29) /*A Half-precision convert instruction */ -XEN_CPUFEATURE(RDRAND, 1*32+30) /*A Digital Random Number Generator */ -XEN_CPUFEATURE(HYPERVISOR, 1*32+31) /*!A Running under some hypervisor */ + /* Intel-defined CPU features, CPUID level 0x00000001.ecx, word 1 */ + XEN_CPUFEATURE(SSE3, 1 * 32 + 0) /*A Streaming SIMD Extensions-3 */ + XEN_CPUFEATURE(PCLMULQDQ, 1 * 32 + 1) /*A Carry-less multiplication */ + XEN_CPUFEATURE(DTES64, 1 * 32 + 2) /* 64-bit Debug Store */ + XEN_CPUFEATURE(MONITOR, 1 * 32 + 3) /* Monitor/Mwait support */ + XEN_CPUFEATURE(DSCPL, 1 * 32 + 4) /* CPL Qualified Debug Store */ + XEN_CPUFEATURE(VMX, 1 * 32 + 5) /*S Virtual Machine Extensions */ + XEN_CPUFEATURE(SMX, 1 * 32 + 6) /* Safer Mode Extensions */ + XEN_CPUFEATURE(EIST, 1 * 32 + 7) /* Enhanced SpeedStep */ + XEN_CPUFEATURE(TM2, 1 * 32 + 8) /* Thermal Monitor 2 */ + XEN_CPUFEATURE(SSSE3, + 1 * 32 + 9) /*A Supplemental Streaming SIMD Extensions-3 */ + XEN_CPUFEATURE(FMA, 1 * 32 + 12) /*A Fused Multiply Add */ + XEN_CPUFEATURE(CX16, 1 * 32 + 13) /*A CMPXCHG16B */ + XEN_CPUFEATURE(XTPR, 1 * 32 + 14) /* Send Task Priority Messages */ + XEN_CPUFEATURE(PDCM, 1 * 32 + 15) /* Perf/Debug Capability MSR */ + XEN_CPUFEATURE(PCID, 1 * 32 + 17) /*H Process Context ID */ + XEN_CPUFEATURE(DCA, 1 * 32 + 18) /* Direct Cache Access */ + XEN_CPUFEATURE(SSE4_1, 1 * 32 + 19) /*A Streaming SIMD Extensions 4.1 */ + XEN_CPUFEATURE(SSE4_2, 1 * 32 + 20) /*A Streaming SIMD Extensions 4.2 */ + XEN_CPUFEATURE(X2APIC, 1 * 32 + 21) /*!A Extended xAPIC */ + XEN_CPUFEATURE(MOVBE, 1 * 32 + 22) /*A movbe instruction */ + XEN_CPUFEATURE(POPCNT, 1 * 32 + 23) /*A POPCNT instruction */ + XEN_CPUFEATURE(TSC_DEADLINE, 1 * 32 + 24) /*S TSC Deadline Timer */ + XEN_CPUFEATURE(AESNI, 1 * 32 + 25) /*A AES instructions */ + XEN_CPUFEATURE(XSAVE, 1 * 32 + 26) /*A XSAVE/XRSTOR/XSETBV/XGETBV */ + XEN_CPUFEATURE(OSXSAVE, 1 * 32 + 27) /*! OSXSAVE */ + XEN_CPUFEATURE(AVX, 1 * 32 + 28) /*A Advanced Vector Extensions */ + XEN_CPUFEATURE(F16C, 1 * 32 + 29) /*A Half-precision convert instruction */ + XEN_CPUFEATURE(RDRAND, 1 * 32 + 30) /*A Digital Random Number Generator */ + XEN_CPUFEATURE(HYPERVISOR, + 1 * 32 + 31) /*!A Running under some hypervisor */ -/* AMD-defined CPU features, CPUID level 0x80000001.edx, word 2 */ -XEN_CPUFEATURE(SYSCALL, 2*32+11) /*A SYSCALL/SYSRET */ -XEN_CPUFEATURE(NX, 2*32+20) /*A Execute Disable */ -XEN_CPUFEATURE(MMXEXT, 2*32+22) /*A AMD MMX extensions */ -XEN_CPUFEATURE(FFXSR, 2*32+25) /*A FFXSR instruction optimizations */ -XEN_CPUFEATURE(PAGE1GB, 2*32+26) /*H 1Gb large page support */ -XEN_CPUFEATURE(RDTSCP, 2*32+27) /*A RDTSCP */ -XEN_CPUFEATURE(LM, 2*32+29) /*A Long Mode (x86-64) */ -XEN_CPUFEATURE(3DNOWEXT, 2*32+30) /*A AMD 3DNow! extensions */ -XEN_CPUFEATURE(3DNOW, 2*32+31) /*A 3DNow! */ + /* AMD-defined CPU features, CPUID level 0x80000001.edx, word 2 */ + XEN_CPUFEATURE(SYSCALL, 2 * 32 + 11) /*A SYSCALL/SYSRET */ + XEN_CPUFEATURE(NX, 2 * 32 + 20) /*A Execute Disable */ + XEN_CPUFEATURE(MMXEXT, 2 * 32 + 22) /*A AMD MMX extensions */ + XEN_CPUFEATURE(FFXSR, 2 * 32 + 25) /*A FFXSR instruction optimizations */ + XEN_CPUFEATURE(PAGE1GB, 2 * 32 + 26) /*H 1Gb large page support */ + XEN_CPUFEATURE(RDTSCP, 2 * 32 + 27) /*A RDTSCP */ + XEN_CPUFEATURE(LM, 2 * 32 + 29) /*A Long Mode (x86-64) */ + XEN_CPUFEATURE(3DNOWEXT, 2 * 32 + 30) /*A AMD 3DNow! extensions */ + XEN_CPUFEATURE(3DNOW, 2 * 32 + 31) /*A 3DNow! */ -/* AMD-defined CPU features, CPUID level 0x80000001.ecx, word 3 */ -XEN_CPUFEATURE(LAHF_LM, 3*32+ 0) /*A LAHF/SAHF in long mode */ -XEN_CPUFEATURE(CMP_LEGACY, 3*32+ 1) /*!A If yes HyperThreading not valid */ -XEN_CPUFEATURE(SVM, 3*32+ 2) /*S Secure virtual machine */ -XEN_CPUFEATURE(EXTAPIC, 3*32+ 3) /* Extended APIC space */ -XEN_CPUFEATURE(CR8_LEGACY, 3*32+ 4) /*S CR8 in 32-bit mode */ -XEN_CPUFEATURE(ABM, 3*32+ 5) /*A Advanced bit manipulation */ -XEN_CPUFEATURE(SSE4A, 3*32+ 6) /*A SSE-4A */ -XEN_CPUFEATURE(MISALIGNSSE, 3*32+ 7) /*A Misaligned SSE mode */ -XEN_CPUFEATURE(3DNOWPREFETCH, 3*32+ 8) /*A 3DNow prefetch instructions */ -XEN_CPUFEATURE(OSVW, 3*32+ 9) /* OS Visible Workaround */ -XEN_CPUFEATURE(IBS, 3*32+10) /* Instruction Based Sampling */ -XEN_CPUFEATURE(XOP, 3*32+11) /*A extended AVX instructions */ -XEN_CPUFEATURE(SKINIT, 3*32+12) /* SKINIT/STGI instructions */ -XEN_CPUFEATURE(WDT, 3*32+13) /* Watchdog timer */ -XEN_CPUFEATURE(LWP, 3*32+15) /* Light Weight Profiling */ -XEN_CPUFEATURE(FMA4, 3*32+16) /*A 4 operands MAC instructions */ -XEN_CPUFEATURE(NODEID_MSR, 3*32+19) /* NodeId MSR */ -XEN_CPUFEATURE(TBM, 3*32+21) /*A trailing bit manipulations */ -XEN_CPUFEATURE(TOPOEXT, 3*32+22) /* topology extensions CPUID leafs */ -XEN_CPUFEATURE(DBEXT, 3*32+26) /*A data breakpoint extension */ -XEN_CPUFEATURE(MONITORX, 3*32+29) /* MONITOR extension (MONITORX/MWAITX) */ + /* AMD-defined CPU features, CPUID level 0x80000001.ecx, word 3 */ + XEN_CPUFEATURE(LAHF_LM, 3 * 32 + 0) /*A LAHF/SAHF in long mode */ + XEN_CPUFEATURE(CMP_LEGACY, + 3 * 32 + 1) /*!A If yes HyperThreading not valid */ + XEN_CPUFEATURE(SVM, 3 * 32 + 2) /*S Secure virtual machine */ + XEN_CPUFEATURE(EXTAPIC, 3 * 32 + 3) /* Extended APIC space */ + XEN_CPUFEATURE(CR8_LEGACY, 3 * 32 + 4) /*S CR8 in 32-bit mode */ + XEN_CPUFEATURE(ABM, 3 * 32 + 5) /*A Advanced bit manipulation */ + XEN_CPUFEATURE(SSE4A, 3 * 32 + 6) /*A SSE-4A */ + XEN_CPUFEATURE(MISALIGNSSE, 3 * 32 + 7) /*A Misaligned SSE mode */ + XEN_CPUFEATURE(3DNOWPREFETCH, + 3 * 32 + 8) /*A 3DNow prefetch instructions */ + XEN_CPUFEATURE(OSVW, 3 * 32 + 9) /* OS Visible Workaround */ + XEN_CPUFEATURE(IBS, 3 * 32 + 10) /* Instruction Based Sampling */ + XEN_CPUFEATURE(XOP, 3 * 32 + 11) /*A extended AVX instructions */ + XEN_CPUFEATURE(SKINIT, 3 * 32 + 12) /* SKINIT/STGI instructions */ + XEN_CPUFEATURE(WDT, 3 * 32 + 13) /* Watchdog timer */ + XEN_CPUFEATURE(LWP, 3 * 32 + 15) /* Light Weight Profiling */ + XEN_CPUFEATURE(FMA4, 3 * 32 + 16) /*A 4 operands MAC instructions */ + XEN_CPUFEATURE(NODEID_MSR, 3 * 32 + 19) /* NodeId MSR */ + XEN_CPUFEATURE(TBM, 3 * 32 + 21) /*A trailing bit manipulations */ + XEN_CPUFEATURE(TOPOEXT, 3 * 32 + 22) /* topology extensions CPUID leafs */ + XEN_CPUFEATURE(DBEXT, 3 * 32 + 26) /*A data breakpoint extension */ + XEN_CPUFEATURE(MONITORX, + 3 * 32 + 29) /* MONITOR extension (MONITORX/MWAITX) */ -/* Intel-defined CPU features, CPUID level 0x0000000D:1.eax, word 4 */ -XEN_CPUFEATURE(XSAVEOPT, 4*32+ 0) /*A XSAVEOPT instruction */ -XEN_CPUFEATURE(XSAVEC, 4*32+ 1) /*A XSAVEC/XRSTORC instructions */ -XEN_CPUFEATURE(XGETBV1, 4*32+ 2) /*A XGETBV with %ecx=1 */ -XEN_CPUFEATURE(XSAVES, 4*32+ 3) /*S XSAVES/XRSTORS instructions */ + /* Intel-defined CPU features, CPUID level 0x0000000D:1.eax, word 4 */ + XEN_CPUFEATURE(XSAVEOPT, 4 * 32 + 0) /*A XSAVEOPT instruction */ + XEN_CPUFEATURE(XSAVEC, 4 * 32 + 1) /*A XSAVEC/XRSTORC instructions */ + XEN_CPUFEATURE(XGETBV1, 4 * 32 + 2) /*A XGETBV with %ecx=1 */ + XEN_CPUFEATURE(XSAVES, 4 * 32 + 3) /*S XSAVES/XRSTORS instructions */ -/* Intel-defined CPU features, CPUID level 0x00000007:0.ebx, word 5 */ -XEN_CPUFEATURE(FSGSBASE, 5*32+ 0) /*A {RD,WR}{FS,GS}BASE instructions */ -XEN_CPUFEATURE(TSC_ADJUST, 5*32+ 1) /*S TSC_ADJUST MSR available */ -XEN_CPUFEATURE(SGX, 5*32+ 2) /* Software Guard extensions */ -XEN_CPUFEATURE(BMI1, 5*32+ 3) /*A 1st bit manipulation extensions */ -XEN_CPUFEATURE(HLE, 5*32+ 4) /*A Hardware Lock Elision */ -XEN_CPUFEATURE(AVX2, 5*32+ 5) /*A AVX2 instructions */ -XEN_CPUFEATURE(FDP_EXCP_ONLY, 5*32+ 6) /*! x87 FDP only updated on exception. */ -XEN_CPUFEATURE(SMEP, 5*32+ 7) /*S Supervisor Mode Execution Protection */ -XEN_CPUFEATURE(BMI2, 5*32+ 8) /*A 2nd bit manipulation extensions */ -XEN_CPUFEATURE(ERMS, 5*32+ 9) /*A Enhanced REP MOVSB/STOSB */ -XEN_CPUFEATURE(INVPCID, 5*32+10) /*H Invalidate Process Context ID */ -XEN_CPUFEATURE(RTM, 5*32+11) /*A Restricted Transactional Memory */ -XEN_CPUFEATURE(PQM, 5*32+12) /* Platform QoS Monitoring */ -XEN_CPUFEATURE(NO_FPU_SEL, 5*32+13) /*! FPU CS/DS stored as zero */ -XEN_CPUFEATURE(MPX, 5*32+14) /*S Memory Protection Extensions */ -XEN_CPUFEATURE(PQE, 5*32+15) /* Platform QoS Enforcement */ -XEN_CPUFEATURE(AVX512F, 5*32+16) /*A AVX-512 Foundation Instructions */ -XEN_CPUFEATURE(AVX512DQ, 5*32+17) /*A AVX-512 Doubleword & Quadword Instrs */ -XEN_CPUFEATURE(RDSEED, 5*32+18) /*A RDSEED instruction */ -XEN_CPUFEATURE(ADX, 5*32+19) /*A ADCX, ADOX instructions */ -XEN_CPUFEATURE(SMAP, 5*32+20) /*S Supervisor Mode Access Prevention */ -XEN_CPUFEATURE(AVX512_IFMA, 5*32+21) /*A AVX-512 Integer Fused Multiply Add */ -XEN_CPUFEATURE(CLFLUSHOPT, 5*32+23) /*A CLFLUSHOPT instruction */ -XEN_CPUFEATURE(CLWB, 5*32+24) /*A CLWB instruction */ -XEN_CPUFEATURE(AVX512PF, 5*32+26) /*A AVX-512 Prefetch Instructions */ -XEN_CPUFEATURE(AVX512ER, 5*32+27) /*A AVX-512 Exponent & Reciprocal Instrs */ -XEN_CPUFEATURE(AVX512CD, 5*32+28) /*A AVX-512 Conflict Detection Instrs */ -XEN_CPUFEATURE(SHA, 5*32+29) /*A SHA1 & SHA256 instructions */ -XEN_CPUFEATURE(AVX512BW, 5*32+30) /*A AVX-512 Byte and Word Instructions */ -XEN_CPUFEATURE(AVX512VL, 5*32+31) /*A AVX-512 Vector Length Extensions */ + /* Intel-defined CPU features, CPUID level 0x00000007:0.ebx, word 5 */ + XEN_CPUFEATURE(FSGSBASE, 5 * 32 + 0) /*A {RD,WR}{FS,GS}BASE instructions */ + XEN_CPUFEATURE(TSC_ADJUST, 5 * 32 + 1) /*S TSC_ADJUST MSR available */ + XEN_CPUFEATURE(SGX, 5 * 32 + 2) /* Software Guard extensions */ + XEN_CPUFEATURE(BMI1, 5 * 32 + 3) /*A 1st bit manipulation extensions */ + XEN_CPUFEATURE(HLE, 5 * 32 + 4) /*A Hardware Lock Elision */ + XEN_CPUFEATURE(AVX2, 5 * 32 + 5) /*A AVX2 instructions */ + XEN_CPUFEATURE(FDP_EXCP_ONLY, + 5 * 32 + 6) /*! x87 FDP only updated on exception. */ + XEN_CPUFEATURE(SMEP, + 5 * 32 + 7) /*S Supervisor Mode Execution Protection */ + XEN_CPUFEATURE(BMI2, 5 * 32 + 8) /*A 2nd bit manipulation extensions */ + XEN_CPUFEATURE(ERMS, 5 * 32 + 9) /*A Enhanced REP MOVSB/STOSB */ + XEN_CPUFEATURE(INVPCID, 5 * 32 + 10) /*H Invalidate Process Context ID */ + XEN_CPUFEATURE(RTM, 5 * 32 + 11) /*A Restricted Transactional Memory */ + XEN_CPUFEATURE(PQM, 5 * 32 + 12) /* Platform QoS Monitoring */ + XEN_CPUFEATURE(NO_FPU_SEL, 5 * 32 + 13) /*! FPU CS/DS stored as zero */ + XEN_CPUFEATURE(MPX, 5 * 32 + 14) /*S Memory Protection Extensions */ + XEN_CPUFEATURE(PQE, 5 * 32 + 15) /* Platform QoS Enforcement */ + XEN_CPUFEATURE(AVX512F, 5 * 32 + 16) /*A AVX-512 Foundation Instructions */ + XEN_CPUFEATURE(AVX512DQ, + 5 * 32 + 17) /*A AVX-512 Doubleword & Quadword Instrs */ + XEN_CPUFEATURE(RDSEED, 5 * 32 + 18) /*A RDSEED instruction */ + XEN_CPUFEATURE(ADX, 5 * 32 + 19) /*A ADCX, ADOX instructions */ + XEN_CPUFEATURE(SMAP, 5 * 32 + 20) /*S Supervisor Mode Access Prevention */ + XEN_CPUFEATURE(AVX512_IFMA, + 5 * 32 + 21) /*A AVX-512 Integer Fused Multiply Add */ + XEN_CPUFEATURE(CLFLUSHOPT, 5 * 32 + 23) /*A CLFLUSHOPT instruction */ + XEN_CPUFEATURE(CLWB, 5 * 32 + 24) /*A CLWB instruction */ + XEN_CPUFEATURE(AVX512PF, 5 * 32 + 26) /*A AVX-512 Prefetch Instructions */ + XEN_CPUFEATURE(AVX512ER, + 5 * 32 + 27) /*A AVX-512 Exponent & Reciprocal Instrs */ + XEN_CPUFEATURE(AVX512CD, + 5 * 32 + 28) /*A AVX-512 Conflict Detection Instrs */ + XEN_CPUFEATURE(SHA, 5 * 32 + 29) /*A SHA1 & SHA256 instructions */ + XEN_CPUFEATURE(AVX512BW, + 5 * 32 + 30) /*A AVX-512 Byte and Word Instructions */ + XEN_CPUFEATURE(AVX512VL, + 5 * 32 + 31) /*A AVX-512 Vector Length Extensions */ -/* Intel-defined CPU features, CPUID level 0x00000007:0.ecx, word 6 */ -XEN_CPUFEATURE(PREFETCHWT1, 6*32+ 0) /*A PREFETCHWT1 instruction */ -XEN_CPUFEATURE(AVX512_VBMI, 6*32+ 1) /*A AVX-512 Vector Byte Manipulation Instrs */ -XEN_CPUFEATURE(UMIP, 6*32+ 2) /*S User Mode Instruction Prevention */ -XEN_CPUFEATURE(PKU, 6*32+ 3) /*H Protection Keys for Userspace */ -XEN_CPUFEATURE(OSPKE, 6*32+ 4) /*! OS Protection Keys Enable */ -XEN_CPUFEATURE(AVX512_VBMI2, 6*32+ 6) /*A Additional AVX-512 Vector Byte Manipulation Instrs */ -XEN_CPUFEATURE(CET_SS, 6*32+ 7) /* CET - Shadow Stacks */ -XEN_CPUFEATURE(GFNI, 6*32+ 8) /*A Galois Field Instrs */ -XEN_CPUFEATURE(VAES, 6*32+ 9) /*A Vector AES Instrs */ -XEN_CPUFEATURE(VPCLMULQDQ, 6*32+10) /*A Vector Carry-less Multiplication Instrs */ -XEN_CPUFEATURE(AVX512_VNNI, 6*32+11) /*A Vector Neural Network Instrs */ -XEN_CPUFEATURE(AVX512_BITALG, 6*32+12) /*A Support for VPOPCNT[B,W] and VPSHUFBITQMB */ -XEN_CPUFEATURE(AVX512_VPOPCNTDQ, 6*32+14) /*A POPCNT for vectors of DW/QW */ -XEN_CPUFEATURE(RDPID, 6*32+22) /*A RDPID instruction */ -XEN_CPUFEATURE(CLDEMOTE, 6*32+25) /*A CLDEMOTE instruction */ + /* Intel-defined CPU features, CPUID level 0x00000007:0.ecx, word 6 */ + XEN_CPUFEATURE(PREFETCHWT1, 6 * 32 + 0) /*A PREFETCHWT1 instruction */ + XEN_CPUFEATURE(AVX512_VBMI, + 6 * 32 + 1) /*A AVX-512 Vector Byte Manipulation Instrs */ + XEN_CPUFEATURE(UMIP, 6 * 32 + 2) /*S User Mode Instruction Prevention */ + XEN_CPUFEATURE(PKU, 6 * 32 + 3) /*H Protection Keys for Userspace */ + XEN_CPUFEATURE(OSPKE, 6 * 32 + 4) /*! OS Protection Keys Enable */ + XEN_CPUFEATURE( + AVX512_VBMI2, + 6 * 32 + 6) /*A Additional AVX-512 Vector Byte Manipulation Instrs */ + XEN_CPUFEATURE(CET_SS, 6 * 32 + 7) /* CET - Shadow Stacks */ + XEN_CPUFEATURE(GFNI, 6 * 32 + 8) /*A Galois Field Instrs */ + XEN_CPUFEATURE(VAES, 6 * 32 + 9) /*A Vector AES Instrs */ + XEN_CPUFEATURE(VPCLMULQDQ, + 6 * 32 + 10) /*A Vector Carry-less Multiplication Instrs */ + XEN_CPUFEATURE(AVX512_VNNI, + 6 * 32 + 11) /*A Vector Neural Network Instrs */ + XEN_CPUFEATURE(AVX512_BITALG, + 6 * 32 + + 12) /*A Support for VPOPCNT[B,W] and VPSHUFBITQMB */ + XEN_CPUFEATURE(AVX512_VPOPCNTDQ, + 6 * 32 + 14) /*A POPCNT for vectors of DW/QW */ + XEN_CPUFEATURE(RDPID, 6 * 32 + 22) /*A RDPID instruction */ + XEN_CPUFEATURE(CLDEMOTE, 6 * 32 + 25) /*A CLDEMOTE instruction */ -/* AMD-defined CPU features, CPUID level 0x80000007.edx, word 7 */ -XEN_CPUFEATURE(ITSC, 7*32+ 8) /* Invariant TSC */ -XEN_CPUFEATURE(EFRO, 7*32+10) /* APERF/MPERF Read Only interface */ + /* AMD-defined CPU features, CPUID level 0x80000007.edx, word 7 */ + XEN_CPUFEATURE(ITSC, 7 * 32 + 8) /* Invariant TSC */ + XEN_CPUFEATURE(EFRO, 7 * 32 + 10) /* APERF/MPERF Read Only interface */ -/* AMD-defined CPU features, CPUID level 0x80000008.ebx, word 8 */ -XEN_CPUFEATURE(CLZERO, 8*32+ 0) /*A CLZERO instruction */ -XEN_CPUFEATURE(RSTR_FP_ERR_PTRS, 8*32+ 2) /*A (F)X{SAVE,RSTOR} always saves/restores FPU Error pointers */ -XEN_CPUFEATURE(WBNOINVD, 8*32+ 9) /* WBNOINVD instruction */ -XEN_CPUFEATURE(IBPB, 8*32+12) /*A IBPB support only (no IBRS, used by AMD) */ + /* AMD-defined CPU features, CPUID level 0x80000008.ebx, word 8 */ + XEN_CPUFEATURE(CLZERO, 8 * 32 + 0) /*A CLZERO instruction */ + XEN_CPUFEATURE( + RSTR_FP_ERR_PTRS, + 8 * 32 + + 2) /*A (F)X{SAVE,RSTOR} always saves/restores FPU Error pointers */ + XEN_CPUFEATURE(WBNOINVD, 8 * 32 + 9) /* WBNOINVD instruction */ + XEN_CPUFEATURE(IBPB, + 8 * 32 + 12) /*A IBPB support only (no IBRS, used by AMD) */ -/* Intel-defined CPU features, CPUID level 0x00000007:0.edx, word 9 */ -XEN_CPUFEATURE(AVX512_4VNNIW, 9*32+ 2) /*A AVX512 Neural Network Instructions */ -XEN_CPUFEATURE(AVX512_4FMAPS, 9*32+ 3) /*A AVX512 Multiply Accumulation Single Precision */ -XEN_CPUFEATURE(MD_CLEAR, 9*32+10) /*A VERW clears microarchitectural buffers */ -XEN_CPUFEATURE(TSX_FORCE_ABORT, 9*32+13) /* MSR_TSX_FORCE_ABORT.RTM_ABORT */ -XEN_CPUFEATURE(CET_IBT, 9*32+20) /* CET - Indirect Branch Tracking */ -XEN_CPUFEATURE(IBRSB, 9*32+26) /*A IBRS and IBPB support (used by Intel) */ -XEN_CPUFEATURE(STIBP, 9*32+27) /*A STIBP */ -XEN_CPUFEATURE(L1D_FLUSH, 9*32+28) /*S MSR_FLUSH_CMD and L1D flush. */ -XEN_CPUFEATURE(ARCH_CAPS, 9*32+29) /* IA32_ARCH_CAPABILITIES MSR */ -XEN_CPUFEATURE(SSBD, 9*32+31) /*A MSR_SPEC_CTRL.SSBD available */ + /* Intel-defined CPU features, CPUID level 0x00000007:0.edx, word 9 */ + XEN_CPUFEATURE(AVX512_4VNNIW, + 9 * 32 + 2) /*A AVX512 Neural Network Instructions */ + XEN_CPUFEATURE(AVX512_4FMAPS, + 9 * 32 + + 3) /*A AVX512 Multiply Accumulation Single Precision */ + XEN_CPUFEATURE(MD_CLEAR, + 9 * 32 + 10) /*A VERW clears microarchitectural buffers */ + XEN_CPUFEATURE(TSX_FORCE_ABORT, + 9 * 32 + 13) /* MSR_TSX_FORCE_ABORT.RTM_ABORT */ + XEN_CPUFEATURE(CET_IBT, 9 * 32 + 20) /* CET - Indirect Branch Tracking */ + XEN_CPUFEATURE(IBRSB, + 9 * 32 + 26) /*A IBRS and IBPB support (used by Intel) */ + XEN_CPUFEATURE(STIBP, 9 * 32 + 27) /*A STIBP */ + XEN_CPUFEATURE(L1D_FLUSH, 9 * 32 + 28) /*S MSR_FLUSH_CMD and L1D flush. */ + XEN_CPUFEATURE(ARCH_CAPS, 9 * 32 + 29) /* IA32_ARCH_CAPABILITIES MSR */ + XEN_CPUFEATURE(SSBD, 9 * 32 + 31) /*A MSR_SPEC_CTRL.SSBD available */ -/* Intel-defined CPU features, CPUID level 0x00000007:1.eax, word 10 */ -XEN_CPUFEATURE(AVX512_BF16, 10*32+ 5) /* AVX512 BFloat16 Instructions */ + /* Intel-defined CPU features, CPUID level 0x00000007:1.eax, word 10 */ + XEN_CPUFEATURE(AVX512_BF16, + 10 * 32 + 5) /* AVX512 BFloat16 Instructions */ #endif /* XEN_CPUFEATURE */ diff --git a/include/xen/arch-x86/cpuid.h b/include/xen/arch-x86/cpuid.h index ce46305be..e3fa3fa4a 100644 --- a/include/xen/arch-x86/cpuid.h +++ b/include/xen/arch-x86/cpuid.h @@ -71,7 +71,7 @@ /* Does the host support MMU_PT_UPDATE_PRESERVE_AD for this guest? */ #define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0 -#define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0) +#define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u << 0) /* * Leaf 4 (0x40000x03) @@ -96,12 +96,15 @@ * Sub-leaf 0: EBX: vcpu id (iff EAX has XEN_HVM_CPUID_VCPU_ID_PRESENT flag) * Sub-leaf 0: ECX: domain id (iff EAX has XEN_HVM_CPUID_DOMID_PRESENT flag) */ -#define XEN_HVM_CPUID_APIC_ACCESS_VIRT (1u << 0) /* Virtualized APIC registers */ -#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1) /* Virtualized x2APIC accesses */ +#define XEN_HVM_CPUID_APIC_ACCESS_VIRT \ + (1u << 0) /* Virtualized APIC registers */ +#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1) /* Virtualized x2APIC accesses */ /* Memory mapped from other domains has valid IOMMU entries */ -#define XEN_HVM_CPUID_IOMMU_MAPPINGS (1u << 2) -#define XEN_HVM_CPUID_VCPU_ID_PRESENT (1u << 3) /* vcpu id is present in EBX */ -#define XEN_HVM_CPUID_DOMID_PRESENT (1u << 4) /* domid is present in ECX */ +#define XEN_HVM_CPUID_IOMMU_MAPPINGS (1u << 2) +#define XEN_HVM_CPUID_VCPU_ID_PRESENT \ + (1u << 3) /* vcpu id is present in EBX \ + */ +#define XEN_HVM_CPUID_DOMID_PRESENT (1u << 4) /* domid is present in ECX */ /* * Leaf 6 (0x40000x05) diff --git a/include/xen/arch-x86/hvm/save.h b/include/xen/arch-x86/hvm/save.h index bb8fa7c12..517123f68 100644 --- a/include/xen/arch-x86/hvm/save.h +++ b/include/xen/arch-x86/hvm/save.h @@ -34,11 +34,11 @@ #define HVM_FILE_VERSION 0x00000001 struct hvm_save_header { - uint32_t magic; /* Must be HVM_FILE_MAGIC */ - uint32_t version; /* File format version */ - uint64_t changeset; /* Version of Xen that saved this file */ - uint32_t cpuid; /* CPUID[0x01][%eax] on the saving machine */ - uint32_t gtsc_khz; /* Guest's TSC frequency in kHz */ + uint32_t magic; /* Must be HVM_FILE_MAGIC */ + uint32_t version; /* File format version */ + uint64_t changeset; /* Version of Xen that saved this file */ + uint32_t cpuid; /* CPUID[0x01][%eax] on the saving machine */ + uint32_t gtsc_khz; /* Guest's TSC frequency in kHz */ }; DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header); @@ -53,7 +53,7 @@ DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header); */ struct hvm_hw_cpu { - uint8_t fpu_regs[512]; + uint8_t fpu_regs[512]; uint64_t rax; uint64_t rbx; @@ -150,24 +150,24 @@ struct hvm_hw_cpu { union { uint32_t pending_event; struct { - uint8_t pending_vector:8; - uint8_t pending_type:3; - uint8_t pending_error_valid:1; - uint32_t pending_reserved:19; - uint8_t pending_valid:1; + uint8_t pending_vector : 8; + uint8_t pending_type : 3; + uint8_t pending_error_valid : 1; + uint32_t pending_reserved : 19; + uint8_t pending_valid : 1; }; }; /* error code for pending event */ uint32_t error_code; -#define _XEN_X86_FPU_INITIALISED 0 -#define XEN_X86_FPU_INITIALISED (1U<<_XEN_X86_FPU_INITIALISED) +#define _XEN_X86_FPU_INITIALISED 0 +#define XEN_X86_FPU_INITIALISED (1U << _XEN_X86_FPU_INITIALISED) uint32_t flags; uint32_t pad0; }; struct hvm_hw_cpu_compat { - uint8_t fpu_regs[512]; + uint8_t fpu_regs[512]; uint64_t rax; uint64_t rbx; @@ -264,26 +264,26 @@ struct hvm_hw_cpu_compat { union { uint32_t pending_event; struct { - uint8_t pending_vector:8; - uint8_t pending_type:3; - uint8_t pending_error_valid:1; - uint32_t pending_reserved:19; - uint8_t pending_valid:1; + uint8_t pending_vector : 8; + uint8_t pending_type : 3; + uint8_t pending_error_valid : 1; + uint32_t pending_reserved : 19; + uint8_t pending_valid : 1; }; }; /* error code for pending event */ uint32_t error_code; }; -static inline int _hvm_hw_fix_cpu(void *h, uint32_t size) { +static inline int _hvm_hw_fix_cpu(void *h, uint32_t size) +{ union hvm_hw_cpu_union { struct hvm_hw_cpu nat; struct hvm_hw_cpu_compat cmp; } *ucpu = (union hvm_hw_cpu_union *)h; - if ( size == sizeof(struct hvm_hw_cpu_compat) ) - { + if (size == sizeof(struct hvm_hw_cpu_compat)) { /* * If we copy from the end backwards, we should * be able to do the modification in-place. @@ -299,7 +299,7 @@ static inline int _hvm_hw_fix_cpu(void *h, uint32_t size) { return 0; } -DECLARE_HVM_SAVE_TYPE_COMPAT(CPU, 2, struct hvm_hw_cpu, \ +DECLARE_HVM_SAVE_TYPE_COMPAT(CPU, 2, struct hvm_hw_cpu, struct hvm_hw_cpu_compat, _hvm_hw_fix_cpu); /* @@ -321,31 +321,31 @@ struct hvm_hw_vpic { * Bit 2: ICW1.IC4 (1 == ICW4 included in init sequence) * Bit 3: ICW1.SNGL (0 == ICW3 included in init sequence) */ - uint8_t init_state:4; + uint8_t init_state : 4; /* IR line with highest priority. */ - uint8_t priority_add:4; + uint8_t priority_add : 4; /* Reads from A=0 obtain ISR or IRR? */ - uint8_t readsel_isr:1; + uint8_t readsel_isr : 1; /* Reads perform a polling read? */ - uint8_t poll:1; + uint8_t poll : 1; /* Automatically clear IRQs from the ISR during INTA? */ - uint8_t auto_eoi:1; + uint8_t auto_eoi : 1; /* Automatically rotate IRQ priorities during AEOI? */ - uint8_t rotate_on_auto_eoi:1; + uint8_t rotate_on_auto_eoi : 1; /* Exclude slave inputs when considering in-service IRQs? */ - uint8_t special_fully_nested_mode:1; + uint8_t special_fully_nested_mode : 1; /* Special mask mode excludes masked IRs from AEOI and priority checks. */ - uint8_t special_mask_mode:1; + uint8_t special_mask_mode : 1; /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */ - uint8_t is_master:1; + uint8_t is_master : 1; /* Edge/trigger selection. */ uint8_t elcr; @@ -361,32 +361,31 @@ DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic); * IO-APIC */ -union vioapic_redir_entry -{ +union vioapic_redir_entry { uint64_t bits; struct { uint8_t vector; - uint8_t delivery_mode:3; - uint8_t dest_mode:1; - uint8_t delivery_status:1; - uint8_t polarity:1; - uint8_t remote_irr:1; - uint8_t trig_mode:1; - uint8_t mask:1; - uint8_t reserve:7; + uint8_t delivery_mode : 3; + uint8_t dest_mode : 1; + uint8_t delivery_status : 1; + uint8_t polarity : 1; + uint8_t remote_irr : 1; + uint8_t trig_mode : 1; + uint8_t mask : 1; + uint8_t reserve : 7; uint8_t reserved[4]; uint8_t dest_id; } fields; }; -#define VIOAPIC_NUM_PINS 48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */ +#define VIOAPIC_NUM_PINS 48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */ -#define XEN_HVM_VIOAPIC(name, cnt) \ - struct name { \ - uint64_t base_address; \ - uint32_t ioregsel; \ - uint32_t id; \ - union vioapic_redir_entry redirtbl[cnt]; \ +#define XEN_HVM_VIOAPIC(name, cnt) \ + struct name { \ + uint64_t base_address; \ + uint32_t ioregsel; \ + uint32_t id; \ + union vioapic_redir_entry redirtbl[cnt]; \ } XEN_HVM_VIOAPIC(hvm_hw_vioapic, VIOAPIC_NUM_PINS); @@ -405,10 +404,10 @@ DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic); */ struct hvm_hw_lapic { - uint64_t apic_base_msr; - uint32_t disabled; /* VLAPIC_xx_DISABLED */ - uint32_t timer_divisor; - uint64_t tdt_msr; + uint64_t apic_base_msr; + uint32_t disabled; /* VLAPIC_xx_DISABLED */ + uint32_t timer_divisor; + uint64_t tdt_msr; }; DECLARE_HVM_SAVE_TYPE(LAPIC, 5, struct hvm_hw_lapic); @@ -430,7 +429,8 @@ struct hvm_hw_pci_irqs { * Indexed by: device*4 + INTx#. */ union { - unsigned long i[16 / sizeof (unsigned long)]; /* DECLARE_BITMAP(i, 32*4); */ + unsigned long + i[16 / sizeof(unsigned long)]; /* DECLARE_BITMAP(i, 32*4); */ uint64_t pad[2]; }; }; @@ -443,7 +443,7 @@ struct hvm_hw_isa_irqs { * Indexed by ISA IRQ (assumes no ISA-device IRQ sharing). */ union { - unsigned long i[1]; /* DECLARE_BITMAP(i, 16); */ + unsigned long i[1]; /* DECLARE_BITMAP(i, 16); */ uint64_t pad[1]; }; }; @@ -481,7 +481,7 @@ struct hvm_hw_pit { uint8_t mode; uint8_t bcd; /* not supported */ uint8_t gate; /* timer start */ - } channels[3]; /* 3 x 16 bytes */ + } channels[3]; /* 3 x 16 bytes */ uint32_t speaker_data_on; uint32_t pad0; }; @@ -509,24 +509,24 @@ DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc); * HPET */ -#define HPET_TIMER_NUM 3 /* 3 timers supported now */ +#define HPET_TIMER_NUM 3 /* 3 timers supported now */ struct hvm_hw_hpet { /* Memory-mapped, software visible registers */ - uint64_t capability; /* capabilities */ - uint64_t res0; /* reserved */ - uint64_t config; /* configuration */ - uint64_t res1; /* reserved */ - uint64_t isr; /* interrupt status reg */ - uint64_t res2[25]; /* reserved */ - uint64_t mc64; /* main counter */ - uint64_t res3; /* reserved */ - struct { /* timers */ - uint64_t config; /* configuration/cap */ - uint64_t cmp; /* comparator */ - uint64_t fsb; /* FSB route, not supported now */ - uint64_t res4; /* reserved */ + uint64_t capability; /* capabilities */ + uint64_t res0; /* reserved */ + uint64_t config; /* configuration */ + uint64_t res1; /* reserved */ + uint64_t isr; /* interrupt status reg */ + uint64_t res2[25]; /* reserved */ + uint64_t mc64; /* main counter */ + uint64_t res3; /* reserved */ + struct { /* timers */ + uint64_t config; /* configuration/cap */ + uint64_t cmp; /* comparator */ + uint64_t fsb; /* FSB route, not supported now */ + uint64_t res4; /* reserved */ } timers[HPET_TIMER_NUM]; - uint64_t res5[4*(24-HPET_TIMER_NUM)]; /* reserved, up to 0x3ff */ + uint64_t res5[4 * (24 - HPET_TIMER_NUM)]; /* reserved, up to 0x3ff */ /* Hidden register state */ uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */ @@ -540,9 +540,9 @@ DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet); */ struct hvm_hw_pmtimer { - uint32_t tmr_val; /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */ - uint16_t pm1a_sts; /* PM1a_EVT_BLK.PM1a_STS: status register */ - uint16_t pm1a_en; /* PM1a_EVT_BLK.PM1a_EN: enable register */ + uint32_t tmr_val; /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */ + uint16_t pm1a_sts; /* PM1a_EVT_BLK.PM1a_STS: status register */ + uint16_t pm1a_en; /* PM1a_EVT_BLK.PM1a_EN: enable register */ }; DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer); @@ -552,11 +552,11 @@ DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer); */ struct hvm_hw_mtrr { -#define MTRR_VCNT 8 +#define MTRR_VCNT 8 #define NUM_FIXED_MSR 11 uint64_t msr_pat_cr; /* mtrr physbase & physmask msr pair*/ - uint64_t msr_mtrr_var[MTRR_VCNT*2]; + uint64_t msr_mtrr_var[MTRR_VCNT * 2]; uint64_t msr_mtrr_fixed[NUM_FIXED_MSR]; uint64_t msr_mtrr_cap; uint64_t msr_mtrr_def_type; @@ -569,21 +569,23 @@ DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr); */ struct hvm_hw_cpu_xsave { - uint64_t xfeature_mask; /* Ignored */ - uint64_t xcr0; /* Updated by XSETBV */ - uint64_t xcr0_accum; /* Updated by XSETBV */ + uint64_t xfeature_mask; /* Ignored */ + uint64_t xcr0; /* Updated by XSETBV */ + uint64_t xcr0_accum; /* Updated by XSETBV */ struct { - struct { char x[512]; } fpu_sse; + struct { + char x[512]; + } fpu_sse; struct hvm_hw_cpu_xsave_hdr { - uint64_t xstate_bv; /* Updated by XRSTOR */ - uint64_t xcomp_bv; /* Updated by XRSTOR{C,S} */ + uint64_t xstate_bv; /* Updated by XRSTOR */ + uint64_t xcomp_bv; /* Updated by XRSTOR{C,S} */ uint64_t reserved[6]; - } xsave_hdr; /* The 64-byte header */ + } xsave_hdr; /* The 64-byte header */ } save_area; }; -#define CPU_XSAVE_CODE 16 +#define CPU_XSAVE_CODE 16 /* * Viridian hypervisor context. @@ -600,8 +602,8 @@ DECLARE_HVM_SAVE_TYPE(VIRIDIAN_DOMAIN, 15, struct hvm_viridian_domain_context); struct hvm_viridian_vcpu_context { uint64_t vp_assist_msr; - uint8_t apic_assist_pending; - uint8_t _pad[7]; + uint8_t apic_assist_pending; + uint8_t _pad[7]; uint64_t simp_msr; uint64_t sint_msr[16]; uint64_t stimer_config_msr[4]; @@ -635,7 +637,7 @@ struct hvm_msr { } msr[XEN_FLEX_ARRAY_DIM]; }; -#define CPU_MSR_CODE 20 +#define CPU_MSR_CODE 20 /* * Largest type-code in use diff --git a/include/xen/arch-x86/hvm/start_info.h b/include/xen/arch-x86/hvm/start_info.h index 50af9ea2f..de128ed8d 100644 --- a/include/xen/arch-x86/hvm/start_info.h +++ b/include/xen/arch-x86/hvm/start_info.h @@ -108,13 +108,13 @@ * Address Map Interfaces" section of the ACPI Specification. Please refer to * section 15 in version 6.2 of the ACPI spec: http://uefi.org/specifications */ -#define XEN_HVM_MEMMAP_TYPE_RAM 1 -#define XEN_HVM_MEMMAP_TYPE_RESERVED 2 -#define XEN_HVM_MEMMAP_TYPE_ACPI 3 -#define XEN_HVM_MEMMAP_TYPE_NVS 4 -#define XEN_HVM_MEMMAP_TYPE_UNUSABLE 5 -#define XEN_HVM_MEMMAP_TYPE_DISABLED 6 -#define XEN_HVM_MEMMAP_TYPE_PMEM 7 +#define XEN_HVM_MEMMAP_TYPE_RAM 1 +#define XEN_HVM_MEMMAP_TYPE_RESERVED 2 +#define XEN_HVM_MEMMAP_TYPE_ACPI 3 +#define XEN_HVM_MEMMAP_TYPE_NVS 4 +#define XEN_HVM_MEMMAP_TYPE_UNUSABLE 5 +#define XEN_HVM_MEMMAP_TYPE_DISABLED 6 +#define XEN_HVM_MEMMAP_TYPE_PMEM 7 /* * C representation of the x86/HVM start info layout. @@ -123,37 +123,37 @@ * represent the layout described there using C types. */ struct hvm_start_info { - uint32_t magic; /* Contains the magic value 0x336ec578 */ - /* ("xEn3" with the 0x80 bit of the "E" set).*/ - uint32_t version; /* Version of this structure. */ - uint32_t flags; /* SIF_xxx flags. */ - uint32_t nr_modules; /* Number of modules passed to the kernel. */ - uint64_t modlist_paddr; /* Physical address of an array of */ - /* hvm_modlist_entry. */ - uint64_t cmdline_paddr; /* Physical address of the command line. */ - uint64_t rsdp_paddr; /* Physical address of the RSDP ACPI data */ - /* structure. */ + uint32_t magic; /* Contains the magic value 0x336ec578 */ + /* ("xEn3" with the 0x80 bit of the "E" set).*/ + uint32_t version; /* Version of this structure. */ + uint32_t flags; /* SIF_xxx flags. */ + uint32_t nr_modules; /* Number of modules passed to the kernel. */ + uint64_t modlist_paddr; /* Physical address of an array of */ + /* hvm_modlist_entry. */ + uint64_t cmdline_paddr; /* Physical address of the command line. */ + uint64_t rsdp_paddr; /* Physical address of the RSDP ACPI data */ + /* structure. */ /* All following fields only present in version 1 and newer */ - uint64_t memmap_paddr; /* Physical address of an array of */ - /* hvm_memmap_table_entry. */ - uint32_t memmap_entries; /* Number of entries in the memmap table. */ - /* Value will be zero if there is no memory */ - /* map being provided. */ - uint32_t reserved; /* Must be zero. */ + uint64_t memmap_paddr; /* Physical address of an array of */ + /* hvm_memmap_table_entry. */ + uint32_t memmap_entries; /* Number of entries in the memmap table. */ + /* Value will be zero if there is no memory */ + /* map being provided. */ + uint32_t reserved; /* Must be zero. */ }; struct hvm_modlist_entry { - uint64_t paddr; /* Physical address of the module. */ - uint64_t size; /* Size of the module in bytes. */ - uint64_t cmdline_paddr; /* Physical address of the command line. */ + uint64_t paddr; /* Physical address of the module. */ + uint64_t size; /* Size of the module in bytes. */ + uint64_t cmdline_paddr; /* Physical address of the command line. */ uint64_t reserved; }; struct hvm_memmap_table_entry { - uint64_t addr; /* Base address of the memory region */ - uint64_t size; /* Size of the memory region in bytes */ - uint32_t type; /* Mapping type */ - uint32_t reserved; /* Must be zero for Version 1. */ + uint64_t addr; /* Base address of the memory region */ + uint64_t size; /* Size of the memory region in bytes */ + uint32_t type; /* Mapping type */ + uint32_t reserved; /* Must be zero for Version 1. */ }; #endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */ diff --git a/include/xen/arch-x86/pmu.h b/include/xen/arch-x86/pmu.h index c421cb7a4..f923e9fee 100644 --- a/include/xen/arch-x86/pmu.h +++ b/include/xen/arch-x86/pmu.h @@ -49,11 +49,11 @@ typedef struct xen_pmu_cntr_pair xen_pmu_cntr_pair_t; DEFINE_XEN_GUEST_HANDLE(xen_pmu_cntr_pair_t); struct xen_pmu_intel_ctxt { - /* - * Offsets to fixed and architectural counter MSRs (relative to - * xen_pmu_arch.c.intel). - * For PV(H) guests these fields are RO. - */ + /* + * Offsets to fixed and architectural counter MSRs (relative to + * xen_pmu_arch.c.intel). + * For PV(H) guests these fields are RO. + */ uint32_t fixed_counters; uint32_t arch_counters; @@ -86,10 +86,10 @@ typedef struct xen_pmu_regs xen_pmu_regs_t; DEFINE_XEN_GUEST_HANDLE(xen_pmu_regs_t); /* PMU flags */ -#define PMU_CACHED (1<<0) /* PMU MSRs are cached in the context */ -#define PMU_SAMPLE_USER (1<<1) /* Sample is from user or kernel mode */ -#define PMU_SAMPLE_REAL (1<<2) /* Sample is from realmode */ -#define PMU_SAMPLE_PV (1<<3) /* Sample from a PV guest */ +#define PMU_CACHED (1 << 0) /* PMU MSRs are cached in the context */ +#define PMU_SAMPLE_USER (1 << 1) /* Sample is from user or kernel mode */ +#define PMU_SAMPLE_REAL (1 << 2) /* Sample is from realmode */ +#define PMU_SAMPLE_PV (1 << 3) /* Sample from a PV guest */ /* * Architecture-specific information describing state of the processor at @@ -107,7 +107,7 @@ struct xen_pmu_arch { */ struct xen_pmu_regs regs; /* Padding for adding new registers to xen_pmu_regs in the future */ -#define XENPMU_REGS_PAD_SZ 64 +#define XENPMU_REGS_PAD_SZ 64 uint8_t pad[XENPMU_REGS_PAD_SZ]; } r; @@ -139,7 +139,7 @@ struct xen_pmu_arch { * Padding for contexts (fixed parts only, does not include MSR banks * that are specified by offsets) */ -#define XENPMU_CTXT_PAD_SZ 128 +#define XENPMU_CTXT_PAD_SZ 128 uint8_t pad[XENPMU_CTXT_PAD_SZ]; } c; }; @@ -156,4 +156,3 @@ DEFINE_XEN_GUEST_HANDLE(xen_pmu_arch_t); * indent-tabs-mode: nil * End: */ - diff --git a/include/xen/arch-x86/xen-mca.h b/include/xen/arch-x86/xen-mca.h index dc3526724..575b33c12 100644 --- a/include/xen/arch-x86/xen-mca.h +++ b/include/xen/arch-x86/xen-mca.h @@ -65,22 +65,22 @@ #define XEN_MCA_INTERFACE_VERSION 0x01ecc003 /* IN: Dom0 calls hypercall to retrieve nonurgent telemetry */ -#define XEN_MC_NONURGENT 0x0001 +#define XEN_MC_NONURGENT 0x0001 /* IN: Dom0/DomU calls hypercall to retrieve urgent telemetry */ -#define XEN_MC_URGENT 0x0002 +#define XEN_MC_URGENT 0x0002 /* IN: Dom0 acknowledges previosly-fetched telemetry */ -#define XEN_MC_ACK 0x0004 +#define XEN_MC_ACK 0x0004 /* OUT: All is ok */ -#define XEN_MC_OK 0x0 +#define XEN_MC_OK 0x0 /* OUT: Domain could not fetch data. */ -#define XEN_MC_FETCHFAILED 0x1 +#define XEN_MC_FETCHFAILED 0x1 /* OUT: There was no machine check data to fetch. */ -#define XEN_MC_NODATA 0x2 +#define XEN_MC_NODATA 0x2 /* OUT: Between notification time and this hypercall an other * (most likely) correctable error happened. The fetched data, * does not match the original machine check data. */ -#define XEN_MC_NOMATCH 0x4 +#define XEN_MC_NOMATCH 0x4 /* OUT: DomU did not register MC NMI handler. Try something else. */ #define XEN_MC_CANNOTHANDLE 0x8 @@ -103,24 +103,24 @@ * Dom0 only: Correctable errors are reported via VIRQ_MCA * Dom0 and DomU: Uncorrectable errors are reported via nmi handlers */ -#define MC_TYPE_GLOBAL 0 -#define MC_TYPE_BANK 1 -#define MC_TYPE_EXTENDED 2 -#define MC_TYPE_RECOVERY 3 +#define MC_TYPE_GLOBAL 0 +#define MC_TYPE_BANK 1 +#define MC_TYPE_EXTENDED 2 +#define MC_TYPE_RECOVERY 3 struct mcinfo_common { - uint16_t type; /* structure type */ - uint16_t size; /* size of this struct in bytes */ + uint16_t type; /* structure type */ + uint16_t size; /* size of this struct in bytes */ }; -#define MC_FLAG_CORRECTABLE (1 << 0) -#define MC_FLAG_UNCORRECTABLE (1 << 1) -#define MC_FLAG_RECOVERABLE (1 << 2) -#define MC_FLAG_POLLED (1 << 3) -#define MC_FLAG_RESET (1 << 4) -#define MC_FLAG_CMCI (1 << 5) -#define MC_FLAG_MCE (1 << 6) +#define MC_FLAG_CORRECTABLE (1 << 0) +#define MC_FLAG_UNCORRECTABLE (1 << 1) +#define MC_FLAG_RECOVERABLE (1 << 2) +#define MC_FLAG_POLLED (1 << 3) +#define MC_FLAG_RESET (1 << 4) +#define MC_FLAG_CMCI (1 << 5) +#define MC_FLAG_MCE (1 << 6) /* contains global x86 mc information */ struct mcinfo_global { struct mcinfo_common common; @@ -144,8 +144,8 @@ struct mcinfo_bank { uint16_t mc_domid; /* Usecase 5: domain referenced by mc_addr on dom0 * and if mc_addr is valid. Never valid on DomU. */ uint64_t mc_status; /* bank status */ - uint64_t mc_addr; /* bank address, only valid - * if addr bit is set in mc_status */ + uint64_t mc_addr; /* bank address, only valid + * if addr bit is set in mc_status */ uint64_t mc_misc; uint64_t mc_ctrl2; uint64_t mc_tsc; @@ -153,7 +153,7 @@ struct mcinfo_bank { struct mcinfo_msr { - uint64_t reg; /* MSR */ + uint64_t reg; /* MSR */ uint64_t value; /* MSR value */ }; @@ -201,16 +201,14 @@ struct mcinfo_extended { * recovery action result to DOM0. DOM0 will save the information in * non-volatile memory for further proactive actions, such as offlining the * easy broken page earlier when doing next reboot. -*/ -struct page_offline_action -{ + */ +struct page_offline_action { /* Params for passing the offlined page number to DOM0 */ uint64_t mfn; uint64_t status; }; -struct cpu_offline_action -{ +struct cpu_offline_action { /* Params for passing the identity of the offlined CPU to DOM0 */ uint32_t mc_socketid; uint16_t mc_coreid; @@ -218,8 +216,7 @@ struct cpu_offline_action }; #define MAX_UNION_SIZE 16 -struct mcinfo_recovery -{ +struct mcinfo_recovery { struct mcinfo_common common; uint16_t mc_bank; /* bank nr */ uint8_t action_flags; @@ -232,8 +229,8 @@ struct mcinfo_recovery }; -#define MCINFO_HYPERCALLSIZE 1024 -#define MCINFO_MAXSIZE 768 +#define MCINFO_HYPERCALLSIZE 1024 +#define MCINFO_MAXSIZE 768 #define MCINFO_FLAGS_UNCOMPLETE 0x1 struct mc_info { @@ -246,15 +243,15 @@ typedef struct mc_info mc_info_t; DEFINE_XEN_GUEST_HANDLE(mc_info_t); #define __MC_MSR_ARRAYSIZE 8 -#define __MC_NMSRS 1 -#define MC_NCAPS 7 /* 7 CPU feature flag words */ -#define MC_CAPS_STD_EDX 0 /* cpuid level 0x00000001 (%edx) */ -#define MC_CAPS_AMD_EDX 1 /* cpuid level 0x80000001 (%edx) */ -#define MC_CAPS_TM 2 /* cpuid level 0x80860001 (TransMeta) */ -#define MC_CAPS_LINUX 3 /* Linux-defined */ -#define MC_CAPS_STD_ECX 4 /* cpuid level 0x00000001 (%ecx) */ -#define MC_CAPS_VIA 5 /* cpuid level 0xc0000001 */ -#define MC_CAPS_AMD_ECX 6 /* cpuid level 0x80000001 (%ecx) */ +#define __MC_NMSRS 1 +#define MC_NCAPS 7 /* 7 CPU feature flag words */ +#define MC_CAPS_STD_EDX 0 /* cpuid level 0x00000001 (%edx) */ +#define MC_CAPS_AMD_EDX 1 /* cpuid level 0x80000001 (%edx) */ +#define MC_CAPS_TM 2 /* cpuid level 0x80860001 (TransMeta) */ +#define MC_CAPS_LINUX 3 /* Linux-defined */ +#define MC_CAPS_STD_ECX 4 /* cpuid level 0x00000001 (%ecx) */ +#define MC_CAPS_VIA 5 /* cpuid level 0xc0000001 */ +#define MC_CAPS_AMD_ECX 6 /* cpuid level 0x80000001 (%ecx) */ struct mcinfo_logical_cpu { uint32_t mc_cpunr; @@ -292,39 +289,38 @@ DEFINE_XEN_GUEST_HANDLE(xen_mc_logical_cpu_t); /* Prototype: * uint32_t x86_mcinfo_nentries(struct mc_info *mi); */ -#define x86_mcinfo_nentries(_mi) \ - (_mi)->mi_nentries +#define x86_mcinfo_nentries(_mi) (_mi)->mi_nentries /* Prototype: * struct mcinfo_common *x86_mcinfo_first(struct mc_info *mi); */ -#define x86_mcinfo_first(_mi) \ - ((struct mcinfo_common *)(_mi)->mi_data) +#define x86_mcinfo_first(_mi) ((struct mcinfo_common *)(_mi)->mi_data) /* Prototype: * struct mcinfo_common *x86_mcinfo_next(struct mcinfo_common *mic); */ -#define x86_mcinfo_next(_mic) \ +#define x86_mcinfo_next(_mic) \ ((struct mcinfo_common *)((uint8_t *)(_mic) + (_mic)->size)) /* Prototype: * void x86_mcinfo_lookup(void *ret, struct mc_info *mi, uint16_t type); */ -#define x86_mcinfo_lookup(_ret, _mi, _type) \ - do { \ - uint32_t found, i; \ - struct mcinfo_common *_mic; \ - \ - found = 0; \ - (_ret) = NULL; \ - if (_mi == NULL) break; \ - _mic = x86_mcinfo_first(_mi); \ - for (i = 0; i < x86_mcinfo_nentries(_mi); i++) { \ - if (_mic->type == (_type)) { \ - found = 1; \ - break; \ - } \ - _mic = x86_mcinfo_next(_mic); \ - } \ - (_ret) = found ? _mic : NULL; \ +#define x86_mcinfo_lookup(_ret, _mi, _type) \ + do { \ + uint32_t found, i; \ + struct mcinfo_common *_mic; \ + \ + found = 0; \ + (_ret) = NULL; \ + if (_mi == NULL) \ + break; \ + _mic = x86_mcinfo_first(_mi); \ + for (i = 0; i < x86_mcinfo_nentries(_mi); i++) { \ + if (_mic->type == (_type)) { \ + found = 1; \ + break; \ + } \ + _mic = x86_mcinfo_next(_mic); \ + } \ + (_ret) = found ? _mic : NULL; \ } while (0) @@ -342,15 +338,15 @@ DEFINE_XEN_GUEST_HANDLE(xen_mc_logical_cpu_t); * Fetch machine check data from hypervisor. * Note, this hypercall is special, because both Dom0 and DomU must use this. */ -#define XEN_MC_fetch 1 +#define XEN_MC_fetch 1 struct xen_mc_fetch { /* IN/OUT variables. */ - uint32_t flags; /* IN: XEN_MC_NONURGENT, XEN_MC_URGENT, - XEN_MC_ACK if ack'ing an earlier fetch */ - /* OUT: XEN_MC_OK, XEN_MC_FETCHFAILED, - XEN_MC_NODATA, XEN_MC_NOMATCH */ + uint32_t flags; /* IN: XEN_MC_NONURGENT, XEN_MC_URGENT, + XEN_MC_ACK if ack'ing an earlier fetch */ + /* OUT: XEN_MC_OK, XEN_MC_FETCHFAILED, + XEN_MC_NODATA, XEN_MC_NOMATCH */ uint32_t _pad0; - uint64_t fetch_id; /* OUT: id for ack, IN: id we are ack'ing */ + uint64_t fetch_id; /* OUT: id for ack, IN: id we are ack'ing */ /* OUT variables. */ XEN_GUEST_HANDLE(mc_info_t) data; @@ -362,18 +358,19 @@ DEFINE_XEN_GUEST_HANDLE(xen_mc_fetch_t); /* Usecase 4 * This tells the hypervisor to notify a DomU about the machine check error */ -#define XEN_MC_notifydomain 2 +#define XEN_MC_notifydomain 2 struct xen_mc_notifydomain { /* IN variables. */ - uint16_t mc_domid; /* The unprivileged domain to notify. */ - uint16_t mc_vcpuid; /* The vcpu in mc_domid to notify. - * Usually echo'd value from the fetch hypercall. */ + uint16_t mc_domid; /* The unprivileged domain to notify. */ + uint16_t mc_vcpuid; /* The vcpu in mc_domid to notify. + * Usually echo'd value from the fetch hypercall. */ /* IN/OUT variables. */ uint32_t flags; -/* IN: XEN_MC_CORRECTABLE, XEN_MC_TRAP */ -/* OUT: XEN_MC_OK, XEN_MC_CANNOTHANDLE, XEN_MC_NOTDELIVERED, XEN_MC_NOMATCH */ + /* IN: XEN_MC_CORRECTABLE, XEN_MC_TRAP */ + /* OUT: XEN_MC_OK, XEN_MC_CANNOTHANDLE, XEN_MC_NOTDELIVERED, XEN_MC_NOMATCH + */ }; typedef struct xen_mc_notifydomain xen_mc_notifydomain_t; DEFINE_XEN_GUEST_HANDLE(xen_mc_notifydomain_t); @@ -387,34 +384,34 @@ struct xen_mc_physcpuinfo { XEN_GUEST_HANDLE(xen_mc_logical_cpu_t) info; }; -#define XEN_MC_msrinject 4 -#define MC_MSRINJ_MAXMSRS 8 +#define XEN_MC_msrinject 4 +#define MC_MSRINJ_MAXMSRS 8 struct xen_mc_msrinject { /* IN */ - uint32_t mcinj_cpunr; /* target processor id */ - uint32_t mcinj_flags; /* see MC_MSRINJ_F_* below */ - uint32_t mcinj_count; /* 0 .. count-1 in array are valid */ - domid_t mcinj_domid; /* valid only if MC_MSRINJ_F_GPADDR is - present in mcinj_flags */ + uint32_t mcinj_cpunr; /* target processor id */ + uint32_t mcinj_flags; /* see MC_MSRINJ_F_* below */ + uint32_t mcinj_count; /* 0 .. count-1 in array are valid */ + domid_t mcinj_domid; /* valid only if MC_MSRINJ_F_GPADDR is + present in mcinj_flags */ uint16_t _pad0; struct mcinfo_msr mcinj_msr[MC_MSRINJ_MAXMSRS]; }; /* Flags for mcinj_flags above; bits 16-31 are reserved */ -#define MC_MSRINJ_F_INTERPOSE 0x1 -#define MC_MSRINJ_F_GPADDR 0x2 +#define MC_MSRINJ_F_INTERPOSE 0x1 +#define MC_MSRINJ_F_GPADDR 0x2 -#define XEN_MC_mceinject 5 +#define XEN_MC_mceinject 5 struct xen_mc_mceinject { - unsigned int mceinj_cpunr; /* target processor id */ + unsigned int mceinj_cpunr; /* target processor id */ }; #if defined(__XEN__) || defined(__XEN_TOOLS__) #define XEN_MC_inject_v2 6 -#define XEN_MC_INJECT_TYPE_MASK 0x7 -#define XEN_MC_INJECT_TYPE_MCE 0x0 -#define XEN_MC_INJECT_TYPE_CMCI 0x1 -#define XEN_MC_INJECT_TYPE_LMCE 0x2 +#define XEN_MC_INJECT_TYPE_MASK 0x7 +#define XEN_MC_INJECT_TYPE_MCE 0x0 +#define XEN_MC_INJECT_TYPE_CMCI 0x1 +#define XEN_MC_INJECT_TYPE_LMCE 0x2 #define XEN_MC_INJECT_CPU_BROADCAST 0x8 @@ -428,13 +425,13 @@ struct xen_mc { uint32_t cmd; uint32_t interface_version; /* XEN_MCA_INTERFACE_VERSION */ union { - struct xen_mc_fetch mc_fetch; + struct xen_mc_fetch mc_fetch; struct xen_mc_notifydomain mc_notifydomain; - struct xen_mc_physcpuinfo mc_physcpuinfo; - struct xen_mc_msrinject mc_msrinject; - struct xen_mc_mceinject mc_mceinject; + struct xen_mc_physcpuinfo mc_physcpuinfo; + struct xen_mc_msrinject mc_msrinject; + struct xen_mc_mceinject mc_mceinject; #if defined(__XEN__) || defined(__XEN_TOOLS__) - struct xen_mc_inject_v2 mc_inject_v2; + struct xen_mc_inject_v2 mc_inject_v2; #endif } u; }; diff --git a/include/xen/arch-x86/xen-x86_32.h b/include/xen/arch-x86/xen-x86_32.h index 19d738863..fd9320248 100644 --- a/include/xen/arch-x86/xen-x86_32.h +++ b/include/xen/arch-x86/xen-x86_32.h @@ -41,37 +41,35 @@ * are also present in the initial GDT, many OSes will be able to avoid * installing their own GDT. */ -#define FLAT_RING1_CS 0xe019 /* GDT index 259 */ -#define FLAT_RING1_DS 0xe021 /* GDT index 260 */ -#define FLAT_RING1_SS 0xe021 /* GDT index 260 */ -#define FLAT_RING3_CS 0xe02b /* GDT index 261 */ -#define FLAT_RING3_DS 0xe033 /* GDT index 262 */ -#define FLAT_RING3_SS 0xe033 /* GDT index 262 */ +#define FLAT_RING1_CS 0xe019 /* GDT index 259 */ +#define FLAT_RING1_DS 0xe021 /* GDT index 260 */ +#define FLAT_RING1_SS 0xe021 /* GDT index 260 */ +#define FLAT_RING3_CS 0xe02b /* GDT index 261 */ +#define FLAT_RING3_DS 0xe033 /* GDT index 262 */ +#define FLAT_RING3_SS 0xe033 /* GDT index 262 */ #define FLAT_KERNEL_CS FLAT_RING1_CS #define FLAT_KERNEL_DS FLAT_RING1_DS #define FLAT_KERNEL_SS FLAT_RING1_SS -#define FLAT_USER_CS FLAT_RING3_CS -#define FLAT_USER_DS FLAT_RING3_DS -#define FLAT_USER_SS FLAT_RING3_SS +#define FLAT_USER_CS FLAT_RING3_CS +#define FLAT_USER_DS FLAT_RING3_DS +#define FLAT_USER_SS FLAT_RING3_SS -#define __HYPERVISOR_VIRT_START_PAE 0xF5800000 -#define __MACH2PHYS_VIRT_START_PAE 0xF5800000 -#define __MACH2PHYS_VIRT_END_PAE 0xF6800000 -#define HYPERVISOR_VIRT_START_PAE xen_mk_ulong(__HYPERVISOR_VIRT_START_PAE) -#define MACH2PHYS_VIRT_START_PAE xen_mk_ulong(__MACH2PHYS_VIRT_START_PAE) -#define MACH2PHYS_VIRT_END_PAE xen_mk_ulong(__MACH2PHYS_VIRT_END_PAE) +#define __HYPERVISOR_VIRT_START_PAE 0xF5800000 +#define __MACH2PHYS_VIRT_START_PAE 0xF5800000 +#define __MACH2PHYS_VIRT_END_PAE 0xF6800000 +#define HYPERVISOR_VIRT_START_PAE xen_mk_ulong(__HYPERVISOR_VIRT_START_PAE) +#define MACH2PHYS_VIRT_START_PAE xen_mk_ulong(__MACH2PHYS_VIRT_START_PAE) +#define MACH2PHYS_VIRT_END_PAE xen_mk_ulong(__MACH2PHYS_VIRT_END_PAE) /* Non-PAE bounds are obsolete. */ #define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000 #define __MACH2PHYS_VIRT_START_NONPAE 0xFC000000 #define __MACH2PHYS_VIRT_END_NONPAE 0xFC400000 -#define HYPERVISOR_VIRT_START_NONPAE \ +#define HYPERVISOR_VIRT_START_NONPAE \ xen_mk_ulong(__HYPERVISOR_VIRT_START_NONPAE) -#define MACH2PHYS_VIRT_START_NONPAE \ - xen_mk_ulong(__MACH2PHYS_VIRT_START_NONPAE) -#define MACH2PHYS_VIRT_END_NONPAE \ - xen_mk_ulong(__MACH2PHYS_VIRT_END_NONPAE) +#define MACH2PHYS_VIRT_START_NONPAE xen_mk_ulong(__MACH2PHYS_VIRT_START_NONPAE) +#define MACH2PHYS_VIRT_END_NONPAE xen_mk_ulong(__MACH2PHYS_VIRT_END_NONPAE) #define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE #define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE @@ -81,9 +79,9 @@ #define HYPERVISOR_VIRT_START xen_mk_ulong(__HYPERVISOR_VIRT_START) #endif -#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) -#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) -#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2) +#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) +#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) +#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END - MACH2PHYS_VIRT_START) >> 2) #ifndef machine_to_phys_mapping #define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START) #endif @@ -91,20 +89,27 @@ /* 32-/64-bit invariability for control interfaces (domctl/sysctl). */ #if defined(__XEN__) || defined(__XEN_TOOLS__) #undef ___DEFINE_XEN_GUEST_HANDLE -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef struct { type *p; } \ - __guest_handle_ ## name; \ - typedef struct { union { type *p; uint64_aligned_t q; }; } \ - __guest_handle_64_ ## name +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef struct { \ + type *p; \ + } __guest_handle_##name; \ + typedef struct { \ + union { \ + type *p; \ + uint64_aligned_t q; \ + }; \ + } __guest_handle_64_##name #undef set_xen_guest_handle_raw -#define set_xen_guest_handle_raw(hnd, val) \ - do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0; \ - (hnd).p = val; \ - } while ( 0 ) -#define int64_aligned_t int64_t __attribute__((aligned(8))) -#define uint64_aligned_t uint64_t __attribute__((aligned(8))) -#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name -#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name) +#define set_xen_guest_handle_raw(hnd, val) \ + do { \ + if (sizeof(hnd) == 8) \ + *(uint64_t *)&(hnd) = 0; \ + (hnd).p = val; \ + } while (0) +#define int64_aligned_t int64_t __attribute__((aligned(8))) +#define uint64_aligned_t uint64_t __attribute__((aligned(8))) +#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_##name +#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name) #endif #ifndef __ASSEMBLY__ @@ -113,22 +118,24 @@ /* nothing */ #elif defined(__XEN__) || defined(__XEN_TOOLS__) /* Anonymous unions include all permissible names (e.g., al/ah/ax/eax). */ -#define __DECL_REG_LO8(which) union { \ - uint32_t e ## which ## x; \ - uint16_t which ## x; \ - struct { \ - uint8_t which ## l; \ - uint8_t which ## h; \ - }; \ -} -#define __DECL_REG_LO16(name) union { \ - uint32_t e ## name, _e ## name; \ - uint16_t name; \ -} +#define __DECL_REG_LO8(which) \ + union { \ + uint32_t e##which##x; \ + uint16_t which##x; \ + struct { \ + uint8_t which##l; \ + uint8_t which##h; \ + }; \ + } +#define __DECL_REG_LO16(name) \ + union { \ + uint32_t e##name, _e##name; \ + uint16_t name; \ + } #else /* Other sources must always use the proper 32-bit name (e.g., eax). */ -#define __DECL_REG_LO8(which) uint32_t e ## which ## x -#define __DECL_REG_LO16(name) uint32_t e ## name +#define __DECL_REG_LO8(which) uint32_t e##which##x +#define __DECL_REG_LO16(name) uint32_t e##name #endif struct cpu_user_regs { @@ -139,12 +146,12 @@ struct cpu_user_regs { __DECL_REG_LO16(di); __DECL_REG_LO16(bp); __DECL_REG_LO8(a); - uint16_t error_code; /* private */ - uint16_t entry_vector; /* private */ + uint16_t error_code; /* private */ + uint16_t entry_vector; /* private */ __DECL_REG_LO16(ip); uint16_t cs; - uint8_t saved_upcall_mask; - uint8_t _pad0; + uint8_t saved_upcall_mask; + uint8_t _pad0; __DECL_REG_LO16(flags); /* eflags.IF == !saved_upcall_mask */ __DECL_REG_LO16(sp); uint16_t ss, _pad1; diff --git a/include/xen/arch-x86/xen-x86_64.h b/include/xen/arch-x86/xen-x86_64.h index 342eabc95..74a9a2a00 100644 --- a/include/xen/arch-x86/xen-x86_64.h +++ b/include/xen/arch-x86/xen-x86_64.h @@ -43,12 +43,12 @@ * installing their own GDT. */ -#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */ -#define FLAT_RING3_CS64 0xe033 /* GDT index 262 */ -#define FLAT_RING3_DS32 0xe02b /* GDT index 261 */ -#define FLAT_RING3_DS64 0x0000 /* NULL selector */ -#define FLAT_RING3_SS32 0xe02b /* GDT index 261 */ -#define FLAT_RING3_SS64 0xe02b /* GDT index 261 */ +#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */ +#define FLAT_RING3_CS64 0xe033 /* GDT index 262 */ +#define FLAT_RING3_DS32 0xe02b /* GDT index 261 */ +#define FLAT_RING3_DS64 0x0000 /* NULL selector */ +#define FLAT_RING3_SS32 0xe02b /* GDT index 261 */ +#define FLAT_RING3_SS64 0xe02b /* GDT index 261 */ #define FLAT_KERNEL_DS64 FLAT_RING3_DS64 #define FLAT_KERNEL_DS32 FLAT_RING3_DS32 @@ -80,9 +80,9 @@ #define HYPERVISOR_VIRT_END xen_mk_ulong(__HYPERVISOR_VIRT_END) #endif -#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) -#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) -#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3) +#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) +#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) +#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END - MACH2PHYS_VIRT_START) >> 3) #ifndef machine_to_phys_mapping #define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) #endif @@ -119,7 +119,7 @@ */ /* Guest exited in SYSCALL context? Return to guest with SYSRET? */ #define _VGCF_in_syscall 8 -#define VGCF_in_syscall (1<<_VGCF_in_syscall) +#define VGCF_in_syscall (1 << _VGCF_in_syscall) #define VGCF_IN_SYSCALL VGCF_in_syscall #ifndef __ASSEMBLY__ @@ -132,48 +132,53 @@ struct iret_context { #if defined(__XEN__) || defined(__XEN_TOOLS__) /* Anonymous unions include all permissible names (e.g., al/ah/ax/eax/rax). */ -#define __DECL_REG_LOHI(which) union { \ - uint64_t r ## which ## x; \ - uint32_t e ## which ## x; \ - uint16_t which ## x; \ - struct { \ - uint8_t which ## l; \ - uint8_t which ## h; \ - }; \ -} -#define __DECL_REG_LO8(name) union { \ - uint64_t r ## name; \ - uint32_t e ## name; \ - uint16_t name; \ - uint8_t name ## l; \ -} -#define __DECL_REG_LO16(name) union { \ - uint64_t r ## name; \ - uint32_t e ## name; \ - uint16_t name; \ -} -#define __DECL_REG_HI(num) union { \ - uint64_t r ## num; \ - uint32_t r ## num ## d; \ - uint16_t r ## num ## w; \ - uint8_t r ## num ## b; \ -} +#define __DECL_REG_LOHI(which) \ + union { \ + uint64_t r##which##x; \ + uint32_t e##which##x; \ + uint16_t which##x; \ + struct { \ + uint8_t which##l; \ + uint8_t which##h; \ + }; \ + } +#define __DECL_REG_LO8(name) \ + union { \ + uint64_t r##name; \ + uint32_t e##name; \ + uint16_t name; \ + uint8_t name##l; \ + } +#define __DECL_REG_LO16(name) \ + union { \ + uint64_t r##name; \ + uint32_t e##name; \ + uint16_t name; \ + } +#define __DECL_REG_HI(num) \ + union { \ + uint64_t r##num; \ + uint32_t r##num##d; \ + uint16_t r##num##w; \ + uint8_t r##num##b; \ + } #elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */ -#define __DECL_REG(name) union { \ - uint64_t r ## name, e ## name; \ - uint32_t _e ## name; \ -} +#define __DECL_REG(name) \ + union { \ + uint64_t r##name, e##name; \ + uint32_t _e##name; \ + } #else /* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */ -#define __DECL_REG(name) uint64_t r ## name +#define __DECL_REG(name) uint64_t r##name #endif #ifndef __DECL_REG_LOHI -#define __DECL_REG_LOHI(name) __DECL_REG(name ## x) +#define __DECL_REG_LOHI(name) __DECL_REG(name##x) #define __DECL_REG_LO8 __DECL_REG #define __DECL_REG_LO16 __DECL_REG -#define __DECL_REG_HI(num) uint64_t r ## num +#define __DECL_REG_HI(num) uint64_t r##num #endif struct cpu_user_regs { @@ -192,12 +197,12 @@ struct cpu_user_regs { __DECL_REG_LOHI(d); __DECL_REG_LO8(si); __DECL_REG_LO8(di); - uint32_t error_code; /* private */ - uint32_t entry_vector; /* private */ + uint32_t error_code; /* private */ + uint32_t entry_vector; /* private */ __DECL_REG_LO16(ip); uint16_t cs, _pad0[1]; - uint8_t saved_upcall_mask; - uint8_t _pad1[3]; + uint8_t saved_upcall_mask; + uint8_t _pad1[3]; __DECL_REG_LO16(flags); /* rflags.IF == !saved_upcall_mask */ __DECL_REG_LO8(sp); uint16_t ss, _pad2[3]; diff --git a/include/xen/arch-x86/xen.h b/include/xen/arch-x86/xen.h index 629cb2ba4..65f68ba12 100644 --- a/include/xen/arch-x86/xen.h +++ b/include/xen/arch-x86/xen.h @@ -31,11 +31,13 @@ /* Structural guest handles introduced in 0x00030201. */ #if __XEN_INTERFACE_VERSION__ >= 0x00030201 -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef struct { type *p; } __guest_handle_ ## name +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef struct { \ + type *p; \ + } __guest_handle_##name #else -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef type * __guest_handle_ ## name +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef type *__guest_handle_##name #endif /* @@ -46,35 +48,39 @@ * XEN_GUEST_HANDLE_PARAM and XEN_GUEST_HANDLE are the same on X86 but * they might not be on other architectures. */ -#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ - ___DEFINE_XEN_GUEST_HANDLE(name, type); \ +#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ + ___DEFINE_XEN_GUEST_HANDLE(name, type); \ ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) -#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) -#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name -#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) -#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) -#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0) +#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name) +#define __XEN_GUEST_HANDLE(name) __guest_handle_##name +#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) +#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) +#define set_xen_guest_handle_raw(hnd, val) \ + do { \ + (hnd).p = val; \ + } while (0) #define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) #if defined(__i386__) -# ifdef __XEN__ -__DeFiNe__ __DECL_REG_LO8(which) uint32_t e ## which ## x -__DeFiNe__ __DECL_REG_LO16(name) union { uint32_t e ## name; } -# endif +#ifdef __XEN__ +__DeFiNe__ __DECL_REG_LO8(which) +uint32_t e##which##x __DeFiNe__ __DECL_REG_LO16(name) union { + uint32_t e##name; +} +#endif #include "xen-x86_32.h" -# ifdef __XEN__ -__UnDeF__ __DECL_REG_LO8 -__UnDeF__ __DECL_REG_LO16 -__DeFiNe__ __DECL_REG_LO8(which) e ## which ## x -__DeFiNe__ __DECL_REG_LO16(name) e ## name -# endif +#ifdef __XEN__ +__UnDeF__ + __DECL_REG_LO8 __UnDeF__ __DECL_REG_LO16 __DeFiNe__ __DECL_REG_LO8(which) e + ##which##x __DeFiNe__ __DECL_REG_LO16(name) e##name +#endif #elif defined(__x86_64__) #include "xen-x86_64.h" #endif #ifndef __ASSEMBLY__ -typedef unsigned long xen_pfn_t; -#define PRI_xen_pfn "lx" + typedef unsigned long xen_pfn_t; +#define PRI_xen_pfn "lx" #define PRIu_xen_pfn "lu" #endif @@ -144,14 +150,14 @@ typedef unsigned long xen_ulong_t; * Level == 2: Kernel may enter * Level == 3: Everyone may enter */ -#define TI_GET_DPL(_ti) ((_ti)->flags & 3) -#define TI_GET_IF(_ti) ((_ti)->flags & 4) -#define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl)) -#define TI_SET_IF(_ti,_if) ((_ti)->flags |= ((!!(_if))<<2)) +#define TI_GET_DPL(_ti) ((_ti)->flags & 3) +#define TI_GET_IF(_ti) ((_ti)->flags & 4) +#define TI_SET_DPL(_ti, _dpl) ((_ti)->flags |= (_dpl)) +#define TI_SET_IF(_ti, _if) ((_ti)->flags |= ((!!(_if)) << 2)) struct trap_info { - uint8_t vector; /* exception vector */ - uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */ - uint16_t cs; /* code selector */ + uint8_t vector; /* exception vector */ + uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */ + uint16_t cs; /* code selector */ unsigned long address; /* code offset */ }; typedef struct trap_info trap_info_t; @@ -172,32 +178,34 @@ typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */ */ struct vcpu_guest_context { /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */ - struct { char x[512]; } fpu_ctxt; /* User-level FPU registers */ -#define VGCF_I387_VALID (1<<0) -#define VGCF_IN_KERNEL (1<<2) + struct { + char x[512]; + } fpu_ctxt; /* User-level FPU registers */ +#define VGCF_I387_VALID (1 << 0) +#define VGCF_IN_KERNEL (1 << 2) #define _VGCF_i387_valid 0 -#define VGCF_i387_valid (1<<_VGCF_i387_valid) +#define VGCF_i387_valid (1 << _VGCF_i387_valid) #define _VGCF_in_kernel 2 -#define VGCF_in_kernel (1<<_VGCF_in_kernel) +#define VGCF_in_kernel (1 << _VGCF_in_kernel) #define _VGCF_failsafe_disables_events 3 -#define VGCF_failsafe_disables_events (1<<_VGCF_failsafe_disables_events) +#define VGCF_failsafe_disables_events (1 << _VGCF_failsafe_disables_events) #define _VGCF_syscall_disables_events 4 -#define VGCF_syscall_disables_events (1<<_VGCF_syscall_disables_events) +#define VGCF_syscall_disables_events (1 << _VGCF_syscall_disables_events) #define _VGCF_online 5 -#define VGCF_online (1<<_VGCF_online) - unsigned long flags; /* VGCF_* flags */ - struct cpu_user_regs user_regs; /* User-level CPU registers */ - struct trap_info trap_ctxt[256]; /* Virtual IDT */ - unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ +#define VGCF_online (1 << _VGCF_online) + unsigned long flags; /* VGCF_* flags */ + struct cpu_user_regs user_regs; /* User-level CPU registers */ + struct trap_info trap_ctxt[256]; /* Virtual IDT */ + unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ - unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ + unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ - unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ - unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */ + unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ + unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */ #ifdef __i386__ - unsigned long event_callback_cs; /* CS:EIP of event callback */ + unsigned long event_callback_cs; /* CS:EIP of event callback */ unsigned long event_callback_eip; - unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ + unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ unsigned long failsafe_callback_eip; #else unsigned long event_callback_eip; @@ -206,7 +214,7 @@ struct vcpu_guest_context { union { unsigned long syscall_callback_eip; struct { - unsigned int event_callback_cs; /* compat CS of event cb */ + unsigned int event_callback_cs; /* compat CS of event cb */ unsigned int failsafe_callback_cs; /* compat CS of failsafe cb */ }; }; @@ -214,12 +222,12 @@ struct vcpu_guest_context { unsigned long syscall_callback_eip; #endif #endif - unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ + unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ #ifdef __x86_64__ /* Segment base addresses. */ - uint64_t fs_base; - uint64_t gs_base_kernel; - uint64_t gs_base_user; + uint64_t fs_base; + uint64_t gs_base_kernel; + uint64_t gs_base_user; #endif }; typedef struct vcpu_guest_context vcpu_guest_context_t; @@ -238,7 +246,7 @@ struct arch_shared_info { * p2m tree. In this case the linear mapper p2m list anchored at p2m_vaddr * is to be used. */ - xen_pfn_t pfn_to_mfn_frame_list_list; + xen_pfn_t pfn_to_mfn_frame_list_list; unsigned long nmi_reason; /* * Following three fields are valid if p2m_cr3 contains a value different @@ -258,9 +266,9 @@ struct arch_shared_info { * Modifying a p2m element in the linear p2m list is allowed via an atomic * write only. */ - unsigned long p2m_cr3; /* cr3 value of the p2m address space */ - unsigned long p2m_vaddr; /* virtual address of the p2m list */ - unsigned long p2m_generation; /* generation count of p2m mapping */ + unsigned long p2m_cr3; /* cr3 value of the p2m address space */ + unsigned long p2m_vaddr; /* virtual address of the p2m list */ + unsigned long p2m_generation; /* generation count of p2m mapping */ #ifdef __i386__ /* There's no room for this field in the generic structure. */ uint32_t wc_sec_hi; @@ -274,44 +282,43 @@ typedef struct arch_shared_info arch_shared_info_t; * XEN_DOMCTL_INTERFACE_VERSION. */ struct xen_arch_domainconfig { -#define _XEN_X86_EMU_LAPIC 0 -#define XEN_X86_EMU_LAPIC (1U<<_XEN_X86_EMU_LAPIC) -#define _XEN_X86_EMU_HPET 1 -#define XEN_X86_EMU_HPET (1U<<_XEN_X86_EMU_HPET) -#define _XEN_X86_EMU_PM 2 -#define XEN_X86_EMU_PM (1U<<_XEN_X86_EMU_PM) -#define _XEN_X86_EMU_RTC 3 -#define XEN_X86_EMU_RTC (1U<<_XEN_X86_EMU_RTC) -#define _XEN_X86_EMU_IOAPIC 4 -#define XEN_X86_EMU_IOAPIC (1U<<_XEN_X86_EMU_IOAPIC) -#define _XEN_X86_EMU_PIC 5 -#define XEN_X86_EMU_PIC (1U<<_XEN_X86_EMU_PIC) -#define _XEN_X86_EMU_VGA 6 -#define XEN_X86_EMU_VGA (1U<<_XEN_X86_EMU_VGA) -#define _XEN_X86_EMU_IOMMU 7 -#define XEN_X86_EMU_IOMMU (1U<<_XEN_X86_EMU_IOMMU) -#define _XEN_X86_EMU_PIT 8 -#define XEN_X86_EMU_PIT (1U<<_XEN_X86_EMU_PIT) -#define _XEN_X86_EMU_USE_PIRQ 9 -#define XEN_X86_EMU_USE_PIRQ (1U<<_XEN_X86_EMU_USE_PIRQ) -#define _XEN_X86_EMU_VPCI 10 -#define XEN_X86_EMU_VPCI (1U<<_XEN_X86_EMU_VPCI) - -#define XEN_X86_EMU_ALL (XEN_X86_EMU_LAPIC | XEN_X86_EMU_HPET | \ - XEN_X86_EMU_PM | XEN_X86_EMU_RTC | \ - XEN_X86_EMU_IOAPIC | XEN_X86_EMU_PIC | \ - XEN_X86_EMU_VGA | XEN_X86_EMU_IOMMU | \ - XEN_X86_EMU_PIT | XEN_X86_EMU_USE_PIRQ |\ - XEN_X86_EMU_VPCI) +#define _XEN_X86_EMU_LAPIC 0 +#define XEN_X86_EMU_LAPIC (1U << _XEN_X86_EMU_LAPIC) +#define _XEN_X86_EMU_HPET 1 +#define XEN_X86_EMU_HPET (1U << _XEN_X86_EMU_HPET) +#define _XEN_X86_EMU_PM 2 +#define XEN_X86_EMU_PM (1U << _XEN_X86_EMU_PM) +#define _XEN_X86_EMU_RTC 3 +#define XEN_X86_EMU_RTC (1U << _XEN_X86_EMU_RTC) +#define _XEN_X86_EMU_IOAPIC 4 +#define XEN_X86_EMU_IOAPIC (1U << _XEN_X86_EMU_IOAPIC) +#define _XEN_X86_EMU_PIC 5 +#define XEN_X86_EMU_PIC (1U << _XEN_X86_EMU_PIC) +#define _XEN_X86_EMU_VGA 6 +#define XEN_X86_EMU_VGA (1U << _XEN_X86_EMU_VGA) +#define _XEN_X86_EMU_IOMMU 7 +#define XEN_X86_EMU_IOMMU (1U << _XEN_X86_EMU_IOMMU) +#define _XEN_X86_EMU_PIT 8 +#define XEN_X86_EMU_PIT (1U << _XEN_X86_EMU_PIT) +#define _XEN_X86_EMU_USE_PIRQ 9 +#define XEN_X86_EMU_USE_PIRQ (1U << _XEN_X86_EMU_USE_PIRQ) +#define _XEN_X86_EMU_VPCI 10 +#define XEN_X86_EMU_VPCI (1U << _XEN_X86_EMU_VPCI) + +#define XEN_X86_EMU_ALL \ + (XEN_X86_EMU_LAPIC | XEN_X86_EMU_HPET | XEN_X86_EMU_PM | XEN_X86_EMU_RTC | \ + XEN_X86_EMU_IOAPIC | XEN_X86_EMU_PIC | XEN_X86_EMU_VGA | \ + XEN_X86_EMU_IOMMU | XEN_X86_EMU_PIT | XEN_X86_EMU_USE_PIRQ | \ + XEN_X86_EMU_VPCI) uint32_t emulation_flags; }; /* Location of online VCPU bitmap. */ -#define XEN_ACPI_CPU_MAP 0xaf00 -#define XEN_ACPI_CPU_MAP_LEN ((HVM_MAX_VCPUS + 7) / 8) +#define XEN_ACPI_CPU_MAP 0xaf00 +#define XEN_ACPI_CPU_MAP_LEN ((HVM_MAX_VCPUS + 7) / 8) /* GPE0 bit set during CPU hotplug */ -#define XEN_ACPI_GPE0_CPUHP_BIT 2 +#define XEN_ACPI_GPE0_CPUHP_BIT 2 #endif /* @@ -357,7 +364,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_msr_entry_t); * Currently only CPUID. */ #ifdef __ASSEMBLY__ -#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ; +#define XEN_EMULATE_PREFIX .byte 0x0f, 0x0b, 0x78, 0x65, 0x6e; #define XEN_CPUID XEN_EMULATE_PREFIX cpuid #else #define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; " diff --git a/include/xen/argo.h b/include/xen/argo.h index 6b645f34e..325d7fc6f 100644 --- a/include/xen/argo.h +++ b/include/xen/argo.h @@ -31,10 +31,10 @@ #include "xen.h" -#define XEN_ARGO_DOMID_ANY DOMID_INVALID +#define XEN_ARGO_DOMID_ANY DOMID_INVALID /* The maximum size of an Argo ring is defined to be: 16MB (0x1000000 bytes). */ -#define XEN_ARGO_MAX_RING_SIZE (0x1000000ULL) +#define XEN_ARGO_MAX_RING_SIZE (0x1000000ULL) /* Fixed-width type for "argo port" number. Nothing to do with evtchns. */ typedef uint32_t xen_argo_port_t; @@ -48,31 +48,27 @@ typedef uint64_t xen_argo_gfn_t; * an array of xen_argo_iov_t structs on the hypervisor stack, so could cause * stack overflow if the value is too large. * The Linux Argo driver never passes more than two iovs. -*/ -#define XEN_ARGO_MAXIOV 8U + */ +#define XEN_ARGO_MAXIOV 8U -typedef struct xen_argo_iov -{ +typedef struct xen_argo_iov { XEN_GUEST_HANDLE(uint8) iov_hnd; uint32_t iov_len; uint32_t pad; } xen_argo_iov_t; -typedef struct xen_argo_addr -{ +typedef struct xen_argo_addr { xen_argo_port_t aport; domid_t domain_id; uint16_t pad; } xen_argo_addr_t; -typedef struct xen_argo_send_addr -{ +typedef struct xen_argo_send_addr { struct xen_argo_addr src; struct xen_argo_addr dst; } xen_argo_send_addr_t; -typedef struct xen_argo_ring -{ +typedef struct xen_argo_ring { /* Guests should use atomic operations to access rx_ptr */ uint32_t rx_ptr; /* Guests should use atomic operations to access tx_ptr */ @@ -85,16 +81,14 @@ typedef struct xen_argo_ring uint8_t ring[XEN_FLEX_ARRAY_DIM]; } xen_argo_ring_t; -typedef struct xen_argo_register_ring -{ +typedef struct xen_argo_register_ring { xen_argo_port_t aport; domid_t partner_id; uint16_t pad; uint32_t len; } xen_argo_register_ring_t; -typedef struct xen_argo_unregister_ring -{ +typedef struct xen_argo_unregister_ring { xen_argo_port_t aport; domid_t partner_id; uint16_t pad; @@ -107,20 +101,19 @@ typedef struct xen_argo_unregister_ring * Notify flags */ /* Ring exists */ -#define XEN_ARGO_RING_EXISTS (1U << 0) +#define XEN_ARGO_RING_EXISTS (1U << 0) /* Ring is shared, not unicast */ -#define XEN_ARGO_RING_SHARED (1U << 1) +#define XEN_ARGO_RING_SHARED (1U << 1) /* Ring is empty */ -#define XEN_ARGO_RING_EMPTY (1U << 2) +#define XEN_ARGO_RING_EMPTY (1U << 2) /* Sufficient space to queue space_required bytes might exist */ -#define XEN_ARGO_RING_SUFFICIENT (1U << 3) +#define XEN_ARGO_RING_SUFFICIENT (1U << 3) /* Insufficient ring size for space_required bytes */ -#define XEN_ARGO_RING_EMSGSIZE (1U << 4) +#define XEN_ARGO_RING_EMSGSIZE (1U << 4) /* Too many domains waiting for available space signals for this ring */ -#define XEN_ARGO_RING_EBUSY (1U << 5) +#define XEN_ARGO_RING_EBUSY (1U << 5) -typedef struct xen_argo_ring_data_ent -{ +typedef struct xen_argo_ring_data_ent { struct xen_argo_addr ring; uint16_t flags; uint16_t pad; @@ -128,15 +121,13 @@ typedef struct xen_argo_ring_data_ent uint32_t max_message_size; } xen_argo_ring_data_ent_t; -typedef struct xen_argo_ring_data -{ +typedef struct xen_argo_ring_data { uint32_t nent; uint32_t pad; struct xen_argo_ring_data_ent data[XEN_FLEX_ARRAY_DIM]; } xen_argo_ring_data_t; -struct xen_argo_ring_message_header -{ +struct xen_argo_ring_message_header { uint32_t len; struct xen_argo_addr source; uint32_t message_type; @@ -167,7 +158,7 @@ struct xen_argo_ring_message_header * arg3: unsigned long npages * arg4: unsigned long flags (32-bit value) */ -#define XEN_ARGO_OP_register_ring 1 +#define XEN_ARGO_OP_register_ring 1 /* Register op flags */ /* @@ -176,7 +167,7 @@ struct xen_argo_ring_message_header * If clear, reregistration occurs if the ring exists, with the new ring * taking the place of the old, preserving tx_ptr if it remains valid. */ -#define XEN_ARGO_REGISTER_FLAG_FAIL_EXIST 0x1 +#define XEN_ARGO_REGISTER_FLAG_FAIL_EXIST 0x1 #ifdef __XEN__ /* Mask for all defined flags. */ @@ -193,7 +184,7 @@ struct xen_argo_ring_message_header * arg3: 0 (ZERO) * arg4: 0 (ZERO) */ -#define XEN_ARGO_OP_unregister_ring 2 +#define XEN_ARGO_OP_unregister_ring 2 /* * XEN_ARGO_OP_sendv @@ -219,7 +210,7 @@ struct xen_argo_ring_message_header * arg3: unsigned long niov * arg4: unsigned long message type (32-bit value) */ -#define XEN_ARGO_OP_sendv 3 +#define XEN_ARGO_OP_sendv 3 /* * XEN_ARGO_OP_notify @@ -250,6 +241,6 @@ struct xen_argo_ring_message_header * arg3: 0 (ZERO) * arg4: 0 (ZERO) */ -#define XEN_ARGO_OP_notify 4 +#define XEN_ARGO_OP_notify 4 #endif diff --git a/include/xen/callback.h b/include/xen/callback.h index 8f937880e..d29f36135 100644 --- a/include/xen/callback.h +++ b/include/xen/callback.h @@ -37,22 +37,22 @@ */ /* x86: Callback for event delivery. */ -#define CALLBACKTYPE_event 0 +#define CALLBACKTYPE_event 0 /* x86: Failsafe callback when guest state cannot be restored by Xen. */ -#define CALLBACKTYPE_failsafe 1 +#define CALLBACKTYPE_failsafe 1 /* x86/64 hypervisor: Syscall by 64-bit guest app ('64-on-64-on-64'). */ -#define CALLBACKTYPE_syscall 2 +#define CALLBACKTYPE_syscall 2 /* * x86/32 hypervisor: Only available on x86/32 when supervisor_mode_kernel * feature is enabled. Do not use this callback type in new code. */ -#define CALLBACKTYPE_sysenter_deprecated 3 +#define CALLBACKTYPE_sysenter_deprecated 3 /* x86: Callback for NMI delivery. */ -#define CALLBACKTYPE_nmi 4 +#define CALLBACKTYPE_nmi 4 /* * x86: sysenter is only available as follows: @@ -62,25 +62,25 @@ * [nb. also 64-bit guest applications on Intel CPUs * ('64-on-64-on-64'), but syscall is preferred] */ -#define CALLBACKTYPE_sysenter 5 +#define CALLBACKTYPE_sysenter 5 /* * x86/64 hypervisor: Syscall by 32-bit guest app on AMD CPUs * ('32-on-32-on-64', '32-on-64-on-64') */ -#define CALLBACKTYPE_syscall32 7 +#define CALLBACKTYPE_syscall32 7 /* * Disable event deliver during callback? This flag is ignored for event and * NMI callbacks: event delivery is unconditionally disabled. */ -#define _CALLBACKF_mask_events 0 -#define CALLBACKF_mask_events (1U << _CALLBACKF_mask_events) +#define _CALLBACKF_mask_events 0 +#define CALLBACKF_mask_events (1U << _CALLBACKF_mask_events) /* * Register a callback. */ -#define CALLBACKOP_register 0 +#define CALLBACKOP_register 0 struct callback_register { uint16_t type; uint16_t flags; @@ -95,7 +95,7 @@ DEFINE_XEN_GUEST_HANDLE(callback_register_t); * Not all callbacks can be unregistered. -EINVAL will be returned if * you attempt to unregister such a callback. */ -#define CALLBACKOP_unregister 1 +#define CALLBACKOP_unregister 1 struct callback_unregister { uint16_t type; uint16_t _unused; diff --git a/include/xen/device_tree_defs.h b/include/xen/device_tree_defs.h index 209d43de3..3a9f4526a 100644 --- a/include/xen/device_tree_defs.h +++ b/include/xen/device_tree_defs.h @@ -9,7 +9,7 @@ #define GUEST_PHANDLE_GIC (65000) #define GUEST_ROOT_ADDRESS_CELLS 2 -#define GUEST_ROOT_SIZE_CELLS 2 +#define GUEST_ROOT_SIZE_CELLS 2 /** * IRQ line type. @@ -24,18 +24,17 @@ * DT_IRQ_TYPE_SENSE_MASK - Mask for all the above bits * DT_IRQ_TYPE_INVALID - Use to initialize the type */ -#define DT_IRQ_TYPE_NONE 0x00000000 -#define DT_IRQ_TYPE_EDGE_RISING 0x00000001 -#define DT_IRQ_TYPE_EDGE_FALLING 0x00000002 -#define DT_IRQ_TYPE_EDGE_BOTH \ +#define DT_IRQ_TYPE_NONE 0x00000000 +#define DT_IRQ_TYPE_EDGE_RISING 0x00000001 +#define DT_IRQ_TYPE_EDGE_FALLING 0x00000002 +#define DT_IRQ_TYPE_EDGE_BOTH \ (DT_IRQ_TYPE_EDGE_FALLING | DT_IRQ_TYPE_EDGE_RISING) -#define DT_IRQ_TYPE_LEVEL_HIGH 0x00000004 -#define DT_IRQ_TYPE_LEVEL_LOW 0x00000008 -#define DT_IRQ_TYPE_LEVEL_MASK \ - (DT_IRQ_TYPE_LEVEL_LOW | DT_IRQ_TYPE_LEVEL_HIGH) -#define DT_IRQ_TYPE_SENSE_MASK 0x0000000f +#define DT_IRQ_TYPE_LEVEL_HIGH 0x00000004 +#define DT_IRQ_TYPE_LEVEL_LOW 0x00000008 +#define DT_IRQ_TYPE_LEVEL_MASK (DT_IRQ_TYPE_LEVEL_LOW | DT_IRQ_TYPE_LEVEL_HIGH) +#define DT_IRQ_TYPE_SENSE_MASK 0x0000000f -#define DT_IRQ_TYPE_INVALID 0x00000010 +#define DT_IRQ_TYPE_INVALID 0x00000010 #endif diff --git a/include/xen/dom0_ops.h b/include/xen/dom0_ops.h index 76598dda1..2eaa76a4b 100644 --- a/include/xen/dom0_ops.h +++ b/include/xen/dom0_ops.h @@ -37,25 +37,25 @@ #define DOM0_INTERFACE_VERSION XENPF_INTERFACE_VERSION -#define DOM0_SETTIME XENPF_settime -#define dom0_settime xenpf_settime -#define dom0_settime_t xenpf_settime_t +#define DOM0_SETTIME XENPF_settime +#define dom0_settime xenpf_settime +#define dom0_settime_t xenpf_settime_t -#define DOM0_ADD_MEMTYPE XENPF_add_memtype -#define dom0_add_memtype xenpf_add_memtype -#define dom0_add_memtype_t xenpf_add_memtype_t +#define DOM0_ADD_MEMTYPE XENPF_add_memtype +#define dom0_add_memtype xenpf_add_memtype +#define dom0_add_memtype_t xenpf_add_memtype_t -#define DOM0_DEL_MEMTYPE XENPF_del_memtype -#define dom0_del_memtype xenpf_del_memtype -#define dom0_del_memtype_t xenpf_del_memtype_t +#define DOM0_DEL_MEMTYPE XENPF_del_memtype +#define dom0_del_memtype xenpf_del_memtype +#define dom0_del_memtype_t xenpf_del_memtype_t -#define DOM0_READ_MEMTYPE XENPF_read_memtype -#define dom0_read_memtype xenpf_read_memtype -#define dom0_read_memtype_t xenpf_read_memtype_t +#define DOM0_READ_MEMTYPE XENPF_read_memtype +#define dom0_read_memtype xenpf_read_memtype +#define dom0_read_memtype_t xenpf_read_memtype_t -#define DOM0_MICROCODE XENPF_microcode_update -#define dom0_microcode xenpf_microcode_update -#define dom0_microcode_t xenpf_microcode_update_t +#define DOM0_MICROCODE XENPF_microcode_update +#define dom0_microcode xenpf_microcode_update +#define dom0_microcode_t xenpf_microcode_update_t #define DOM0_PLATFORM_QUIRK XENPF_platform_quirk #define dom0_platform_quirk xenpf_platform_quirk @@ -64,7 +64,7 @@ typedef uint64_t cpumap_t; /* Unsupported legacy operation -- defined for API compatibility. */ -#define DOM0_MSR 15 +#define DOM0_MSR 15 struct dom0_msr { /* IN variables. */ uint32_t write; @@ -84,7 +84,7 @@ DEFINE_XEN_GUEST_HANDLE(dom0_msr_t); struct dom0_memory_map_entry { uint64_t start, end; uint32_t flags; /* reserved */ - uint8_t is_ram; + uint8_t is_ram; }; typedef struct dom0_memory_map_entry dom0_memory_map_entry_t; DEFINE_XEN_GUEST_HANDLE(dom0_memory_map_entry_t); @@ -93,15 +93,15 @@ struct dom0_op { uint32_t cmd; uint32_t interface_version; /* DOM0_INTERFACE_VERSION */ union { - struct dom0_msr msr; - struct dom0_settime settime; - struct dom0_add_memtype add_memtype; - struct dom0_del_memtype del_memtype; - struct dom0_read_memtype read_memtype; - struct dom0_microcode microcode; - struct dom0_platform_quirk platform_quirk; - struct dom0_memory_map_entry physical_memory_map; - uint8_t pad[128]; + struct dom0_msr msr; + struct dom0_settime settime; + struct dom0_add_memtype add_memtype; + struct dom0_del_memtype del_memtype; + struct dom0_read_memtype read_memtype; + struct dom0_microcode microcode; + struct dom0_platform_quirk platform_quirk; + struct dom0_memory_map_entry physical_memory_map; + uint8_t pad[128]; } u; }; typedef struct dom0_op dom0_op_t; diff --git a/include/xen/domctl.h b/include/xen/domctl.h index e313da499..2fc1dfc42 100644 --- a/include/xen/domctl.h +++ b/include/xen/domctl.h @@ -49,32 +49,32 @@ struct xen_domctl_createdomain { /* IN parameters */ uint32_t ssidref; xen_domain_handle_t handle; - /* Is this an HVM guest (as opposed to a PV guest)? */ -#define _XEN_DOMCTL_CDF_hvm 0 -#define XEN_DOMCTL_CDF_hvm (1U<<_XEN_DOMCTL_CDF_hvm) - /* Use hardware-assisted paging if available? */ -#define _XEN_DOMCTL_CDF_hap 1 -#define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap) - /* Should domain memory integrity be verifed by tboot during Sx? */ -#define _XEN_DOMCTL_CDF_s3_integrity 2 -#define XEN_DOMCTL_CDF_s3_integrity (1U<<_XEN_DOMCTL_CDF_s3_integrity) - /* Disable out-of-sync shadow page tables? */ -#define _XEN_DOMCTL_CDF_oos_off 3 -#define XEN_DOMCTL_CDF_oos_off (1U<<_XEN_DOMCTL_CDF_oos_off) - /* Is this a xenstore domain? */ -#define _XEN_DOMCTL_CDF_xs_domain 4 -#define XEN_DOMCTL_CDF_xs_domain (1U<<_XEN_DOMCTL_CDF_xs_domain) - /* Should this domain be permitted to use the IOMMU? */ -#define _XEN_DOMCTL_CDF_iommu 5 -#define XEN_DOMCTL_CDF_iommu (1U<<_XEN_DOMCTL_CDF_iommu) + /* Is this an HVM guest (as opposed to a PV guest)? */ +#define _XEN_DOMCTL_CDF_hvm 0 +#define XEN_DOMCTL_CDF_hvm (1U << _XEN_DOMCTL_CDF_hvm) + /* Use hardware-assisted paging if available? */ +#define _XEN_DOMCTL_CDF_hap 1 +#define XEN_DOMCTL_CDF_hap (1U << _XEN_DOMCTL_CDF_hap) + /* Should domain memory integrity be verifed by tboot during Sx? */ +#define _XEN_DOMCTL_CDF_s3_integrity 2 +#define XEN_DOMCTL_CDF_s3_integrity (1U << _XEN_DOMCTL_CDF_s3_integrity) + /* Disable out-of-sync shadow page tables? */ +#define _XEN_DOMCTL_CDF_oos_off 3 +#define XEN_DOMCTL_CDF_oos_off (1U << _XEN_DOMCTL_CDF_oos_off) + /* Is this a xenstore domain? */ +#define _XEN_DOMCTL_CDF_xs_domain 4 +#define XEN_DOMCTL_CDF_xs_domain (1U << _XEN_DOMCTL_CDF_xs_domain) + /* Should this domain be permitted to use the IOMMU? */ +#define _XEN_DOMCTL_CDF_iommu 5 +#define XEN_DOMCTL_CDF_iommu (1U << _XEN_DOMCTL_CDF_iommu) /* Max XEN_DOMCTL_CDF_* constant. Used for ABI checking. */ #define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_iommu uint32_t flags; -#define _XEN_DOMCTL_IOMMU_no_sharept 0 -#define XEN_DOMCTL_IOMMU_no_sharept (1U << _XEN_DOMCTL_IOMMU_no_sharept) +#define _XEN_DOMCTL_IOMMU_no_sharept 0 +#define XEN_DOMCTL_IOMMU_no_sharept (1U << _XEN_DOMCTL_IOMMU_no_sharept) /* Max XEN_DOMCTL_IOMMU_* constant. Used for ABI checking. */ #define XEN_DOMCTL_IOMMU_MAX XEN_DOMCTL_IOMMU_no_sharept @@ -98,38 +98,38 @@ struct xen_domctl_createdomain { /* XEN_DOMCTL_getdomaininfo */ struct xen_domctl_getdomaininfo { /* OUT variables. */ - domid_t domain; /* Also echoed in domctl.domain */ - /* Domain is scheduled to die. */ -#define _XEN_DOMINF_dying 0 -#define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying) - /* Domain is an HVM guest (as opposed to a PV guest). */ + domid_t domain; /* Also echoed in domctl.domain */ + /* Domain is scheduled to die. */ +#define _XEN_DOMINF_dying 0 +#define XEN_DOMINF_dying (1U << _XEN_DOMINF_dying) + /* Domain is an HVM guest (as opposed to a PV guest). */ #define _XEN_DOMINF_hvm_guest 1 -#define XEN_DOMINF_hvm_guest (1U<<_XEN_DOMINF_hvm_guest) - /* The guest OS has shut down. */ -#define _XEN_DOMINF_shutdown 2 -#define XEN_DOMINF_shutdown (1U<<_XEN_DOMINF_shutdown) - /* Currently paused by control software. */ -#define _XEN_DOMINF_paused 3 -#define XEN_DOMINF_paused (1U<<_XEN_DOMINF_paused) - /* Currently blocked pending an event. */ -#define _XEN_DOMINF_blocked 4 -#define XEN_DOMINF_blocked (1U<<_XEN_DOMINF_blocked) - /* Domain is currently running. */ -#define _XEN_DOMINF_running 5 -#define XEN_DOMINF_running (1U<<_XEN_DOMINF_running) - /* Being debugged. */ -#define _XEN_DOMINF_debugged 6 -#define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged) +#define XEN_DOMINF_hvm_guest (1U << _XEN_DOMINF_hvm_guest) + /* The guest OS has shut down. */ +#define _XEN_DOMINF_shutdown 2 +#define XEN_DOMINF_shutdown (1U << _XEN_DOMINF_shutdown) + /* Currently paused by control software. */ +#define _XEN_DOMINF_paused 3 +#define XEN_DOMINF_paused (1U << _XEN_DOMINF_paused) + /* Currently blocked pending an event. */ +#define _XEN_DOMINF_blocked 4 +#define XEN_DOMINF_blocked (1U << _XEN_DOMINF_blocked) + /* Domain is currently running. */ +#define _XEN_DOMINF_running 5 +#define XEN_DOMINF_running (1U << _XEN_DOMINF_running) + /* Being debugged. */ +#define _XEN_DOMINF_debugged 6 +#define XEN_DOMINF_debugged (1U << _XEN_DOMINF_debugged) /* domain is a xenstore domain */ #define _XEN_DOMINF_xs_domain 7 -#define XEN_DOMINF_xs_domain (1U<<_XEN_DOMINF_xs_domain) +#define XEN_DOMINF_xs_domain (1U << _XEN_DOMINF_xs_domain) /* domain has hardware assisted paging */ -#define _XEN_DOMINF_hap 8 -#define XEN_DOMINF_hap (1U<<_XEN_DOMINF_hap) - /* XEN_DOMINF_shutdown guest-supplied code. */ -#define XEN_DOMINF_shutdownmask 255 +#define _XEN_DOMINF_hap 8 +#define XEN_DOMINF_hap (1U << _XEN_DOMINF_hap) + /* XEN_DOMINF_shutdown guest-supplied code. */ +#define XEN_DOMINF_shutdownmask 255 #define XEN_DOMINF_shutdownshift 16 - uint32_t flags; /* XEN_DOMINF_* */ + uint32_t flags; /* XEN_DOMINF_* */ uint64_aligned_t tot_pages; uint64_aligned_t max_pages; uint64_aligned_t outstanding_pages; @@ -137,9 +137,9 @@ struct xen_domctl_getdomaininfo { uint64_aligned_t paged_pages; uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */ uint64_aligned_t cpu_time; - uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */ + uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */ #define XEN_INVALID_MAX_VCPU_ID (~0U) /* Domain has no vcpus? */ - uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */ + uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */ uint32_t ssidref; xen_domain_handle_t handle; uint32_t cpupool; @@ -151,18 +151,18 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t); /* XEN_DOMCTL_getpageframeinfo */ -#define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28 -#define XEN_DOMCTL_PFINFO_NOTAB (0x0U<<28) -#define XEN_DOMCTL_PFINFO_L1TAB (0x1U<<28) -#define XEN_DOMCTL_PFINFO_L2TAB (0x2U<<28) -#define XEN_DOMCTL_PFINFO_L3TAB (0x3U<<28) -#define XEN_DOMCTL_PFINFO_L4TAB (0x4U<<28) -#define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28) -#define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31) -#define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */ -#define XEN_DOMCTL_PFINFO_XALLOC (0xeU<<28) /* allocate-only page */ -#define XEN_DOMCTL_PFINFO_BROKEN (0xdU<<28) /* broken page */ -#define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28) +#define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28 +#define XEN_DOMCTL_PFINFO_NOTAB (0x0U << 28) +#define XEN_DOMCTL_PFINFO_L1TAB (0x1U << 28) +#define XEN_DOMCTL_PFINFO_L2TAB (0x2U << 28) +#define XEN_DOMCTL_PFINFO_L3TAB (0x3U << 28) +#define XEN_DOMCTL_PFINFO_L4TAB (0x4U << 28) +#define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U << 28) +#define XEN_DOMCTL_PFINFO_LPINTAB (0x1U << 31) +#define XEN_DOMCTL_PFINFO_XTAB (0xfU << 28) /* invalid page */ +#define XEN_DOMCTL_PFINFO_XALLOC (0xeU << 28) /* allocate-only page */ +#define XEN_DOMCTL_PFINFO_BROKEN (0xdU << 28) /* broken page */ +#define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU << 28) /* XEN_DOMCTL_getpageframeinfo3 */ /* @@ -183,59 +183,59 @@ struct xen_domctl_getpageframeinfo3 { /* XEN_DOMCTL_shadow_op */ /* Disable shadow mode. */ -#define XEN_DOMCTL_SHADOW_OP_OFF 0 +#define XEN_DOMCTL_SHADOW_OP_OFF 0 /* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */ -#define XEN_DOMCTL_SHADOW_OP_ENABLE 32 +#define XEN_DOMCTL_SHADOW_OP_ENABLE 32 /* Log-dirty bitmap operations. */ - /* Return the bitmap and clean internal copy for next round. */ -#define XEN_DOMCTL_SHADOW_OP_CLEAN 11 - /* Return the bitmap but do not modify internal copy. */ -#define XEN_DOMCTL_SHADOW_OP_PEEK 12 +/* Return the bitmap and clean internal copy for next round. */ +#define XEN_DOMCTL_SHADOW_OP_CLEAN 11 +/* Return the bitmap but do not modify internal copy. */ +#define XEN_DOMCTL_SHADOW_OP_PEEK 12 /* Memory allocation accessors. */ -#define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30 -#define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31 +#define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30 +#define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31 /* Legacy enable operations. */ - /* Equiv. to ENABLE with no mode flags. */ -#define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1 - /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */ -#define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2 - /* - * No longer supported, was equiv. to ENABLE with mode flags - * ENABLE_REFCOUNT and ENABLE_TRANSLATE: +/* Equiv. to ENABLE with no mode flags. */ +#define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1 +/* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */ +#define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2 +/* + * No longer supported, was equiv. to ENABLE with mode flags + * ENABLE_REFCOUNT and ENABLE_TRANSLATE: #define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE 3 - */ + */ /* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */ - /* - * Shadow pagetables are refcounted: guest does not use explicit mmu - * operations nor write-protect its pagetables. - */ -#define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1) - /* - * Log pages in a bitmap as they are dirtied. - * Used for live relocation to determine which pages must be re-sent. - */ +/* + * Shadow pagetables are refcounted: guest does not use explicit mmu + * operations nor write-protect its pagetables. + */ +#define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1) +/* + * Log pages in a bitmap as they are dirtied. + * Used for live relocation to determine which pages must be re-sent. + */ #define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2) - /* - * Automatically translate GPFNs into MFNs. - */ +/* + * Automatically translate GPFNs into MFNs. + */ #define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3) - /* - * Xen does not steal virtual address space from the guest. - * Requires HVM support. - */ -#define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4) +/* + * Xen does not steal virtual address space from the guest. + * Requires HVM support. + */ +#define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4) /* Mode flags for XEN_DOMCTL_SHADOW_OP_{CLEAN,PEEK}. */ - /* - * This is the final iteration: Requesting to include pages mapped - * writably by the hypervisor in the dirty bitmap. - */ -#define XEN_DOMCTL_SHADOW_LOGDIRTY_FINAL (1 << 0) +/* + * This is the final iteration: Requesting to include pages mapped + * writably by the hypervisor in the dirty bitmap. + */ +#define XEN_DOMCTL_SHADOW_LOGDIRTY_FINAL (1 << 0) struct xen_domctl_shadow_op_stats { uint32_t fault_count; @@ -244,14 +244,14 @@ struct xen_domctl_shadow_op_stats { struct xen_domctl_shadow_op { /* IN variables. */ - uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */ + uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */ /* OP_ENABLE: XEN_DOMCTL_SHADOW_ENABLE_* */ /* OP_PEAK / OP_CLEAN: XEN_DOMCTL_SHADOW_LOGDIRTY_* */ - uint32_t mode; + uint32_t mode; /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */ - uint32_t mb; /* Shadow memory allocation in MB */ + uint32_t mb; /* Shadow memory allocation in MB */ /* OP_PEEK / OP_CLEAN */ XEN_GUEST_HANDLE_64(uint8) dirty_bitmap; @@ -270,7 +270,7 @@ struct xen_domctl_max_mem { /* XEN_DOMCTL_setvcpucontext */ /* XEN_DOMCTL_getvcpucontext */ struct xen_domctl_vcpucontext { - uint32_t vcpu; /* IN */ + uint32_t vcpu; /* IN */ XEN_GUEST_HANDLE_64(vcpu_guest_context_t) ctxt; /* IN/OUT */ }; @@ -280,11 +280,11 @@ struct xen_domctl_getvcpuinfo { /* IN variables. */ uint32_t vcpu; /* OUT variables. */ - uint8_t online; /* currently online (not hotplugged)? */ - uint8_t blocked; /* blocked waiting for an event? */ - uint8_t running; /* currently scheduled on its CPU? */ - uint64_aligned_t cpu_time; /* total cpu time consumed (ns) */ - uint32_t cpu; /* current mapping */ + uint8_t online; /* currently online (not hotplugged)? */ + uint8_t blocked; /* blocked waiting for an event? */ + uint8_t running; /* currently scheduled on its CPU? */ + uint64_aligned_t cpu_time; /* total cpu time consumed (ns) */ + uint32_t cpu; /* current mapping */ }; @@ -292,7 +292,7 @@ struct xen_domctl_getvcpuinfo { /* XEN_DOMCTL_setnodeaffinity */ /* XEN_DOMCTL_getnodeaffinity */ struct xen_domctl_nodeaffinity { - struct xenctl_bitmap nodemap;/* IN */ + struct xenctl_bitmap nodemap; /* IN */ }; @@ -301,16 +301,16 @@ struct xen_domctl_nodeaffinity { /* XEN_DOMCTL_getvcpuaffinity */ struct xen_domctl_vcpuaffinity { /* IN variables. */ - uint32_t vcpu; - /* Set/get the hard affinity for vcpu */ -#define _XEN_VCPUAFFINITY_HARD 0 -#define XEN_VCPUAFFINITY_HARD (1U<<_XEN_VCPUAFFINITY_HARD) - /* Set/get the soft affinity for vcpu */ -#define _XEN_VCPUAFFINITY_SOFT 1 -#define XEN_VCPUAFFINITY_SOFT (1U<<_XEN_VCPUAFFINITY_SOFT) - /* Undo SCHEDOP_pin_override */ + uint32_t vcpu; + /* Set/get the hard affinity for vcpu */ +#define _XEN_VCPUAFFINITY_HARD 0 +#define XEN_VCPUAFFINITY_HARD (1U << _XEN_VCPUAFFINITY_HARD) + /* Set/get the soft affinity for vcpu */ +#define _XEN_VCPUAFFINITY_SOFT 1 +#define XEN_VCPUAFFINITY_SOFT (1U << _XEN_VCPUAFFINITY_SOFT) + /* Undo SCHEDOP_pin_override */ #define _XEN_VCPUAFFINITY_FORCE 2 -#define XEN_VCPUAFFINITY_FORCE (1U<<_XEN_VCPUAFFINITY_FORCE) +#define XEN_VCPUAFFINITY_FORCE (1U << _XEN_VCPUAFFINITY_FORCE) uint32_t flags; /* * IN/OUT variables. @@ -342,7 +342,7 @@ struct xen_domctl_vcpuaffinity { * still required in the short term to allocate the vcpus themselves. */ struct xen_domctl_max_vcpus { - uint32_t max; /* maximum number of vcpus */ + uint32_t max; /* maximum number of vcpus */ }; @@ -369,8 +369,8 @@ struct xen_domctl_sched_rtds { uint32_t period; uint32_t budget; /* Can this vCPU execute beyond its reserved amount of time? */ -#define _XEN_DOMCTL_SCHEDRT_extra 0 -#define XEN_DOMCTL_SCHEDRT_extra (1U<<_XEN_DOMCTL_SCHEDRT_extra) +#define _XEN_DOMCTL_SCHEDRT_extra 0 +#define XEN_DOMCTL_SCHEDRT_extra (1U << _XEN_DOMCTL_SCHEDRT_extra) uint32_t flags; }; @@ -396,13 +396,13 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_schedparam_vcpu_t); * XEN_DOMCTL_SCHEDOP_getinfo gets domain-wise params; * XEN_DOMCTL_SCHEDOP_put(get)vcpuinfo returns error; */ -#define XEN_DOMCTL_SCHEDOP_putinfo 0 -#define XEN_DOMCTL_SCHEDOP_getinfo 1 +#define XEN_DOMCTL_SCHEDOP_putinfo 0 +#define XEN_DOMCTL_SCHEDOP_getinfo 1 #define XEN_DOMCTL_SCHEDOP_putvcpuinfo 2 #define XEN_DOMCTL_SCHEDOP_getvcpuinfo 3 struct xen_domctl_scheduler_op { - uint32_t sched_id; /* XEN_SCHEDULER_* */ - uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */ + uint32_t sched_id; /* XEN_SCHEDULER_* */ + uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */ /* IN/OUT */ union { struct xen_domctl_sched_credit credit; @@ -436,29 +436,29 @@ struct xen_domctl_setdebugging { /* XEN_DOMCTL_irq_permission */ struct xen_domctl_irq_permission { uint8_t pirq; - uint8_t allow_access; /* flag to specify enable/disable of IRQ access */ + uint8_t allow_access; /* flag to specify enable/disable of IRQ access */ }; /* XEN_DOMCTL_iomem_permission */ struct xen_domctl_iomem_permission { - uint64_aligned_t first_mfn;/* first page (physical page number) in range */ - uint64_aligned_t nr_mfns; /* number of pages in range (>0) */ - uint8_t allow_access; /* allow (!0) or deny (0) access to range? */ + uint64_aligned_t first_mfn; /* first page (physical page number) in range */ + uint64_aligned_t nr_mfns; /* number of pages in range (>0) */ + uint8_t allow_access; /* allow (!0) or deny (0) access to range? */ }; /* XEN_DOMCTL_ioport_permission */ struct xen_domctl_ioport_permission { - uint32_t first_port; /* first port int range */ - uint32_t nr_ports; /* size of port range */ - uint8_t allow_access; /* allow or deny access to range? */ + uint32_t first_port; /* first port int range */ + uint32_t nr_ports; /* size of port range */ + uint8_t allow_access; /* allow or deny access to range? */ }; /* XEN_DOMCTL_hypercall_init */ struct xen_domctl_hypercall_init { - uint64_aligned_t gmfn; /* GMFN to be initialised */ + uint64_aligned_t gmfn; /* GMFN to be initialised */ }; @@ -471,9 +471,10 @@ struct xen_domctl_settimeoffset { /* XEN_DOMCTL_sethvmcontext */ struct xen_domctl_hvmcontext { uint32_t size; /* IN/OUT: size of buffer / bytes filled */ - XEN_GUEST_HANDLE_64(uint8) buffer; /* IN/OUT: data, or call - * gethvmcontext with NULL - * buffer to get size req'd */ + XEN_GUEST_HANDLE_64(uint8) + buffer; /* IN/OUT: data, or call + * gethvmcontext with NULL + * buffer to get size req'd */ }; @@ -485,14 +486,14 @@ struct xen_domctl_address_size { /* XEN_DOMCTL_sendtrigger */ -#define XEN_DOMCTL_SENDTRIGGER_NMI 0 -#define XEN_DOMCTL_SENDTRIGGER_RESET 1 -#define XEN_DOMCTL_SENDTRIGGER_INIT 2 -#define XEN_DOMCTL_SENDTRIGGER_POWER 3 -#define XEN_DOMCTL_SENDTRIGGER_SLEEP 4 +#define XEN_DOMCTL_SENDTRIGGER_NMI 0 +#define XEN_DOMCTL_SENDTRIGGER_RESET 1 +#define XEN_DOMCTL_SENDTRIGGER_INIT 2 +#define XEN_DOMCTL_SENDTRIGGER_POWER 3 +#define XEN_DOMCTL_SENDTRIGGER_SLEEP 4 struct xen_domctl_sendtrigger { - uint32_t trigger; /* IN */ - uint32_t vcpu; /* IN */ + uint32_t trigger; /* IN */ + uint32_t vcpu; /* IN */ }; @@ -511,16 +512,16 @@ struct xen_domctl_sendtrigger { * will have to call XEN_DOMCTL_assign_device in order to use the * device. */ -#define XEN_DOMCTL_DEV_PCI 0 -#define XEN_DOMCTL_DEV_DT 1 +#define XEN_DOMCTL_DEV_PCI 0 +#define XEN_DOMCTL_DEV_DT 1 struct xen_domctl_assign_device { /* IN */ - uint32_t dev; /* XEN_DOMCTL_DEV_* */ + uint32_t dev; /* XEN_DOMCTL_DEV_* */ uint32_t flags; -#define XEN_DOMCTL_DEV_RDM_RELAXED 1 /* assign only */ +#define XEN_DOMCTL_DEV_RDM_RELAXED 1 /* assign only */ union { struct { - uint32_t machine_sbdf; /* machine PCI ID of assigned device */ + uint32_t machine_sbdf; /* machine PCI ID of assigned device */ } pci; struct { uint32_t size; /* Length of the path */ @@ -532,10 +533,10 @@ struct xen_domctl_assign_device { /* Retrieve sibling devices information of machine_sbdf */ /* XEN_DOMCTL_get_device_group */ struct xen_domctl_get_device_group { - uint32_t machine_sbdf; /* IN */ - uint32_t max_sdevs; /* IN */ - uint32_t num_sdevs; /* OUT */ - XEN_GUEST_HANDLE_64(uint32) sdev_array; /* OUT */ + uint32_t machine_sbdf; /* IN */ + uint32_t max_sdevs; /* IN */ + uint32_t num_sdevs; /* OUT */ + XEN_GUEST_HANDLE_64(uint32) sdev_array; /* OUT */ }; /* Pass-through interrupts: bind real irq -> hvm devfn. */ @@ -546,7 +547,7 @@ enum pt_irq_type { PT_IRQ_TYPE_ISA, PT_IRQ_TYPE_MSI, PT_IRQ_TYPE_MSI_TRANSLATE, - PT_IRQ_TYPE_SPI, /* ARM: valid range 32-1019 */ + PT_IRQ_TYPE_SPI, /* ARM: valid range 32-1019 */ }; struct xen_domctl_bind_pt_irq { uint32_t machine_irq; @@ -590,24 +591,24 @@ struct xen_domctl_bind_pt_irq { caller after updating inputs - negative error; other than -E2BIG */ -#define DPCI_ADD_MAPPING 1 -#define DPCI_REMOVE_MAPPING 0 +#define DPCI_ADD_MAPPING 1 +#define DPCI_REMOVE_MAPPING 0 struct xen_domctl_memory_mapping { uint64_aligned_t first_gfn; /* first page (hvm guest phys page) in range */ uint64_aligned_t first_mfn; /* first page (machine page) in range */ - uint64_aligned_t nr_mfns; /* number of pages in range (>0) */ - uint32_t add_mapping; /* add or remove mapping */ - uint32_t padding; /* padding for 64-bit aligned structure */ + uint64_aligned_t nr_mfns; /* number of pages in range (>0) */ + uint32_t add_mapping; /* add or remove mapping */ + uint32_t padding; /* padding for 64-bit aligned structure */ }; /* Bind machine I/O port range -> HVM I/O port range. */ /* XEN_DOMCTL_ioport_mapping */ struct xen_domctl_ioport_mapping { - uint32_t first_gport; /* first guest IO port*/ - uint32_t first_mport; /* first machine IO port */ - uint32_t nr_ports; /* size of port range */ - uint32_t add_mapping; /* add or remove mapping */ + uint32_t first_gport; /* first guest IO port*/ + uint32_t first_mport; /* first machine IO port */ + uint32_t nr_ports; /* size of port range */ + uint32_t add_mapping; /* add or remove mapping */ }; @@ -616,12 +617,12 @@ struct xen_domctl_ioport_mapping { */ /* XEN_DOMCTL_pin_mem_cacheattr */ /* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */ -#define XEN_DOMCTL_MEM_CACHEATTR_UC 0 -#define XEN_DOMCTL_MEM_CACHEATTR_WC 1 -#define XEN_DOMCTL_MEM_CACHEATTR_WT 4 -#define XEN_DOMCTL_MEM_CACHEATTR_WP 5 -#define XEN_DOMCTL_MEM_CACHEATTR_WB 6 -#define XEN_DOMCTL_MEM_CACHEATTR_UCM 7 +#define XEN_DOMCTL_MEM_CACHEATTR_UC 0 +#define XEN_DOMCTL_MEM_CACHEATTR_WC 1 +#define XEN_DOMCTL_MEM_CACHEATTR_WT 4 +#define XEN_DOMCTL_MEM_CACHEATTR_WP 5 +#define XEN_DOMCTL_MEM_CACHEATTR_WB 6 +#define XEN_DOMCTL_MEM_CACHEATTR_UCM 7 #define XEN_DOMCTL_DELETE_MEM_CACHEATTR (~(uint32_t)0) @@ -629,21 +630,21 @@ struct xen_domctl_ioport_mapping { /* XEN_DOMCTL_get_ext_vcpucontext */ struct xen_domctl_ext_vcpucontext { /* IN: VCPU that this call applies to. */ - uint32_t vcpu; + uint32_t vcpu; /* * SET: Size of struct (IN) * GET: Size of struct (OUT, up to 128 bytes) */ - uint32_t size; + uint32_t size; #if defined(__i386__) || defined(__x86_64__) /* SYSCALL from 32-bit mode and SYSENTER callback information. */ /* NB. SYSCALL from 64-bit mode is contained in vcpu_guest_context_t */ uint64_aligned_t syscall32_callback_eip; uint64_aligned_t sysenter_callback_eip; - uint16_t syscall32_callback_cs; - uint16_t sysenter_callback_cs; - uint8_t syscall32_disables_events; - uint8_t sysenter_disables_events; + uint16_t syscall32_callback_cs; + uint16_t sysenter_callback_cs; + uint8_t syscall32_disables_events; + uint8_t sysenter_disables_events; #if defined(__GNUC__) union { uint64_aligned_t mcg_cap; @@ -664,7 +665,7 @@ struct xen_domctl_set_target { }; #if defined(__i386__) || defined(__x86_64__) -# define XEN_CPUID_INPUT_UNUSED 0xFFFFFFFF +#define XEN_CPUID_INPUT_UNUSED 0xFFFFFFFF /* * XEN_DOMCTL_{get,set}_cpu_policy (x86 specific) @@ -674,10 +675,10 @@ struct xen_domctl_set_target { struct xen_domctl_cpu_policy { uint32_t nr_leaves; /* IN/OUT: Number of leaves in/written to * 'cpuid_policy'. */ - uint32_t nr_msrs; /* IN/OUT: Number of MSRs in/written to - * 'msr_domain_policy' */ + uint32_t nr_msrs; /* IN/OUT: Number of MSRs in/written to + * 'msr_domain_policy' */ XEN_GUEST_HANDLE_64(xen_cpuid_leaf_t) cpuid_policy; /* IN/OUT */ - XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_policy; /* IN/OUT */ + XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_policy; /* IN/OUT */ /* * OUT, set_policy only. Written in some (but not all) error cases to @@ -711,10 +712,10 @@ struct xen_domctl_subscribe { }; /* XEN_DOMCTL_debug_op */ -#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF 0 -#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON 1 +#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF 0 +#define XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON 1 struct xen_domctl_debug_op { - uint32_t op; /* IN */ + uint32_t op; /* IN */ uint32_t vcpu; /* IN */ }; @@ -723,10 +724,10 @@ struct xen_domctl_debug_op { */ /* XEN_DOMCTL_gethvmcontext_partial */ struct xen_domctl_hvmcontext_partial { - uint32_t type; /* IN: Type of record required */ - uint32_t instance; /* IN: Instance of that type */ - uint64_aligned_t bufsz; /* IN: size of buffer */ - XEN_GUEST_HANDLE_64(uint8) buffer; /* OUT: buffer to write record into */ + uint32_t type; /* IN: Type of record required */ + uint32_t instance; /* IN: Instance of that type */ + uint64_aligned_t bufsz; /* IN: size of buffer */ + XEN_GUEST_HANDLE_64(uint8) buffer; /* OUT: buffer to write record into */ }; /* XEN_DOMCTL_disable_migrate */ @@ -749,27 +750,27 @@ struct xen_domctl_tsc_info { /* XEN_DOMCTL_gdbsx_guestmemio guest mem io */ struct xen_domctl_gdbsx_memio { /* IN */ - uint64_aligned_t pgd3val;/* optional: init_mm.pgd[3] value */ - uint64_aligned_t gva; /* guest virtual address */ - uint64_aligned_t uva; /* user buffer virtual address */ - uint32_t len; /* number of bytes to read/write */ - uint8_t gwr; /* 0 = read from guest. 1 = write to guest */ + uint64_aligned_t pgd3val; /* optional: init_mm.pgd[3] value */ + uint64_aligned_t gva; /* guest virtual address */ + uint64_aligned_t uva; /* user buffer virtual address */ + uint32_t len; /* number of bytes to read/write */ + uint8_t gwr; /* 0 = read from guest. 1 = write to guest */ /* OUT */ - uint32_t remain; /* bytes remaining to be copied */ + uint32_t remain; /* bytes remaining to be copied */ }; /* XEN_DOMCTL_gdbsx_pausevcpu */ /* XEN_DOMCTL_gdbsx_unpausevcpu */ struct xen_domctl_gdbsx_pauseunp_vcpu { /* pause/unpause a vcpu */ - uint32_t vcpu; /* which vcpu */ + uint32_t vcpu; /* which vcpu */ }; /* XEN_DOMCTL_gdbsx_domstatus */ struct xen_domctl_gdbsx_domstatus { /* OUT */ - uint8_t paused; /* is the domain paused */ - uint32_t vcpu_id; /* any vcpu in an event? */ - uint32_t vcpu_ev; /* if yes, what event? */ + uint8_t paused; /* is the domain paused */ + uint32_t vcpu_id; /* any vcpu in an event? */ + uint32_t vcpu_ev; /* if yes, what event? */ }; /* @@ -785,10 +786,10 @@ struct xen_domctl_gdbsx_domstatus { * to the hypervisor to pull responses (resume) from the given * ring. */ -#define XEN_VM_EVENT_ENABLE 0 -#define XEN_VM_EVENT_DISABLE 1 -#define XEN_VM_EVENT_RESUME 2 -#define XEN_VM_EVENT_GET_VERSION 3 +#define XEN_VM_EVENT_ENABLE 0 +#define XEN_VM_EVENT_DISABLE 1 +#define XEN_VM_EVENT_RESUME 2 +#define XEN_VM_EVENT_GET_VERSION 3 /* * Domain memory paging @@ -804,7 +805,7 @@ struct xen_domctl_gdbsx_domstatus { * EXDEV - guest has PoD enabled * EBUSY - guest has or had paging enabled, ring buffer still active */ -#define XEN_DOMCTL_VM_EVENT_OP_PAGING 1 +#define XEN_DOMCTL_VM_EVENT_OP_PAGING 1 /* * Monitor helper. @@ -828,7 +829,7 @@ struct xen_domctl_gdbsx_domstatus { * EBUSY - guest has or had access enabled, ring buffer still active * */ -#define XEN_DOMCTL_VM_EVENT_OP_MONITOR 2 +#define XEN_DOMCTL_VM_EVENT_OP_MONITOR 2 /* * Sharing ENOMEM helper. @@ -843,17 +844,17 @@ struct xen_domctl_gdbsx_domstatus { * Note that shring can be turned on (as per the domctl below) * *without* this ring being setup. */ -#define XEN_DOMCTL_VM_EVENT_OP_SHARING 3 +#define XEN_DOMCTL_VM_EVENT_OP_SHARING 3 /* Use for teardown/setup of helper<->hypervisor interface for paging, * access and sharing.*/ struct xen_domctl_vm_event_op { - uint32_t op; /* XEN_VM_EVENT_* */ - uint32_t mode; /* XEN_DOMCTL_VM_EVENT_OP_* */ + uint32_t op; /* XEN_VM_EVENT_* */ + uint32_t mode; /* XEN_DOMCTL_VM_EVENT_OP_* */ union { struct { - uint32_t port; /* OUT: event channel for ring */ + uint32_t port; /* OUT: event channel for ring */ } enable; uint32_t version; @@ -865,13 +866,13 @@ struct xen_domctl_vm_event_op { */ /* XEN_DOMCTL_mem_sharing_op. * The CONTROL sub-domctl is used for bringup/teardown. */ -#define XEN_DOMCTL_MEM_SHARING_CONTROL 0 +#define XEN_DOMCTL_MEM_SHARING_CONTROL 0 struct xen_domctl_mem_sharing_op { uint8_t op; /* XEN_DOMCTL_MEM_SHARING_* */ union { - uint8_t enable; /* CONTROL */ + uint8_t enable; /* CONTROL */ } u; }; @@ -891,7 +892,7 @@ struct xen_domctl_set_virq_handler { /* XEN_DOMCTL_getvcpuextstate */ struct xen_domctl_vcpuextstate { /* IN: VCPU that this call applies to. */ - uint32_t vcpu; + uint32_t vcpu; /* * SET: Ignored. * GET: xfeature support mask of struct (IN/OUT) @@ -899,12 +900,12 @@ struct xen_domctl_vcpuextstate { * so that compatible CPUs can have a check on format to decide * whether it can restore. */ - uint64_aligned_t xfeature_mask; + uint64_aligned_t xfeature_mask; /* * SET: Size of struct (IN) * GET: Size of struct (IN/OUT) */ - uint64_aligned_t size; + uint64_aligned_t size; XEN_GUEST_HANDLE_64(uint64) buffer; }; #endif @@ -932,8 +933,8 @@ struct xen_domctl_cacheflush { #if defined(__i386__) || defined(__x86_64__) struct xen_domctl_vcpu_msr { - uint32_t index; - uint32_t reserved; + uint32_t index; + uint32_t reserved; uint64_aligned_t value; }; typedef struct xen_domctl_vcpu_msr xen_domctl_vcpu_msr_t; @@ -957,8 +958,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpu_msr_t); * and 'msr_count' shall be set to the offending index, to aid debugging. */ struct xen_domctl_vcpu_msrs { - uint32_t vcpu; /* IN */ - uint32_t msr_count; /* IN/OUT */ + uint32_t vcpu; /* IN */ + uint32_t msr_count; /* IN/OUT */ XEN_GUEST_HANDLE_64(xen_domctl_vcpu_msr_t) msrs; /* IN/OUT */ }; #endif @@ -974,7 +975,7 @@ struct xen_domctl_vnuma { * array declared below). Shall be equal to the domain's max_vcpus. */ uint32_t nr_vcpus; - uint32_t pad; /* must be zero */ + uint32_t pad; /* must be zero */ /* * IN: array for specifying the distances of the vNUMA nodes @@ -999,9 +1000,9 @@ struct xen_domctl_vnuma { }; struct xen_domctl_psr_cmt_op { -#define XEN_DOMCTL_PSR_CMT_OP_DETACH 0 -#define XEN_DOMCTL_PSR_CMT_OP_ATTACH 1 -#define XEN_DOMCTL_PSR_CMT_OP_QUERY_RMID 2 +#define XEN_DOMCTL_PSR_CMT_OP_DETACH 0 +#define XEN_DOMCTL_PSR_CMT_OP_ATTACH 1 +#define XEN_DOMCTL_PSR_CMT_OP_QUERY_RMID 2 uint32_t cmd; uint32_t data; }; @@ -1020,24 +1021,24 @@ struct xen_domctl_psr_cmt_op { * however, enabling/disabling those events is performed with the use of * memory_op hypercalls! */ -#define XEN_DOMCTL_MONITOR_OP_ENABLE 0 -#define XEN_DOMCTL_MONITOR_OP_DISABLE 1 -#define XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES 2 -#define XEN_DOMCTL_MONITOR_OP_EMULATE_EACH_REP 3 - -#define XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG 0 -#define XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR 1 -#define XEN_DOMCTL_MONITOR_EVENT_SINGLESTEP 2 -#define XEN_DOMCTL_MONITOR_EVENT_SOFTWARE_BREAKPOINT 3 -#define XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST 4 -#define XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION 5 -#define XEN_DOMCTL_MONITOR_EVENT_CPUID 6 -#define XEN_DOMCTL_MONITOR_EVENT_PRIVILEGED_CALL 7 -#define XEN_DOMCTL_MONITOR_EVENT_INTERRUPT 8 -#define XEN_DOMCTL_MONITOR_EVENT_DESC_ACCESS 9 -#define XEN_DOMCTL_MONITOR_EVENT_EMUL_UNIMPLEMENTED 10 +#define XEN_DOMCTL_MONITOR_OP_ENABLE 0 +#define XEN_DOMCTL_MONITOR_OP_DISABLE 1 +#define XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES 2 +#define XEN_DOMCTL_MONITOR_OP_EMULATE_EACH_REP 3 + +#define XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG 0 +#define XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR 1 +#define XEN_DOMCTL_MONITOR_EVENT_SINGLESTEP 2 +#define XEN_DOMCTL_MONITOR_EVENT_SOFTWARE_BREAKPOINT 3 +#define XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST 4 +#define XEN_DOMCTL_MONITOR_EVENT_DEBUG_EXCEPTION 5 +#define XEN_DOMCTL_MONITOR_EVENT_CPUID 6 +#define XEN_DOMCTL_MONITOR_EVENT_PRIVILEGED_CALL 7 +#define XEN_DOMCTL_MONITOR_EVENT_INTERRUPT 8 +#define XEN_DOMCTL_MONITOR_EVENT_DESC_ACCESS 9 +#define XEN_DOMCTL_MONITOR_EVENT_EMUL_UNIMPLEMENTED 10 /* Enabled by default */ -#define XEN_DOMCTL_MONITOR_EVENT_INGUEST_PAGEFAULT 11 +#define XEN_DOMCTL_MONITOR_EVENT_INGUEST_PAGEFAULT 11 struct xen_domctl_monitor_op { uint32_t op; /* XEN_DOMCTL_MONITOR_OP_* */ @@ -1092,184 +1093,189 @@ struct xen_domctl_monitor_op { }; struct xen_domctl_psr_alloc { -#define XEN_DOMCTL_PSR_SET_L3_CBM 0 -#define XEN_DOMCTL_PSR_GET_L3_CBM 1 -#define XEN_DOMCTL_PSR_SET_L3_CODE 2 -#define XEN_DOMCTL_PSR_SET_L3_DATA 3 -#define XEN_DOMCTL_PSR_GET_L3_CODE 4 -#define XEN_DOMCTL_PSR_GET_L3_DATA 5 -#define XEN_DOMCTL_PSR_SET_L2_CBM 6 -#define XEN_DOMCTL_PSR_GET_L2_CBM 7 -#define XEN_DOMCTL_PSR_SET_MBA_THRTL 8 -#define XEN_DOMCTL_PSR_GET_MBA_THRTL 9 - uint32_t cmd; /* IN: XEN_DOMCTL_PSR_* */ - uint32_t target; /* IN */ - uint64_t data; /* IN/OUT */ +#define XEN_DOMCTL_PSR_SET_L3_CBM 0 +#define XEN_DOMCTL_PSR_GET_L3_CBM 1 +#define XEN_DOMCTL_PSR_SET_L3_CODE 2 +#define XEN_DOMCTL_PSR_SET_L3_DATA 3 +#define XEN_DOMCTL_PSR_GET_L3_CODE 4 +#define XEN_DOMCTL_PSR_GET_L3_DATA 5 +#define XEN_DOMCTL_PSR_SET_L2_CBM 6 +#define XEN_DOMCTL_PSR_GET_L2_CBM 7 +#define XEN_DOMCTL_PSR_SET_MBA_THRTL 8 +#define XEN_DOMCTL_PSR_GET_MBA_THRTL 9 + uint32_t cmd; /* IN: XEN_DOMCTL_PSR_* */ + uint32_t target; /* IN */ + uint64_t data; /* IN/OUT */ }; /* XEN_DOMCTL_vuart_op */ struct xen_domctl_vuart_op { -#define XEN_DOMCTL_VUART_OP_INIT 0 - uint32_t cmd; /* XEN_DOMCTL_VUART_OP_* */ +#define XEN_DOMCTL_VUART_OP_INIT 0 + uint32_t cmd; /* XEN_DOMCTL_VUART_OP_* */ #define XEN_DOMCTL_VUART_TYPE_VPL011 0 - uint32_t type; /* IN - type of vuart. - * Currently only vpl011 supported. - */ - uint64_aligned_t gfn; /* IN - guest gfn to be used as a - * ring buffer. - */ - domid_t console_domid; /* IN - domid of domain running the - * backend console. - */ - uint8_t pad[2]; - evtchn_port_t evtchn; /* OUT - remote port of the event - * channel used for sending - * ring buffer events. - */ + uint32_t type; /* IN - type of vuart. + * Currently only vpl011 supported. + */ + uint64_aligned_t gfn; /* IN - guest gfn to be used as a + * ring buffer. + */ + domid_t console_domid; /* IN - domid of domain running the + * backend console. + */ + uint8_t pad[2]; + evtchn_port_t evtchn; /* OUT - remote port of the event + * channel used for sending + * ring buffer events. + */ }; struct xen_domctl { uint32_t cmd; -#define XEN_DOMCTL_createdomain 1 -#define XEN_DOMCTL_destroydomain 2 -#define XEN_DOMCTL_pausedomain 3 -#define XEN_DOMCTL_unpausedomain 4 -#define XEN_DOMCTL_getdomaininfo 5 +#define XEN_DOMCTL_createdomain 1 +#define XEN_DOMCTL_destroydomain 2 +#define XEN_DOMCTL_pausedomain 3 +#define XEN_DOMCTL_unpausedomain 4 +#define XEN_DOMCTL_getdomaininfo 5 /* #define XEN_DOMCTL_getmemlist 6 Removed */ -/* #define XEN_DOMCTL_getpageframeinfo 7 Obsolete - use getpageframeinfo3 */ -/* #define XEN_DOMCTL_getpageframeinfo2 8 Obsolete - use getpageframeinfo3 */ -#define XEN_DOMCTL_setvcpuaffinity 9 -#define XEN_DOMCTL_shadow_op 10 -#define XEN_DOMCTL_max_mem 11 -#define XEN_DOMCTL_setvcpucontext 12 -#define XEN_DOMCTL_getvcpucontext 13 -#define XEN_DOMCTL_getvcpuinfo 14 -#define XEN_DOMCTL_max_vcpus 15 -#define XEN_DOMCTL_scheduler_op 16 -#define XEN_DOMCTL_setdomainhandle 17 -#define XEN_DOMCTL_setdebugging 18 -#define XEN_DOMCTL_irq_permission 19 -#define XEN_DOMCTL_iomem_permission 20 -#define XEN_DOMCTL_ioport_permission 21 -#define XEN_DOMCTL_hypercall_init 22 -#define XEN_DOMCTL_arch_setup 23 /* Obsolete IA64 only */ -#define XEN_DOMCTL_settimeoffset 24 -#define XEN_DOMCTL_getvcpuaffinity 25 -#define XEN_DOMCTL_real_mode_area 26 /* Obsolete PPC only */ -#define XEN_DOMCTL_resumedomain 27 -#define XEN_DOMCTL_sendtrigger 28 -#define XEN_DOMCTL_subscribe 29 -#define XEN_DOMCTL_gethvmcontext 33 -#define XEN_DOMCTL_sethvmcontext 34 -#define XEN_DOMCTL_set_address_size 35 -#define XEN_DOMCTL_get_address_size 36 -#define XEN_DOMCTL_assign_device 37 -#define XEN_DOMCTL_bind_pt_irq 38 -#define XEN_DOMCTL_memory_mapping 39 -#define XEN_DOMCTL_ioport_mapping 40 +/* #define XEN_DOMCTL_getpageframeinfo 7 Obsolete - use + * getpageframeinfo3 */ +/* #define XEN_DOMCTL_getpageframeinfo2 8 Obsolete - use + * getpageframeinfo3 */ +#define XEN_DOMCTL_setvcpuaffinity 9 +#define XEN_DOMCTL_shadow_op 10 +#define XEN_DOMCTL_max_mem 11 +#define XEN_DOMCTL_setvcpucontext 12 +#define XEN_DOMCTL_getvcpucontext 13 +#define XEN_DOMCTL_getvcpuinfo 14 +#define XEN_DOMCTL_max_vcpus 15 +#define XEN_DOMCTL_scheduler_op 16 +#define XEN_DOMCTL_setdomainhandle 17 +#define XEN_DOMCTL_setdebugging 18 +#define XEN_DOMCTL_irq_permission 19 +#define XEN_DOMCTL_iomem_permission 20 +#define XEN_DOMCTL_ioport_permission 21 +#define XEN_DOMCTL_hypercall_init 22 +#define XEN_DOMCTL_arch_setup 23 /* Obsolete IA64 only */ +#define XEN_DOMCTL_settimeoffset 24 +#define XEN_DOMCTL_getvcpuaffinity 25 +#define XEN_DOMCTL_real_mode_area 26 /* Obsolete PPC only */ +#define XEN_DOMCTL_resumedomain 27 +#define XEN_DOMCTL_sendtrigger 28 +#define XEN_DOMCTL_subscribe 29 +#define XEN_DOMCTL_gethvmcontext 33 +#define XEN_DOMCTL_sethvmcontext 34 +#define XEN_DOMCTL_set_address_size 35 +#define XEN_DOMCTL_get_address_size 36 +#define XEN_DOMCTL_assign_device 37 +#define XEN_DOMCTL_bind_pt_irq 38 +#define XEN_DOMCTL_memory_mapping 39 +#define XEN_DOMCTL_ioport_mapping 40 /* #define XEN_DOMCTL_pin_mem_cacheattr 41 Removed - use dmop */ -#define XEN_DOMCTL_set_ext_vcpucontext 42 -#define XEN_DOMCTL_get_ext_vcpucontext 43 -#define XEN_DOMCTL_set_opt_feature 44 /* Obsolete IA64 only */ -#define XEN_DOMCTL_test_assign_device 45 -#define XEN_DOMCTL_set_target 46 -#define XEN_DOMCTL_deassign_device 47 -#define XEN_DOMCTL_unbind_pt_irq 48 -/* #define XEN_DOMCTL_set_cpuid 49 - Obsolete - use set_cpu_policy */ -#define XEN_DOMCTL_get_device_group 50 +#define XEN_DOMCTL_set_ext_vcpucontext 42 +#define XEN_DOMCTL_get_ext_vcpucontext 43 +#define XEN_DOMCTL_set_opt_feature 44 /* Obsolete IA64 only */ +#define XEN_DOMCTL_test_assign_device 45 +#define XEN_DOMCTL_set_target 46 +#define XEN_DOMCTL_deassign_device 47 +#define XEN_DOMCTL_unbind_pt_irq 48 +/* #define XEN_DOMCTL_set_cpuid 49 - Obsolete - use + * set_cpu_policy */ +#define XEN_DOMCTL_get_device_group 50 /* #define XEN_DOMCTL_set_machine_address_size 51 - Obsolete */ /* #define XEN_DOMCTL_get_machine_address_size 52 - Obsolete */ /* #define XEN_DOMCTL_suppress_spurious_page_faults 53 - Obsolete */ -#define XEN_DOMCTL_debug_op 54 -#define XEN_DOMCTL_gethvmcontext_partial 55 -#define XEN_DOMCTL_vm_event_op 56 -#define XEN_DOMCTL_mem_sharing_op 57 -#define XEN_DOMCTL_disable_migrate 58 -#define XEN_DOMCTL_gettscinfo 59 -#define XEN_DOMCTL_settscinfo 60 -#define XEN_DOMCTL_getpageframeinfo3 61 -#define XEN_DOMCTL_setvcpuextstate 62 -#define XEN_DOMCTL_getvcpuextstate 63 -#define XEN_DOMCTL_set_access_required 64 -#define XEN_DOMCTL_audit_p2m 65 -#define XEN_DOMCTL_set_virq_handler 66 -#define XEN_DOMCTL_set_broken_page_p2m 67 -#define XEN_DOMCTL_setnodeaffinity 68 -#define XEN_DOMCTL_getnodeaffinity 69 -/* #define XEN_DOMCTL_set_max_evtchn 70 - Moved into XEN_DOMCTL_createdomain */ -#define XEN_DOMCTL_cacheflush 71 -#define XEN_DOMCTL_get_vcpu_msrs 72 -#define XEN_DOMCTL_set_vcpu_msrs 73 -#define XEN_DOMCTL_setvnumainfo 74 -#define XEN_DOMCTL_psr_cmt_op 75 -#define XEN_DOMCTL_monitor_op 77 -#define XEN_DOMCTL_psr_alloc 78 -#define XEN_DOMCTL_soft_reset 79 -/* #define XEN_DOMCTL_set_gnttab_limits 80 - Moved into XEN_DOMCTL_createdomain */ -#define XEN_DOMCTL_vuart_op 81 -#define XEN_DOMCTL_get_cpu_policy 82 -#define XEN_DOMCTL_set_cpu_policy 83 -#define XEN_DOMCTL_gdbsx_guestmemio 1000 -#define XEN_DOMCTL_gdbsx_pausevcpu 1001 -#define XEN_DOMCTL_gdbsx_unpausevcpu 1002 -#define XEN_DOMCTL_gdbsx_domstatus 1003 +#define XEN_DOMCTL_debug_op 54 +#define XEN_DOMCTL_gethvmcontext_partial 55 +#define XEN_DOMCTL_vm_event_op 56 +#define XEN_DOMCTL_mem_sharing_op 57 +#define XEN_DOMCTL_disable_migrate 58 +#define XEN_DOMCTL_gettscinfo 59 +#define XEN_DOMCTL_settscinfo 60 +#define XEN_DOMCTL_getpageframeinfo3 61 +#define XEN_DOMCTL_setvcpuextstate 62 +#define XEN_DOMCTL_getvcpuextstate 63 +#define XEN_DOMCTL_set_access_required 64 +#define XEN_DOMCTL_audit_p2m 65 +#define XEN_DOMCTL_set_virq_handler 66 +#define XEN_DOMCTL_set_broken_page_p2m 67 +#define XEN_DOMCTL_setnodeaffinity 68 +#define XEN_DOMCTL_getnodeaffinity 69 +/* #define XEN_DOMCTL_set_max_evtchn 70 - Moved into + * XEN_DOMCTL_createdomain */ +#define XEN_DOMCTL_cacheflush 71 +#define XEN_DOMCTL_get_vcpu_msrs 72 +#define XEN_DOMCTL_set_vcpu_msrs 73 +#define XEN_DOMCTL_setvnumainfo 74 +#define XEN_DOMCTL_psr_cmt_op 75 +#define XEN_DOMCTL_monitor_op 77 +#define XEN_DOMCTL_psr_alloc 78 +#define XEN_DOMCTL_soft_reset 79 +/* #define XEN_DOMCTL_set_gnttab_limits 80 - Moved into + * XEN_DOMCTL_createdomain */ +#define XEN_DOMCTL_vuart_op 81 +#define XEN_DOMCTL_get_cpu_policy 82 +#define XEN_DOMCTL_set_cpu_policy 83 +#define XEN_DOMCTL_gdbsx_guestmemio 1000 +#define XEN_DOMCTL_gdbsx_pausevcpu 1001 +#define XEN_DOMCTL_gdbsx_unpausevcpu 1002 +#define XEN_DOMCTL_gdbsx_domstatus 1003 uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */ - domid_t domain; + domid_t domain; union { - struct xen_domctl_createdomain createdomain; - struct xen_domctl_getdomaininfo getdomaininfo; + struct xen_domctl_createdomain createdomain; + struct xen_domctl_getdomaininfo getdomaininfo; struct xen_domctl_getpageframeinfo3 getpageframeinfo3; - struct xen_domctl_nodeaffinity nodeaffinity; - struct xen_domctl_vcpuaffinity vcpuaffinity; - struct xen_domctl_shadow_op shadow_op; - struct xen_domctl_max_mem max_mem; - struct xen_domctl_vcpucontext vcpucontext; - struct xen_domctl_getvcpuinfo getvcpuinfo; - struct xen_domctl_max_vcpus max_vcpus; - struct xen_domctl_scheduler_op scheduler_op; - struct xen_domctl_setdomainhandle setdomainhandle; - struct xen_domctl_setdebugging setdebugging; - struct xen_domctl_irq_permission irq_permission; - struct xen_domctl_iomem_permission iomem_permission; + struct xen_domctl_nodeaffinity nodeaffinity; + struct xen_domctl_vcpuaffinity vcpuaffinity; + struct xen_domctl_shadow_op shadow_op; + struct xen_domctl_max_mem max_mem; + struct xen_domctl_vcpucontext vcpucontext; + struct xen_domctl_getvcpuinfo getvcpuinfo; + struct xen_domctl_max_vcpus max_vcpus; + struct xen_domctl_scheduler_op scheduler_op; + struct xen_domctl_setdomainhandle setdomainhandle; + struct xen_domctl_setdebugging setdebugging; + struct xen_domctl_irq_permission irq_permission; + struct xen_domctl_iomem_permission iomem_permission; struct xen_domctl_ioport_permission ioport_permission; - struct xen_domctl_hypercall_init hypercall_init; - struct xen_domctl_settimeoffset settimeoffset; - struct xen_domctl_disable_migrate disable_migrate; - struct xen_domctl_tsc_info tsc_info; - struct xen_domctl_hvmcontext hvmcontext; + struct xen_domctl_hypercall_init hypercall_init; + struct xen_domctl_settimeoffset settimeoffset; + struct xen_domctl_disable_migrate disable_migrate; + struct xen_domctl_tsc_info tsc_info; + struct xen_domctl_hvmcontext hvmcontext; struct xen_domctl_hvmcontext_partial hvmcontext_partial; - struct xen_domctl_address_size address_size; - struct xen_domctl_sendtrigger sendtrigger; - struct xen_domctl_get_device_group get_device_group; - struct xen_domctl_assign_device assign_device; - struct xen_domctl_bind_pt_irq bind_pt_irq; - struct xen_domctl_memory_mapping memory_mapping; - struct xen_domctl_ioport_mapping ioport_mapping; - struct xen_domctl_ext_vcpucontext ext_vcpucontext; - struct xen_domctl_set_target set_target; - struct xen_domctl_subscribe subscribe; - struct xen_domctl_debug_op debug_op; - struct xen_domctl_vm_event_op vm_event_op; - struct xen_domctl_mem_sharing_op mem_sharing_op; + struct xen_domctl_address_size address_size; + struct xen_domctl_sendtrigger sendtrigger; + struct xen_domctl_get_device_group get_device_group; + struct xen_domctl_assign_device assign_device; + struct xen_domctl_bind_pt_irq bind_pt_irq; + struct xen_domctl_memory_mapping memory_mapping; + struct xen_domctl_ioport_mapping ioport_mapping; + struct xen_domctl_ext_vcpucontext ext_vcpucontext; + struct xen_domctl_set_target set_target; + struct xen_domctl_subscribe subscribe; + struct xen_domctl_debug_op debug_op; + struct xen_domctl_vm_event_op vm_event_op; + struct xen_domctl_mem_sharing_op mem_sharing_op; #if defined(__i386__) || defined(__x86_64__) - struct xen_domctl_cpu_policy cpu_policy; - struct xen_domctl_vcpuextstate vcpuextstate; - struct xen_domctl_vcpu_msrs vcpu_msrs; + struct xen_domctl_cpu_policy cpu_policy; + struct xen_domctl_vcpuextstate vcpuextstate; + struct xen_domctl_vcpu_msrs vcpu_msrs; #endif struct xen_domctl_set_access_required access_required; - struct xen_domctl_audit_p2m audit_p2m; - struct xen_domctl_set_virq_handler set_virq_handler; - struct xen_domctl_gdbsx_memio gdbsx_guest_memio; + struct xen_domctl_audit_p2m audit_p2m; + struct xen_domctl_set_virq_handler set_virq_handler; + struct xen_domctl_gdbsx_memio gdbsx_guest_memio; struct xen_domctl_set_broken_page_p2m set_broken_page_p2m; - struct xen_domctl_cacheflush cacheflush; + struct xen_domctl_cacheflush cacheflush; struct xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu; - struct xen_domctl_gdbsx_domstatus gdbsx_domstatus; - struct xen_domctl_vnuma vnuma; - struct xen_domctl_psr_cmt_op psr_cmt_op; - struct xen_domctl_monitor_op monitor_op; - struct xen_domctl_psr_alloc psr_alloc; - struct xen_domctl_vuart_op vuart_op; - uint8_t pad[128]; + struct xen_domctl_gdbsx_domstatus gdbsx_domstatus; + struct xen_domctl_vnuma vnuma; + struct xen_domctl_psr_cmt_op psr_cmt_op; + struct xen_domctl_monitor_op monitor_op; + struct xen_domctl_psr_alloc psr_alloc; + struct xen_domctl_vuart_op vuart_op; + uint8_t pad[128]; } u; }; typedef struct xen_domctl xen_domctl_t; diff --git a/include/xen/elfnote.h b/include/xen/elfnote.h index 181cbc4ec..444cdeab0 100644 --- a/include/xen/elfnote.h +++ b/include/xen/elfnote.h @@ -46,14 +46,14 @@ /* * NAME=VALUE pair (string). */ -#define XEN_ELFNOTE_INFO 0 +#define XEN_ELFNOTE_INFO 0 /* * The virtual address of the entry point (numeric). * * LEGACY: VIRT_ENTRY */ -#define XEN_ELFNOTE_ENTRY 1 +#define XEN_ELFNOTE_ENTRY 1 /* The virtual address of the hypercall transfer page (numeric). * @@ -68,7 +68,7 @@ * * LEGACY: VIRT_BASE */ -#define XEN_ELFNOTE_VIRT_BASE 3 +#define XEN_ELFNOTE_VIRT_BASE 3 /* * The offset of the ELF paddr field from the actual required @@ -80,35 +80,35 @@ * * LEGACY: ELF_PADDR_OFFSET. (n.b. legacy default is VIRT_BASE) */ -#define XEN_ELFNOTE_PADDR_OFFSET 4 +#define XEN_ELFNOTE_PADDR_OFFSET 4 /* * The version of Xen that we work with (string). * * LEGACY: XEN_VER */ -#define XEN_ELFNOTE_XEN_VERSION 5 +#define XEN_ELFNOTE_XEN_VERSION 5 /* * The name of the guest operating system (string). * * LEGACY: GUEST_OS */ -#define XEN_ELFNOTE_GUEST_OS 6 +#define XEN_ELFNOTE_GUEST_OS 6 /* * The version of the guest operating system (string). * * LEGACY: GUEST_VER */ -#define XEN_ELFNOTE_GUEST_VERSION 7 +#define XEN_ELFNOTE_GUEST_VERSION 7 /* * The loader type (string). * * LEGACY: LOADER */ -#define XEN_ELFNOTE_LOADER 8 +#define XEN_ELFNOTE_LOADER 8 /* * The kernel supports PAE (x86/32 only, string = "yes", "no" or @@ -124,7 +124,7 @@ * these ELF notes will include this and therefore "yes" here is * equivalent to "yes[entended-cr3]" in the __xen_guest interface. */ -#define XEN_ELFNOTE_PAE_MODE 9 +#define XEN_ELFNOTE_PAE_MODE 9 /* * The features supported/required by this kernel (string). @@ -136,7 +136,7 @@ * * LEGACY: FEATURES */ -#define XEN_ELFNOTE_FEATURES 10 +#define XEN_ELFNOTE_FEATURES 10 /* * The kernel requires the symbol table to be loaded (string = "yes" or "no") @@ -144,7 +144,7 @@ * of this string as a boolean flag rather than requiring "yes" or * "no". */ -#define XEN_ELFNOTE_BSD_SYMTAB 11 +#define XEN_ELFNOTE_BSD_SYMTAB 11 /* * The lowest address the hypervisor hole can begin at (numeric). @@ -153,13 +153,13 @@ * also indicates to the hypervisor that the kernel can deal with the * hole starting at a higher address. */ -#define XEN_ELFNOTE_HV_START_LOW 12 +#define XEN_ELFNOTE_HV_START_LOW 12 /* * List of maddr_t-sized mask/value pairs describing how to recognize * (non-present) L1 page table entries carrying valid MFNs (numeric). */ -#define XEN_ELFNOTE_L1_MFN_VALID 13 +#define XEN_ELFNOTE_L1_MFN_VALID 13 /* * Whether or not the guest supports cooperative suspend cancellation. @@ -180,7 +180,7 @@ * this mapping not being accessible through the initial mapping. * (Only x86-64 supports this at present.) */ -#define XEN_ELFNOTE_INIT_P2M 15 +#define XEN_ELFNOTE_INIT_P2M 15 /* * Whether or not the guest can deal with being passed an initrd not @@ -243,7 +243,7 @@ * file. This note doesn't have any other information. * See tools/libxc/xc_core.h for more information. */ -#define XEN_ELFNOTE_DUMPCORE_NONE 0x2000000 +#define XEN_ELFNOTE_DUMPCORE_NONE 0x2000000 /* * xen dump-core header note. @@ -251,7 +251,7 @@ * in its dump file. * See tools/libxc/xc_core.h for more information. */ -#define XEN_ELFNOTE_DUMPCORE_HEADER 0x2000001 +#define XEN_ELFNOTE_DUMPCORE_HEADER 0x2000001 /* * xen dump-core xen version note. @@ -260,7 +260,7 @@ * XENVER hypercall. * See tools/libxc/xc_core.h for more information. */ -#define XEN_ELFNOTE_DUMPCORE_XEN_VERSION 0x2000002 +#define XEN_ELFNOTE_DUMPCORE_XEN_VERSION 0x2000002 /* * xen dump-core format version note. @@ -268,7 +268,7 @@ * in its dump file. It contains a format version identifier. * See tools/libxc/xc_core.h for more information. */ -#define XEN_ELFNOTE_DUMPCORE_FORMAT_VERSION 0x2000003 +#define XEN_ELFNOTE_DUMPCORE_FORMAT_VERSION 0x2000003 #endif /* __XEN_PUBLIC_ELFNOTE_H__ */ diff --git a/include/xen/errno.h b/include/xen/errno.h index e1d02fcdd..8d9e24865 100644 --- a/include/xen/errno.h +++ b/include/xen/errno.h @@ -46,71 +46,73 @@ enum xen_errno { #ifdef XEN_ERRNO -/* - * Values originating from x86 Linux. Please consider using respective - * values when adding new definitions here. - * - * The set of identifiers to be added here shouldn't extend beyond what - * POSIX mandates (see e.g. - * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html) - * with the exception that we support some optional (XSR) values - * specified there (but no new ones should be added). - */ - -XEN_ERRNO(EPERM, 1) /* Operation not permitted */ -XEN_ERRNO(ENOENT, 2) /* No such file or directory */ -XEN_ERRNO(ESRCH, 3) /* No such process */ + /* + * Values originating from x86 Linux. Please consider using respective + * values when adding new definitions here. + * + * The set of identifiers to be added here shouldn't extend beyond what + * POSIX mandates (see e.g. + * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html) + * with the exception that we support some optional (XSR) values + * specified there (but no new ones should be added). + */ + + XEN_ERRNO(EPERM, 1) /* Operation not permitted */ + XEN_ERRNO(ENOENT, 2) /* No such file or directory */ + XEN_ERRNO(ESRCH, 3) /* No such process */ #ifdef __XEN__ /* Internal only, should never be exposed to the guest. */ -XEN_ERRNO(EINTR, 4) /* Interrupted system call */ + XEN_ERRNO(EINTR, 4) /* Interrupted system call */ #endif -XEN_ERRNO(EIO, 5) /* I/O error */ -XEN_ERRNO(ENXIO, 6) /* No such device or address */ -XEN_ERRNO(E2BIG, 7) /* Arg list too long */ -XEN_ERRNO(ENOEXEC, 8) /* Exec format error */ -XEN_ERRNO(EBADF, 9) /* Bad file number */ -XEN_ERRNO(ECHILD, 10) /* No child processes */ -XEN_ERRNO(EAGAIN, 11) /* Try again */ -XEN_ERRNO(EWOULDBLOCK, 11) /* Operation would block. Aliases EAGAIN */ -XEN_ERRNO(ENOMEM, 12) /* Out of memory */ -XEN_ERRNO(EACCES, 13) /* Permission denied */ -XEN_ERRNO(EFAULT, 14) /* Bad address */ -XEN_ERRNO(EBUSY, 16) /* Device or resource busy */ -XEN_ERRNO(EEXIST, 17) /* File exists */ -XEN_ERRNO(EXDEV, 18) /* Cross-device link */ -XEN_ERRNO(ENODEV, 19) /* No such device */ -XEN_ERRNO(EISDIR, 21) /* Is a directory */ -XEN_ERRNO(EINVAL, 22) /* Invalid argument */ -XEN_ERRNO(ENFILE, 23) /* File table overflow */ -XEN_ERRNO(EMFILE, 24) /* Too many open files */ -XEN_ERRNO(ENOSPC, 28) /* No space left on device */ -XEN_ERRNO(EROFS, 30) /* Read-only file system */ -XEN_ERRNO(EMLINK, 31) /* Too many links */ -XEN_ERRNO(EDOM, 33) /* Math argument out of domain of func */ -XEN_ERRNO(ERANGE, 34) /* Math result not representable */ -XEN_ERRNO(EDEADLK, 35) /* Resource deadlock would occur */ -XEN_ERRNO(EDEADLOCK, 35) /* Resource deadlock would occur. Aliases EDEADLK */ -XEN_ERRNO(ENAMETOOLONG, 36) /* File name too long */ -XEN_ERRNO(ENOLCK, 37) /* No record locks available */ -XEN_ERRNO(ENOSYS, 38) /* Function not implemented */ -XEN_ERRNO(ENOTEMPTY, 39) /* Directory not empty */ -XEN_ERRNO(ENODATA, 61) /* No data available */ -XEN_ERRNO(ETIME, 62) /* Timer expired */ -XEN_ERRNO(EBADMSG, 74) /* Not a data message */ -XEN_ERRNO(EOVERFLOW, 75) /* Value too large for defined data type */ -XEN_ERRNO(EILSEQ, 84) /* Illegal byte sequence */ + XEN_ERRNO(EIO, 5) /* I/O error */ + XEN_ERRNO(ENXIO, 6) /* No such device or address */ + XEN_ERRNO(E2BIG, 7) /* Arg list too long */ + XEN_ERRNO(ENOEXEC, 8) /* Exec format error */ + XEN_ERRNO(EBADF, 9) /* Bad file number */ + XEN_ERRNO(ECHILD, 10) /* No child processes */ + XEN_ERRNO(EAGAIN, 11) /* Try again */ + XEN_ERRNO(EWOULDBLOCK, 11) /* Operation would block. Aliases EAGAIN */ + XEN_ERRNO(ENOMEM, 12) /* Out of memory */ + XEN_ERRNO(EACCES, 13) /* Permission denied */ + XEN_ERRNO(EFAULT, 14) /* Bad address */ + XEN_ERRNO(EBUSY, 16) /* Device or resource busy */ + XEN_ERRNO(EEXIST, 17) /* File exists */ + XEN_ERRNO(EXDEV, 18) /* Cross-device link */ + XEN_ERRNO(ENODEV, 19) /* No such device */ + XEN_ERRNO(EISDIR, 21) /* Is a directory */ + XEN_ERRNO(EINVAL, 22) /* Invalid argument */ + XEN_ERRNO(ENFILE, 23) /* File table overflow */ + XEN_ERRNO(EMFILE, 24) /* Too many open files */ + XEN_ERRNO(ENOSPC, 28) /* No space left on device */ + XEN_ERRNO(EROFS, 30) /* Read-only file system */ + XEN_ERRNO(EMLINK, 31) /* Too many links */ + XEN_ERRNO(EDOM, 33) /* Math argument out of domain of func */ + XEN_ERRNO(ERANGE, 34) /* Math result not representable */ + XEN_ERRNO(EDEADLK, 35) /* Resource deadlock would occur */ + XEN_ERRNO(EDEADLOCK, + 35) /* Resource deadlock would occur. Aliases EDEADLK */ + XEN_ERRNO(ENAMETOOLONG, 36) /* File name too long */ + XEN_ERRNO(ENOLCK, 37) /* No record locks available */ + XEN_ERRNO(ENOSYS, 38) /* Function not implemented */ + XEN_ERRNO(ENOTEMPTY, 39) /* Directory not empty */ + XEN_ERRNO(ENODATA, 61) /* No data available */ + XEN_ERRNO(ETIME, 62) /* Timer expired */ + XEN_ERRNO(EBADMSG, 74) /* Not a data message */ + XEN_ERRNO(EOVERFLOW, 75) /* Value too large for defined data type */ + XEN_ERRNO(EILSEQ, 84) /* Illegal byte sequence */ #ifdef __XEN__ /* Internal only, should never be exposed to the guest. */ -XEN_ERRNO(ERESTART, 85) /* Interrupted system call should be restarted */ + XEN_ERRNO(ERESTART, 85) /* Interrupted system call should be restarted */ #endif -XEN_ERRNO(ENOTSOCK, 88) /* Socket operation on non-socket */ -XEN_ERRNO(EMSGSIZE, 90) /* Message too large. */ -XEN_ERRNO(EOPNOTSUPP, 95) /* Operation not supported on transport endpoint */ -XEN_ERRNO(EADDRINUSE, 98) /* Address already in use */ -XEN_ERRNO(EADDRNOTAVAIL, 99) /* Cannot assign requested address */ -XEN_ERRNO(ENOBUFS, 105) /* No buffer space available */ -XEN_ERRNO(EISCONN, 106) /* Transport endpoint is already connected */ -XEN_ERRNO(ENOTCONN, 107) /* Transport endpoint is not connected */ -XEN_ERRNO(ETIMEDOUT, 110) /* Connection timed out */ -XEN_ERRNO(ECONNREFUSED, 111) /* Connection refused */ + XEN_ERRNO(ENOTSOCK, 88) /* Socket operation on non-socket */ + XEN_ERRNO(EMSGSIZE, 90) /* Message too large. */ + XEN_ERRNO(EOPNOTSUPP, + 95) /* Operation not supported on transport endpoint */ + XEN_ERRNO(EADDRINUSE, 98) /* Address already in use */ + XEN_ERRNO(EADDRNOTAVAIL, 99) /* Cannot assign requested address */ + XEN_ERRNO(ENOBUFS, 105) /* No buffer space available */ + XEN_ERRNO(EISCONN, 106) /* Transport endpoint is already connected */ + XEN_ERRNO(ENOTCONN, 107) /* Transport endpoint is not connected */ + XEN_ERRNO(ETIMEDOUT, 110) /* Connection timed out */ + XEN_ERRNO(ECONNREFUSED, 111) /* Connection refused */ #undef XEN_ERRNO #endif /* XEN_ERRNO */ diff --git a/include/xen/event_channel.h b/include/xen/event_channel.h index 44c549dd6..900f8216f 100644 --- a/include/xen/event_channel.h +++ b/include/xen/event_channel.h @@ -70,10 +70,10 @@ #define EVTCHNOP_bind_ipi 7 #define EVTCHNOP_bind_vcpu 8 #define EVTCHNOP_unmask 9 -#define EVTCHNOP_reset 10 -#define EVTCHNOP_init_control 11 -#define EVTCHNOP_expand_array 12 -#define EVTCHNOP_set_priority 13 +#define EVTCHNOP_reset 10 +#define EVTCHNOP_init_control 11 +#define EVTCHNOP_expand_array 12 +#define EVTCHNOP_set_priority 13 /* ` } */ typedef uint32_t evtchn_port_t; @@ -205,27 +205,27 @@ typedef struct evtchn_send evtchn_send_t; */ struct evtchn_status { /* IN parameters */ - domid_t dom; + domid_t dom; evtchn_port_t port; /* OUT parameters */ -#define EVTCHNSTAT_closed 0 /* Channel is not in use. */ -#define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/ -#define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */ -#define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */ -#define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */ -#define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */ +#define EVTCHNSTAT_closed 0 /* Channel is not in use. */ +#define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/ +#define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */ +#define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */ +#define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */ +#define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */ uint32_t status; - uint32_t vcpu; /* VCPU to which this channel is bound. */ + uint32_t vcpu; /* VCPU to which this channel is bound. */ union { struct { domid_t dom; - } unbound; /* EVTCHNSTAT_unbound */ + } unbound; /* EVTCHNSTAT_unbound */ struct { domid_t dom; evtchn_port_t port; - } interdomain; /* EVTCHNSTAT_interdomain */ - uint32_t pirq; /* EVTCHNSTAT_pirq */ - uint32_t virq; /* EVTCHNSTAT_virq */ + } interdomain; /* EVTCHNSTAT_interdomain */ + uint32_t pirq; /* EVTCHNSTAT_pirq */ + uint32_t virq; /* EVTCHNSTAT_virq */ } u; }; typedef struct evtchn_status evtchn_status_t; @@ -321,16 +321,16 @@ typedef struct evtchn_set_priority evtchn_set_priority_t; struct evtchn_op { uint32_t cmd; /* enum event_channel_op */ union { - struct evtchn_alloc_unbound alloc_unbound; + struct evtchn_alloc_unbound alloc_unbound; struct evtchn_bind_interdomain bind_interdomain; - struct evtchn_bind_virq bind_virq; - struct evtchn_bind_pirq bind_pirq; - struct evtchn_bind_ipi bind_ipi; - struct evtchn_close close; - struct evtchn_send send; - struct evtchn_status status; - struct evtchn_bind_vcpu bind_vcpu; - struct evtchn_unmask unmask; + struct evtchn_bind_virq bind_virq; + struct evtchn_bind_pirq bind_pirq; + struct evtchn_bind_ipi bind_ipi; + struct evtchn_close close; + struct evtchn_send send; + struct evtchn_status status; + struct evtchn_bind_vcpu bind_vcpu; + struct evtchn_unmask unmask; } u; }; typedef struct evtchn_op evtchn_op_t; diff --git a/include/xen/features.h b/include/xen/features.h index 1613b2aab..05423fc9b 100644 --- a/include/xen/features.h +++ b/include/xen/features.h @@ -45,7 +45,7 @@ * If set, the guest does not need to write-protect its pagetables, and can * update them via direct writes. */ -#define XENFEAT_writable_page_tables 0 +#define XENFEAT_writable_page_tables 0 /* * If set, the guest does not need to write-protect its segment descriptor @@ -59,40 +59,40 @@ * mode the guest does not need to perform phys-to/from-machine translations * when performing page table operations. */ -#define XENFEAT_auto_translated_physmap 2 +#define XENFEAT_auto_translated_physmap 2 /* If set, the guest is running in supervisor mode (e.g., x86 ring 0). */ -#define XENFEAT_supervisor_mode_kernel 3 +#define XENFEAT_supervisor_mode_kernel 3 /* * If set, the guest does not need to allocate x86 PAE page directories * below 4GB. This flag is usually implied by auto_translated_physmap. */ -#define XENFEAT_pae_pgdir_above_4gb 4 +#define XENFEAT_pae_pgdir_above_4gb 4 /* x86: Does this Xen host support the MMU_PT_UPDATE_PRESERVE_AD hypercall? */ -#define XENFEAT_mmu_pt_update_preserve_ad 5 +#define XENFEAT_mmu_pt_update_preserve_ad 5 /* x86: Does this Xen host support the MMU_{CLEAR,COPY}_PAGE hypercall? */ -#define XENFEAT_highmem_assist 6 +#define XENFEAT_highmem_assist 6 /* * If set, GNTTABOP_map_grant_ref honors flags to be placed into guest kernel * available pte bits. */ -#define XENFEAT_gnttab_map_avail_bits 7 +#define XENFEAT_gnttab_map_avail_bits 7 /* x86: Does this Xen host support the HVM callback vector type? */ -#define XENFEAT_hvm_callback_vector 8 +#define XENFEAT_hvm_callback_vector 8 /* x86: pvclock algorithm is safe to use on HVM */ -#define XENFEAT_hvm_safe_pvclock 9 +#define XENFEAT_hvm_safe_pvclock 9 /* x86: pirq can be used by HVM guests */ -#define XENFEAT_hvm_pirqs 10 +#define XENFEAT_hvm_pirqs 10 /* operation as Dom0 is supported */ -#define XENFEAT_dom0 11 +#define XENFEAT_dom0 11 /* Xen also maps grant references at pfn = mfn. * This feature flag is deprecated and should not be used. @@ -103,7 +103,7 @@ #define XENFEAT_memory_op_vnode_supported 13 /* arm: Hypervisor supports ARM SMC calling convention. */ -#define XENFEAT_ARM_SMCCC_supported 14 +#define XENFEAT_ARM_SMCCC_supported 14 /* * x86/PVH: If set, ACPI RSDP can be placed at any address. Otherwise RSDP @@ -112,7 +112,7 @@ * This feature flag is only consulted if XEN_ELFNOTE_GUEST_OS contains * the "linux" string. */ -#define XENFEAT_linux_rsdp_unrestricted 15 +#define XENFEAT_linux_rsdp_unrestricted 15 #define XENFEAT_NR_SUBMAPS 1 diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index 3b7bf93d7..d71823d8f 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h @@ -125,14 +125,14 @@ typedef uint32_t grant_ref_t; * for backwards compatibility. New guests should use version 2. */ #if __XEN_INTERFACE_VERSION__ < 0x0003020a -#define grant_entry_v1 grant_entry +#define grant_entry_v1 grant_entry #define grant_entry_v1_t grant_entry_t #endif struct grant_entry_v1 { /* GTF_xxx: various type and flag information. [XEN,GST] */ uint16_t flags; /* The domain being granted foreign privileges. [GST] */ - domid_t domid; + domid_t domid; /* * GTF_permit_access: GFN that @domid is allowed to map and access. [GST] * GTF_accept_transfer: GFN that @domid is allowed to transfer into. [GST] @@ -146,9 +146,9 @@ typedef struct grant_entry_v1 grant_entry_v1_t; /* The first few grant table entries will be preserved across grant table * version changes and may be pre-populated at domain creation by tools. */ -#define GNTTAB_NR_RESERVED_ENTRIES 8 -#define GNTTAB_RESERVED_CONSOLE 0 -#define GNTTAB_RESERVED_XENSTORE 1 +#define GNTTAB_NR_RESERVED_ENTRIES 8 +#define GNTTAB_RESERVED_CONSOLE 0 +#define GNTTAB_RESERVED_XENSTORE 1 /* * Type of grant entry. @@ -159,11 +159,11 @@ typedef struct grant_entry_v1 grant_entry_v1_t; * GTF_transitive: Allow @domid to transitively access a subrange of * @trans_grant in @trans_domid. No mappings are allowed. */ -#define GTF_invalid (0U<<0) -#define GTF_permit_access (1U<<0) -#define GTF_accept_transfer (2U<<0) -#define GTF_transitive (3U<<0) -#define GTF_type_mask (3U<<0) +#define GTF_invalid (0U << 0) +#define GTF_permit_access (1U << 0) +#define GTF_accept_transfer (2U << 0) +#define GTF_transitive (3U << 0) +#define GTF_type_mask (3U << 0) /* * Subflags for GTF_permit_access. @@ -175,20 +175,20 @@ typedef struct grant_entry_v1 grant_entry_v1_t; * will only be allowed to copy from the grant, and not * map it. [GST] */ -#define _GTF_readonly (2) -#define GTF_readonly (1U<<_GTF_readonly) -#define _GTF_reading (3) -#define GTF_reading (1U<<_GTF_reading) -#define _GTF_writing (4) -#define GTF_writing (1U<<_GTF_writing) -#define _GTF_PWT (5) -#define GTF_PWT (1U<<_GTF_PWT) -#define _GTF_PCD (6) -#define GTF_PCD (1U<<_GTF_PCD) -#define _GTF_PAT (7) -#define GTF_PAT (1U<<_GTF_PAT) -#define _GTF_sub_page (8) -#define GTF_sub_page (1U<<_GTF_sub_page) +#define _GTF_readonly (2) +#define GTF_readonly (1U << _GTF_readonly) +#define _GTF_reading (3) +#define GTF_reading (1U << _GTF_reading) +#define _GTF_writing (4) +#define GTF_writing (1U << _GTF_writing) +#define _GTF_PWT (5) +#define GTF_PWT (1U << _GTF_PWT) +#define _GTF_PCD (6) +#define GTF_PCD (1U << _GTF_PCD) +#define _GTF_PAT (7) +#define GTF_PAT (1U << _GTF_PAT) +#define _GTF_sub_page (8) +#define GTF_sub_page (1U << _GTF_sub_page) /* * Subflags for GTF_accept_transfer: @@ -201,9 +201,9 @@ typedef struct grant_entry_v1 grant_entry_v1_t; * address, followed by ORing this flag, in a timely manner. */ #define _GTF_transfer_committed (2) -#define GTF_transfer_committed (1U<<_GTF_transfer_committed) +#define GTF_transfer_committed (1U << _GTF_transfer_committed) #define _GTF_transfer_completed (3) -#define GTF_transfer_completed (1U<<_GTF_transfer_completed) +#define GTF_transfer_completed (1U << _GTF_transfer_completed) /* * Version 2 grant table entries. These fulfil the same role as @@ -222,7 +222,7 @@ typedef struct grant_entry_v1 grant_entry_v1_t; */ struct grant_entry_header { uint16_t flags; - domid_t domid; + domid_t domid; }; typedef struct grant_entry_header grant_entry_header_t; @@ -298,20 +298,20 @@ typedef uint16_t grant_status_t; */ /* ` enum grant_table_op { // GNTTABOP_* => struct gnttab_* */ -#define GNTTABOP_map_grant_ref 0 -#define GNTTABOP_unmap_grant_ref 1 -#define GNTTABOP_setup_table 2 -#define GNTTABOP_dump_table 3 -#define GNTTABOP_transfer 4 -#define GNTTABOP_copy 5 -#define GNTTABOP_query_size 6 -#define GNTTABOP_unmap_and_replace 7 +#define GNTTABOP_map_grant_ref 0 +#define GNTTABOP_unmap_grant_ref 1 +#define GNTTABOP_setup_table 2 +#define GNTTABOP_dump_table 3 +#define GNTTABOP_transfer 4 +#define GNTTABOP_copy 5 +#define GNTTABOP_query_size 6 +#define GNTTABOP_unmap_and_replace 7 #if __XEN_INTERFACE_VERSION__ >= 0x0003020a -#define GNTTABOP_set_version 8 -#define GNTTABOP_get_status_frames 9 -#define GNTTABOP_get_version 10 -#define GNTTABOP_swap_grant_ref 11 -#define GNTTABOP_cache_flush 12 +#define GNTTABOP_set_version 8 +#define GNTTABOP_get_status_frames 9 +#define GNTTABOP_get_version 10 +#define GNTTABOP_swap_grant_ref 11 +#define GNTTABOP_cache_flush 12 #endif /* __XEN_INTERFACE_VERSION__ */ /* ` } */ @@ -340,11 +340,11 @@ typedef uint32_t grant_handle_t; struct gnttab_map_grant_ref { /* IN parameters. */ uint64_t host_addr; - uint32_t flags; /* GNTMAP_* */ + uint32_t flags; /* GNTMAP_* */ grant_ref_t ref; - domid_t dom; + domid_t dom; /* OUT parameters. */ - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ grant_handle_t handle; uint64_t dev_bus_addr; }; @@ -368,7 +368,7 @@ struct gnttab_unmap_grant_ref { uint64_t dev_bus_addr; grant_handle_t handle; /* OUT parameters. */ - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ }; typedef struct gnttab_unmap_grant_ref gnttab_unmap_grant_ref_t; DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t); @@ -384,10 +384,10 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t); */ struct gnttab_setup_table { /* IN parameters. */ - domid_t dom; + domid_t dom; uint32_t nr_frames; /* OUT parameters. */ - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ #if __XEN_INTERFACE_VERSION__ < 0x00040300 XEN_GUEST_HANDLE(ulong) frame_list; #else @@ -405,7 +405,7 @@ struct gnttab_dump_table { /* IN parameters. */ domid_t dom; /* OUT parameters. */ - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ }; typedef struct gnttab_dump_table gnttab_dump_table_t; DEFINE_XEN_GUEST_HANDLE(gnttab_dump_table_t); @@ -421,11 +421,11 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_dump_table_t); */ struct gnttab_transfer { /* IN parameters. */ - xen_pfn_t mfn; - domid_t domid; - grant_ref_t ref; + xen_pfn_t mfn; + domid_t domid; + grant_ref_t ref; /* OUT parameters. */ - int16_t status; + int16_t status; }; typedef struct gnttab_transfer gnttab_transfer_t; DEFINE_XEN_GUEST_HANDLE(gnttab_transfer_t); @@ -449,27 +449,27 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_transfer_t); * bytes to be copied. */ -#define _GNTCOPY_source_gref (0) -#define GNTCOPY_source_gref (1<<_GNTCOPY_source_gref) -#define _GNTCOPY_dest_gref (1) -#define GNTCOPY_dest_gref (1<<_GNTCOPY_dest_gref) +#define _GNTCOPY_source_gref (0) +#define GNTCOPY_source_gref (1 << _GNTCOPY_source_gref) +#define _GNTCOPY_dest_gref (1) +#define GNTCOPY_dest_gref (1 << _GNTCOPY_dest_gref) struct gnttab_copy { /* IN parameters. */ struct gnttab_copy_ptr { union { grant_ref_t ref; - xen_pfn_t gmfn; + xen_pfn_t gmfn; } u; - domid_t domid; + domid_t domid; uint16_t offset; } source, dest; - uint16_t len; - uint16_t flags; /* GNTCOPY_* */ + uint16_t len; + uint16_t flags; /* GNTCOPY_* */ /* OUT parameters. */ - int16_t status; + int16_t status; }; -typedef struct gnttab_copy gnttab_copy_t; +typedef struct gnttab_copy gnttab_copy_t; DEFINE_XEN_GUEST_HANDLE(gnttab_copy_t); /* @@ -481,11 +481,11 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_copy_t); */ struct gnttab_query_size { /* IN parameters. */ - domid_t dom; + domid_t dom; /* OUT parameters. */ uint32_t nr_frames; uint32_t max_nr_frames; - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ }; typedef struct gnttab_query_size gnttab_query_size_t; DEFINE_XEN_GUEST_HANDLE(gnttab_query_size_t); @@ -507,7 +507,7 @@ struct gnttab_unmap_and_replace { uint64_t new_addr; grant_handle_t handle; /* OUT parameters. */ - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ }; typedef struct gnttab_unmap_and_replace gnttab_unmap_and_replace_t; DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t); @@ -542,9 +542,9 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_set_version_t); struct gnttab_get_status_frames { /* IN parameters. */ uint32_t nr_frames; - domid_t dom; + domid_t dom; /* OUT parameters. */ - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ XEN_GUEST_HANDLE(uint64_t) frame_list; }; typedef struct gnttab_get_status_frames gnttab_get_status_frames_t; @@ -572,7 +572,7 @@ struct gnttab_swap_grant_ref { grant_ref_t ref_a; grant_ref_t ref_b; /* OUT parameters */ - int16_t status; /* => enum grant_status */ + int16_t status; /* => enum grant_status */ }; typedef struct gnttab_swap_grant_ref gnttab_swap_grant_ref_t; DEFINE_XEN_GUEST_HANDLE(gnttab_swap_grant_ref_t); @@ -588,9 +588,9 @@ struct gnttab_cache_flush { } a; uint16_t offset; /* offset from start of grant */ uint16_t length; /* size within the grant */ -#define GNTTAB_CACHE_CLEAN (1u<<0) -#define GNTTAB_CACHE_INVAL (1u<<1) -#define GNTTAB_CACHE_SOURCE_GREF (1u<<31) +#define GNTTAB_CACHE_CLEAN (1u << 0) +#define GNTTAB_CACHE_INVAL (1u << 1) +#define GNTTAB_CACHE_SOURCE_GREF (1u << 31) uint32_t op; }; typedef struct gnttab_cache_flush gnttab_cache_flush_t; @@ -601,33 +601,33 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_cache_flush_t); /* * Bitfield values for gnttab_map_grant_ref.flags. */ - /* Map the grant entry for access by I/O devices. */ -#define _GNTMAP_device_map (0) -#define GNTMAP_device_map (1<<_GNTMAP_device_map) - /* Map the grant entry for access by host CPUs. */ -#define _GNTMAP_host_map (1) -#define GNTMAP_host_map (1<<_GNTMAP_host_map) - /* Accesses to the granted frame will be restricted to read-only access. */ -#define _GNTMAP_readonly (2) -#define GNTMAP_readonly (1<<_GNTMAP_readonly) - /* - * GNTMAP_host_map subflag: - * 0 => The host mapping is usable only by the guest OS. - * 1 => The host mapping is usable by guest OS + current application. - */ +/* Map the grant entry for access by I/O devices. */ +#define _GNTMAP_device_map (0) +#define GNTMAP_device_map (1 << _GNTMAP_device_map) +/* Map the grant entry for access by host CPUs. */ +#define _GNTMAP_host_map (1) +#define GNTMAP_host_map (1 << _GNTMAP_host_map) +/* Accesses to the granted frame will be restricted to read-only access. */ +#define _GNTMAP_readonly (2) +#define GNTMAP_readonly (1 << _GNTMAP_readonly) +/* + * GNTMAP_host_map subflag: + * 0 => The host mapping is usable only by the guest OS. + * 1 => The host mapping is usable by guest OS + current application. + */ #define _GNTMAP_application_map (3) -#define GNTMAP_application_map (1<<_GNTMAP_application_map) +#define GNTMAP_application_map (1 << _GNTMAP_application_map) - /* - * GNTMAP_contains_pte subflag: - * 0 => This map request contains a host virtual address. - * 1 => This map request contains the machine addess of the PTE to update. - */ -#define _GNTMAP_contains_pte (4) -#define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte) +/* + * GNTMAP_contains_pte subflag: + * 0 => This map request contains a host virtual address. + * 1 => This map request contains the machine addess of the PTE to update. + */ +#define _GNTMAP_contains_pte (4) +#define GNTMAP_contains_pte (1 << _GNTMAP_contains_pte) -#define _GNTMAP_can_fail (5) -#define GNTMAP_can_fail (1<<_GNTMAP_can_fail) +#define _GNTMAP_can_fail (5) +#define GNTMAP_can_fail (1 << _GNTMAP_can_fail) /* * Bits to be placed in guest kernel available PTE bits (architecture @@ -640,36 +640,35 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_cache_flush_t); * Values for error status returns. All errors are -ve. */ /* ` enum grant_status { */ -#define GNTST_okay (0) /* Normal return. */ -#define GNTST_general_error (-1) /* General undefined error. */ -#define GNTST_bad_domain (-2) /* Unrecognsed domain id. */ -#define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntref. */ -#define GNTST_bad_handle (-4) /* Unrecognised or inappropriate handle. */ -#define GNTST_bad_virt_addr (-5) /* Inappropriate virtual address to map. */ -#define GNTST_bad_dev_addr (-6) /* Inappropriate device address to unmap.*/ -#define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */ -#define GNTST_permission_denied (-8) /* Not enough privilege for operation. */ -#define GNTST_bad_page (-9) /* Specified page was invalid for op. */ +#define GNTST_okay (0) /* Normal return. */ +#define GNTST_general_error (-1) /* General undefined error. */ +#define GNTST_bad_domain (-2) /* Unrecognsed domain id. */ +#define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntref. */ +#define GNTST_bad_handle (-4) /* Unrecognised or inappropriate handle. */ +#define GNTST_bad_virt_addr (-5) /* Inappropriate virtual address to map. */ +#define GNTST_bad_dev_addr (-6) /* Inappropriate device address to unmap.*/ +#define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */ +#define GNTST_permission_denied (-8) /* Not enough privilege for operation. */ +#define GNTST_bad_page (-9) /* Specified page was invalid for op. */ #define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary. */ -#define GNTST_address_too_big (-11) /* transfer page address too large. */ +#define GNTST_address_too_big (-11) /* transfer page address too large. */ #define GNTST_eagain (-12) /* Operation not done; try again. */ /* ` } */ -#define GNTTABOP_error_msgs { \ - "okay", \ - "undefined error", \ - "unrecognised domain id", \ - "invalid grant reference", \ - "invalid mapping handle", \ - "invalid virtual address", \ - "invalid device address", \ - "no spare translation slot in the I/O MMU", \ - "permission denied", \ - "bad page", \ - "copy arguments cross page boundary", \ - "page address size too large", \ - "operation not done; try again" \ -} +#define GNTTABOP_error_msgs \ + {"okay", \ + "undefined error", \ + "unrecognised domain id", \ + "invalid grant reference", \ + "invalid mapping handle", \ + "invalid virtual address", \ + "invalid device address", \ + "no spare translation slot in the I/O MMU", \ + "permission denied", \ + "bad page", \ + "copy arguments cross page boundary", \ + "page address size too large", \ + "operation not done; try again"} #endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */ diff --git a/include/xen/hvm/dm_op.h b/include/xen/hvm/dm_op.h index d3b554d01..4013a9543 100644 --- a/include/xen/hvm/dm_op.h +++ b/include/xen/hvm/dm_op.h @@ -104,7 +104,7 @@ struct xen_dm_op_get_ioreq_server_info { uint16_t flags; #define _XEN_DMOP_no_gfns 0 -#define XEN_DMOP_no_gfns (1u << _XEN_DMOP_no_gfns) +#define XEN_DMOP_no_gfns (1u << _XEN_DMOP_no_gfns) /* OUT - buffered ioreq port */ evtchn_port_t bufioreq_port; @@ -133,7 +133,7 @@ struct xen_dm_op_get_ioreq_server_info { * NOTE: unless an emulation request falls entirely within a range mapped * by a secondary emulator, it will not be passed to that emulator. */ -#define XEN_DMOP_map_io_range_to_ioreq_server 3 +#define XEN_DMOP_map_io_range_to_ioreq_server 3 #define XEN_DMOP_unmap_io_range_from_ioreq_server 4 struct xen_dm_op_ioreq_server_range { @@ -142,18 +142,16 @@ struct xen_dm_op_ioreq_server_range { uint16_t pad; /* IN - type of range */ uint32_t type; -# define XEN_DMOP_IO_RANGE_PORT 0 /* I/O port range */ -# define XEN_DMOP_IO_RANGE_MEMORY 1 /* MMIO range */ -# define XEN_DMOP_IO_RANGE_PCI 2 /* PCI segment/bus/dev/func range */ +#define XEN_DMOP_IO_RANGE_PORT 0 /* I/O port range */ +#define XEN_DMOP_IO_RANGE_MEMORY 1 /* MMIO range */ +#define XEN_DMOP_IO_RANGE_PCI 2 /* PCI segment/bus/dev/func range */ /* IN - inclusive start and end of range */ uint64_aligned_t start, end; }; -#define XEN_DMOP_PCI_SBDF(s,b,d,f) \ - ((((s) & 0xffff) << 16) | \ - (((b) & 0xff) << 8) | \ - (((d) & 0x1f) << 3) | \ - ((f) & 0x07)) +#define XEN_DMOP_PCI_SBDF(s, b, d, f) \ + ((((s) & 0xffff) << 16) | (((b) & 0xff) << 8) | (((d) & 0x1f) << 3) | \ + ((f) & 0x07)) /* * XEN_DMOP_set_ioreq_server_state: Enable or disable the IOREQ Server @@ -215,7 +213,7 @@ struct xen_dm_op_set_pci_intx_level { uint16_t domain; uint8_t bus, device, intx; /* IN - Level: 0 -> deasserted, 1 -> asserted */ - uint8_t level; + uint8_t level; }; /* @@ -226,9 +224,9 @@ struct xen_dm_op_set_pci_intx_level { struct xen_dm_op_set_isa_irq_level { /* IN - ISA IRQ (0-15) */ - uint8_t isa_irq; + uint8_t isa_irq; /* IN - Level: 0 -> deasserted, 1 -> asserted */ - uint8_t level; + uint8_t level; }; /* @@ -238,9 +236,9 @@ struct xen_dm_op_set_isa_irq_level { struct xen_dm_op_set_pci_link_route { /* PCI INTx line (0-3) */ - uint8_t link; + uint8_t link; /* ISA IRQ (1-15) or 0 -> disable link */ - uint8_t isa_irq; + uint8_t isa_irq; }; /* @@ -312,12 +310,12 @@ struct xen_dm_op_inject_event { /* IN - event type (DMOP_EVENT_* ) */ uint8_t type; /* NB. This enumeration precisely matches hvm.h:X86_EVENTTYPE_* */ -# define XEN_DMOP_EVENT_ext_int 0 /* external interrupt */ -# define XEN_DMOP_EVENT_nmi 2 /* nmi */ -# define XEN_DMOP_EVENT_hw_exc 3 /* hardware exception */ -# define XEN_DMOP_EVENT_sw_int 4 /* software interrupt (CD nn) */ -# define XEN_DMOP_EVENT_pri_sw_exc 5 /* ICEBP (F1) */ -# define XEN_DMOP_EVENT_sw_exc 6 /* INT3 (CC), INTO (CE) */ +#define XEN_DMOP_EVENT_ext_int 0 /* external interrupt */ +#define XEN_DMOP_EVENT_nmi 2 /* nmi */ +#define XEN_DMOP_EVENT_hw_exc 3 /* hardware exception */ +#define XEN_DMOP_EVENT_sw_int 4 /* software interrupt (CD nn) */ +#define XEN_DMOP_EVENT_pri_sw_exc 5 /* ICEBP (F1) */ +#define XEN_DMOP_EVENT_sw_exc 6 /* INT3 (CC), INTO (CE) */ /* IN - instruction length */ uint8_t insn_len; uint8_t pad0; @@ -354,17 +352,17 @@ struct xen_dm_op_inject_msi { #define XEN_DMOP_map_mem_type_to_ioreq_server 15 struct xen_dm_op_map_mem_type_to_ioreq_server { - ioservid_t id; /* IN - ioreq server id */ - uint16_t type; /* IN - memory type */ - uint32_t flags; /* IN - types of accesses to be forwarded to the - ioreq server. flags with 0 means to unmap the - ioreq server */ + ioservid_t id; /* IN - ioreq server id */ + uint16_t type; /* IN - memory type */ + uint32_t flags; /* IN - types of accesses to be forwarded to the + ioreq server. flags with 0 means to unmap the + ioreq server */ -#define XEN_DMOP_IOREQ_MEM_ACCESS_READ (1u << 0) +#define XEN_DMOP_IOREQ_MEM_ACCESS_READ (1u << 0) #define XEN_DMOP_IOREQ_MEM_ACCESS_WRITE (1u << 1) - uint64_t opaque; /* IN/OUT - only used for hypercall continuation, - has to be set to zero by the caller */ + uint64_t opaque; /* IN/OUT - only used for hypercall continuation, + has to be set to zero by the caller */ }; /* @@ -374,8 +372,8 @@ struct xen_dm_op_map_mem_type_to_ioreq_server { #define XEN_DMOP_remote_shutdown 16 struct xen_dm_op_remote_shutdown { - uint32_t reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ - /* (Other reason values are not blocked) */ + uint32_t reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ + /* (Other reason values are not blocked) */ }; /* @@ -404,16 +402,16 @@ struct xen_dm_op_relocate_memory { struct xen_dm_op_pin_memory_cacheattr { uint64_aligned_t start; /* Start gfn. */ - uint64_aligned_t end; /* End gfn. */ + uint64_aligned_t end; /* End gfn. */ /* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */ -#define XEN_DMOP_MEM_CACHEATTR_UC 0 -#define XEN_DMOP_MEM_CACHEATTR_WC 1 -#define XEN_DMOP_MEM_CACHEATTR_WT 4 -#define XEN_DMOP_MEM_CACHEATTR_WP 5 -#define XEN_DMOP_MEM_CACHEATTR_WB 6 -#define XEN_DMOP_MEM_CACHEATTR_UCM 7 +#define XEN_DMOP_MEM_CACHEATTR_UC 0 +#define XEN_DMOP_MEM_CACHEATTR_WC 1 +#define XEN_DMOP_MEM_CACHEATTR_WT 4 +#define XEN_DMOP_MEM_CACHEATTR_WP 5 +#define XEN_DMOP_MEM_CACHEATTR_WB 6 +#define XEN_DMOP_MEM_CACHEATTR_UCM 7 #define XEN_DMOP_DELETE_MEM_CACHEATTR (~(uint32_t)0) - uint32_t type; /* XEN_DMOP_MEM_CACHEATTR_* */ + uint32_t type; /* XEN_DMOP_MEM_CACHEATTR_* */ uint32_t pad; }; @@ -436,7 +434,7 @@ struct xen_dm_op { struct xen_dm_op_inject_event inject_event; struct xen_dm_op_inject_msi inject_msi; struct xen_dm_op_map_mem_type_to_ioreq_server - map_mem_type_to_ioreq_server; + map_mem_type_to_ioreq_server; struct xen_dm_op_remote_shutdown remote_shutdown; struct xen_dm_op_relocate_memory relocate_memory; struct xen_dm_op_pin_memory_cacheattr pin_memory_cacheattr; diff --git a/include/xen/hvm/e820.h b/include/xen/hvm/e820.h index 4c42f3341..5140647b6 100644 --- a/include/xen/hvm/e820.h +++ b/include/xen/hvm/e820.h @@ -26,13 +26,13 @@ #include "../xen.h" /* E820 location in HVM virtual address space. */ -#define HVM_E820_PAGE 0x00090000 -#define HVM_E820_NR_OFFSET 0x000001E8 -#define HVM_E820_OFFSET 0x000002D0 +#define HVM_E820_PAGE 0x00090000 +#define HVM_E820_NR_OFFSET 0x000001E8 +#define HVM_E820_OFFSET 0x000002D0 -#define HVM_BELOW_4G_RAM_END 0xF0000000 -#define HVM_BELOW_4G_MMIO_START HVM_BELOW_4G_RAM_END -#define HVM_BELOW_4G_MMIO_LENGTH ((xen_mk_ullong(1) << 32) - \ - HVM_BELOW_4G_MMIO_START) +#define HVM_BELOW_4G_RAM_END 0xF0000000 +#define HVM_BELOW_4G_MMIO_START HVM_BELOW_4G_RAM_END +#define HVM_BELOW_4G_MMIO_LENGTH \ + ((xen_mk_ullong(1) << 32) - HVM_BELOW_4G_MMIO_START) #endif /* __XEN_PUBLIC_HVM_E820_H__ */ diff --git a/include/xen/hvm/hvm_info_table.h b/include/xen/hvm/hvm_info_table.h index c46e03ef1..f71420907 100644 --- a/include/xen/hvm/hvm_info_table.h +++ b/include/xen/hvm/hvm_info_table.h @@ -27,12 +27,12 @@ #ifndef __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ #define __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ -#define HVM_INFO_PFN 0x09F -#define HVM_INFO_OFFSET 0x800 -#define HVM_INFO_PADDR ((HVM_INFO_PFN << 12) + HVM_INFO_OFFSET) +#define HVM_INFO_PFN 0x09F +#define HVM_INFO_OFFSET 0x800 +#define HVM_INFO_PADDR ((HVM_INFO_PFN << 12) + HVM_INFO_OFFSET) /* Maximum we can support with current vLAPIC ID mapping. */ -#define HVM_MAX_VCPUS 128 +#define HVM_MAX_VCPUS 128 /* * In some cases SMP HVM guests may require knowledge of Xen's idea of vCPU ids @@ -43,15 +43,15 @@ */ struct hvm_info_table { - char signature[8]; /* "HVM INFO" */ - uint32_t length; - uint8_t checksum; + char signature[8]; /* "HVM INFO" */ + uint32_t length; + uint8_t checksum; /* Should firmware build APIC descriptors (APIC MADT / MP BIOS)? */ - uint8_t apic_mode; + uint8_t apic_mode; /* How many CPUs does this domain have? */ - uint32_t nr_vcpus; + uint32_t nr_vcpus; /* * MEMORY MAP provided by HVM domain builder. @@ -63,20 +63,20 @@ struct hvm_info_table { * 0x0 to page_to_phys(low_mem_pgend)-1: * RAM below 4GB (except for VGA hole 0xA0000-0xBFFFF) */ - uint32_t low_mem_pgend; + uint32_t low_mem_pgend; /* * page_to_phys(reserved_mem_pgstart) to 0xFFFFFFFF: * Reserved for special memory mappings */ - uint32_t reserved_mem_pgstart; + uint32_t reserved_mem_pgstart; /* * 0x100000000 to page_to_phys(high_mem_pgend)-1: * RAM above 4GB */ - uint32_t high_mem_pgend; + uint32_t high_mem_pgend; /* Bitmap of which CPUs are online at boot time. */ - uint8_t vcpu_online[(HVM_MAX_VCPUS + 7)/8]; + uint8_t vcpu_online[(HVM_MAX_VCPUS + 7) / 8]; }; #endif /* __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ */ diff --git a/include/xen/hvm/hvm_op.h b/include/xen/hvm/hvm_op.h index 353f8034d..913c729a0 100644 --- a/include/xen/hvm/hvm_op.h +++ b/include/xen/hvm/hvm_op.h @@ -28,12 +28,12 @@ #include "../event_channel.h" /* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */ -#define HVMOP_set_param 0 -#define HVMOP_get_param 1 +#define HVMOP_set_param 0 +#define HVMOP_get_param 1 struct xen_hvm_param { - domid_t domid; /* IN */ - uint32_t index; /* IN */ - uint64_t value; /* IN/OUT */ + domid_t domid; /* IN */ + uint32_t index; /* IN */ + uint64_t value; /* IN/OUT */ }; typedef struct xen_hvm_param xen_hvm_param_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t); @@ -49,39 +49,39 @@ struct xen_hvm_altp2m_suppress_ve { #if __XEN_INTERFACE_VERSION__ < 0x00040900 /* Set the logical level of one of a domain's PCI INTx wires. */ -#define HVMOP_set_pci_intx_level 2 +#define HVMOP_set_pci_intx_level 2 struct xen_hvm_set_pci_intx_level { /* Domain to be updated. */ - domid_t domid; + domid_t domid; /* PCI INTx identification in PCI topology (domain:bus:device:intx). */ - uint8_t domain, bus, device, intx; + uint8_t domain, bus, device, intx; /* Assertion level (0 = unasserted, 1 = asserted). */ - uint8_t level; + uint8_t level; }; typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t); /* Set the logical level of one of a domain's ISA IRQ wires. */ -#define HVMOP_set_isa_irq_level 3 +#define HVMOP_set_isa_irq_level 3 struct xen_hvm_set_isa_irq_level { /* Domain to be updated. */ - domid_t domid; + domid_t domid; /* ISA device identification, by ISA IRQ (0-15). */ - uint8_t isa_irq; + uint8_t isa_irq; /* Assertion level (0 = unasserted, 1 = asserted). */ - uint8_t level; + uint8_t level; }; typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t); -#define HVMOP_set_pci_link_route 4 +#define HVMOP_set_pci_link_route 4 struct xen_hvm_set_pci_link_route { /* Domain to be updated. */ - domid_t domid; + domid_t domid; /* PCI link identifier (0-3). */ - uint8_t link; + uint8_t link; /* ISA IRQ (1-15), or 0 (disable link). */ - uint8_t isa_irq; + uint8_t isa_irq; }; typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t); @@ -89,7 +89,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t); #endif /* __XEN_INTERFACE_VERSION__ < 0x00040900 */ /* Flushes all VCPU TLBs: @arg must be NULL. */ -#define HVMOP_flush_tlbs 5 +#define HVMOP_flush_tlbs 5 /* * hvmmem_type_t should not be defined when generating the corresponding @@ -99,31 +99,31 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t); #ifndef XEN_GENERATING_COMPAT_HEADERS typedef enum { - HVMMEM_ram_rw, /* Normal read/write guest RAM */ - HVMMEM_ram_ro, /* Read-only; writes are discarded */ - HVMMEM_mmio_dm, /* Reads and write go to the device model */ + HVMMEM_ram_rw, /* Normal read/write guest RAM */ + HVMMEM_ram_ro, /* Read-only; writes are discarded */ + HVMMEM_mmio_dm, /* Reads and write go to the device model */ #if __XEN_INTERFACE_VERSION__ < 0x00040700 - HVMMEM_mmio_write_dm, /* Read-only; writes go to the device model */ + HVMMEM_mmio_write_dm, /* Read-only; writes go to the device model */ #else - HVMMEM_unused, /* Placeholder; setting memory to this type - will fail for code after 4.7.0 */ + HVMMEM_unused, /* Placeholder; setting memory to this type + will fail for code after 4.7.0 */ #endif - HVMMEM_ioreq_server /* Memory type claimed by an ioreq server; type - changes to this value are only allowed after - an ioreq server has claimed its ownership. - Only pages with HVMMEM_ram_rw are allowed to - change to this type; conversely, pages with - this type are only allowed to be changed back - to HVMMEM_ram_rw. */ + HVMMEM_ioreq_server /* Memory type claimed by an ioreq server; type + changes to this value are only allowed after + an ioreq server has claimed its ownership. + Only pages with HVMMEM_ram_rw are allowed to + change to this type; conversely, pages with + this type are only allowed to be changed back + to HVMMEM_ram_rw. */ } hvmmem_type_t; #endif /* XEN_GENERATING_COMPAT_HEADERS */ /* Hint from PV drivers for pagetable destruction. */ -#define HVMOP_pagetable_dying 9 +#define HVMOP_pagetable_dying 9 struct xen_hvm_pagetable_dying { /* Domain with a pagetable about to be destroyed. */ - domid_t domid; + domid_t domid; uint16_t pad[3]; /* align next field on 8-byte boundary */ /* guest physical address of the toplevel pagetable dying */ uint64_t gpa; @@ -132,14 +132,14 @@ typedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_pagetable_dying_t); /* Get the current Xen time, in nanoseconds since system boot. */ -#define HVMOP_get_time 10 +#define HVMOP_get_time 10 struct xen_hvm_get_time { - uint64_t now; /* OUT */ + uint64_t now; /* OUT */ }; typedef struct xen_hvm_get_time xen_hvm_get_time_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_time_t); -#define HVMOP_xentrace 11 +#define HVMOP_xentrace 11 struct xen_hvm_xentrace { uint16_t event, extra_bytes; uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)]; @@ -151,14 +151,14 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t); #if defined(__XEN__) || defined(__XEN_TOOLS__) /* Deprecated by XENMEM_access_op_set_access */ -#define HVMOP_set_mem_access 12 +#define HVMOP_set_mem_access 12 /* Deprecated by XENMEM_access_op_get_access */ -#define HVMOP_get_mem_access 13 +#define HVMOP_get_mem_access 13 #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ -#define HVMOP_get_mem_type 15 +#define HVMOP_get_mem_type 15 /* Return hvmmem_type_t for the specified pfn. */ struct xen_hvm_get_mem_type { /* Domain to be queried. */ @@ -194,10 +194,9 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_type_t); /* * HVMOP_set_evtchn_upcall_vector: Set a that should be used for event - * channel upcalls on the specified . If set, - * this vector will be used in preference to the - * domain global callback via (see - * HVM_PARAM_CALLBACK_IRQ). + * channel upcalls on the specified . If + * set, this vector will be used in preference to the domain global callback via + * (see HVM_PARAM_CALLBACK_IRQ). */ #define HVMOP_set_evtchn_upcall_vector 23 struct xen_hvm_evtchn_upcall_vector { @@ -229,13 +228,15 @@ struct xen_hvm_altp2m_vcpu_enable_notify { /* #VE info area gfn */ uint64_t gfn; }; -typedef struct xen_hvm_altp2m_vcpu_enable_notify xen_hvm_altp2m_vcpu_enable_notify_t; +typedef struct xen_hvm_altp2m_vcpu_enable_notify + xen_hvm_altp2m_vcpu_enable_notify_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_enable_notify_t); struct xen_hvm_altp2m_vcpu_disable_notify { uint32_t vcpu_id; }; -typedef struct xen_hvm_altp2m_vcpu_disable_notify xen_hvm_altp2m_vcpu_disable_notify_t; +typedef struct xen_hvm_altp2m_vcpu_disable_notify + xen_hvm_altp2m_vcpu_disable_notify_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_disable_notify_t); struct xen_hvm_altp2m_view { @@ -310,51 +311,51 @@ struct xen_hvm_altp2m_get_vcpu_p2m_idx { }; struct xen_hvm_altp2m_op { - uint32_t version; /* HVMOP_ALTP2M_INTERFACE_VERSION */ + uint32_t version; /* HVMOP_ALTP2M_INTERFACE_VERSION */ uint32_t cmd; /* Get/set the altp2m state for a domain */ -#define HVMOP_altp2m_get_domain_state 1 -#define HVMOP_altp2m_set_domain_state 2 +#define HVMOP_altp2m_get_domain_state 1 +#define HVMOP_altp2m_set_domain_state 2 /* Set a given VCPU to receive altp2m event notifications */ -#define HVMOP_altp2m_vcpu_enable_notify 3 +#define HVMOP_altp2m_vcpu_enable_notify 3 /* Create a new view */ -#define HVMOP_altp2m_create_p2m 4 +#define HVMOP_altp2m_create_p2m 4 /* Destroy a view */ -#define HVMOP_altp2m_destroy_p2m 5 +#define HVMOP_altp2m_destroy_p2m 5 /* Switch view for an entire domain */ -#define HVMOP_altp2m_switch_p2m 6 +#define HVMOP_altp2m_switch_p2m 6 /* Notify that a page of memory is to have specific access types */ -#define HVMOP_altp2m_set_mem_access 7 +#define HVMOP_altp2m_set_mem_access 7 /* Change a p2m entry to have a different gfn->mfn mapping */ -#define HVMOP_altp2m_change_gfn 8 +#define HVMOP_altp2m_change_gfn 8 /* Set access for an array of pages */ #define HVMOP_altp2m_set_mem_access_multi 9 /* Set the "Suppress #VE" bit on a page */ -#define HVMOP_altp2m_set_suppress_ve 10 +#define HVMOP_altp2m_set_suppress_ve 10 /* Get the "Suppress #VE" bit of a page */ -#define HVMOP_altp2m_get_suppress_ve 11 +#define HVMOP_altp2m_get_suppress_ve 11 /* Get the access of a page of memory from a certain view */ -#define HVMOP_altp2m_get_mem_access 12 +#define HVMOP_altp2m_get_mem_access 12 /* Disable altp2m event notifications for a given VCPU */ -#define HVMOP_altp2m_vcpu_disable_notify 13 +#define HVMOP_altp2m_vcpu_disable_notify 13 /* Get the active vcpu p2m index */ -#define HVMOP_altp2m_get_p2m_idx 14 +#define HVMOP_altp2m_get_p2m_idx 14 domid_t domain; uint16_t pad1; uint32_t pad2; union { - struct xen_hvm_altp2m_domain_state domain_state; - struct xen_hvm_altp2m_vcpu_enable_notify enable_notify; - struct xen_hvm_altp2m_view view; + struct xen_hvm_altp2m_domain_state domain_state; + struct xen_hvm_altp2m_vcpu_enable_notify enable_notify; + struct xen_hvm_altp2m_view view; #if __XEN_INTERFACE_VERSION__ < 0x00040a00 - struct xen_hvm_altp2m_set_mem_access set_mem_access; + struct xen_hvm_altp2m_set_mem_access set_mem_access; #endif /* __XEN_INTERFACE_VERSION__ < 0x00040a00 */ - struct xen_hvm_altp2m_mem_access mem_access; - struct xen_hvm_altp2m_change_gfn change_gfn; + struct xen_hvm_altp2m_mem_access mem_access; + struct xen_hvm_altp2m_change_gfn change_gfn; struct xen_hvm_altp2m_set_mem_access_multi set_mem_access_multi; - struct xen_hvm_altp2m_suppress_ve suppress_ve; - struct xen_hvm_altp2m_vcpu_disable_notify disable_notify; - struct xen_hvm_altp2m_get_vcpu_p2m_idx get_vcpu_p2m_idx; + struct xen_hvm_altp2m_suppress_ve suppress_ve; + struct xen_hvm_altp2m_vcpu_disable_notify disable_notify; + struct xen_hvm_altp2m_get_vcpu_p2m_idx get_vcpu_p2m_idx; uint8_t pad[64]; } u; }; diff --git a/include/xen/hvm/hvm_vcpu.h b/include/xen/hvm/hvm_vcpu.h index d21abf188..02b024cbe 100644 --- a/include/xen/hvm/hvm_vcpu.h +++ b/include/xen/hvm/hvm_vcpu.h @@ -116,8 +116,8 @@ struct vcpu_hvm_x86_64 { }; struct vcpu_hvm_context { -#define VCPU_HVM_MODE_32B 0 /* 32bit fields of the structure will be used. */ -#define VCPU_HVM_MODE_64B 1 /* 64bit fields of the structure will be used. */ +#define VCPU_HVM_MODE_32B 0 /* 32bit fields of the structure will be used. */ +#define VCPU_HVM_MODE_64B 1 /* 64bit fields of the structure will be used. */ uint32_t mode; uint32_t pad; diff --git a/include/xen/hvm/hvm_xs_strings.h b/include/xen/hvm/hvm_xs_strings.h index fba254642..3a423104e 100644 --- a/include/xen/hvm/hvm_xs_strings.h +++ b/include/xen/hvm/hvm_xs_strings.h @@ -27,10 +27,10 @@ #ifndef __XEN_PUBLIC_HVM_HVM_XS_STRINGS_H__ #define __XEN_PUBLIC_HVM_HVM_XS_STRINGS_H__ -#define HVM_XS_HVMLOADER "hvmloader" -#define HVM_XS_BIOS "hvmloader/bios" -#define HVM_XS_GENERATION_ID_ADDRESS "hvmloader/generation-id-address" -#define HVM_XS_ALLOW_MEMORY_RELOCATE "hvmloader/allow-memory-relocate" +#define HVM_XS_HVMLOADER "hvmloader" +#define HVM_XS_BIOS "hvmloader/bios" +#define HVM_XS_GENERATION_ID_ADDRESS "hvmloader/generation-id-address" +#define HVM_XS_ALLOW_MEMORY_RELOCATE "hvmloader/allow-memory-relocate" /* The following values allow additional ACPI tables to be added to the * virtual ACPI BIOS that hvmloader constructs. The values specify the guest @@ -38,8 +38,8 @@ * the block is simply concatenated raw tables (which specify their own length * in the ACPI header). */ -#define HVM_XS_ACPI_PT_ADDRESS "hvmloader/acpi/address" -#define HVM_XS_ACPI_PT_LENGTH "hvmloader/acpi/length" +#define HVM_XS_ACPI_PT_ADDRESS "hvmloader/acpi/address" +#define HVM_XS_ACPI_PT_LENGTH "hvmloader/acpi/length" /* Any number of SMBIOS types can be passed through to an HVM guest using * the following xenstore values. The values specify the guest physical @@ -53,11 +53,11 @@ * will replace the default structure in hvmloader. In addition, any * OEM/vendortypes (128 - 255) will all be added. */ -#define HVM_XS_SMBIOS_PT_ADDRESS "hvmloader/smbios/address" -#define HVM_XS_SMBIOS_PT_LENGTH "hvmloader/smbios/length" +#define HVM_XS_SMBIOS_PT_ADDRESS "hvmloader/smbios/address" +#define HVM_XS_SMBIOS_PT_LENGTH "hvmloader/smbios/length" /* Set to 1 to enable SMBIOS default portable battery (type 22) values. */ -#define HVM_XS_SMBIOS_DEFAULT_BATTERY "hvmloader/smbios/default_battery" +#define HVM_XS_SMBIOS_DEFAULT_BATTERY "hvmloader/smbios/default_battery" /* The following xenstore values are used to override some of the default * string values in the SMBIOS table constructed in hvmloader. @@ -74,7 +74,8 @@ #define HVM_XS_BASEBOARD_VERSION "bios-strings/baseboard-version" #define HVM_XS_BASEBOARD_SERIAL_NUMBER "bios-strings/baseboard-serial-number" #define HVM_XS_BASEBOARD_ASSET_TAG "bios-strings/baseboard-asset-tag" -#define HVM_XS_BASEBOARD_LOCATION_IN_CHASSIS "bios-strings/baseboard-location-in-chassis" +#define HVM_XS_BASEBOARD_LOCATION_IN_CHASSIS \ + "bios-strings/baseboard-location-in-chassis" #define HVM_XS_ENCLOSURE_MANUFACTURER "bios-strings/enclosure-manufacturer" #define HVM_XS_ENCLOSURE_SERIAL_NUMBER "bios-strings/enclosure-serial-number" #define HVM_XS_ENCLOSURE_ASSET_TAG "bios-strings/enclosure-asset-tag" @@ -84,6 +85,6 @@ /* 1 to 99 OEM strings can be set in xenstore using values of the form * below. These strings will be loaded into the SMBIOS type 11 structure. */ -#define HVM_XS_OEM_STRINGS "bios-strings/oem-%d" +#define HVM_XS_OEM_STRINGS "bios-strings/oem-%d" #endif /* __XEN_PUBLIC_HVM_HVM_XS_STRINGS_H__ */ diff --git a/include/xen/hvm/ioreq.h b/include/xen/hvm/ioreq.h index c511fae8e..7693e8ef4 100644 --- a/include/xen/hvm/ioreq.h +++ b/include/xen/hvm/ioreq.h @@ -24,19 +24,19 @@ #ifndef _IOREQ_H_ #define _IOREQ_H_ -#define IOREQ_READ 1 -#define IOREQ_WRITE 0 +#define IOREQ_READ 1 +#define IOREQ_WRITE 0 -#define STATE_IOREQ_NONE 0 -#define STATE_IOREQ_READY 1 -#define STATE_IOREQ_INPROCESS 2 -#define STATE_IORESP_READY 3 +#define STATE_IOREQ_NONE 0 +#define STATE_IOREQ_READY 1 +#define STATE_IOREQ_INPROCESS 2 +#define STATE_IORESP_READY 3 -#define IOREQ_TYPE_PIO 0 /* pio */ -#define IOREQ_TYPE_COPY 1 /* mmio ops */ -#define IOREQ_TYPE_PCI_CONFIG 2 -#define IOREQ_TYPE_TIMEOFFSET 7 -#define IOREQ_TYPE_INVALIDATE 8 /* mapcache */ +#define IOREQ_TYPE_PIO 0 /* pio */ +#define IOREQ_TYPE_COPY 1 /* mmio ops */ +#define IOREQ_TYPE_PCI_CONFIG 2 +#define IOREQ_TYPE_TIMEOFFSET 7 +#define IOREQ_TYPE_INVALIDATE 8 /* mapcache */ /* * VMExit dispatcher should cooperate with instruction decoder to @@ -50,19 +50,19 @@ * SEGMENT |BUS |DEV |FN |OFFSET */ struct ioreq { - uint64_t addr; /* physical address */ - uint64_t data; /* data (or paddr of data) */ - uint32_t count; /* for rep prefixes */ - uint32_t size; /* size in bytes */ - uint32_t vp_eport; /* evtchn for notifications to/from device model */ + uint64_t addr; /* physical address */ + uint64_t data; /* data (or paddr of data) */ + uint32_t count; /* for rep prefixes */ + uint32_t size; /* size in bytes */ + uint32_t vp_eport; /* evtchn for notifications to/from device model */ uint16_t _pad0; - uint8_t state:4; - uint8_t data_is_ptr:1; /* if 1, data above is the guest paddr - * of the real data to use. */ - uint8_t dir:1; /* 1=read, 0=write */ - uint8_t df:1; - uint8_t _pad1:1; - uint8_t type; /* I/O type */ + uint8_t state : 4; + uint8_t data_is_ptr : 1; /* if 1, data above is the guest paddr + * of the real data to use. */ + uint8_t dir : 1; /* 1=read, 0=write */ + uint8_t df : 1; + uint8_t _pad1 : 1; + uint8_t type; /* I/O type */ }; typedef struct ioreq ioreq_t; @@ -72,16 +72,16 @@ struct shared_iopage { typedef struct shared_iopage shared_iopage_t; struct buf_ioreq { - uint8_t type; /* I/O type */ - uint8_t pad:1; - uint8_t dir:1; /* 1=read, 0=write */ - uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */ - uint32_t addr:20;/* physical address */ - uint32_t data; /* data */ + uint8_t type; /* I/O type */ + uint8_t pad : 1; + uint8_t dir : 1; /* 1=read, 0=write */ + uint8_t size : 2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */ + uint32_t addr : 20; /* physical address */ + uint32_t data; /* data */ }; typedef struct buf_ioreq buf_ioreq_t; -#define IOREQ_BUFFER_SLOT_NUM 511 /* 8 bytes each, plus 2 4-byte indexes */ +#define IOREQ_BUFFER_SLOT_NUM 511 /* 8 bytes each, plus 2 4-byte indexes */ struct buffered_iopage { #ifdef __XEN__ union bufioreq_pointers { @@ -123,11 +123,11 @@ typedef struct buffered_iopage buffered_iopage_t; #define ACPI_GPE0_BLK_LEN_V1 0x04 /* Compatibility definitions for the default location (version 0). */ -#define ACPI_PM1A_EVT_BLK_ADDRESS ACPI_PM1A_EVT_BLK_ADDRESS_V0 -#define ACPI_PM1A_CNT_BLK_ADDRESS ACPI_PM1A_CNT_BLK_ADDRESS_V0 -#define ACPI_PM_TMR_BLK_ADDRESS ACPI_PM_TMR_BLK_ADDRESS_V0 -#define ACPI_GPE0_BLK_ADDRESS ACPI_GPE0_BLK_ADDRESS_V0 -#define ACPI_GPE0_BLK_LEN ACPI_GPE0_BLK_LEN_V0 +#define ACPI_PM1A_EVT_BLK_ADDRESS ACPI_PM1A_EVT_BLK_ADDRESS_V0 +#define ACPI_PM1A_CNT_BLK_ADDRESS ACPI_PM1A_CNT_BLK_ADDRESS_V0 +#define ACPI_PM_TMR_BLK_ADDRESS ACPI_PM_TMR_BLK_ADDRESS_V0 +#define ACPI_GPE0_BLK_ADDRESS ACPI_GPE0_BLK_ADDRESS_V0 +#define ACPI_GPE0_BLK_LEN ACPI_GPE0_BLK_LEN_V0 #endif /* _IOREQ_H_ */ diff --git a/include/xen/hvm/params.h b/include/xen/hvm/params.h index 36832e4b9..103ae61ce 100644 --- a/include/xen/hvm/params.h +++ b/include/xen/hvm/params.h @@ -28,7 +28,7 @@ /* These parameters are deprecated and their meaning is undefined. */ #if defined(__XEN__) || defined(__XEN_TOOLS__) -#define HVM_PARAM_DM_DOMAIN 13 +#define HVM_PARAM_DM_DOMAIN 13 #define HVM_PARAM_BUFIOREQ_EVTCHN 26 #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ @@ -37,7 +37,7 @@ * Parameter space for HVMOP_{set,get}_param. */ -#define HVM_PARAM_CALLBACK_IRQ 0 +#define HVM_PARAM_CALLBACK_IRQ 0 #define HVM_PARAM_CALLBACK_IRQ_TYPE_MASK xen_mk_ullong(0xFF00000000000000) /* * How should CPU0 event-channel notifications be delivered? @@ -46,7 +46,7 @@ * If val != 0, val[63:56] encodes the type, as follows: */ -#define HVM_PARAM_CALLBACK_TYPE_GSI 0 +#define HVM_PARAM_CALLBACK_TYPE_GSI 0 /* * val[55:0] is a delivery GSI. GSI 0 cannot be used, as it aliases val == 0, * and disables all notifications. @@ -59,13 +59,13 @@ */ #if defined(__i386__) || defined(__x86_64__) -#define HVM_PARAM_CALLBACK_TYPE_VECTOR 2 +#define HVM_PARAM_CALLBACK_TYPE_VECTOR 2 /* * val[7:0] is a vector number. Check for XENFEAT_hvm_callback_vector to know * if this delivery method is available. */ #elif defined(__arm__) || defined(__aarch64__) -#define HVM_PARAM_CALLBACK_TYPE_PPI 2 +#define HVM_PARAM_CALLBACK_TYPE_PPI 2 /* * val[55:16] needs to be zero. * val[15:8] is interrupt flag of the PPI used by event-channel: @@ -86,9 +86,9 @@ #define HVM_PARAM_STORE_PFN 1 #define HVM_PARAM_STORE_EVTCHN 2 -#define HVM_PARAM_PAE_ENABLED 4 +#define HVM_PARAM_PAE_ENABLED 4 -#define HVM_PARAM_IOREQ_PFN 5 +#define HVM_PARAM_IOREQ_PFN 5 #define HVM_PARAM_BUFIOREQ_PFN 6 @@ -97,13 +97,14 @@ /* * Viridian enlightenments * - * (See http://download.microsoft.com/download/A/B/4/AB43A34E-BDD0-4FA6-BDEF-79EEF16E880B/Hypervisor%20Top%20Level%20Functional%20Specification%20v4.0.docx) + * (See + * http://download.microsoft.com/download/A/B/4/AB43A34E-BDD0-4FA6-BDEF-79EEF16E880B/Hypervisor%20Top%20Level%20Functional%20Specification%20v4.0.docx) * * To expose viridian enlightenments to the guest set this parameter * to the desired feature mask. The base feature set must be present * in any valid feature mask. */ -#define HVM_PARAM_VIRIDIAN 9 +#define HVM_PARAM_VIRIDIAN 9 /* Base+Freq viridian feature sets: * @@ -136,39 +137,32 @@ /* Use Hypercall for remote TLB flush */ #define _HVMPV_hcall_remote_tlb_flush 4 -#define HVMPV_hcall_remote_tlb_flush (1 << _HVMPV_hcall_remote_tlb_flush) +#define HVMPV_hcall_remote_tlb_flush (1 << _HVMPV_hcall_remote_tlb_flush) /* Use APIC assist */ #define _HVMPV_apic_assist 5 -#define HVMPV_apic_assist (1 << _HVMPV_apic_assist) +#define HVMPV_apic_assist (1 << _HVMPV_apic_assist) /* Enable crash MSRs */ #define _HVMPV_crash_ctl 6 -#define HVMPV_crash_ctl (1 << _HVMPV_crash_ctl) +#define HVMPV_crash_ctl (1 << _HVMPV_crash_ctl) /* Enable SYNIC MSRs */ #define _HVMPV_synic 7 -#define HVMPV_synic (1 << _HVMPV_synic) +#define HVMPV_synic (1 << _HVMPV_synic) /* Enable STIMER MSRs */ #define _HVMPV_stimer 8 -#define HVMPV_stimer (1 << _HVMPV_stimer) +#define HVMPV_stimer (1 << _HVMPV_stimer) /* Use Synthetic Cluster IPI Hypercall */ #define _HVMPV_hcall_ipi 9 -#define HVMPV_hcall_ipi (1 << _HVMPV_hcall_ipi) - -#define HVMPV_feature_mask \ - (HVMPV_base_freq | \ - HVMPV_no_freq | \ - HVMPV_time_ref_count | \ - HVMPV_reference_tsc | \ - HVMPV_hcall_remote_tlb_flush | \ - HVMPV_apic_assist | \ - HVMPV_crash_ctl | \ - HVMPV_synic | \ - HVMPV_stimer | \ - HVMPV_hcall_ipi) +#define HVMPV_hcall_ipi (1 << _HVMPV_hcall_ipi) + +#define HVMPV_feature_mask \ + (HVMPV_base_freq | HVMPV_no_freq | HVMPV_time_ref_count | \ + HVMPV_reference_tsc | HVMPV_hcall_remote_tlb_flush | HVMPV_apic_assist | \ + HVMPV_crash_ctl | HVMPV_synic | HVMPV_stimer | HVMPV_hcall_ipi) #endif @@ -191,7 +185,7 @@ * Missed interrupts are collapsed together and delivered as one 'late tick'. * Guest time always tracks wallclock (i.e., real) time. */ -#define HVM_PARAM_TIMER_MODE 10 +#define HVM_PARAM_TIMER_MODE 10 #define HVMPTM_delay_for_missed_ticks 0 #define HVMPTM_no_delay_for_missed_ticks 1 #define HVMPTM_no_missed_ticks_pending 2 @@ -201,16 +195,16 @@ #define HVM_PARAM_HPET_ENABLED 11 /* Identity-map page directory used by Intel EPT when CR0.PG=0. */ -#define HVM_PARAM_IDENT_PT 12 +#define HVM_PARAM_IDENT_PT 12 /* ACPI S state: currently support S0 and S3 on x86. */ #define HVM_PARAM_ACPI_S_STATE 14 /* TSS used on Intel when CR0.PE=0. */ -#define HVM_PARAM_VM86_TSS 15 +#define HVM_PARAM_VM86_TSS 15 /* Boolean: Enable aligning all periodic vpts to reduce interrupts */ -#define HVM_PARAM_VPT_ALIGN 16 +#define HVM_PARAM_VPT_ALIGN 16 /* Console debug shared memory ring and event channel */ #define HVM_PARAM_CONSOLE_PFN 17 @@ -228,25 +222,25 @@ #define HVM_PARAM_ACPI_IOPORTS_LOCATION 19 /* Deprecated */ -#define HVM_PARAM_MEMORY_EVENT_CR0 20 -#define HVM_PARAM_MEMORY_EVENT_CR3 21 -#define HVM_PARAM_MEMORY_EVENT_CR4 22 -#define HVM_PARAM_MEMORY_EVENT_INT3 23 -#define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25 -#define HVM_PARAM_MEMORY_EVENT_MSR 30 +#define HVM_PARAM_MEMORY_EVENT_CR0 20 +#define HVM_PARAM_MEMORY_EVENT_CR3 21 +#define HVM_PARAM_MEMORY_EVENT_CR4 22 +#define HVM_PARAM_MEMORY_EVENT_INT3 23 +#define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25 +#define HVM_PARAM_MEMORY_EVENT_MSR 30 /* Boolean: Enable nestedhvm (hvm only) */ -#define HVM_PARAM_NESTEDHVM 24 +#define HVM_PARAM_NESTEDHVM 24 /* Params for the mem event rings */ -#define HVM_PARAM_PAGING_RING_PFN 27 -#define HVM_PARAM_MONITOR_RING_PFN 28 -#define HVM_PARAM_SHARING_RING_PFN 29 +#define HVM_PARAM_PAGING_RING_PFN 27 +#define HVM_PARAM_MONITOR_RING_PFN 28 +#define HVM_PARAM_SHARING_RING_PFN 29 /* SHUTDOWN_* action in case of a triple fault */ #define HVM_PARAM_TRIPLE_FAULT_REASON 31 -#define HVM_PARAM_IOREQ_SERVER_PFN 32 +#define HVM_PARAM_IOREQ_SERVER_PFN 32 #define HVM_PARAM_NR_IOREQ_SERVER_PAGES 33 /* Location of the VM Generation ID in guest physical address space. */ @@ -264,11 +258,11 @@ * security-critical environment, each subop should be evaluated for * safety, with unsafe subops blacklisted in XSM. */ -#define HVM_PARAM_ALTP2M 35 -#define XEN_ALTP2M_disabled 0 -#define XEN_ALTP2M_mixed 1 -#define XEN_ALTP2M_external 2 -#define XEN_ALTP2M_limited 3 +#define HVM_PARAM_ALTP2M 35 +#define XEN_ALTP2M_disabled 0 +#define XEN_ALTP2M_mixed 1 +#define XEN_ALTP2M_external 2 +#define XEN_ALTP2M_limited 3 /* * Size of the x87 FPU FIP/FDP registers that the hypervisor needs to @@ -299,9 +293,9 @@ #define HVM_PARAM_VM86_TSS_SIZED 37 /* Enable MCA capabilities. */ -#define HVM_PARAM_MCA_CAP 38 -#define XEN_HVM_MCA_CAP_LMCE (xen_mk_ullong(1) << 0) -#define XEN_HVM_MCA_CAP_MASK XEN_HVM_MCA_CAP_LMCE +#define HVM_PARAM_MCA_CAP 38 +#define XEN_HVM_MCA_CAP_LMCE (xen_mk_ullong(1) << 0) +#define XEN_HVM_MCA_CAP_MASK XEN_HVM_MCA_CAP_LMCE #define HVM_NR_PARAMS 39 diff --git a/include/xen/hvm/pvdrivers.h b/include/xen/hvm/pvdrivers.h index 3241f94eb..c0ce28399 100644 --- a/include/xen/hvm/pvdrivers.h +++ b/include/xen/hvm/pvdrivers.h @@ -38,12 +38,12 @@ * indicate a driver which is yet to be released. */ -#define PVDRIVERS_PRODUCT_LIST(EACH) \ - EACH("xensource-windows", 0x0001) /* Citrix */ \ - EACH("gplpv-windows", 0x0002) /* James Harper */ \ - EACH("linux", 0x0003) \ - EACH("xenserver-windows-v7.0+", 0x0004) /* Citrix */ \ - EACH("xenserver-windows-v7.2+", 0x0005) /* Citrix */ \ - EACH("experimental", 0xffff) +#define PVDRIVERS_PRODUCT_LIST(EACH) \ + EACH("xensource-windows", 0x0001) /* Citrix */ \ + EACH("gplpv-windows", 0x0002) /* James Harper */ \ + EACH("linux", 0x0003) \ + EACH("xenserver-windows-v7.0+", 0x0004) /* Citrix */ \ + EACH("xenserver-windows-v7.2+", 0x0005) /* Citrix */ \ + EACH("experimental", 0xffff) #endif /* _XEN_PUBLIC_PVDRIVERS_H_ */ diff --git a/include/xen/hvm/save.h b/include/xen/hvm/save.h index f72e3a9bc..691cc78f1 100644 --- a/include/xen/hvm/save.h +++ b/include/xen/hvm/save.h @@ -47,9 +47,9 @@ * Each entry is preceded by a descriptor giving its type and length */ struct hvm_save_descriptor { - uint16_t typecode; /* Used to demux the various types below */ - uint16_t instance; /* Further demux within a type */ - uint32_t length; /* In bytes, *not* including this descriptor */ + uint16_t typecode; /* Used to demux the various types below */ + uint16_t instance; /* Further demux within a type */ + uint32_t length; /* In bytes, *not* including this descriptor */ }; @@ -62,36 +62,64 @@ struct hvm_save_descriptor { */ #ifdef __XEN__ -# define DECLARE_HVM_SAVE_TYPE_COMPAT(_x, _code, _type, _ctype, _fix) \ - static inline int __HVM_SAVE_FIX_COMPAT_##_x(void *h, uint32_t size) \ - { return _fix(h, size); } \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[2];}; \ - struct __HVM_SAVE_TYPE_COMPAT_##_x { _ctype t; } - -# include /* BUG() */ -# define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \ - static inline int __HVM_SAVE_FIX_COMPAT_##_x(void *h, uint32_t size) \ - { BUG(); return -1; } \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[1];}; \ - struct __HVM_SAVE_TYPE_COMPAT_##_x { _type t; } +#define DECLARE_HVM_SAVE_TYPE_COMPAT(_x, _code, _type, _ctype, _fix) \ + static inline int __HVM_SAVE_FIX_COMPAT_##_x(void *h, uint32_t size) \ + { \ + return _fix(h, size); \ + } \ + struct __HVM_SAVE_TYPE_##_x { \ + _type t; \ + char c[_code]; \ + char cpt[2]; \ + }; \ + struct __HVM_SAVE_TYPE_COMPAT_##_x { \ + _ctype t; \ + } + +#include /* BUG() */ +#define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \ + static inline int __HVM_SAVE_FIX_COMPAT_##_x(void *h, uint32_t size) \ + { \ + BUG(); \ + return -1; \ + } \ + struct __HVM_SAVE_TYPE_##_x { \ + _type t; \ + char c[_code]; \ + char cpt[1]; \ + }; \ + struct __HVM_SAVE_TYPE_COMPAT_##_x { \ + _type t; \ + } #else -# define DECLARE_HVM_SAVE_TYPE_COMPAT(_x, _code, _type, _ctype, _fix) \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[2];} - -# define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \ - struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[1];} +#define DECLARE_HVM_SAVE_TYPE_COMPAT(_x, _code, _type, _ctype, _fix) \ + struct __HVM_SAVE_TYPE_##_x { \ + _type t; \ + char c[_code]; \ + char cpt[2]; \ + } + +#define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \ + struct __HVM_SAVE_TYPE_##_x { \ + _type t; \ + char c[_code]; \ + char cpt[1]; \ + } #endif -#define HVM_SAVE_TYPE(_x) typeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->t) -#define HVM_SAVE_LENGTH(_x) (sizeof (HVM_SAVE_TYPE(_x))) -#define HVM_SAVE_CODE(_x) (sizeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->c)) +#define HVM_SAVE_TYPE(_x) typeof(((struct __HVM_SAVE_TYPE_##_x *)(0))->t) +#define HVM_SAVE_LENGTH(_x) (sizeof(HVM_SAVE_TYPE(_x))) +#define HVM_SAVE_CODE(_x) (sizeof(((struct __HVM_SAVE_TYPE_##_x *)(0))->c)) #ifdef __XEN__ -# define HVM_SAVE_TYPE_COMPAT(_x) typeof (((struct __HVM_SAVE_TYPE_COMPAT_##_x *)(0))->t) -# define HVM_SAVE_LENGTH_COMPAT(_x) (sizeof (HVM_SAVE_TYPE_COMPAT(_x))) - -# define HVM_SAVE_HAS_COMPAT(_x) (sizeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->cpt)-1) -# define HVM_SAVE_FIX_COMPAT(_x, _dst, _size) __HVM_SAVE_FIX_COMPAT_##_x(_dst, _size) +#define HVM_SAVE_TYPE_COMPAT(_x) \ + typeof(((struct __HVM_SAVE_TYPE_COMPAT_##_x *)(0))->t) +#define HVM_SAVE_LENGTH_COMPAT(_x) (sizeof(HVM_SAVE_TYPE_COMPAT(_x))) + +#define HVM_SAVE_HAS_COMPAT(_x) \ + (sizeof(((struct __HVM_SAVE_TYPE_##_x *)(0))->cpt) - 1) +#define HVM_SAVE_FIX_COMPAT(_x, _dst, _size) \ + __HVM_SAVE_FIX_COMPAT_##_x(_dst, _size) #endif /* @@ -99,7 +127,8 @@ struct hvm_save_descriptor { * descriptor. */ -struct hvm_save_end {}; +struct hvm_save_end { +}; DECLARE_HVM_SAVE_TYPE(END, 0, struct hvm_save_end); #if defined(__i386__) || defined(__x86_64__) diff --git a/include/xen/io/blkif.h b/include/xen/io/blkif.h index d4a34de94..1ec0980d2 100644 --- a/include/xen/io/blkif.h +++ b/include/xen/io/blkif.h @@ -44,7 +44,7 @@ */ #ifndef blkif_vdev_t -#define blkif_vdev_t uint16_t +#define blkif_vdev_t uint16_t #endif #define blkif_sector_t uint64_t @@ -546,8 +546,8 @@ /* * REQUEST CODES. */ -#define BLKIF_OP_READ 0 -#define BLKIF_OP_WRITE 1 +#define BLKIF_OP_READ 0 +#define BLKIF_OP_WRITE 1 /* * All writes issued prior to a request with the BLKIF_OP_WRITE_BARRIER * operation code ("barrier request") must be completed prior to the @@ -556,19 +556,19 @@ * * Optional. See "feature-barrier" XenBus node documentation above. */ -#define BLKIF_OP_WRITE_BARRIER 2 +#define BLKIF_OP_WRITE_BARRIER 2 /* * Commit any uncommitted contents of the backing device's volatile cache * to stable storage. * * Optional. See "feature-flush-cache" XenBus node documentation above. */ -#define BLKIF_OP_FLUSH_DISKCACHE 3 +#define BLKIF_OP_FLUSH_DISKCACHE 3 /* * Used in SLES sources for device specific command packet * contained within the request. Reserved for that purpose. */ -#define BLKIF_OP_RESERVED_1 4 +#define BLKIF_OP_RESERVED_1 4 /* * Indicate to the backend device that a region of storage is no longer in * use, and may be discarded at any time without impact to the client. If @@ -589,7 +589,7 @@ * "discard-granularity", and "discard-secure" in the XenBus node * documentation above. */ -#define BLKIF_OP_DISCARD 5 +#define BLKIF_OP_DISCARD 5 /* * Recognized if "feature-max-indirect-segments" in present in the backend @@ -613,7 +613,7 @@ * If a backend does not recognize BLKIF_OP_INDIRECT, it should *not* * create the "feature-max-indirect-segments" node! */ -#define BLKIF_OP_INDIRECT 6 +#define BLKIF_OP_INDIRECT 6 /* * Maximum scatter/gather segments per request. @@ -635,21 +635,21 @@ * more information. */ struct blkif_request_segment { - grant_ref_t gref; /* reference to I/O buffer frame */ + grant_ref_t gref; /* reference to I/O buffer frame */ /* @first_sect: first sector in frame to transfer (inclusive). */ /* @last_sect: last sector in frame to transfer (inclusive). */ - uint8_t first_sect, last_sect; + uint8_t first_sect, last_sect; }; /* * Starting ring element for any I/O request. */ struct blkif_request { - uint8_t operation; /* BLKIF_OP_??? */ - uint8_t nr_segments; /* number of segments */ - blkif_vdev_t handle; /* only for read/write requests */ - uint64_t id; /* private guest value, echoed in resp */ - blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ + uint8_t operation; /* BLKIF_OP_??? */ + uint8_t nr_segments; /* number of segments */ + blkif_vdev_t handle; /* only for read/write requests */ + uint64_t id; /* private guest value, echoed in resp */ + blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */ struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; }; typedef struct blkif_request blkif_request_t; @@ -659,55 +659,55 @@ typedef struct blkif_request blkif_request_t; * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request) */ struct blkif_request_discard { - uint8_t operation; /* BLKIF_OP_DISCARD */ - uint8_t flag; /* BLKIF_DISCARD_SECURE or zero */ -#define BLKIF_DISCARD_SECURE (1<<0) /* ignored if discard-secure=0 */ - blkif_vdev_t handle; /* same as for read/write requests */ - uint64_t id; /* private guest value, echoed in resp */ - blkif_sector_t sector_number;/* start sector idx on disk */ - uint64_t nr_sectors; /* number of contiguous sectors to discard*/ + uint8_t operation; /* BLKIF_OP_DISCARD */ + uint8_t flag; /* BLKIF_DISCARD_SECURE or zero */ +#define BLKIF_DISCARD_SECURE (1 << 0) /* ignored if discard-secure=0 */ + blkif_vdev_t handle; /* same as for read/write requests */ + uint64_t id; /* private guest value, echoed in resp */ + blkif_sector_t sector_number; /* start sector idx on disk */ + uint64_t nr_sectors; /* number of contiguous sectors to discard*/ }; typedef struct blkif_request_discard blkif_request_discard_t; struct blkif_request_indirect { - uint8_t operation; /* BLKIF_OP_INDIRECT */ - uint8_t indirect_op; /* BLKIF_OP_{READ/WRITE} */ - uint16_t nr_segments; /* number of segments */ - uint64_t id; /* private guest value, echoed in resp */ - blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ - blkif_vdev_t handle; /* same as for read/write requests */ - grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; + uint8_t operation; /* BLKIF_OP_INDIRECT */ + uint8_t indirect_op; /* BLKIF_OP_{READ/WRITE} */ + uint16_t nr_segments; /* number of segments */ + uint64_t id; /* private guest value, echoed in resp */ + blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */ + blkif_vdev_t handle; /* same as for read/write requests */ + grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; #ifdef __i386__ - uint64_t pad; /* Make it 64 byte aligned on i386 */ + uint64_t pad; /* Make it 64 byte aligned on i386 */ #endif }; typedef struct blkif_request_indirect blkif_request_indirect_t; struct blkif_response { - uint64_t id; /* copied from request */ - uint8_t operation; /* copied from request */ - int16_t status; /* BLKIF_RSP_??? */ + uint64_t id; /* copied from request */ + uint8_t operation; /* copied from request */ + int16_t status; /* BLKIF_RSP_??? */ }; typedef struct blkif_response blkif_response_t; /* * STATUS RETURN CODES. */ - /* Operation not supported (only happens on barrier writes). */ -#define BLKIF_RSP_EOPNOTSUPP -2 - /* Operation failed for some unspecified reason (-EIO). */ -#define BLKIF_RSP_ERROR -1 - /* Operation completed successfully. */ -#define BLKIF_RSP_OKAY 0 +/* Operation not supported (only happens on barrier writes). */ +#define BLKIF_RSP_EOPNOTSUPP -2 +/* Operation failed for some unspecified reason (-EIO). */ +#define BLKIF_RSP_ERROR -1 +/* Operation completed successfully. */ +#define BLKIF_RSP_OKAY 0 /* * Generate blkif ring structures and types. */ DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response); -#define VDISK_CDROM 0x1 -#define VDISK_REMOVABLE 0x2 -#define VDISK_READONLY 0x4 +#define VDISK_CDROM 0x1 +#define VDISK_REMOVABLE 0x2 +#define VDISK_READONLY 0x4 #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ diff --git a/include/xen/io/cameraif.h b/include/xen/io/cameraif.h index acbcbf3bd..5b4e86e6f 100644 --- a/include/xen/io/cameraif.h +++ b/include/xen/io/cameraif.h @@ -37,7 +37,7 @@ * Protocol version ****************************************************************************** */ -#define XENCAMERA_PROTOCOL_VERSION "1" +#define XENCAMERA_PROTOCOL_VERSION "1" /* ****************************************************************************** @@ -73,25 +73,27 @@ *--------------------------------- Backend ----------------------------------- * * /local/domain/0/backend/vcamera/1/0/frontend-id = "1" - * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0" - * /local/domain/0/backend/vcamera/1/0/state = "4" - * /local/domain/0/backend/vcamera/1/0/versions = "1,2" + * /local/domain/0/backend/vcamera/1/0/frontend = + * "/local/domain/1/device/vcamera/0" /local/domain/0/backend/vcamera/1/0/state + * = "4" /local/domain/0/backend/vcamera/1/0/versions = "1,2" * *--------------------------------- Frontend ---------------------------------- * * /local/domain/1/device/vcamera/0/backend-id = "0" - * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1" - * /local/domain/1/device/vcamera/0/state = "4" - * /local/domain/1/device/vcamera/0/version = "1" + * /local/domain/1/device/vcamera/0/backend = + * "/local/domain/0/backend/vcamera/1" /local/domain/1/device/vcamera/0/state = + * "4" /local/domain/1/device/vcamera/0/version = "1" * /local/domain/1/device/vcamera/0/be-alloc = "1" * *---------------------------- Device 0 configuration ------------------------- * * /local/domain/1/device/vcamera/0/max-buffers = "3" * /local/domain/1/device/vcamera/0/controls = "contrast,hue" - * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1" + * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = + * "30/1,15/1" * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2" - * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2" + * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = + * "15/1,15/2" * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "15/2" * /local/domain/1/device/vcamera/0/unique-id = "0" * /local/domain/1/device/vcamera/0/req-ring-ref = "2832" @@ -103,7 +105,8 @@ * * /local/domain/1/device/vcamera/1/max-buffers = "8" * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" - * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2" + * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = + * "30/1,15/2" * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "15/2" * /local/domain/1/device/vcamera/1/unique-id = "1" * /local/domain/1/device/vcamera/1/req-ring-ref = "2833" @@ -346,36 +349,36 @@ * REQUEST CODES ****************************************************************************** */ -#define XENCAMERA_OP_CONFIG_SET 0x00 -#define XENCAMERA_OP_CONFIG_GET 0x01 -#define XENCAMERA_OP_CONFIG_VALIDATE 0x02 -#define XENCAMERA_OP_FRAME_RATE_SET 0x03 -#define XENCAMERA_OP_BUF_GET_LAYOUT 0x04 -#define XENCAMERA_OP_BUF_REQUEST 0x05 -#define XENCAMERA_OP_BUF_CREATE 0x06 -#define XENCAMERA_OP_BUF_DESTROY 0x07 -#define XENCAMERA_OP_BUF_QUEUE 0x08 -#define XENCAMERA_OP_BUF_DEQUEUE 0x09 -#define XENCAMERA_OP_CTRL_ENUM 0x0a -#define XENCAMERA_OP_CTRL_SET 0x0b -#define XENCAMERA_OP_CTRL_GET 0x0c -#define XENCAMERA_OP_STREAM_START 0x0d -#define XENCAMERA_OP_STREAM_STOP 0x0e +#define XENCAMERA_OP_CONFIG_SET 0x00 +#define XENCAMERA_OP_CONFIG_GET 0x01 +#define XENCAMERA_OP_CONFIG_VALIDATE 0x02 +#define XENCAMERA_OP_FRAME_RATE_SET 0x03 +#define XENCAMERA_OP_BUF_GET_LAYOUT 0x04 +#define XENCAMERA_OP_BUF_REQUEST 0x05 +#define XENCAMERA_OP_BUF_CREATE 0x06 +#define XENCAMERA_OP_BUF_DESTROY 0x07 +#define XENCAMERA_OP_BUF_QUEUE 0x08 +#define XENCAMERA_OP_BUF_DEQUEUE 0x09 +#define XENCAMERA_OP_CTRL_ENUM 0x0a +#define XENCAMERA_OP_CTRL_SET 0x0b +#define XENCAMERA_OP_CTRL_GET 0x0c +#define XENCAMERA_OP_STREAM_START 0x0d +#define XENCAMERA_OP_STREAM_STOP 0x0e -#define XENCAMERA_CTRL_BRIGHTNESS 0 -#define XENCAMERA_CTRL_CONTRAST 1 -#define XENCAMERA_CTRL_SATURATION 2 -#define XENCAMERA_CTRL_HUE 3 +#define XENCAMERA_CTRL_BRIGHTNESS 0 +#define XENCAMERA_CTRL_CONTRAST 1 +#define XENCAMERA_CTRL_SATURATION 2 +#define XENCAMERA_CTRL_HUE 3 /* Number of supported controls. */ -#define XENCAMERA_MAX_CTRL 4 +#define XENCAMERA_MAX_CTRL 4 /* Control is read-only. */ -#define XENCAMERA_CTRL_FLG_RO (1 << 0) +#define XENCAMERA_CTRL_FLG_RO (1 << 0) /* Control is write-only. */ -#define XENCAMERA_CTRL_FLG_WO (1 << 1) +#define XENCAMERA_CTRL_FLG_WO (1 << 1) /* Control's value is volatile. */ -#define XENCAMERA_CTRL_FLG_VOLATILE (1 << 2) +#define XENCAMERA_CTRL_FLG_VOLATILE (1 << 2) /* Supported color spaces. */ #define XENCAMERA_COLORSPACE_DEFAULT 0 @@ -387,13 +390,13 @@ #define XENCAMERA_COLORSPACE_DCI_P3 6 /* Color space transfer function. */ -#define XENCAMERA_XFER_FUNC_DEFAULT 0 -#define XENCAMERA_XFER_FUNC_709 1 -#define XENCAMERA_XFER_FUNC_SRGB 2 -#define XENCAMERA_XFER_FUNC_OPRGB 3 -#define XENCAMERA_XFER_FUNC_NONE 4 -#define XENCAMERA_XFER_FUNC_DCI_P3 5 -#define XENCAMERA_XFER_FUNC_SMPTE2084 6 +#define XENCAMERA_XFER_FUNC_DEFAULT 0 +#define XENCAMERA_XFER_FUNC_709 1 +#define XENCAMERA_XFER_FUNC_SRGB 2 +#define XENCAMERA_XFER_FUNC_OPRGB 3 +#define XENCAMERA_XFER_FUNC_NONE 4 +#define XENCAMERA_XFER_FUNC_DCI_P3 5 +#define XENCAMERA_XFER_FUNC_SMPTE2084 6 /* Color space Y’CbCr encoding. */ #define XENCAMERA_YCBCR_ENC_IGNORE 0 @@ -405,51 +408,51 @@ #define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6 /* Quantization range. */ -#define XENCAMERA_QUANTIZATION_DEFAULT 0 -#define XENCAMERA_QUANTIZATION_FULL_RANGE 1 -#define XENCAMERA_QUANTIZATION_LIM_RANGE 2 +#define XENCAMERA_QUANTIZATION_DEFAULT 0 +#define XENCAMERA_QUANTIZATION_FULL_RANGE 1 +#define XENCAMERA_QUANTIZATION_LIM_RANGE 2 /* ****************************************************************************** * EVENT CODES ****************************************************************************** */ -#define XENCAMERA_EVT_FRAME_AVAIL 0x00 -#define XENCAMERA_EVT_CTRL_CHANGE 0x01 +#define XENCAMERA_EVT_FRAME_AVAIL 0x00 +#define XENCAMERA_EVT_CTRL_CHANGE 0x01 /* ****************************************************************************** * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS ****************************************************************************** */ -#define XENCAMERA_DRIVER_NAME "vcamera" +#define XENCAMERA_DRIVER_NAME "vcamera" #define XENCAMERA_LIST_SEPARATOR "," #define XENCAMERA_RESOLUTION_SEPARATOR "x" #define XENCAMERA_FRACTION_SEPARATOR "/" -#define XENCAMERA_FIELD_BE_VERSIONS "versions" -#define XENCAMERA_FIELD_FE_VERSION "version" -#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" -#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" -#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" -#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" -#define XENCAMERA_FIELD_MAX_BUFFERS "max-buffers" -#define XENCAMERA_FIELD_CONTROLS "controls" -#define XENCAMERA_FIELD_FORMATS "formats" -#define XENCAMERA_FIELD_FRAME_RATES "frame-rates" -#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" -#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" +#define XENCAMERA_FIELD_BE_VERSIONS "versions" +#define XENCAMERA_FIELD_FE_VERSION "version" +#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" +#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" +#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" +#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" +#define XENCAMERA_FIELD_MAX_BUFFERS "max-buffers" +#define XENCAMERA_FIELD_CONTROLS "controls" +#define XENCAMERA_FIELD_FORMATS "formats" +#define XENCAMERA_FIELD_FRAME_RATES "frame-rates" +#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" +#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" -#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" -#define XENCAMERA_CTRL_CONTRAST_STR "contrast" -#define XENCAMERA_CTRL_SATURATION_STR "saturation" -#define XENCAMERA_CTRL_HUE_STR "hue" +#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" +#define XENCAMERA_CTRL_CONTRAST_STR "contrast" +#define XENCAMERA_CTRL_SATURATION_STR "saturation" +#define XENCAMERA_CTRL_HUE_STR "hue" #define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE" /* Maximum number of buffer planes supported. */ -#define XENCAMERA_MAX_PLANE 4 +#define XENCAMERA_MAX_PLANE 4 /* ****************************************************************************** @@ -468,7 +471,8 @@ * - all references in this document to page sizes must be treated * as pages of size XEN_PAGE_SIZE unless otherwise noted. * - all FOURCC mappings used for configuration and messaging are - * Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h + * Linux V4L2 ones: + * https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h * with the following exceptions: * - characters are allowed in [0x20; 0x7f] range * - when used for XenStore configuration entries the following @@ -1353,12 +1357,14 @@ struct xencamera_event_page { }; #define XENCAMERA_EVENT_PAGE_SIZE 4096 -#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) -#define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) -#define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) -#define XENCAMERA_IN_RING(page) \ +#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) +#define XENCAMERA_IN_RING_SIZE \ + (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) +#define XENCAMERA_IN_RING_LEN \ + (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) +#define XENCAMERA_IN_RING(page) \ ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS)) -#define XENCAMERA_IN_RING_REF(page, idx) \ +#define XENCAMERA_IN_RING_REF(page, idx) \ (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN]) #endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */ diff --git a/include/xen/io/console.h b/include/xen/io/console.h index 4811f4722..20f1bdac5 100644 --- a/include/xen/io/console.h +++ b/include/xen/io/console.h @@ -29,7 +29,7 @@ typedef uint32_t XENCONS_RING_IDX; -#define MASK_XENCONS_IDX(idx, ring) ((idx) & (sizeof(ring)-1)) +#define MASK_XENCONS_IDX(idx, ring) ((idx) & (sizeof(ring) - 1)) struct xencons_interface { char in[1024]; diff --git a/include/xen/io/displif.h b/include/xen/io/displif.h index cc5de9cb1..df959dd3d 100644 --- a/include/xen/io/displif.h +++ b/include/xen/io/displif.h @@ -38,7 +38,7 @@ * Protocol version ****************************************************************************** */ -#define XENDISPL_PROTOCOL_VERSION "1" +#define XENDISPL_PROTOCOL_VERSION "1" /* ****************************************************************************** @@ -108,16 +108,16 @@ *--------------------------------- Backend ----------------------------------- * * /local/domain/0/backend/vdispl/1/0/frontend-id = "1" - * /local/domain/0/backend/vdispl/1/0/frontend = "/local/domain/1/device/vdispl/0" - * /local/domain/0/backend/vdispl/1/0/state = "4" - * /local/domain/0/backend/vdispl/1/0/versions = "1,2" + * /local/domain/0/backend/vdispl/1/0/frontend = + * "/local/domain/1/device/vdispl/0" /local/domain/0/backend/vdispl/1/0/state = + * "4" /local/domain/0/backend/vdispl/1/0/versions = "1,2" * *--------------------------------- Frontend ---------------------------------- * * /local/domain/1/device/vdispl/0/backend-id = "0" - * /local/domain/1/device/vdispl/0/backend = "/local/domain/0/backend/vdispl/1/0" - * /local/domain/1/device/vdispl/0/state = "4" - * /local/domain/1/device/vdispl/0/version = "1" + * /local/domain/1/device/vdispl/0/backend = + * "/local/domain/0/backend/vdispl/1/0" /local/domain/1/device/vdispl/0/state = + * "4" /local/domain/1/device/vdispl/0/version = "1" * /local/domain/1/device/vdispl/0/be-alloc = "1" * *-------------------------- Connector 0 configuration ------------------------ @@ -343,39 +343,39 @@ * Request codes [0; 15] are reserved and must not be used */ -#define XENDISPL_OP_DBUF_CREATE 0x10 -#define XENDISPL_OP_DBUF_DESTROY 0x11 -#define XENDISPL_OP_FB_ATTACH 0x12 -#define XENDISPL_OP_FB_DETACH 0x13 -#define XENDISPL_OP_SET_CONFIG 0x14 -#define XENDISPL_OP_PG_FLIP 0x15 +#define XENDISPL_OP_DBUF_CREATE 0x10 +#define XENDISPL_OP_DBUF_DESTROY 0x11 +#define XENDISPL_OP_FB_ATTACH 0x12 +#define XENDISPL_OP_FB_DETACH 0x13 +#define XENDISPL_OP_SET_CONFIG 0x14 +#define XENDISPL_OP_PG_FLIP 0x15 /* ****************************************************************************** * EVENT CODES ****************************************************************************** */ -#define XENDISPL_EVT_PG_FLIP 0x00 +#define XENDISPL_EVT_PG_FLIP 0x00 /* ****************************************************************************** * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS ****************************************************************************** */ -#define XENDISPL_DRIVER_NAME "vdispl" +#define XENDISPL_DRIVER_NAME "vdispl" #define XENDISPL_LIST_SEPARATOR "," #define XENDISPL_RESOLUTION_SEPARATOR "x" -#define XENDISPL_FIELD_BE_VERSIONS "versions" -#define XENDISPL_FIELD_FE_VERSION "version" -#define XENDISPL_FIELD_REQ_RING_REF "req-ring-ref" -#define XENDISPL_FIELD_REQ_CHANNEL "req-event-channel" -#define XENDISPL_FIELD_EVT_RING_REF "evt-ring-ref" -#define XENDISPL_FIELD_EVT_CHANNEL "evt-event-channel" -#define XENDISPL_FIELD_RESOLUTION "resolution" -#define XENDISPL_FIELD_BE_ALLOC "be-alloc" -#define XENDISPL_FIELD_UNIQUE_ID "unique-id" +#define XENDISPL_FIELD_BE_VERSIONS "versions" +#define XENDISPL_FIELD_FE_VERSION "version" +#define XENDISPL_FIELD_REQ_RING_REF "req-ring-ref" +#define XENDISPL_FIELD_REQ_CHANNEL "req-event-channel" +#define XENDISPL_FIELD_EVT_RING_REF "evt-ring-ref" +#define XENDISPL_FIELD_EVT_CHANNEL "evt-event-channel" +#define XENDISPL_FIELD_RESOLUTION "resolution" +#define XENDISPL_FIELD_BE_ALLOC "be-alloc" +#define XENDISPL_FIELD_UNIQUE_ID "unique-id" /* ****************************************************************************** @@ -496,7 +496,7 @@ * below) */ -#define XENDISPL_DBUF_FLG_REQ_ALLOC (1 << 0) +#define XENDISPL_DBUF_FLG_REQ_ALLOC (1 << 0) struct xendispl_dbuf_create_req { uint64_t dbuf_cookie; @@ -851,13 +851,14 @@ struct xendispl_event_page { }; #define XENDISPL_EVENT_PAGE_SIZE 4096 -#define XENDISPL_IN_RING_OFFS (sizeof(struct xendispl_event_page)) +#define XENDISPL_IN_RING_OFFS (sizeof(struct xendispl_event_page)) #define XENDISPL_IN_RING_SIZE (XENDISPL_EVENT_PAGE_SIZE - XENDISPL_IN_RING_OFFS) -#define XENDISPL_IN_RING_LEN (XENDISPL_IN_RING_SIZE / sizeof(struct xendispl_evt)) -#define XENDISPL_IN_RING(page) \ - ((struct xendispl_evt *)((char *)(page) + XENDISPL_IN_RING_OFFS)) -#define XENDISPL_IN_RING_REF(page, idx) \ - (XENDISPL_IN_RING((page))[(idx) % XENDISPL_IN_RING_LEN]) +#define XENDISPL_IN_RING_LEN \ + (XENDISPL_IN_RING_SIZE / sizeof(struct xendispl_evt)) +#define XENDISPL_IN_RING(page) \ + ((struct xendispl_evt *)((char *)(page) + XENDISPL_IN_RING_OFFS)) +#define XENDISPL_IN_RING_REF(page, idx) \ + (XENDISPL_IN_RING((page))[(idx) % XENDISPL_IN_RING_LEN]) #endif /* __XEN_PUBLIC_IO_DISPLIF_H__ */ diff --git a/include/xen/io/fbif.h b/include/xen/io/fbif.h index cc25aab32..ed893bee1 100644 --- a/include/xen/io/fbif.h +++ b/include/xen/io/fbif.h @@ -41,12 +41,11 @@ */ #define XENFB_TYPE_UPDATE 2 -struct xenfb_update -{ - uint8_t type; /* XENFB_TYPE_UPDATE */ - int32_t x; /* source x */ - int32_t y; /* source y */ - int32_t width; /* rect width */ +struct xenfb_update { + uint8_t type; /* XENFB_TYPE_UPDATE */ + int32_t x; /* source x */ + int32_t y; /* source y */ + int32_t width; /* rect width */ int32_t height; /* rect height */ }; @@ -56,20 +55,18 @@ struct xenfb_update */ #define XENFB_TYPE_RESIZE 3 -struct xenfb_resize -{ - uint8_t type; /* XENFB_TYPE_RESIZE */ - int32_t width; /* width in pixels */ - int32_t height; /* height in pixels */ - int32_t stride; /* stride in bytes */ - int32_t depth; /* depth in bits */ - int32_t offset; /* offset of the framebuffer in bytes */ +struct xenfb_resize { + uint8_t type; /* XENFB_TYPE_RESIZE */ + int32_t width; /* width in pixels */ + int32_t height; /* height in pixels */ + int32_t stride; /* stride in bytes */ + int32_t depth; /* depth in bits */ + int32_t offset; /* offset of the framebuffer in bytes */ }; #define XENFB_OUT_EVENT_SIZE 40 -union xenfb_out_event -{ +union xenfb_out_event { uint8_t type; struct xenfb_update update; struct xenfb_resize resize; @@ -92,19 +89,17 @@ union xenfb_out_event * their periodical refreshs. */ #define XENFB_TYPE_REFRESH_PERIOD 1 -#define XENFB_NO_REFRESH 0 +#define XENFB_NO_REFRESH 0 -struct xenfb_refresh_period -{ - uint8_t type; /* XENFB_TYPE_UPDATE_PERIOD */ +struct xenfb_refresh_period { + uint8_t type; /* XENFB_TYPE_UPDATE_PERIOD */ uint32_t period; /* period of refresh, in ms, * XENFB_NO_REFRESH if no refresh is needed */ }; #define XENFB_IN_EVENT_SIZE 40 -union xenfb_in_event -{ +union xenfb_in_event { uint8_t type; struct xenfb_refresh_period refresh_period; char pad[XENFB_IN_EVENT_SIZE]; @@ -113,31 +108,30 @@ union xenfb_in_event /* shared page */ #define XENFB_IN_RING_SIZE 1024 -#define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE) +#define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE) #define XENFB_IN_RING_OFFS 1024 -#define XENFB_IN_RING(page) \ +#define XENFB_IN_RING(page) \ ((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS)) -#define XENFB_IN_RING_REF(page, idx) \ +#define XENFB_IN_RING_REF(page, idx) \ (XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN]) #define XENFB_OUT_RING_SIZE 2048 -#define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE) +#define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE) #define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE) -#define XENFB_OUT_RING(page) \ +#define XENFB_OUT_RING(page) \ ((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS)) -#define XENFB_OUT_RING_REF(page, idx) \ +#define XENFB_OUT_RING_REF(page, idx) \ (XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN]) -struct xenfb_page -{ +struct xenfb_page { uint32_t in_cons, in_prod; uint32_t out_cons, out_prod; - int32_t width; /* the width of the framebuffer (in pixels) */ - int32_t height; /* the height of the framebuffer (in pixels) */ - uint32_t line_length; /* the length of a row of pixels (in bytes) */ - uint32_t mem_length; /* the length of the framebuffer (in bytes) */ - uint8_t depth; /* the depth of a pixel (in bits) */ + int32_t width; /* the width of the framebuffer (in pixels) */ + int32_t height; /* the height of the framebuffer (in pixels) */ + uint32_t line_length; /* the length of a row of pixels (in bytes) */ + uint32_t mem_length; /* the length of the framebuffer (in bytes) */ + uint8_t depth; /* the depth of a pixel (in bits) */ /* * Framebuffer page directory @@ -158,9 +152,9 @@ struct xenfb_page * better solution is found, but don't leak it to the backend. */ #ifdef __KERNEL__ -#define XENFB_WIDTH 800 +#define XENFB_WIDTH 800 #define XENFB_HEIGHT 600 -#define XENFB_DEPTH 32 +#define XENFB_DEPTH 32 #endif #endif diff --git a/include/xen/io/fsif.h b/include/xen/io/fsif.h index a8bea193b..3bdec9cc8 100644 --- a/include/xen/io/fsif.h +++ b/include/xen/io/fsif.h @@ -30,19 +30,19 @@ #include "ring.h" #include "../grant_table.h" -#define REQ_FILE_OPEN 1 -#define REQ_FILE_CLOSE 2 -#define REQ_FILE_READ 3 -#define REQ_FILE_WRITE 4 -#define REQ_STAT 5 -#define REQ_FILE_TRUNCATE 6 -#define REQ_REMOVE 7 -#define REQ_RENAME 8 -#define REQ_CREATE 9 -#define REQ_DIR_LIST 10 -#define REQ_CHMOD 11 -#define REQ_FS_SPACE 12 -#define REQ_FILE_SYNC 13 +#define REQ_FILE_OPEN 1 +#define REQ_FILE_CLOSE 2 +#define REQ_FILE_READ 3 +#define REQ_FILE_WRITE 4 +#define REQ_STAT 5 +#define REQ_FILE_TRUNCATE 6 +#define REQ_REMOVE 7 +#define REQ_RENAME 8 +#define REQ_CREATE 9 +#define REQ_DIR_LIST 10 +#define REQ_CHMOD 11 +#define REQ_FS_SPACE 12 +#define REQ_FILE_SYNC 13 struct fsif_open_request { grant_ref_t gref; @@ -57,7 +57,7 @@ struct fsif_read_request { int32_t pad; uint64_t len; uint64_t offset; - grant_ref_t grefs[1]; /* Variable length */ + grant_ref_t grefs[1]; /* Variable length */ }; struct fsif_write_request { @@ -65,7 +65,7 @@ struct fsif_write_request { int32_t pad; uint64_t len; uint64_t offset; - grant_ref_t grefs[1]; /* Variable length */ + grant_ref_t grefs[1]; /* Variable length */ }; struct fsif_stat_request { @@ -75,14 +75,14 @@ struct fsif_stat_request { /* This structure is a copy of some fields from stat structure, returned * via the ring. */ struct fsif_stat_response { - int32_t stat_mode; + int32_t stat_mode; uint32_t stat_uid; uint32_t stat_gid; - int32_t stat_ret; - int64_t stat_size; - int64_t stat_atime; - int64_t stat_mtime; - int64_t stat_ctime; + int32_t stat_ret; + int64_t stat_size; + int64_t stat_atime; + int64_t stat_mtime; + int64_t stat_ctime; }; struct fsif_truncate_request { @@ -114,14 +114,14 @@ struct fsif_list_request { grant_ref_t gref; }; -#define NR_FILES_SHIFT 0 -#define NR_FILES_SIZE 16 /* 16 bits for the number of files mask */ -#define NR_FILES_MASK (((1ULL << NR_FILES_SIZE) - 1) << NR_FILES_SHIFT) -#define ERROR_SIZE 32 /* 32 bits for the error mask */ -#define ERROR_SHIFT (NR_FILES_SIZE + NR_FILES_SHIFT) -#define ERROR_MASK (((1ULL << ERROR_SIZE) - 1) << ERROR_SHIFT) -#define HAS_MORE_SHIFT (ERROR_SHIFT + ERROR_SIZE) -#define HAS_MORE_FLAG (1ULL << HAS_MORE_SHIFT) +#define NR_FILES_SHIFT 0 +#define NR_FILES_SIZE 16 /* 16 bits for the number of files mask */ +#define NR_FILES_MASK (((1ULL << NR_FILES_SIZE) - 1) << NR_FILES_SHIFT) +#define ERROR_SIZE 32 /* 32 bits for the error mask */ +#define ERROR_SHIFT (NR_FILES_SIZE + NR_FILES_SHIFT) +#define ERROR_MASK (((1ULL << ERROR_SIZE) - 1) << ERROR_SHIFT) +#define HAS_MORE_SHIFT (ERROR_SHIFT + ERROR_SIZE) +#define HAS_MORE_FLAG (1ULL << HAS_MORE_SHIFT) struct fsif_chmod_request { uint32_t fd; @@ -139,24 +139,24 @@ struct fsif_sync_request { /* FS operation request */ struct fsif_request { - uint8_t type; /* Type of the request */ + uint8_t type; /* Type of the request */ uint8_t pad; - uint16_t id; /* Request ID, copied to the response */ + uint16_t id; /* Request ID, copied to the response */ uint32_t pad2; union { - struct fsif_open_request fopen; - struct fsif_close_request fclose; - struct fsif_read_request fread; - struct fsif_write_request fwrite; - struct fsif_stat_request fstat; + struct fsif_open_request fopen; + struct fsif_close_request fclose; + struct fsif_read_request fread; + struct fsif_write_request fwrite; + struct fsif_stat_request fstat; struct fsif_truncate_request ftruncate; - struct fsif_remove_request fremove; - struct fsif_rename_request frename; - struct fsif_create_request fcreate; - struct fsif_list_request flist; - struct fsif_chmod_request fchmod; - struct fsif_space_request fspace; - struct fsif_sync_request fsync; + struct fsif_remove_request fremove; + struct fsif_rename_request frename; + struct fsif_create_request fcreate; + struct fsif_list_request flist; + struct fsif_chmod_request fchmod; + struct fsif_space_request fspace; + struct fsif_sync_request fsync; } u; }; typedef struct fsif_request fsif_request_t; @@ -174,19 +174,23 @@ struct fsif_response { typedef struct fsif_response fsif_response_t; -#define FSIF_RING_ENTRY_SIZE 64 +#define FSIF_RING_ENTRY_SIZE 64 -#define FSIF_NR_READ_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_read_request)) / \ - sizeof(grant_ref_t) + 1) -#define FSIF_NR_WRITE_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_write_request)) / \ - sizeof(grant_ref_t) + 1) +#define FSIF_NR_READ_GNTS \ + ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_read_request)) / \ + sizeof(grant_ref_t) + \ + 1) +#define FSIF_NR_WRITE_GNTS \ + ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_write_request)) / \ + sizeof(grant_ref_t) + \ + 1) DEFINE_RING_TYPES(fsif, struct fsif_request, struct fsif_response); -#define STATE_INITIALISED "init" -#define STATE_READY "ready" -#define STATE_CLOSING "closing" -#define STATE_CLOSED "closed" +#define STATE_INITIALISED "init" +#define STATE_READY "ready" +#define STATE_CLOSING "closing" +#define STATE_CLOSED "closed" #endif diff --git a/include/xen/io/kbdif.h b/include/xen/io/kbdif.h index a6b01c52c..7389c6974 100644 --- a/include/xen/io/kbdif.h +++ b/include/xen/io/kbdif.h @@ -177,26 +177,26 @@ * EVENT CODES. */ -#define XENKBD_TYPE_MOTION 1 -#define XENKBD_TYPE_RESERVED 2 -#define XENKBD_TYPE_KEY 3 -#define XENKBD_TYPE_POS 4 -#define XENKBD_TYPE_MTOUCH 5 +#define XENKBD_TYPE_MOTION 1 +#define XENKBD_TYPE_RESERVED 2 +#define XENKBD_TYPE_KEY 3 +#define XENKBD_TYPE_POS 4 +#define XENKBD_TYPE_MTOUCH 5 /* Multi-touch event sub-codes */ -#define XENKBD_MT_EV_DOWN 0 -#define XENKBD_MT_EV_UP 1 -#define XENKBD_MT_EV_MOTION 2 -#define XENKBD_MT_EV_SYN 3 -#define XENKBD_MT_EV_SHAPE 4 -#define XENKBD_MT_EV_ORIENT 5 +#define XENKBD_MT_EV_DOWN 0 +#define XENKBD_MT_EV_UP 1 +#define XENKBD_MT_EV_MOTION 2 +#define XENKBD_MT_EV_SYN 3 +#define XENKBD_MT_EV_SHAPE 4 +#define XENKBD_MT_EV_ORIENT 5 /* * CONSTANTS, XENSTORE FIELD AND PATH NAME STRINGS, HELPERS. */ -#define XENKBD_DRIVER_NAME "vkbd" +#define XENKBD_DRIVER_NAME "vkbd" #define XENKBD_FIELD_FEAT_DSBL_KEYBRD "feature-disable-keyboard" #define XENKBD_FIELD_FEAT_DSBL_POINTER "feature-disable-pointer" @@ -216,7 +216,7 @@ #define XENKBD_FIELD_UNIQUE_ID "unique-id" /* OBSOLETE, not recommended for use */ -#define XENKBD_FIELD_RING_REF "page-ref" +#define XENKBD_FIELD_RING_REF "page-ref" /* ***************************************************************************** @@ -267,8 +267,7 @@ * rel_z - int32_t, relative Z motion (wheel) */ -struct xenkbd_motion -{ +struct xenkbd_motion { uint8_t type; int32_t rel_x; int32_t rel_y; @@ -294,8 +293,7 @@ struct xenkbd_motion * keycode - uint32_t, KEY_* from linux/input.h */ -struct xenkbd_key -{ +struct xenkbd_key { uint8_t type; uint8_t pressed; uint32_t keycode; @@ -325,8 +323,7 @@ struct xenkbd_key * rel_z - int32_t, relative Z motion (wheel) */ -struct xenkbd_position -{ +struct xenkbd_position { uint8_t type; int32_t abs_x; int32_t abs_y; @@ -480,18 +477,18 @@ struct xenkbd_position */ struct xenkbd_mtouch { - uint8_t type; /* XENKBD_TYPE_MTOUCH */ - uint8_t event_type; /* XENKBD_MT_EV_??? */ + uint8_t type; /* XENKBD_TYPE_MTOUCH */ + uint8_t event_type; /* XENKBD_MT_EV_??? */ uint8_t contact_id; - uint8_t reserved[5]; /* reserved for the future use */ + uint8_t reserved[5]; /* reserved for the future use */ union { struct { - int32_t abs_x; /* absolute X position, pixels */ - int32_t abs_y; /* absolute Y position, pixels */ + int32_t abs_x; /* absolute X position, pixels */ + int32_t abs_y; /* absolute Y position, pixels */ } pos; struct { - uint32_t major; /* length of the major axis, pixels */ - uint32_t minor; /* length of the minor axis, pixels */ + uint32_t major; /* length of the major axis, pixels */ + uint32_t minor; /* length of the minor axis, pixels */ } shape; int16_t orientation; /* clockwise angle of the major axis */ } u; @@ -499,8 +496,7 @@ struct xenkbd_mtouch { #define XENKBD_IN_EVENT_SIZE 40 -union xenkbd_in_event -{ +union xenkbd_in_event { uint8_t type; struct xenkbd_motion motion; struct xenkbd_key key; @@ -529,8 +525,7 @@ union xenkbd_in_event #define XENKBD_OUT_EVENT_SIZE 40 -union xenkbd_out_event -{ +union xenkbd_out_event { uint8_t type; char pad[XENKBD_OUT_EVENT_SIZE]; }; @@ -542,23 +537,22 @@ union xenkbd_out_event */ #define XENKBD_IN_RING_SIZE 2048 -#define XENKBD_IN_RING_LEN (XENKBD_IN_RING_SIZE / XENKBD_IN_EVENT_SIZE) +#define XENKBD_IN_RING_LEN (XENKBD_IN_RING_SIZE / XENKBD_IN_EVENT_SIZE) #define XENKBD_IN_RING_OFFS 1024 -#define XENKBD_IN_RING(page) \ +#define XENKBD_IN_RING(page) \ ((union xenkbd_in_event *)((char *)(page) + XENKBD_IN_RING_OFFS)) -#define XENKBD_IN_RING_REF(page, idx) \ +#define XENKBD_IN_RING_REF(page, idx) \ (XENKBD_IN_RING((page))[(idx) % XENKBD_IN_RING_LEN]) #define XENKBD_OUT_RING_SIZE 1024 -#define XENKBD_OUT_RING_LEN (XENKBD_OUT_RING_SIZE / XENKBD_OUT_EVENT_SIZE) +#define XENKBD_OUT_RING_LEN (XENKBD_OUT_RING_SIZE / XENKBD_OUT_EVENT_SIZE) #define XENKBD_OUT_RING_OFFS (XENKBD_IN_RING_OFFS + XENKBD_IN_RING_SIZE) -#define XENKBD_OUT_RING(page) \ +#define XENKBD_OUT_RING(page) \ ((union xenkbd_out_event *)((char *)(page) + XENKBD_OUT_RING_OFFS)) -#define XENKBD_OUT_RING_REF(page, idx) \ +#define XENKBD_OUT_RING_REF(page, idx) \ (XENKBD_OUT_RING((page))[(idx) % XENKBD_OUT_RING_LEN]) -struct xenkbd_page -{ +struct xenkbd_page { uint32_t in_cons, in_prod; uint32_t out_cons, out_prod; }; diff --git a/include/xen/io/libxenvchan.h b/include/xen/io/libxenvchan.h index 44284f437..ad51c035a 100644 --- a/include/xen/io/libxenvchan.h +++ b/include/xen/io/libxenvchan.h @@ -51,51 +51,50 @@ #include struct ring_shared { - uint32_t cons, prod; + uint32_t cons, prod; }; #define VCHAN_NOTIFY_WRITE 0x1 -#define VCHAN_NOTIFY_READ 0x2 +#define VCHAN_NOTIFY_READ 0x2 /** * vchan_interface: primary shared data structure */ struct vchan_interface { - /** - * Standard consumer/producer interface, one pair per buffer - * left is client write, server read - * right is client read, server write - */ - struct ring_shared left, right; - /** - * size of the rings, which determines their location - * 10 - at offset 1024 in ring's page - * 11 - at offset 2048 in ring's page - * 12+ - uses 2^(N-12) grants to describe the multi-page ring - * These should remain constant once the page is shared. - * Only one of the two orders can be 10 (or 11). - */ - uint16_t left_order, right_order; - /** - * Shutdown detection: - * 0: client (or server) has exited - * 1: client (or server) is connected - * 2: client has not yet connected - */ - uint8_t cli_live, srv_live; - /** - * Notification bits: - * VCHAN_NOTIFY_WRITE: send notify when data is written - * VCHAN_NOTIFY_READ: send notify when data is read (consumed) - * cli_notify is used for the client to inform the server of its action - */ - uint8_t cli_notify, srv_notify; - /** - * Grant list: ordering is left, right. Must not extend into actual ring - * or grow beyond the end of the initial shared page. - * These should remain constant once the page is shared, to allow - * for possible remapping by a client that restarts. - */ - uint32_t grants[0]; + /** + * Standard consumer/producer interface, one pair per buffer + * left is client write, server read + * right is client read, server write + */ + struct ring_shared left, right; + /** + * size of the rings, which determines their location + * 10 - at offset 1024 in ring's page + * 11 - at offset 2048 in ring's page + * 12+ - uses 2^(N-12) grants to describe the multi-page ring + * These should remain constant once the page is shared. + * Only one of the two orders can be 10 (or 11). + */ + uint16_t left_order, right_order; + /** + * Shutdown detection: + * 0: client (or server) has exited + * 1: client (or server) is connected + * 2: client has not yet connected + */ + uint8_t cli_live, srv_live; + /** + * Notification bits: + * VCHAN_NOTIFY_WRITE: send notify when data is written + * VCHAN_NOTIFY_READ: send notify when data is read (consumed) + * cli_notify is used for the client to inform the server of its action + */ + uint8_t cli_notify, srv_notify; + /** + * Grant list: ordering is left, right. Must not extend into actual ring + * or grow beyond the end of the initial shared page. + * These should remain constant once the page is shared, to allow + * for possible remapping by a client that restarts. + */ + uint32_t grants[0]; }; - diff --git a/include/xen/io/netif.h b/include/xen/io/netif.h index 2454448ba..ed79e760d 100644 --- a/include/xen/io/netif.h +++ b/include/xen/io/netif.h @@ -209,8 +209,7 @@ * Result = Hash(Buffer, 8) */ #define _XEN_NETIF_CTRL_HASH_TYPE_IPV4 0 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV4 \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4) +#define XEN_NETIF_CTRL_HASH_TYPE_IPV4 (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4) /* * A hash calculated over an IP version 4 header and TCP header as @@ -224,7 +223,7 @@ * Result = Hash(Buffer, 12) */ #define _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP 1 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP \ +#define XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP \ (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP) /* @@ -236,8 +235,7 @@ * Result = Hash(Buffer, 32) */ #define _XEN_NETIF_CTRL_HASH_TYPE_IPV6 2 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV6 \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6) +#define XEN_NETIF_CTRL_HASH_TYPE_IPV6 (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6) /* * A hash calculated over an IP version 6 header and TCP header as @@ -251,7 +249,7 @@ * Result = Hash(Buffer, 36) */ #define _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP 3 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP \ +#define XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP \ (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP) /* @@ -284,10 +282,8 @@ * does not already provide an implementation. */ #ifdef XEN_NETIF_DEFINE_TOEPLITZ -static uint32_t xen_netif_toeplitz_hash(const uint8_t *key, - unsigned int keylen, - const uint8_t *buf, - unsigned int buflen) +static uint32_t xen_netif_toeplitz_hash(const uint8_t *key, unsigned int keylen, + const uint8_t *buf, unsigned int buflen) { unsigned int keyi, bufi; uint64_t prefix = 0; @@ -307,7 +303,7 @@ static uint32_t xen_netif_toeplitz_hash(const uint8_t *key, if (byte & 0x80) hash ^= prefix; prefix <<= 1; - byte <<=1; + byte <<= 1; } /* @@ -355,7 +351,7 @@ struct xen_netif_ctrl_request { #define XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM 7 #define XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE 8 #define XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING 9 -#define XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING 10 +#define XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING 10 uint32_t data[3]; }; @@ -422,13 +418,13 @@ struct xen_netif_ctrl_response { */ struct xen_netif_gref { - grant_ref_t ref; - uint16_t flags; + grant_ref_t ref; + uint16_t flags; -#define _XEN_NETIF_CTRLF_GREF_readonly 0 -#define XEN_NETIF_CTRLF_GREF_readonly (1U<<_XEN_NETIF_CTRLF_GREF_readonly) +#define _XEN_NETIF_CTRLF_GREF_readonly 0 +#define XEN_NETIF_CTRLF_GREF_readonly (1U << _XEN_NETIF_CTRLF_GREF_readonly) - uint16_t status; + uint16_t status; }; /* @@ -734,8 +730,7 @@ struct xen_netif_gref { * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER upon completion. */ -DEFINE_RING_TYPES(xen_netif_ctrl, - struct xen_netif_ctrl_request, +DEFINE_RING_TYPES(xen_netif_ctrl, struct xen_netif_ctrl_request, struct xen_netif_ctrl_response); /* @@ -940,20 +935,20 @@ DEFINE_RING_TYPES(xen_netif_ctrl, */ /* Protocol checksum field is blank in the packet (hardware offload)? */ -#define _NETTXF_csum_blank (0) -#define NETTXF_csum_blank (1U<<_NETTXF_csum_blank) +#define _NETTXF_csum_blank (0) +#define NETTXF_csum_blank (1U << _NETTXF_csum_blank) /* Packet data has been validated against protocol checksum. */ #define _NETTXF_data_validated (1) -#define NETTXF_data_validated (1U<<_NETTXF_data_validated) +#define NETTXF_data_validated (1U << _NETTXF_data_validated) /* Packet continues in the next request descriptor. */ -#define _NETTXF_more_data (2) -#define NETTXF_more_data (1U<<_NETTXF_more_data) +#define _NETTXF_more_data (2) +#define NETTXF_more_data (1U << _NETTXF_more_data) /* Packet to be followed by extra descriptor(s). */ -#define _NETTXF_extra_info (3) -#define NETTXF_extra_info (1U<<_NETTXF_extra_info) +#define _NETTXF_extra_info (3) +#define NETTXF_extra_info (1U << _NETTXF_extra_info) #define XEN_NETIF_MAX_TX_SIZE 0xFFFF struct netif_tx_request { @@ -966,21 +961,21 @@ struct netif_tx_request { typedef struct netif_tx_request netif_tx_request_t; /* Types of netif_extra_info descriptors. */ -#define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ -#define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ -#define XEN_NETIF_EXTRA_TYPE_MCAST_ADD (2) /* u.mcast */ -#define XEN_NETIF_EXTRA_TYPE_MCAST_DEL (3) /* u.mcast */ -#define XEN_NETIF_EXTRA_TYPE_HASH (4) /* u.hash */ +#define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ +#define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ +#define XEN_NETIF_EXTRA_TYPE_MCAST_ADD (2) /* u.mcast */ +#define XEN_NETIF_EXTRA_TYPE_MCAST_DEL (3) /* u.mcast */ +#define XEN_NETIF_EXTRA_TYPE_HASH (4) /* u.hash */ #define XEN_NETIF_EXTRA_TYPE_MAX (5) /* netif_extra_info_t flags. */ #define _XEN_NETIF_EXTRA_FLAG_MORE (0) -#define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) +#define XEN_NETIF_EXTRA_FLAG_MORE (1U << _XEN_NETIF_EXTRA_FLAG_MORE) /* GSO types */ -#define XEN_NETIF_GSO_TYPE_NONE (0) -#define XEN_NETIF_GSO_TYPE_TCPV4 (1) -#define XEN_NETIF_GSO_TYPE_TCPV6 (2) +#define XEN_NETIF_GSO_TYPE_NONE (0) +#define XEN_NETIF_GSO_TYPE_TCPV4 (1) +#define XEN_NETIF_GSO_TYPE_TCPV6 (2) /* * This structure needs to fit within both netif_tx_request_t and @@ -1011,42 +1006,42 @@ typedef struct netif_extra_info netif_extra_info_t; struct netif_tx_response { uint16_t id; - int16_t status; + int16_t status; }; typedef struct netif_tx_response netif_tx_response_t; struct netif_rx_request { - uint16_t id; /* Echoed in response message. */ - uint16_t pad; + uint16_t id; /* Echoed in response message. */ + uint16_t pad; grant_ref_t gref; }; typedef struct netif_rx_request netif_rx_request_t; /* Packet data has been validated against protocol checksum. */ #define _NETRXF_data_validated (0) -#define NETRXF_data_validated (1U<<_NETRXF_data_validated) +#define NETRXF_data_validated (1U << _NETRXF_data_validated) /* Protocol checksum field is blank in the packet (hardware offload)? */ -#define _NETRXF_csum_blank (1) -#define NETRXF_csum_blank (1U<<_NETRXF_csum_blank) +#define _NETRXF_csum_blank (1) +#define NETRXF_csum_blank (1U << _NETRXF_csum_blank) /* Packet continues in the next request descriptor. */ -#define _NETRXF_more_data (2) -#define NETRXF_more_data (1U<<_NETRXF_more_data) +#define _NETRXF_more_data (2) +#define NETRXF_more_data (1U << _NETRXF_more_data) /* Packet to be followed by extra descriptor(s). */ -#define _NETRXF_extra_info (3) -#define NETRXF_extra_info (1U<<_NETRXF_extra_info) +#define _NETRXF_extra_info (3) +#define NETRXF_extra_info (1U << _NETRXF_extra_info) /* Packet has GSO prefix. Deprecated but included for compatibility */ -#define _NETRXF_gso_prefix (4) -#define NETRXF_gso_prefix (1U<<_NETRXF_gso_prefix) +#define _NETRXF_gso_prefix (4) +#define NETRXF_gso_prefix (1U << _NETRXF_gso_prefix) struct netif_rx_response { uint16_t id; uint16_t offset; uint16_t flags; - int16_t status; + int16_t status; }; typedef struct netif_rx_response netif_rx_response_t; @@ -1057,11 +1052,11 @@ typedef struct netif_rx_response netif_rx_response_t; DEFINE_RING_TYPES(netif_tx, struct netif_tx_request, struct netif_tx_response); DEFINE_RING_TYPES(netif_rx, struct netif_rx_request, struct netif_rx_response); -#define NETIF_RSP_DROPPED -2 -#define NETIF_RSP_ERROR -1 -#define NETIF_RSP_OKAY 0 +#define NETIF_RSP_DROPPED -2 +#define NETIF_RSP_ERROR -1 +#define NETIF_RSP_OKAY 0 /* No response: used for auxiliary requests (e.g., netif_extra_info_t). */ -#define NETIF_RSP_NULL 1 +#define NETIF_RSP_NULL 1 #endif diff --git a/include/xen/io/pciif.h b/include/xen/io/pciif.h index a4ba13cc1..aaa8e696c 100644 --- a/include/xen/io/pciif.h +++ b/include/xen/io/pciif.h @@ -29,39 +29,39 @@ /* xen_pci_sharedinfo flags */ #define _XEN_PCIF_active (0) -#define XEN_PCIF_active (1<<_XEN_PCIF_active) +#define XEN_PCIF_active (1 << _XEN_PCIF_active) #define _XEN_PCIB_AERHANDLER (1) -#define XEN_PCIB_AERHANDLER (1<<_XEN_PCIB_AERHANDLER) +#define XEN_PCIB_AERHANDLER (1 << _XEN_PCIB_AERHANDLER) #define _XEN_PCIB_active (2) -#define XEN_PCIB_active (1<<_XEN_PCIB_active) +#define XEN_PCIB_active (1 << _XEN_PCIB_active) /* xen_pci_op commands */ -#define XEN_PCI_OP_conf_read (0) -#define XEN_PCI_OP_conf_write (1) -#define XEN_PCI_OP_enable_msi (2) -#define XEN_PCI_OP_disable_msi (3) -#define XEN_PCI_OP_enable_msix (4) -#define XEN_PCI_OP_disable_msix (5) -#define XEN_PCI_OP_aer_detected (6) -#define XEN_PCI_OP_aer_resume (7) -#define XEN_PCI_OP_aer_mmio (8) -#define XEN_PCI_OP_aer_slotreset (9) -#define XEN_PCI_OP_enable_multi_msi (10) +#define XEN_PCI_OP_conf_read (0) +#define XEN_PCI_OP_conf_write (1) +#define XEN_PCI_OP_enable_msi (2) +#define XEN_PCI_OP_disable_msi (3) +#define XEN_PCI_OP_enable_msix (4) +#define XEN_PCI_OP_disable_msix (5) +#define XEN_PCI_OP_aer_detected (6) +#define XEN_PCI_OP_aer_resume (7) +#define XEN_PCI_OP_aer_mmio (8) +#define XEN_PCI_OP_aer_slotreset (9) +#define XEN_PCI_OP_enable_multi_msi (10) /* xen_pci_op error numbers */ -#define XEN_PCI_ERR_success (0) +#define XEN_PCI_ERR_success (0) #define XEN_PCI_ERR_dev_not_found (-1) #define XEN_PCI_ERR_invalid_offset (-2) #define XEN_PCI_ERR_access_denied (-3) #define XEN_PCI_ERR_not_implemented (-4) /* XEN_PCI_ERR_op_failed - backend failed to complete the operation */ -#define XEN_PCI_ERR_op_failed (-5) +#define XEN_PCI_ERR_op_failed (-5) /* * it should be PAGE_SIZE-sizeof(struct xen_pci_op))/sizeof(struct msix_entry)) * Should not exceed 128 */ -#define SH_INFO_MAX_VEC 128 +#define SH_INFO_MAX_VEC 128 struct xen_msix_entry { uint16_t vector; @@ -92,8 +92,7 @@ struct xen_pci_op { }; /*used for pcie aer handling*/ -struct xen_pcie_aer_op -{ +struct xen_pcie_aer_op { /* IN: what action to perform: XEN_PCI_OP_* */ uint32_t cmd; diff --git a/include/xen/io/protocols.h b/include/xen/io/protocols.h index 52b4de0f8..24988bc39 100644 --- a/include/xen/io/protocols.h +++ b/include/xen/io/protocols.h @@ -25,18 +25,18 @@ #ifndef __XEN_PROTOCOLS_H__ #define __XEN_PROTOCOLS_H__ -#define XEN_IO_PROTO_ABI_X86_32 "x86_32-abi" -#define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" -#define XEN_IO_PROTO_ABI_ARM "arm-abi" +#define XEN_IO_PROTO_ABI_X86_32 "x86_32-abi" +#define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" +#define XEN_IO_PROTO_ABI_ARM "arm-abi" #if defined(__i386__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 +#define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 #elif defined(__x86_64__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64 +#define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64 #elif defined(__arm__) || defined(__aarch64__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM +#define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM #else -# error arch fixup needed here +#error arch fixup needed here #endif #endif diff --git a/include/xen/io/pvcalls.h b/include/xen/io/pvcalls.h index cb8171275..8dd67190e 100644 --- a/include/xen/io/pvcalls.h +++ b/include/xen/io/pvcalls.h @@ -48,17 +48,17 @@ struct pvcalls_data_intf { }; DEFINE_XEN_FLEX_RING(pvcalls); -#define PVCALLS_SOCKET 0 -#define PVCALLS_CONNECT 1 -#define PVCALLS_RELEASE 2 -#define PVCALLS_BIND 3 -#define PVCALLS_LISTEN 4 -#define PVCALLS_ACCEPT 5 -#define PVCALLS_POLL 6 +#define PVCALLS_SOCKET 0 +#define PVCALLS_CONNECT 1 +#define PVCALLS_RELEASE 2 +#define PVCALLS_BIND 3 +#define PVCALLS_LISTEN 4 +#define PVCALLS_ACCEPT 5 +#define PVCALLS_POLL 6 struct xen_pvcalls_request { uint32_t req_id; /* private to guest, echoed in response */ - uint32_t cmd; /* command to execute */ + uint32_t cmd; /* command to execute */ union { struct xen_pvcalls_socket { uint64_t id; diff --git a/include/xen/io/ring.h b/include/xen/io/ring.h index c5d53e310..14c95bad8 100644 --- a/include/xen/io/ring.h +++ b/include/xen/io/ring.h @@ -53,11 +53,11 @@ typedef unsigned int RING_IDX; /* Round a 32-bit unsigned constant down to the nearest power of two. */ -#define __RD2(_x) (((_x) & 0x00000002) ? 0x2 : ((_x) & 0x1)) -#define __RD4(_x) (((_x) & 0x0000000c) ? __RD2((_x)>>2)<<2 : __RD2(_x)) -#define __RD8(_x) (((_x) & 0x000000f0) ? __RD4((_x)>>4)<<4 : __RD4(_x)) -#define __RD16(_x) (((_x) & 0x0000ff00) ? __RD8((_x)>>8)<<8 : __RD8(_x)) -#define __RD32(_x) (((_x) & 0xffff0000) ? __RD16((_x)>>16)<<16 : __RD16(_x)) +#define __RD2(_x) (((_x) & 0x00000002) ? 0x2 : ((_x) & 0x1)) +#define __RD4(_x) (((_x) & 0x0000000c) ? __RD2((_x) >> 2) << 2 : __RD2(_x)) +#define __RD8(_x) (((_x) & 0x000000f0) ? __RD4((_x) >> 4) << 4 : __RD4(_x)) +#define __RD16(_x) (((_x) & 0x0000ff00) ? __RD8((_x) >> 8) << 8 : __RD8(_x)) +#define __RD32(_x) (((_x) & 0xffff0000) ? __RD16((_x) >> 16) << 16 : __RD16(_x)) /* * Calculate size of a shared ring, given the total available space for the @@ -65,13 +65,13 @@ typedef unsigned int RING_IDX; * A ring contains as many entries as will fit, rounded down to the nearest * power of two (so we can mask with (size-1) to loop around). */ -#define __CONST_RING_SIZE(_s, _sz) \ - (__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \ - sizeof(((struct _s##_sring *)0)->ring[0]))) +#define __CONST_RING_SIZE(_s, _sz) \ + (__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \ + sizeof(((struct _s##_sring *)0)->ring[0]))) /* * The same for passing in an actual pointer instead of a name tag. */ -#define __RING_SIZE(_s, _sz) \ +#define __RING_SIZE(_s, _sz) \ (__RD32(((_sz) - (long)(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0]))) /* @@ -106,51 +106,51 @@ typedef unsigned int RING_IDX; * BACK_RING_INIT(&back_ring, (mytag_sring_t *)shared_page, PAGE_SIZE); */ -#define DEFINE_RING_TYPES(__name, __req_t, __rsp_t) \ - \ -/* Shared ring entry */ \ -union __name##_sring_entry { \ - __req_t req; \ - __rsp_t rsp; \ -}; \ - \ -/* Shared ring page */ \ -struct __name##_sring { \ - RING_IDX req_prod, req_event; \ - RING_IDX rsp_prod, rsp_event; \ - union { \ - struct { \ - uint8_t smartpoll_active; \ - } netif; \ - struct { \ - uint8_t msg; \ - } tapif_user; \ - uint8_t pvt_pad[4]; \ - } pvt; \ - uint8_t __pad[44]; \ - union __name##_sring_entry ring[1]; /* variable-length */ \ -}; \ - \ -/* "Front" end's private variables */ \ -struct __name##_front_ring { \ - RING_IDX req_prod_pvt; \ - RING_IDX rsp_cons; \ - unsigned int nr_ents; \ - struct __name##_sring *sring; \ -}; \ - \ -/* "Back" end's private variables */ \ -struct __name##_back_ring { \ - RING_IDX rsp_prod_pvt; \ - RING_IDX req_cons; \ - unsigned int nr_ents; \ - struct __name##_sring *sring; \ -}; \ - \ -/* Syntactic sugar */ \ -typedef struct __name##_sring __name##_sring_t; \ -typedef struct __name##_front_ring __name##_front_ring_t; \ -typedef struct __name##_back_ring __name##_back_ring_t +#define DEFINE_RING_TYPES(__name, __req_t, __rsp_t) \ + \ + /* Shared ring entry */ \ + union __name##_sring_entry { \ + __req_t req; \ + __rsp_t rsp; \ + }; \ + \ + /* Shared ring page */ \ + struct __name##_sring { \ + RING_IDX req_prod, req_event; \ + RING_IDX rsp_prod, rsp_event; \ + union { \ + struct { \ + uint8_t smartpoll_active; \ + } netif; \ + struct { \ + uint8_t msg; \ + } tapif_user; \ + uint8_t pvt_pad[4]; \ + } pvt; \ + uint8_t __pad[44]; \ + union __name##_sring_entry ring[1]; /* variable-length */ \ + }; \ + \ + /* "Front" end's private variables */ \ + struct __name##_front_ring { \ + RING_IDX req_prod_pvt; \ + RING_IDX rsp_cons; \ + unsigned int nr_ents; \ + struct __name##_sring *sring; \ + }; \ + \ + /* "Back" end's private variables */ \ + struct __name##_back_ring { \ + RING_IDX rsp_prod_pvt; \ + RING_IDX req_cons; \ + unsigned int nr_ents; \ + struct __name##_sring *sring; \ + }; \ + \ + /* Syntactic sugar */ \ + typedef struct __name##_sring __name##_sring_t; \ + typedef struct __name##_front_ring __name##_front_ring_t; \ + typedef struct __name##_back_ring __name##_back_ring_t /* * Macros for manipulating rings. @@ -168,63 +168,65 @@ typedef struct __name##_back_ring __name##_back_ring_t */ /* Initialising empty rings */ -#define SHARED_RING_INIT(_s) do { \ - (_s)->req_prod = (_s)->rsp_prod = 0; \ - (_s)->req_event = (_s)->rsp_event = 1; \ - (void)memset((_s)->pvt.pvt_pad, 0, sizeof((_s)->pvt.pvt_pad)); \ - (void)memset((_s)->__pad, 0, sizeof((_s)->__pad)); \ -} while(0) - -#define FRONT_RING_INIT(_r, _s, __size) do { \ - (_r)->req_prod_pvt = 0; \ - (_r)->rsp_cons = 0; \ - (_r)->nr_ents = __RING_SIZE(_s, __size); \ - (_r)->sring = (_s); \ -} while (0) - -#define BACK_RING_INIT(_r, _s, __size) do { \ - (_r)->rsp_prod_pvt = 0; \ - (_r)->req_cons = 0; \ - (_r)->nr_ents = __RING_SIZE(_s, __size); \ - (_r)->sring = (_s); \ -} while (0) +#define SHARED_RING_INIT(_s) \ + do { \ + (_s)->req_prod = (_s)->rsp_prod = 0; \ + (_s)->req_event = (_s)->rsp_event = 1; \ + (void)memset((_s)->pvt.pvt_pad, 0, sizeof((_s)->pvt.pvt_pad)); \ + (void)memset((_s)->__pad, 0, sizeof((_s)->__pad)); \ + } while (0) + +#define FRONT_RING_INIT(_r, _s, __size) \ + do { \ + (_r)->req_prod_pvt = 0; \ + (_r)->rsp_cons = 0; \ + (_r)->nr_ents = __RING_SIZE(_s, __size); \ + (_r)->sring = (_s); \ + } while (0) + +#define BACK_RING_INIT(_r, _s, __size) \ + do { \ + (_r)->rsp_prod_pvt = 0; \ + (_r)->req_cons = 0; \ + (_r)->nr_ents = __RING_SIZE(_s, __size); \ + (_r)->sring = (_s); \ + } while (0) /* How big is this ring? */ -#define RING_SIZE(_r) \ - ((_r)->nr_ents) +#define RING_SIZE(_r) ((_r)->nr_ents) /* Number of free requests (for use on front side only). */ -#define RING_FREE_REQUESTS(_r) \ +#define RING_FREE_REQUESTS(_r) \ (RING_SIZE(_r) - ((_r)->req_prod_pvt - (_r)->rsp_cons)) /* Test if there is an empty slot available on the front ring. * (This is only meaningful from the front. ) */ -#define RING_FULL(_r) \ - (RING_FREE_REQUESTS(_r) == 0) +#define RING_FULL(_r) (RING_FREE_REQUESTS(_r) == 0) /* Test if there are outstanding messages to be processed on a ring. */ -#define RING_HAS_UNCONSUMED_RESPONSES(_r) \ +#define RING_HAS_UNCONSUMED_RESPONSES(_r) \ ((_r)->sring->rsp_prod - (_r)->rsp_cons) #ifdef __GNUC__ -#define RING_HAS_UNCONSUMED_REQUESTS(_r) ({ \ - unsigned int req = (_r)->sring->req_prod - (_r)->req_cons; \ - unsigned int rsp = RING_SIZE(_r) - \ - ((_r)->req_cons - (_r)->rsp_prod_pvt); \ - req < rsp ? req : rsp; \ -}) +#define RING_HAS_UNCONSUMED_REQUESTS(_r) \ + ({ \ + unsigned int req = (_r)->sring->req_prod - (_r)->req_cons; \ + unsigned int rsp = \ + RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt); \ + req < rsp ? req : rsp; \ + }) #else /* Same as above, but without the nice GCC ({ ... }) syntax. */ -#define RING_HAS_UNCONSUMED_REQUESTS(_r) \ - ((((_r)->sring->req_prod - (_r)->req_cons) < \ - (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) ? \ - ((_r)->sring->req_prod - (_r)->req_cons) : \ - (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) +#define RING_HAS_UNCONSUMED_REQUESTS(_r) \ + ((((_r)->sring->req_prod - (_r)->req_cons) < \ + (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) \ + ? ((_r)->sring->req_prod - (_r)->req_cons) \ + : (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) #endif /* Direct access to individual ring elements, by index. */ -#define RING_GET_REQUEST(_r, _idx) \ +#define RING_GET_REQUEST(_r, _idx) \ (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].req)) /* @@ -236,31 +238,34 @@ typedef struct __name##_back_ring __name##_back_ring_t * Note that https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145 may cause this * to be ineffective where _req is a struct which consists of only bitfields. */ -#define RING_COPY_REQUEST(_r, _idx, _req) do { \ - /* Use volatile to force the copy into _req. */ \ - *(_req) = *(volatile typeof(_req))RING_GET_REQUEST(_r, _idx); \ -} while (0) +#define RING_COPY_REQUEST(_r, _idx, _req) \ + do { \ + /* Use volatile to force the copy into _req. */ \ + *(_req) = *(volatile typeof(_req))RING_GET_REQUEST(_r, _idx); \ + } while (0) -#define RING_GET_RESPONSE(_r, _idx) \ +#define RING_GET_RESPONSE(_r, _idx) \ (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp)) /* Loop termination condition: Would the specified index overflow the ring? */ -#define RING_REQUEST_CONS_OVERFLOW(_r, _cons) \ +#define RING_REQUEST_CONS_OVERFLOW(_r, _cons) \ (((_cons) - (_r)->rsp_prod_pvt) >= RING_SIZE(_r)) /* Ill-behaved frontend determination: Can there be this many requests? */ -#define RING_REQUEST_PROD_OVERFLOW(_r, _prod) \ +#define RING_REQUEST_PROD_OVERFLOW(_r, _prod) \ (((_prod) - (_r)->rsp_prod_pvt) > RING_SIZE(_r)) -#define RING_PUSH_REQUESTS(_r) do { \ - xen_wmb(); /* back sees requests /before/ updated producer index */ \ - (_r)->sring->req_prod = (_r)->req_prod_pvt; \ -} while (0) +#define RING_PUSH_REQUESTS(_r) \ + do { \ + xen_wmb(); /* back sees requests /before/ updated producer index */ \ + (_r)->sring->req_prod = (_r)->req_prod_pvt; \ + } while (0) -#define RING_PUSH_RESPONSES(_r) do { \ - xen_wmb(); /* front sees resps /before/ updated producer index */ \ - (_r)->sring->rsp_prod = (_r)->rsp_prod_pvt; \ -} while (0) +#define RING_PUSH_RESPONSES(_r) \ + do { \ + xen_wmb(); /* front sees resps /before/ updated producer index */ \ + (_r)->sring->rsp_prod = (_r)->rsp_prod_pvt; \ + } while (0) /* * Notification hold-off (req_event and rsp_event): @@ -292,41 +297,47 @@ typedef struct __name##_back_ring __name##_back_ring_t * field appropriately. */ -#define RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(_r, _notify) do { \ - RING_IDX __old = (_r)->sring->req_prod; \ - RING_IDX __new = (_r)->req_prod_pvt; \ - xen_wmb(); /* back sees requests /before/ updated producer index */ \ - (_r)->sring->req_prod = __new; \ - xen_mb(); /* back sees new requests /before/ we check req_event */ \ - (_notify) = ((RING_IDX)(__new - (_r)->sring->req_event) < \ - (RING_IDX)(__new - __old)); \ -} while (0) - -#define RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(_r, _notify) do { \ - RING_IDX __old = (_r)->sring->rsp_prod; \ - RING_IDX __new = (_r)->rsp_prod_pvt; \ - xen_wmb(); /* front sees resps /before/ updated producer index */ \ - (_r)->sring->rsp_prod = __new; \ - xen_mb(); /* front sees new resps /before/ we check rsp_event */ \ - (_notify) = ((RING_IDX)(__new - (_r)->sring->rsp_event) < \ - (RING_IDX)(__new - __old)); \ -} while (0) - -#define RING_FINAL_CHECK_FOR_REQUESTS(_r, _work_to_do) do { \ - (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r); \ - if (_work_to_do) break; \ - (_r)->sring->req_event = (_r)->req_cons + 1; \ - xen_mb(); \ - (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r); \ -} while (0) - -#define RING_FINAL_CHECK_FOR_RESPONSES(_r, _work_to_do) do { \ - (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r); \ - if (_work_to_do) break; \ - (_r)->sring->rsp_event = (_r)->rsp_cons + 1; \ - xen_mb(); \ - (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r); \ -} while (0) +#define RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(_r, _notify) \ + do { \ + RING_IDX __old = (_r)->sring->req_prod; \ + RING_IDX __new = (_r)->req_prod_pvt; \ + xen_wmb(); /* back sees requests /before/ updated producer index */ \ + (_r)->sring->req_prod = __new; \ + xen_mb(); /* back sees new requests /before/ we check req_event */ \ + (_notify) = ((RING_IDX)(__new - (_r)->sring->req_event) < \ + (RING_IDX)(__new - __old)); \ + } while (0) + +#define RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(_r, _notify) \ + do { \ + RING_IDX __old = (_r)->sring->rsp_prod; \ + RING_IDX __new = (_r)->rsp_prod_pvt; \ + xen_wmb(); /* front sees resps /before/ updated producer index */ \ + (_r)->sring->rsp_prod = __new; \ + xen_mb(); /* front sees new resps /before/ we check rsp_event */ \ + (_notify) = ((RING_IDX)(__new - (_r)->sring->rsp_event) < \ + (RING_IDX)(__new - __old)); \ + } while (0) + +#define RING_FINAL_CHECK_FOR_REQUESTS(_r, _work_to_do) \ + do { \ + (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r); \ + if (_work_to_do) \ + break; \ + (_r)->sring->req_event = (_r)->req_cons + 1; \ + xen_mb(); \ + (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r); \ + } while (0) + +#define RING_FINAL_CHECK_FOR_RESPONSES(_r, _work_to_do) \ + do { \ + (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r); \ + if (_work_to_do) \ + break; \ + (_r)->sring->rsp_event = (_r)->rsp_cons + 1; \ + xen_mb(); \ + (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r); \ + } while (0) /* @@ -377,99 +388,88 @@ typedef struct __name##_back_ring __name##_back_ring_t */ #define XEN_PAGE_SHIFT 12 #endif -#define XEN_FLEX_RING_SIZE(order) \ - (1UL << ((order) + XEN_PAGE_SHIFT - 1)) - -#define DEFINE_XEN_FLEX_RING(name) \ -static inline RING_IDX name##_mask(RING_IDX idx, RING_IDX ring_size) \ -{ \ - return idx & (ring_size - 1); \ -} \ - \ -static inline unsigned char *name##_get_ring_ptr(unsigned char *buf, \ - RING_IDX idx, \ - RING_IDX ring_size) \ -{ \ - return buf + name##_mask(idx, ring_size); \ -} \ - \ -static inline void name##_read_packet(void *opaque, \ - const unsigned char *buf, \ - size_t size, \ - RING_IDX masked_prod, \ - RING_IDX *masked_cons, \ - RING_IDX ring_size) \ -{ \ - if (*masked_cons < masked_prod || \ - size <= ring_size - *masked_cons) { \ - memcpy(opaque, buf + *masked_cons, size); \ - } else { \ - memcpy(opaque, buf + *masked_cons, ring_size - *masked_cons); \ - memcpy((unsigned char *)opaque + ring_size - *masked_cons, buf, \ - size - (ring_size - *masked_cons)); \ - } \ - *masked_cons = name##_mask(*masked_cons + size, ring_size); \ -} \ - \ -static inline void name##_write_packet(unsigned char *buf, \ - const void *opaque, \ - size_t size, \ - RING_IDX *masked_prod, \ - RING_IDX masked_cons, \ - RING_IDX ring_size) \ -{ \ - if (*masked_prod < masked_cons || \ - size <= ring_size - *masked_prod) { \ - memcpy(buf + *masked_prod, opaque, size); \ - } else { \ - memcpy(buf + *masked_prod, opaque, ring_size - *masked_prod); \ - memcpy(buf, (unsigned char *)opaque + (ring_size - *masked_prod), \ - size - (ring_size - *masked_prod)); \ - } \ - *masked_prod = name##_mask(*masked_prod + size, ring_size); \ -} \ - \ -static inline RING_IDX name##_queued(RING_IDX prod, \ - RING_IDX cons, \ - RING_IDX ring_size) \ -{ \ - RING_IDX size; \ - \ - if (prod == cons) \ - return 0; \ - \ - prod = name##_mask(prod, ring_size); \ - cons = name##_mask(cons, ring_size); \ - \ - if (prod == cons) \ - return ring_size; \ - \ - if (prod > cons) \ - size = prod - cons; \ - else \ - size = ring_size - (cons - prod); \ - return size; \ -} \ - \ -struct name##_data { \ - unsigned char *in; /* half of the allocation */ \ - unsigned char *out; /* half of the allocation */ \ -} - -#define DEFINE_XEN_FLEX_RING_AND_INTF(name) \ -struct name##_data_intf { \ - RING_IDX in_cons, in_prod; \ - \ - uint8_t pad1[56]; \ - \ - RING_IDX out_cons, out_prod; \ - \ - uint8_t pad2[56]; \ - \ - RING_IDX ring_order; \ - grant_ref_t ref[]; \ -}; \ -DEFINE_XEN_FLEX_RING(name) +#define XEN_FLEX_RING_SIZE(order) (1UL << ((order) + XEN_PAGE_SHIFT - 1)) + +#define DEFINE_XEN_FLEX_RING(name) \ + static inline RING_IDX name##_mask(RING_IDX idx, RING_IDX ring_size) \ + { \ + return idx & (ring_size - 1); \ + } \ + \ + static inline unsigned char *name##_get_ring_ptr( \ + unsigned char *buf, RING_IDX idx, RING_IDX ring_size) \ + { \ + return buf + name##_mask(idx, ring_size); \ + } \ + \ + static inline void name##_read_packet( \ + void *opaque, const unsigned char *buf, size_t size, \ + RING_IDX masked_prod, RING_IDX *masked_cons, RING_IDX ring_size) \ + { \ + if (*masked_cons < masked_prod || size <= ring_size - *masked_cons) { \ + memcpy(opaque, buf + *masked_cons, size); \ + } else { \ + memcpy(opaque, buf + *masked_cons, ring_size - *masked_cons); \ + memcpy((unsigned char *)opaque + ring_size - *masked_cons, buf, \ + size - (ring_size - *masked_cons)); \ + } \ + *masked_cons = name##_mask(*masked_cons + size, ring_size); \ + } \ + \ + static inline void name##_write_packet( \ + unsigned char *buf, const void *opaque, size_t size, \ + RING_IDX *masked_prod, RING_IDX masked_cons, RING_IDX ring_size) \ + { \ + if (*masked_prod < masked_cons || size <= ring_size - *masked_prod) { \ + memcpy(buf + *masked_prod, opaque, size); \ + } else { \ + memcpy(buf + *masked_prod, opaque, ring_size - *masked_prod); \ + memcpy(buf, (unsigned char *)opaque + (ring_size - *masked_prod), \ + size - (ring_size - *masked_prod)); \ + } \ + *masked_prod = name##_mask(*masked_prod + size, ring_size); \ + } \ + \ + static inline RING_IDX name##_queued(RING_IDX prod, RING_IDX cons, \ + RING_IDX ring_size) \ + { \ + RING_IDX size; \ + \ + if (prod == cons) \ + return 0; \ + \ + prod = name##_mask(prod, ring_size); \ + cons = name##_mask(cons, ring_size); \ + \ + if (prod == cons) \ + return ring_size; \ + \ + if (prod > cons) \ + size = prod - cons; \ + else \ + size = ring_size - (cons - prod); \ + return size; \ + } \ + \ + struct name##_data { \ + unsigned char *in; /* half of the allocation */ \ + unsigned char *out; /* half of the allocation */ \ + } + +#define DEFINE_XEN_FLEX_RING_AND_INTF(name) \ + struct name##_data_intf { \ + RING_IDX in_cons, in_prod; \ + \ + uint8_t pad1[56]; \ + \ + RING_IDX out_cons, out_prod; \ + \ + uint8_t pad2[56]; \ + \ + RING_IDX ring_order; \ + grant_ref_t ref[]; \ + }; \ + DEFINE_XEN_FLEX_RING(name) #endif /* __XEN_PUBLIC_IO_RING_H__ */ diff --git a/include/xen/io/sndif.h b/include/xen/io/sndif.h index 402033cf4..9d9e46ca7 100644 --- a/include/xen/io/sndif.h +++ b/include/xen/io/sndif.h @@ -41,7 +41,7 @@ * Protocol version ****************************************************************************** */ -#define XENSND_PROTOCOL_VERSION 2 +#define XENSND_PROTOCOL_VERSION 2 /* ****************************************************************************** @@ -423,119 +423,119 @@ * endian: , may be absent * LE - Little endian, BE - Big endian */ -#define XENSND_PCM_FORMAT_S8 0 -#define XENSND_PCM_FORMAT_U8 1 -#define XENSND_PCM_FORMAT_S16_LE 2 -#define XENSND_PCM_FORMAT_S16_BE 3 -#define XENSND_PCM_FORMAT_U16_LE 4 -#define XENSND_PCM_FORMAT_U16_BE 5 -#define XENSND_PCM_FORMAT_S24_LE 6 -#define XENSND_PCM_FORMAT_S24_BE 7 -#define XENSND_PCM_FORMAT_U24_LE 8 -#define XENSND_PCM_FORMAT_U24_BE 9 -#define XENSND_PCM_FORMAT_S32_LE 10 -#define XENSND_PCM_FORMAT_S32_BE 11 -#define XENSND_PCM_FORMAT_U32_LE 12 -#define XENSND_PCM_FORMAT_U32_BE 13 -#define XENSND_PCM_FORMAT_F32_LE 14 /* 4-byte float, IEEE-754 32-bit, */ -#define XENSND_PCM_FORMAT_F32_BE 15 /* range -1.0 to 1.0 */ -#define XENSND_PCM_FORMAT_F64_LE 16 /* 8-byte float, IEEE-754 64-bit, */ -#define XENSND_PCM_FORMAT_F64_BE 17 /* range -1.0 to 1.0 */ +#define XENSND_PCM_FORMAT_S8 0 +#define XENSND_PCM_FORMAT_U8 1 +#define XENSND_PCM_FORMAT_S16_LE 2 +#define XENSND_PCM_FORMAT_S16_BE 3 +#define XENSND_PCM_FORMAT_U16_LE 4 +#define XENSND_PCM_FORMAT_U16_BE 5 +#define XENSND_PCM_FORMAT_S24_LE 6 +#define XENSND_PCM_FORMAT_S24_BE 7 +#define XENSND_PCM_FORMAT_U24_LE 8 +#define XENSND_PCM_FORMAT_U24_BE 9 +#define XENSND_PCM_FORMAT_S32_LE 10 +#define XENSND_PCM_FORMAT_S32_BE 11 +#define XENSND_PCM_FORMAT_U32_LE 12 +#define XENSND_PCM_FORMAT_U32_BE 13 +#define XENSND_PCM_FORMAT_F32_LE 14 /* 4-byte float, IEEE-754 32-bit, */ +#define XENSND_PCM_FORMAT_F32_BE 15 /* range -1.0 to 1.0 */ +#define XENSND_PCM_FORMAT_F64_LE 16 /* 8-byte float, IEEE-754 64-bit, */ +#define XENSND_PCM_FORMAT_F64_BE 17 /* range -1.0 to 1.0 */ #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE 18 #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE 19 -#define XENSND_PCM_FORMAT_MU_LAW 20 -#define XENSND_PCM_FORMAT_A_LAW 21 -#define XENSND_PCM_FORMAT_IMA_ADPCM 22 -#define XENSND_PCM_FORMAT_MPEG 23 -#define XENSND_PCM_FORMAT_GSM 24 +#define XENSND_PCM_FORMAT_MU_LAW 20 +#define XENSND_PCM_FORMAT_A_LAW 21 +#define XENSND_PCM_FORMAT_IMA_ADPCM 22 +#define XENSND_PCM_FORMAT_MPEG 23 +#define XENSND_PCM_FORMAT_GSM 24 /* ****************************************************************************** * REQUEST CODES ****************************************************************************** */ -#define XENSND_OP_OPEN 0 -#define XENSND_OP_CLOSE 1 -#define XENSND_OP_READ 2 -#define XENSND_OP_WRITE 3 -#define XENSND_OP_SET_VOLUME 4 -#define XENSND_OP_GET_VOLUME 5 -#define XENSND_OP_MUTE 6 -#define XENSND_OP_UNMUTE 7 -#define XENSND_OP_TRIGGER 8 -#define XENSND_OP_HW_PARAM_QUERY 9 +#define XENSND_OP_OPEN 0 +#define XENSND_OP_CLOSE 1 +#define XENSND_OP_READ 2 +#define XENSND_OP_WRITE 3 +#define XENSND_OP_SET_VOLUME 4 +#define XENSND_OP_GET_VOLUME 5 +#define XENSND_OP_MUTE 6 +#define XENSND_OP_UNMUTE 7 +#define XENSND_OP_TRIGGER 8 +#define XENSND_OP_HW_PARAM_QUERY 9 -#define XENSND_OP_TRIGGER_START 0 -#define XENSND_OP_TRIGGER_PAUSE 1 -#define XENSND_OP_TRIGGER_STOP 2 -#define XENSND_OP_TRIGGER_RESUME 3 +#define XENSND_OP_TRIGGER_START 0 +#define XENSND_OP_TRIGGER_PAUSE 1 +#define XENSND_OP_TRIGGER_STOP 2 +#define XENSND_OP_TRIGGER_RESUME 3 /* ****************************************************************************** * EVENT CODES ****************************************************************************** */ -#define XENSND_EVT_CUR_POS 0 +#define XENSND_EVT_CUR_POS 0 /* ****************************************************************************** * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS ****************************************************************************** */ -#define XENSND_DRIVER_NAME "vsnd" +#define XENSND_DRIVER_NAME "vsnd" -#define XENSND_LIST_SEPARATOR "," +#define XENSND_LIST_SEPARATOR "," /* Field names */ -#define XENSND_FIELD_BE_VERSIONS "versions" -#define XENSND_FIELD_FE_VERSION "version" -#define XENSND_FIELD_VCARD_SHORT_NAME "short-name" -#define XENSND_FIELD_VCARD_LONG_NAME "long-name" -#define XENSND_FIELD_RING_REF "ring-ref" -#define XENSND_FIELD_EVT_CHNL "event-channel" -#define XENSND_FIELD_EVT_RING_REF "evt-ring-ref" -#define XENSND_FIELD_EVT_EVT_CHNL "evt-event-channel" -#define XENSND_FIELD_DEVICE_NAME "name" -#define XENSND_FIELD_TYPE "type" -#define XENSND_FIELD_STREAM_UNIQUE_ID "unique-id" -#define XENSND_FIELD_CHANNELS_MIN "channels-min" -#define XENSND_FIELD_CHANNELS_MAX "channels-max" -#define XENSND_FIELD_SAMPLE_RATES "sample-rates" -#define XENSND_FIELD_SAMPLE_FORMATS "sample-formats" -#define XENSND_FIELD_BUFFER_SIZE "buffer-size" +#define XENSND_FIELD_BE_VERSIONS "versions" +#define XENSND_FIELD_FE_VERSION "version" +#define XENSND_FIELD_VCARD_SHORT_NAME "short-name" +#define XENSND_FIELD_VCARD_LONG_NAME "long-name" +#define XENSND_FIELD_RING_REF "ring-ref" +#define XENSND_FIELD_EVT_CHNL "event-channel" +#define XENSND_FIELD_EVT_RING_REF "evt-ring-ref" +#define XENSND_FIELD_EVT_EVT_CHNL "evt-event-channel" +#define XENSND_FIELD_DEVICE_NAME "name" +#define XENSND_FIELD_TYPE "type" +#define XENSND_FIELD_STREAM_UNIQUE_ID "unique-id" +#define XENSND_FIELD_CHANNELS_MIN "channels-min" +#define XENSND_FIELD_CHANNELS_MAX "channels-max" +#define XENSND_FIELD_SAMPLE_RATES "sample-rates" +#define XENSND_FIELD_SAMPLE_FORMATS "sample-formats" +#define XENSND_FIELD_BUFFER_SIZE "buffer-size" /* Stream type field values. */ -#define XENSND_STREAM_TYPE_PLAYBACK "p" -#define XENSND_STREAM_TYPE_CAPTURE "c" +#define XENSND_STREAM_TYPE_PLAYBACK "p" +#define XENSND_STREAM_TYPE_CAPTURE "c" /* Sample rate max string length */ -#define XENSND_SAMPLE_RATE_MAX_LEN 11 +#define XENSND_SAMPLE_RATE_MAX_LEN 11 /* Sample format field values */ -#define XENSND_SAMPLE_FORMAT_MAX_LEN 24 +#define XENSND_SAMPLE_FORMAT_MAX_LEN 24 -#define XENSND_PCM_FORMAT_S8_STR "s8" -#define XENSND_PCM_FORMAT_U8_STR "u8" -#define XENSND_PCM_FORMAT_S16_LE_STR "s16_le" -#define XENSND_PCM_FORMAT_S16_BE_STR "s16_be" -#define XENSND_PCM_FORMAT_U16_LE_STR "u16_le" -#define XENSND_PCM_FORMAT_U16_BE_STR "u16_be" -#define XENSND_PCM_FORMAT_S24_LE_STR "s24_le" -#define XENSND_PCM_FORMAT_S24_BE_STR "s24_be" -#define XENSND_PCM_FORMAT_U24_LE_STR "u24_le" -#define XENSND_PCM_FORMAT_U24_BE_STR "u24_be" -#define XENSND_PCM_FORMAT_S32_LE_STR "s32_le" -#define XENSND_PCM_FORMAT_S32_BE_STR "s32_be" -#define XENSND_PCM_FORMAT_U32_LE_STR "u32_le" -#define XENSND_PCM_FORMAT_U32_BE_STR "u32_be" -#define XENSND_PCM_FORMAT_F32_LE_STR "float_le" -#define XENSND_PCM_FORMAT_F32_BE_STR "float_be" -#define XENSND_PCM_FORMAT_F64_LE_STR "float64_le" -#define XENSND_PCM_FORMAT_F64_BE_STR "float64_be" +#define XENSND_PCM_FORMAT_S8_STR "s8" +#define XENSND_PCM_FORMAT_U8_STR "u8" +#define XENSND_PCM_FORMAT_S16_LE_STR "s16_le" +#define XENSND_PCM_FORMAT_S16_BE_STR "s16_be" +#define XENSND_PCM_FORMAT_U16_LE_STR "u16_le" +#define XENSND_PCM_FORMAT_U16_BE_STR "u16_be" +#define XENSND_PCM_FORMAT_S24_LE_STR "s24_le" +#define XENSND_PCM_FORMAT_S24_BE_STR "s24_be" +#define XENSND_PCM_FORMAT_U24_LE_STR "u24_le" +#define XENSND_PCM_FORMAT_U24_BE_STR "u24_be" +#define XENSND_PCM_FORMAT_S32_LE_STR "s32_le" +#define XENSND_PCM_FORMAT_S32_BE_STR "s32_be" +#define XENSND_PCM_FORMAT_U32_LE_STR "u32_le" +#define XENSND_PCM_FORMAT_U32_BE_STR "u32_be" +#define XENSND_PCM_FORMAT_F32_LE_STR "float_le" +#define XENSND_PCM_FORMAT_F32_BE_STR "float_be" +#define XENSND_PCM_FORMAT_F64_LE_STR "float64_le" +#define XENSND_PCM_FORMAT_F64_BE_STR "float64_be" #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE_STR "iec958_subframe_le" #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE_STR "iec958_subframe_be" -#define XENSND_PCM_FORMAT_MU_LAW_STR "mu_law" -#define XENSND_PCM_FORMAT_A_LAW_STR "a_law" -#define XENSND_PCM_FORMAT_IMA_ADPCM_STR "ima_adpcm" -#define XENSND_PCM_FORMAT_MPEG_STR "mpeg" -#define XENSND_PCM_FORMAT_GSM_STR "gsm" +#define XENSND_PCM_FORMAT_MU_LAW_STR "mu_law" +#define XENSND_PCM_FORMAT_A_LAW_STR "a_law" +#define XENSND_PCM_FORMAT_IMA_ADPCM_STR "ima_adpcm" +#define XENSND_PCM_FORMAT_MPEG_STR "mpeg" +#define XENSND_PCM_FORMAT_GSM_STR "gsm" /* @@ -1070,12 +1070,12 @@ struct xensnd_event_page { }; #define XENSND_EVENT_PAGE_SIZE 4096 -#define XENSND_IN_RING_OFFS (sizeof(struct xensnd_event_page)) -#define XENSND_IN_RING_SIZE (XENSND_EVENT_PAGE_SIZE - XENSND_IN_RING_OFFS) -#define XENSND_IN_RING_LEN (XENSND_IN_RING_SIZE / sizeof(struct xensnd_evt)) -#define XENSND_IN_RING(page) \ +#define XENSND_IN_RING_OFFS (sizeof(struct xensnd_event_page)) +#define XENSND_IN_RING_SIZE (XENSND_EVENT_PAGE_SIZE - XENSND_IN_RING_OFFS) +#define XENSND_IN_RING_LEN (XENSND_IN_RING_SIZE / sizeof(struct xensnd_evt)) +#define XENSND_IN_RING(page) \ ((struct xensnd_evt *)((char *)(page) + XENSND_IN_RING_OFFS)) -#define XENSND_IN_RING_REF(page, idx) \ +#define XENSND_IN_RING_REF(page, idx) \ (XENSND_IN_RING((page))[(idx) % XENSND_IN_RING_LEN]) #endif /* __XEN_PUBLIC_IO_SNDIF_H__ */ diff --git a/include/xen/io/tpmif.h b/include/xen/io/tpmif.h index 9743dc936..3f7d770db 100644 --- a/include/xen/io/tpmif.h +++ b/include/xen/io/tpmif.h @@ -37,10 +37,10 @@ #include "../grant_table.h" struct tpmif_tx_request { - unsigned long addr; /* Machine address of packet. */ - grant_ref_t ref; /* grant table access reference */ + unsigned long addr; /* Machine address of packet. */ + grant_ref_t ref; /* grant table access reference */ uint16_t unused; - uint16_t size; /* Packet size in bytes. */ + uint16_t size; /* Packet size in bytes. */ }; typedef struct tpmif_tx_request tpmif_tx_request_t; @@ -92,10 +92,10 @@ typedef struct tpmif_tx_interface tpmif_tx_interface_t; */ enum tpmif_state { - TPMIF_STATE_IDLE, /* no contents / vTPM idle / cancel complete */ - TPMIF_STATE_SUBMIT, /* request ready / vTPM working */ - TPMIF_STATE_FINISH, /* response ready / vTPM idle */ - TPMIF_STATE_CANCEL, /* cancel requested / vTPM working */ + TPMIF_STATE_IDLE, /* no contents / vTPM idle / cancel complete */ + TPMIF_STATE_SUBMIT, /* request ready / vTPM working */ + TPMIF_STATE_FINISH, /* response ready / vTPM idle */ + TPMIF_STATE_CANCEL, /* cancel requested / vTPM working */ }; /* Note: The backend should only change state to IDLE or FINISH, while the * frontend should only change to SUBMIT or CANCEL. Status changes do not need @@ -119,13 +119,13 @@ enum tpmif_state { * the TPM_CAP_PROP_INPUT_BUFFER property from the TPM. */ struct tpmif_shared_page { - uint32_t length; /* request/response length in bytes */ + uint32_t length; /* request/response length in bytes */ - uint8_t state; /* enum tpmif_state */ - uint8_t locality; /* for the current request */ - uint8_t pad; /* should be zero */ + uint8_t state; /* enum tpmif_state */ + uint8_t locality; /* for the current request */ + uint8_t pad; /* should be zero */ - uint8_t nr_extra_pages; /* extra pages for long packets; may be zero */ + uint8_t nr_extra_pages; /* extra pages for long packets; may be zero */ uint32_t extra_pages[0]; /* grant IDs; length is actually nr_extra_pages */ }; typedef struct tpmif_shared_page tpmif_shared_page_t; diff --git a/include/xen/io/usbif.h b/include/xen/io/usbif.h index c6a58639d..053a330f3 100644 --- a/include/xen/io/usbif.h +++ b/include/xen/io/usbif.h @@ -102,10 +102,10 @@ */ enum usb_spec_version { - USB_VER_UNKNOWN = 0, - USB_VER_USB11, - USB_VER_USB20, - USB_VER_USB30, /* not supported yet */ + USB_VER_UNKNOWN = 0, + USB_VER_USB11, + USB_VER_USB20, + USB_VER_USB30, /* not supported yet */ }; /* @@ -131,124 +131,126 @@ enum usb_spec_version { * 10 = control, 11 = bulk) */ -#define USBIF_PIPE_PORT_MASK 0x0000001f -#define USBIF_PIPE_UNLINK 0x00000020 -#define USBIF_PIPE_DIR 0x00000080 -#define USBIF_PIPE_DEV_MASK 0x0000007f -#define USBIF_PIPE_DEV_SHIFT 8 -#define USBIF_PIPE_EP_MASK 0x0000000f -#define USBIF_PIPE_EP_SHIFT 15 -#define USBIF_PIPE_TYPE_MASK 0x00000003 -#define USBIF_PIPE_TYPE_SHIFT 30 -#define USBIF_PIPE_TYPE_ISOC 0 -#define USBIF_PIPE_TYPE_INT 1 -#define USBIF_PIPE_TYPE_CTRL 2 -#define USBIF_PIPE_TYPE_BULK 3 - -#define usbif_pipeportnum(pipe) ((pipe) & USBIF_PIPE_PORT_MASK) -#define usbif_setportnum_pipe(pipe, portnum) ((pipe) | (portnum)) - -#define usbif_pipeunlink(pipe) ((pipe) & USBIF_PIPE_UNLINK) -#define usbif_pipesubmit(pipe) (!usbif_pipeunlink(pipe)) -#define usbif_setunlink_pipe(pipe) ((pipe) | USBIF_PIPE_UNLINK) - -#define usbif_pipein(pipe) ((pipe) & USBIF_PIPE_DIR) -#define usbif_pipeout(pipe) (!usbif_pipein(pipe)) - -#define usbif_pipedevice(pipe) \ - (((pipe) >> USBIF_PIPE_DEV_SHIFT) & USBIF_PIPE_DEV_MASK) - -#define usbif_pipeendpoint(pipe) \ - (((pipe) >> USBIF_PIPE_EP_SHIFT) & USBIF_PIPE_EP_MASK) - -#define usbif_pipetype(pipe) \ - (((pipe) >> USBIF_PIPE_TYPE_SHIFT) & USBIF_PIPE_TYPE_MASK) -#define usbif_pipeisoc(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_ISOC) -#define usbif_pipeint(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_INT) -#define usbif_pipectrl(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_CTRL) -#define usbif_pipebulk(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_BULK) +#define USBIF_PIPE_PORT_MASK 0x0000001f +#define USBIF_PIPE_UNLINK 0x00000020 +#define USBIF_PIPE_DIR 0x00000080 +#define USBIF_PIPE_DEV_MASK 0x0000007f +#define USBIF_PIPE_DEV_SHIFT 8 +#define USBIF_PIPE_EP_MASK 0x0000000f +#define USBIF_PIPE_EP_SHIFT 15 +#define USBIF_PIPE_TYPE_MASK 0x00000003 +#define USBIF_PIPE_TYPE_SHIFT 30 +#define USBIF_PIPE_TYPE_ISOC 0 +#define USBIF_PIPE_TYPE_INT 1 +#define USBIF_PIPE_TYPE_CTRL 2 +#define USBIF_PIPE_TYPE_BULK 3 + +#define usbif_pipeportnum(pipe) ((pipe) & USBIF_PIPE_PORT_MASK) +#define usbif_setportnum_pipe(pipe, portnum) ((pipe) | (portnum)) + +#define usbif_pipeunlink(pipe) ((pipe) & USBIF_PIPE_UNLINK) +#define usbif_pipesubmit(pipe) (!usbif_pipeunlink(pipe)) +#define usbif_setunlink_pipe(pipe) ((pipe) | USBIF_PIPE_UNLINK) + +#define usbif_pipein(pipe) ((pipe) & USBIF_PIPE_DIR) +#define usbif_pipeout(pipe) (!usbif_pipein(pipe)) + +#define usbif_pipedevice(pipe) \ + (((pipe) >> USBIF_PIPE_DEV_SHIFT) & USBIF_PIPE_DEV_MASK) + +#define usbif_pipeendpoint(pipe) \ + (((pipe) >> USBIF_PIPE_EP_SHIFT) & USBIF_PIPE_EP_MASK) + +#define usbif_pipetype(pipe) \ + (((pipe) >> USBIF_PIPE_TYPE_SHIFT) & USBIF_PIPE_TYPE_MASK) +#define usbif_pipeisoc(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_ISOC) +#define usbif_pipeint(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_INT) +#define usbif_pipectrl(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_CTRL) +#define usbif_pipebulk(pipe) (usbif_pipetype(pipe) == USBIF_PIPE_TYPE_BULK) #define USBIF_MAX_SEGMENTS_PER_REQUEST (16) -#define USBIF_MAX_PORTNR 31 -#define USBIF_RING_SIZE 4096 +#define USBIF_MAX_PORTNR 31 +#define USBIF_RING_SIZE 4096 /* * RING for transferring urbs. */ struct usbif_request_segment { - grant_ref_t gref; - uint16_t offset; - uint16_t length; + grant_ref_t gref; + uint16_t offset; + uint16_t length; }; struct usbif_urb_request { - uint16_t id; /* request id */ - uint16_t nr_buffer_segs; /* number of urb->transfer_buffer segments */ - - /* basic urb parameter */ - uint32_t pipe; - uint16_t transfer_flags; -#define USBIF_SHORT_NOT_OK 0x0001 - uint16_t buffer_length; - union { - uint8_t ctrl[8]; /* setup_packet (Ctrl) */ - - struct { - uint16_t interval; /* maximum (1024*8) in usb core */ - uint16_t start_frame; /* start frame */ - uint16_t number_of_packets; /* number of ISO packet */ - uint16_t nr_frame_desc_segs; /* number of iso_frame_desc segments */ - } isoc; - - struct { - uint16_t interval; /* maximum (1024*8) in usb core */ - uint16_t pad[3]; - } intr; - - struct { - uint16_t unlink_id; /* unlink request id */ - uint16_t pad[3]; - } unlink; - - } u; - - /* urb data segments */ - struct usbif_request_segment seg[USBIF_MAX_SEGMENTS_PER_REQUEST]; + uint16_t id; /* request id */ + uint16_t nr_buffer_segs; /* number of urb->transfer_buffer segments */ + + /* basic urb parameter */ + uint32_t pipe; + uint16_t transfer_flags; +#define USBIF_SHORT_NOT_OK 0x0001 + uint16_t buffer_length; + union { + uint8_t ctrl[8]; /* setup_packet (Ctrl) */ + + struct { + uint16_t interval; /* maximum (1024*8) in usb core */ + uint16_t start_frame; /* start frame */ + uint16_t number_of_packets; /* number of ISO packet */ + uint16_t nr_frame_desc_segs; /* number of iso_frame_desc segments */ + } isoc; + + struct { + uint16_t interval; /* maximum (1024*8) in usb core */ + uint16_t pad[3]; + } intr; + + struct { + uint16_t unlink_id; /* unlink request id */ + uint16_t pad[3]; + } unlink; + + } u; + + /* urb data segments */ + struct usbif_request_segment seg[USBIF_MAX_SEGMENTS_PER_REQUEST]; }; typedef struct usbif_urb_request usbif_urb_request_t; struct usbif_urb_response { - uint16_t id; /* request id */ - uint16_t start_frame; /* start frame (ISO) */ - int32_t status; /* status (non-ISO) */ - int32_t actual_length; /* actual transfer length */ - int32_t error_count; /* number of ISO errors */ + uint16_t id; /* request id */ + uint16_t start_frame; /* start frame (ISO) */ + int32_t status; /* status (non-ISO) */ + int32_t actual_length; /* actual transfer length */ + int32_t error_count; /* number of ISO errors */ }; typedef struct usbif_urb_response usbif_urb_response_t; -DEFINE_RING_TYPES(usbif_urb, struct usbif_urb_request, struct usbif_urb_response); +DEFINE_RING_TYPES(usbif_urb, struct usbif_urb_request, + struct usbif_urb_response); #define USB_URB_RING_SIZE __CONST_RING_SIZE(usbif_urb, USBIF_RING_SIZE) /* * RING for notifying connect/disconnect events to frontend */ struct usbif_conn_request { - uint16_t id; + uint16_t id; }; typedef struct usbif_conn_request usbif_conn_request_t; struct usbif_conn_response { - uint16_t id; /* request id */ - uint8_t portnum; /* port number */ - uint8_t speed; /* usb_device_speed */ -#define USBIF_SPEED_NONE 0 -#define USBIF_SPEED_LOW 1 -#define USBIF_SPEED_FULL 2 -#define USBIF_SPEED_HIGH 3 + uint16_t id; /* request id */ + uint8_t portnum; /* port number */ + uint8_t speed; /* usb_device_speed */ +#define USBIF_SPEED_NONE 0 +#define USBIF_SPEED_LOW 1 +#define USBIF_SPEED_FULL 2 +#define USBIF_SPEED_HIGH 3 }; typedef struct usbif_conn_response usbif_conn_response_t; -DEFINE_RING_TYPES(usbif_conn, struct usbif_conn_request, struct usbif_conn_response); +DEFINE_RING_TYPES(usbif_conn, struct usbif_conn_request, + struct usbif_conn_response); #define USB_CONN_RING_SIZE __CONST_RING_SIZE(usbif_conn, USBIF_RING_SIZE) #endif /* __XEN_PUBLIC_IO_USBIF_H__ */ diff --git a/include/xen/io/vscsiif.h b/include/xen/io/vscsiif.h index c9ceb1884..7bb52b4d3 100644 --- a/include/xen/io/vscsiif.h +++ b/include/xen/io/vscsiif.h @@ -109,8 +109,9 @@ * =========================== * * The backend driver uses a single_host:many_devices notation to manage domU - * devices. Everything is stored in /local/domain//backend/vscsi/. - * The xenstore layout looks like this (dom0 is assumed to be the backend_domid): + * devices. Everything is stored in + * /local/domain//backend/vscsi/. The xenstore layout looks like + * this (dom0 is assumed to be the backend_domid): * * //feature-host = "0" * //frontend = "/local/domain//device/vscsi/0" @@ -154,14 +155,16 @@ * //vscsi-devs/dev-0/p-dev = "8:0:2:1" * //vscsi-devs/dev-0/state = "1" * //vscsi-devs/dev-0/v-dev = "0:0:0:0" - * Wait for //state + //vscsi-devs/dev-0/state become 4 + * Wait for //state + //vscsi-devs/dev-0/state + * become 4 * * To add another device to a vhost: * //state = "7" * //vscsi-devs/dev-1/p-dev = "8:0:2:2" * //vscsi-devs/dev-1/state = "1" * //vscsi-devs/dev-1/v-dev = "0:0:1:0" - * Wait for //state + //vscsi-devs/dev-1/state become 4 + * Wait for //state + //vscsi-devs/dev-1/state + * become 4 * * To remove a device from a vhost: * //state = "7" @@ -206,24 +209,24 @@ * size of one scsiif_request_segment structure). The frontend may use a mix of * direct and indirect requests. */ -#define VSCSIIF_ACT_SCSI_CDB 1 +#define VSCSIIF_ACT_SCSI_CDB 1 /* * Request abort of a running operation for the specified target given by * channel, id, lun and the operation's rqid in ref_rqid. */ -#define VSCSIIF_ACT_SCSI_ABORT 2 +#define VSCSIIF_ACT_SCSI_ABORT 2 /* * Request a device reset of the specified target (channel and id). */ -#define VSCSIIF_ACT_SCSI_RESET 3 +#define VSCSIIF_ACT_SCSI_RESET 3 /* * Preset scatter/gather elements for a following request. Deprecated. * Keeping the define only to avoid usage of the value "4" for other actions. */ -#define VSCSIIF_ACT_SCSI_SG_PRESET 4 +#define VSCSIIF_ACT_SCSI_SG_PRESET 4 /* * Maximum scatter/gather segments per request. @@ -237,7 +240,7 @@ * In this case the vscsiif_request seg elements don't contain references to * the user data, but to the SG elements referencing the user data. */ -#define VSCSIIF_SG_TABLESIZE 26 +#define VSCSIIF_SG_TABLESIZE 26 /* * based on Linux kernel 2.6.18, still valid @@ -246,9 +249,9 @@ * as "old clients" will blindly use these values and the resulting structure * sizes. */ -#define VSCSIIF_MAX_COMMAND_SIZE 16 -#define VSCSIIF_SENSE_BUFFERSIZE 96 -#define VSCSIIF_PAGE_SIZE 4096 +#define VSCSIIF_MAX_COMMAND_SIZE 16 +#define VSCSIIF_SENSE_BUFFERSIZE 96 +#define VSCSIIF_PAGE_SIZE 4096 struct scsiif_request_segment { grant_ref_t gref; @@ -257,29 +260,30 @@ struct scsiif_request_segment { }; typedef struct scsiif_request_segment vscsiif_segment_t; -#define VSCSIIF_SG_PER_PAGE (VSCSIIF_PAGE_SIZE / sizeof(struct scsiif_request_segment)) +#define VSCSIIF_SG_PER_PAGE \ + (VSCSIIF_PAGE_SIZE / sizeof(struct scsiif_request_segment)) /* Size of one request is 252 bytes */ struct vscsiif_request { - uint16_t rqid; /* private guest value, echoed in resp */ - uint8_t act; /* command between backend and frontend */ - uint8_t cmd_len; /* valid CDB bytes */ + uint16_t rqid; /* private guest value, echoed in resp */ + uint8_t act; /* command between backend and frontend */ + uint8_t cmd_len; /* valid CDB bytes */ uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE]; /* the CDB */ - uint16_t timeout_per_command; /* deprecated: timeout in secs, 0=default */ - uint16_t channel, id, lun; /* (virtual) device specification */ - uint16_t ref_rqid; /* command abort reference */ - uint8_t sc_data_direction; /* for DMA_TO_DEVICE(1) - DMA_FROM_DEVICE(2) - DMA_NONE(3) requests */ - uint8_t nr_segments; /* Number of pieces of scatter-gather */ + uint16_t timeout_per_command; /* deprecated: timeout in secs, 0=default */ + uint16_t channel, id, lun; /* (virtual) device specification */ + uint16_t ref_rqid; /* command abort reference */ + uint8_t sc_data_direction; /* for DMA_TO_DEVICE(1) + DMA_FROM_DEVICE(2) + DMA_NONE(3) requests */ + uint8_t nr_segments; /* Number of pieces of scatter-gather */ /* * flag in nr_segments: SG elements via grant page * * If VSCSIIF_SG_GRANT is set, the low 7 bits of nr_segments specify the number * of grant pages containing SG elements. Usable if "feature-sg-grant" set. */ -#define VSCSIIF_SG_GRANT 0x80 +#define VSCSIIF_SG_GRANT 0x80 vscsiif_segment_t seg[VSCSIIF_SG_TABLESIZE]; uint32_t reserved[3]; @@ -289,14 +293,14 @@ typedef struct vscsiif_request vscsiif_request_t; /* * The following interface is deprecated! */ -#define VSCSIIF_SG_LIST_SIZE ((sizeof(vscsiif_request_t) - 4) \ - / sizeof(vscsiif_segment_t)) +#define VSCSIIF_SG_LIST_SIZE \ + ((sizeof(vscsiif_request_t) - 4) / sizeof(vscsiif_segment_t)) struct vscsiif_sg_list { /* First two fields must match struct vscsiif_request! */ - uint16_t rqid; /* private guest value, must match main req */ - uint8_t act; /* VSCSIIF_ACT_SCSI_SG_PRESET */ - uint8_t nr_segments; /* Number of pieces of scatter-gather */ + uint16_t rqid; /* private guest value, must match main req */ + uint8_t act; /* VSCSIIF_ACT_SCSI_SG_PRESET */ + uint8_t nr_segments; /* Number of pieces of scatter-gather */ vscsiif_segment_t seg[VSCSIIF_SG_LIST_SIZE]; }; typedef struct vscsiif_sg_list vscsiif_sg_list_t; @@ -304,13 +308,13 @@ typedef struct vscsiif_sg_list vscsiif_sg_list_t; /* Size of one response is 252 bytes */ struct vscsiif_response { - uint16_t rqid; /* identifies request */ - uint8_t act; /* deprecated: valid only if SG_PRESET supported */ + uint16_t rqid; /* identifies request */ + uint8_t act; /* deprecated: valid only if SG_PRESET supported */ uint8_t sense_len; uint8_t sense_buffer[VSCSIIF_SENSE_BUFFERSIZE]; int32_t rslt; - uint32_t residual_len; /* request bufflen - - return the value from physical device */ + uint32_t residual_len; /* request bufflen - + return the value from physical device */ uint32_t reserved[36]; }; typedef struct vscsiif_response vscsiif_response_t; @@ -318,7 +322,7 @@ typedef struct vscsiif_response vscsiif_response_t; DEFINE_RING_TYPES(vscsiif, struct vscsiif_request, struct vscsiif_response); -#endif /*__XEN__PUBLIC_IO_SCSI_H__*/ +#endif /*__XEN__PUBLIC_IO_SCSI_H__*/ /* * Local variables: * mode: C diff --git a/include/xen/io/xenbus.h b/include/xen/io/xenbus.h index 927f9db55..fc344936e 100644 --- a/include/xen/io/xenbus.h +++ b/include/xen/io/xenbus.h @@ -34,36 +34,36 @@ * layers. */ enum xenbus_state { - XenbusStateUnknown = 0, + XenbusStateUnknown = 0, - XenbusStateInitialising = 1, + XenbusStateInitialising = 1, /* * InitWait: Finished early initialisation but waiting for information * from the peer or hotplug scripts. */ - XenbusStateInitWait = 2, + XenbusStateInitWait = 2, /* * Initialised: Waiting for a connection from the peer. */ - XenbusStateInitialised = 3, + XenbusStateInitialised = 3, - XenbusStateConnected = 4, + XenbusStateConnected = 4, /* * Closing: The device is being closed due to an error or an unplug event. */ - XenbusStateClosing = 5, + XenbusStateClosing = 5, - XenbusStateClosed = 6, + XenbusStateClosed = 6, /* * Reconfiguring: The device is being reconfigured. */ XenbusStateReconfiguring = 7, - XenbusStateReconfigured = 8 + XenbusStateReconfigured = 8 }; typedef enum xenbus_state XenbusState; diff --git a/include/xen/io/xs_wire.h b/include/xen/io/xs_wire.h index 4dd663266..ad98c283f 100644 --- a/include/xen/io/xs_wire.h +++ b/include/xen/io/xs_wire.h @@ -26,8 +26,7 @@ #ifndef _XS_WIRE_H #define _XS_WIRE_H -enum xsd_sockmsg_type -{ +enum xsd_sockmsg_type { XS_CONTROL, #define XS_DEBUG XS_CONTROL XS_DIRECTORY, @@ -53,62 +52,44 @@ enum xsd_sockmsg_type XS_RESET_WATCHES = XS_SET_TARGET + 2, XS_DIRECTORY_PART, - XS_TYPE_COUNT, /* Number of valid types. */ + XS_TYPE_COUNT, /* Number of valid types. */ XS_INVALID = 0xffff /* Guaranteed to remain an invalid type */ }; -#define XS_WRITE_NONE "NONE" -#define XS_WRITE_CREATE "CREATE" +#define XS_WRITE_NONE "NONE" +#define XS_WRITE_CREATE "CREATE" #define XS_WRITE_CREATE_EXCL "CREATE|EXCL" /* We hand errors as strings, for portability. */ -struct xsd_errors -{ +struct xsd_errors { int errnum; const char *errstring; }; #ifdef EINVAL -#define XSD_ERROR(x) { x, #x } +#define XSD_ERROR(x) {x, #x} /* LINTED: static unused */ static struct xsd_errors xsd_errors[] #if defined(__GNUC__) -__attribute__((unused)) + __attribute__((unused)) #endif - = { - XSD_ERROR(EINVAL), - XSD_ERROR(EACCES), - XSD_ERROR(EEXIST), - XSD_ERROR(EISDIR), - XSD_ERROR(ENOENT), - XSD_ERROR(ENOMEM), - XSD_ERROR(ENOSPC), - XSD_ERROR(EIO), - XSD_ERROR(ENOTEMPTY), - XSD_ERROR(ENOSYS), - XSD_ERROR(EROFS), - XSD_ERROR(EBUSY), - XSD_ERROR(EAGAIN), - XSD_ERROR(EISCONN), - XSD_ERROR(E2BIG) -}; + = {XSD_ERROR(EINVAL), XSD_ERROR(EACCES), XSD_ERROR(EEXIST), + XSD_ERROR(EISDIR), XSD_ERROR(ENOENT), XSD_ERROR(ENOMEM), + XSD_ERROR(ENOSPC), XSD_ERROR(EIO), XSD_ERROR(ENOTEMPTY), + XSD_ERROR(ENOSYS), XSD_ERROR(EROFS), XSD_ERROR(EBUSY), + XSD_ERROR(EAGAIN), XSD_ERROR(EISCONN), XSD_ERROR(E2BIG)}; #endif -struct xsd_sockmsg -{ - uint32_t type; /* XS_??? */ - uint32_t req_id;/* Request identifier, echoed in daemon's response. */ +struct xsd_sockmsg { + uint32_t type; /* XS_??? */ + uint32_t req_id; /* Request identifier, echoed in daemon's response. */ uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */ - uint32_t len; /* Length of data following this. */ + uint32_t len; /* Length of data following this. */ /* Generally followed by nul-terminated string(s). */ }; -enum xs_watch_type -{ - XS_WATCH_PATH = 0, - XS_WATCH_TOKEN -}; +enum xs_watch_type { XS_WATCH_PATH = 0, XS_WATCH_TOKEN }; /* * `incontents 150 xenstore_struct XenStore wire protocol. @@ -116,7 +97,7 @@ enum xs_watch_type * Inter-domain shared memory communications. */ #define XENSTORE_RING_SIZE 1024 typedef uint32_t XENSTORE_RING_IDX; -#define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1)) +#define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE - 1)) struct xenstore_domain_interface { char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */ char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */ diff --git a/include/xen/kexec.h b/include/xen/kexec.h index 3f2a11838..89d10ea41 100644 --- a/include/xen/kexec.h +++ b/include/xen/kexec.h @@ -120,7 +120,7 @@ typedef struct xen_kexec_image { * mappings. The location of any page tables is undefined and these * page table frames are not be mapped. */ -#define KEXEC_CMD_kexec 0 +#define KEXEC_CMD_kexec 0 typedef struct xen_kexec_exec { int type; } xen_kexec_exec_t; @@ -130,26 +130,31 @@ typedef struct xen_kexec_exec { * type == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in] * image == relocation information for kexec (ignored for unload) [in] */ -#define KEXEC_CMD_kexec_load_v1 1 /* obsolete since 0x00040400 */ -#define KEXEC_CMD_kexec_unload_v1 2 /* obsolete since 0x00040400 */ +#define KEXEC_CMD_kexec_load_v1 1 /* obsolete since 0x00040400 */ +#define KEXEC_CMD_kexec_unload_v1 2 /* obsolete since 0x00040400 */ typedef struct xen_kexec_load_v1 { int type; xen_kexec_image_t image; } xen_kexec_load_v1_t; -#define KEXEC_RANGE_MA_CRASH 0 /* machine address and size of crash area */ -#define KEXEC_RANGE_MA_XEN 1 /* machine address and size of Xen itself */ -#define KEXEC_RANGE_MA_CPU 2 /* machine address and size of a CPU note */ -#define KEXEC_RANGE_MA_XENHEAP 3 /* machine address and size of xenheap - * Note that although this is adjacent - * to Xen it exists in a separate EFI - * region on ia64, and thus needs to be - * inserted into iomem_machine separately */ -#define KEXEC_RANGE_MA_BOOT_PARAM 4 /* Obsolete: machine address and size of - * the ia64_boot_param */ -#define KEXEC_RANGE_MA_EFI_MEMMAP 5 /* machine address and size of - * of the EFI Memory Map */ -#define KEXEC_RANGE_MA_VMCOREINFO 6 /* machine address and size of vmcoreinfo */ +#define KEXEC_RANGE_MA_CRASH 0 /* machine address and size of crash area */ +#define KEXEC_RANGE_MA_XEN 1 /* machine address and size of Xen itself */ +#define KEXEC_RANGE_MA_CPU 2 /* machine address and size of a CPU note */ +#define KEXEC_RANGE_MA_XENHEAP \ + 3 /* machine address and size of xenheap \ + * Note that although this is adjacent \ + * to Xen it exists in a separate EFI \ + * region on ia64, and thus needs to be \ + * inserted into iomem_machine separately */ +#define KEXEC_RANGE_MA_BOOT_PARAM \ + 4 /* Obsolete: machine address and size of \ + * the ia64_boot_param */ +#define KEXEC_RANGE_MA_EFI_MEMMAP \ + 5 /* machine address and size of \ + * of the EFI Memory Map */ +#define KEXEC_RANGE_MA_VMCOREINFO \ + 6 /* machine address and size of vmcoreinfo \ + */ /* * Find the address and size of certain memory areas @@ -158,7 +163,7 @@ typedef struct xen_kexec_load_v1 { * size == number of bytes reserved in window [out] * start == address of the first byte in the window [out] */ -#define KEXEC_CMD_kexec_get_range 3 +#define KEXEC_CMD_kexec_get_range 3 typedef struct xen_kexec_range { int range; int nr; @@ -204,9 +209,9 @@ DEFINE_XEN_GUEST_HANDLE(xen_kexec_segment_t); #define KEXEC_CMD_kexec_load 4 typedef struct xen_kexec_load { - uint8_t type; /* One of KEXEC_TYPE_* */ - uint8_t _pad; - uint16_t arch; /* ELF machine type (EM_*). */ + uint8_t type; /* One of KEXEC_TYPE_* */ + uint8_t _pad; + uint16_t arch; /* ELF machine type (EM_*). */ uint32_t nr_segments; union { XEN_GUEST_HANDLE(xen_kexec_segment_t) h; @@ -243,10 +248,10 @@ DEFINE_XEN_GUEST_HANDLE(xen_kexec_status_t); #else /* __XEN_INTERFACE_VERSION__ < 0x00040400 */ -#define KEXEC_CMD_kexec_load KEXEC_CMD_kexec_load_v1 +#define KEXEC_CMD_kexec_load KEXEC_CMD_kexec_load_v1 #define KEXEC_CMD_kexec_unload KEXEC_CMD_kexec_unload_v1 -#define xen_kexec_load xen_kexec_load_v1 -#define xen_kexec_load_t xen_kexec_load_v1_t +#define xen_kexec_load xen_kexec_load_v1 +#define xen_kexec_load_t xen_kexec_load_v1_t #endif diff --git a/include/xen/memory.h b/include/xen/memory.h index cfdda6e2a..092f6a13c 100644 --- a/include/xen/memory.h +++ b/include/xen/memory.h @@ -52,12 +52,12 @@ #define XENMEMF_node(x) (((x) + 1) << 8) #define XENMEMF_get_node(x) ((((x) >> 8) - 1) & 0xffu) /* Flag to populate physmap with populate-on-demand entries */ -#define XENMEMF_populate_on_demand (1<<16) +#define XENMEMF_populate_on_demand (1 << 16) /* Flag to request allocation only from the node specified */ -#define XENMEMF_exact_node_request (1<<17) +#define XENMEMF_exact_node_request (1 << 17) #define XENMEMF_exact_node(n) (XENMEMF_node(n) | XENMEMF_exact_node_request) /* Flag to indicate the node specified is virtual node */ -#define XENMEMF_vnode (1<<18) +#define XENMEMF_vnode (1 << 18) #endif struct xen_memory_reservation { @@ -77,21 +77,21 @@ struct xen_memory_reservation { XEN_GUEST_HANDLE(xen_pfn_t) extent_start; /* Number of extents, and size/alignment of each (2^extent_order pages). */ - xen_ulong_t nr_extents; - unsigned int extent_order; + xen_ulong_t nr_extents; + unsigned int extent_order; #if __XEN_INTERFACE_VERSION__ >= 0x00030209 /* XENMEMF flags. */ - unsigned int mem_flags; + unsigned int mem_flags; #else - unsigned int address_bits; + unsigned int address_bits; #endif /* * Domain whose reservation is being changed. * Unprivileged domains can specify only DOMID_SELF. */ - domid_t domid; + domid_t domid; }; typedef struct xen_memory_reservation xen_memory_reservation_t; DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t); @@ -105,7 +105,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t); * * Note that only PV guests can use this operation. */ -#define XENMEM_exchange 11 +#define XENMEM_exchange 11 struct xen_memory_exchange { /* * [IN] Details of memory extents to be exchanged (GMFN bases). @@ -146,20 +146,20 @@ DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t); * This command always succeeds (it never returns an error code). * arg == NULL. */ -#define XENMEM_maximum_ram_page 2 +#define XENMEM_maximum_ram_page 2 /* * Returns the current or maximum memory reservation, in pages, of the * specified domain (may be DOMID_SELF). Returns -ve errcode on failure. * arg == addr of domid_t. */ -#define XENMEM_current_reservation 3 -#define XENMEM_maximum_reservation 4 +#define XENMEM_current_reservation 3 +#define XENMEM_maximum_reservation 4 /* * Returns the maximum GPFN in use by the guest, or -ve errcode on failure. */ -#define XENMEM_maximum_gpfn 14 +#define XENMEM_maximum_gpfn 14 /* * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys @@ -167,7 +167,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t); * this command. * arg == addr of xen_machphys_mfn_list_t. */ -#define XENMEM_machphys_mfn_list 5 +#define XENMEM_machphys_mfn_list 5 struct xen_machphys_mfn_list { /* * Size of the 'extent_start' array. Fewer entries will be filled if the @@ -198,7 +198,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t); * XENMEM_machphys_mfn_list, but returns the mfns making up the compatibility * m2p table. */ -#define XENMEM_machphys_compat_mfn_list 25 +#define XENMEM_machphys_compat_mfn_list 25 /* * Returns the location in virtual address space of the machine_to_phys @@ -206,27 +206,29 @@ DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t); * map it by default into guest address space, do not implement this command. * arg == addr of xen_machphys_mapping_t. */ -#define XENMEM_machphys_mapping 12 +#define XENMEM_machphys_mapping 12 struct xen_machphys_mapping { xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */ - xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */ + xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */ }; typedef struct xen_machphys_mapping xen_machphys_mapping_t; DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); /* Source mapping space. */ /* ` enum phys_map_space { */ -#define XENMAPSPACE_shared_info 0 /* shared info page */ -#define XENMAPSPACE_grant_table 1 /* grant table page */ -#define XENMAPSPACE_gmfn 2 /* GMFN */ -#define XENMAPSPACE_gmfn_range 3 /* GMFN range, XENMEM_add_to_physmap only. */ -#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom, - * XENMEM_add_to_physmap_batch only. */ -#define XENMAPSPACE_dev_mmio 5 /* device mmio region - ARM only; the region is mapped in - Stage-2 using the Normal Memory - Inner/Outer Write-Back Cacheable - memory attribute. */ +#define XENMAPSPACE_shared_info 0 /* shared info page */ +#define XENMAPSPACE_grant_table 1 /* grant table page */ +#define XENMAPSPACE_gmfn 2 /* GMFN */ +#define XENMAPSPACE_gmfn_range 3 /* GMFN range, XENMEM_add_to_physmap only. */ +#define XENMAPSPACE_gmfn_foreign \ + 4 /* GMFN from another dom, \ + * XENMEM_add_to_physmap_batch only. */ +#define XENMAPSPACE_dev_mmio \ + 5 /* device mmio region \ + ARM only; the region is mapped in \ + Stage-2 using the Normal Memory \ + Inner/Outer Write-Back Cacheable \ + memory attribute. */ /* ` } */ /* @@ -234,13 +236,13 @@ DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); * physical address space (translated guests only). * arg == addr of xen_add_to_physmap_t. */ -#define XENMEM_add_to_physmap 7 +#define XENMEM_add_to_physmap 7 struct xen_add_to_physmap { /* Which domain to change the mapping for. */ domid_t domid; /* Number of pages to go through for gmfn_range */ - uint16_t size; + uint16_t size; unsigned int space; /* => enum phys_map_space */ @@ -250,7 +252,7 @@ struct xen_add_to_physmap { xen_ulong_t idx; /* GPFN in domid where the source mapping page should appear. */ - xen_pfn_t gpfn; + xen_pfn_t gpfn; }; typedef struct xen_add_to_physmap xen_add_to_physmap_t; DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t); @@ -271,7 +273,7 @@ struct xen_add_to_physmap_batch { #else union xen_add_to_physmap_batch_extra { domid_t foreign_domid; /* gmfn_foreign */ - uint16_t res0; /* All the other spaces. Should be 0 */ + uint16_t res0; /* All the other spaces. Should be 0 */ } u; #endif @@ -291,7 +293,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_batch_t); #if __XEN_INTERFACE_VERSION__ < 0x00040400 #define XENMEM_add_to_physmap_range XENMEM_add_to_physmap_batch -#define xen_add_to_physmap_range xen_add_to_physmap_batch +#define xen_add_to_physmap_range xen_add_to_physmap_batch typedef struct xen_add_to_physmap_batch xen_add_to_physmap_range_t; DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_range_t); #endif @@ -301,13 +303,13 @@ DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_range_t); * physical address space (translated guests only). * arg == addr of xen_remove_from_physmap_t. */ -#define XENMEM_remove_from_physmap 15 +#define XENMEM_remove_from_physmap 15 struct xen_remove_from_physmap { /* Which domain to change the mapping for. */ domid_t domid; /* GPFN of the current mapping of the page. */ - xen_pfn_t gpfn; + xen_pfn_t gpfn; }; typedef struct xen_remove_from_physmap xen_remove_from_physmap_t; DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t); @@ -320,7 +322,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t); * was started (specified by XENMEM_set_memory_map). * arg == addr of xen_memory_map_t. */ -#define XENMEM_memory_map 9 +#define XENMEM_memory_map 9 struct xen_memory_map { /* * On call the number of entries which can be stored in buffer. On @@ -345,14 +347,14 @@ DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t); * to store the complete memory map. * arg == addr of xen_memory_map_t. */ -#define XENMEM_machine_memory_map 10 +#define XENMEM_machine_memory_map 10 /* * Set the pseudo-physical memory map of a domain, as returned by * XENMEM_memory_map. * arg == addr of xen_foreign_memory_map_t. */ -#define XENMEM_set_memory_map 13 +#define XENMEM_set_memory_map 13 struct xen_foreign_memory_map { domid_t domid; struct xen_memory_map map; @@ -360,8 +362,8 @@ struct xen_foreign_memory_map { typedef struct xen_foreign_memory_map xen_foreign_memory_map_t; DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t); -#define XENMEM_set_pod_target 16 -#define XENMEM_get_pod_target 17 +#define XENMEM_set_pod_target 16 +#define XENMEM_get_pod_target 17 struct xen_pod_target { /* IN */ uint64_t target_pages; @@ -384,29 +386,29 @@ typedef struct xen_pod_target xen_pod_target_t; * Get the number of MFNs saved through memory sharing. * The call never fails. */ -#define XENMEM_get_sharing_freed_pages 18 -#define XENMEM_get_sharing_shared_pages 19 +#define XENMEM_get_sharing_freed_pages 18 +#define XENMEM_get_sharing_shared_pages 19 -#define XENMEM_paging_op 20 -#define XENMEM_paging_op_nominate 0 -#define XENMEM_paging_op_evict 1 -#define XENMEM_paging_op_prep 2 +#define XENMEM_paging_op 20 +#define XENMEM_paging_op_nominate 0 +#define XENMEM_paging_op_evict 1 +#define XENMEM_paging_op_prep 2 struct xen_mem_paging_op { - uint8_t op; /* XENMEM_paging_op_* */ - domid_t domain; + uint8_t op; /* XENMEM_paging_op_* */ + domid_t domain; /* PAGING_PREP IN: buffer to immediately fill page in */ - uint64_aligned_t buffer; + uint64_aligned_t buffer; /* Other OPs */ - uint64_aligned_t gfn; /* IN: gfn of page being operated on */ + uint64_aligned_t gfn; /* IN: gfn of page being operated on */ }; typedef struct xen_mem_paging_op xen_mem_paging_op_t; DEFINE_XEN_GUEST_HANDLE(xen_mem_paging_op_t); -#define XENMEM_access_op 21 -#define XENMEM_access_op_set_access 0 -#define XENMEM_access_op_get_access 1 +#define XENMEM_access_op 21 +#define XENMEM_access_op_set_access 0 +#define XENMEM_access_op_get_access 1 /* * XENMEM_access_op_enable_emulate and XENMEM_access_op_disable_emulate are * currently unused, but since they have been in use please do not reuse them. @@ -414,7 +416,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_mem_paging_op_t); * #define XENMEM_access_op_enable_emulate 2 * #define XENMEM_access_op_disable_emulate 3 */ -#define XENMEM_access_op_set_access_multi 4 +#define XENMEM_access_op_set_access_multi 4 typedef enum { XENMEM_access_n, @@ -472,64 +474,64 @@ struct xen_mem_access_op { typedef struct xen_mem_access_op xen_mem_access_op_t; DEFINE_XEN_GUEST_HANDLE(xen_mem_access_op_t); -#define XENMEM_sharing_op 22 -#define XENMEM_sharing_op_nominate_gfn 0 -#define XENMEM_sharing_op_nominate_gref 1 -#define XENMEM_sharing_op_share 2 -#define XENMEM_sharing_op_debug_gfn 3 -#define XENMEM_sharing_op_debug_mfn 4 -#define XENMEM_sharing_op_debug_gref 5 -#define XENMEM_sharing_op_add_physmap 6 -#define XENMEM_sharing_op_audit 7 -#define XENMEM_sharing_op_range_share 8 +#define XENMEM_sharing_op 22 +#define XENMEM_sharing_op_nominate_gfn 0 +#define XENMEM_sharing_op_nominate_gref 1 +#define XENMEM_sharing_op_share 2 +#define XENMEM_sharing_op_debug_gfn 3 +#define XENMEM_sharing_op_debug_mfn 4 +#define XENMEM_sharing_op_debug_gref 5 +#define XENMEM_sharing_op_add_physmap 6 +#define XENMEM_sharing_op_audit 7 +#define XENMEM_sharing_op_range_share 8 -#define XENMEM_SHARING_OP_S_HANDLE_INVALID (-10) -#define XENMEM_SHARING_OP_C_HANDLE_INVALID (-9) +#define XENMEM_SHARING_OP_S_HANDLE_INVALID (-10) +#define XENMEM_SHARING_OP_C_HANDLE_INVALID (-9) /* The following allows sharing of grant refs. This is useful * for sharing utilities sitting as "filters" in IO backends * (e.g. memshr + blktap(2)). The IO backend is only exposed * to grant references, and this allows sharing of the grefs */ -#define XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG (xen_mk_ullong(1) << 62) +#define XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG (xen_mk_ullong(1) << 62) -#define XENMEM_SHARING_OP_FIELD_MAKE_GREF(field, val) \ +#define XENMEM_SHARING_OP_FIELD_MAKE_GREF(field, val) \ (field) = (XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG | val) -#define XENMEM_SHARING_OP_FIELD_IS_GREF(field) \ +#define XENMEM_SHARING_OP_FIELD_IS_GREF(field) \ ((field) & XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG) -#define XENMEM_SHARING_OP_FIELD_GET_GREF(field) \ +#define XENMEM_SHARING_OP_FIELD_GET_GREF(field) \ ((field) & (~XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG)) struct xen_mem_sharing_op { - uint8_t op; /* XENMEM_sharing_op_* */ - domid_t domain; + uint8_t op; /* XENMEM_sharing_op_* */ + domid_t domain; union { - struct mem_sharing_op_nominate { /* OP_NOMINATE_xxx */ + struct mem_sharing_op_nominate { /* OP_NOMINATE_xxx */ union { - uint64_aligned_t gfn; /* IN: gfn to nominate */ - uint32_t grant_ref; /* IN: grant ref to nominate */ + uint64_aligned_t gfn; /* IN: gfn to nominate */ + uint32_t grant_ref; /* IN: grant ref to nominate */ } u; - uint64_aligned_t handle; /* OUT: the handle */ + uint64_aligned_t handle; /* OUT: the handle */ } nominate; - struct mem_sharing_op_share { /* OP_SHARE/ADD_PHYSMAP */ - uint64_aligned_t source_gfn; /* IN: the gfn of the source page */ + struct mem_sharing_op_share { /* OP_SHARE/ADD_PHYSMAP */ + uint64_aligned_t source_gfn; /* IN: the gfn of the source page */ uint64_aligned_t source_handle; /* IN: handle to the source page */ - uint64_aligned_t client_gfn; /* IN: the client gfn */ + uint64_aligned_t client_gfn; /* IN: the client gfn */ uint64_aligned_t client_handle; /* IN: handle to the client page */ - domid_t client_domain; /* IN: the client domain id */ + domid_t client_domain; /* IN: the client domain id */ } share; - struct mem_sharing_op_range { /* OP_RANGE_SHARE */ - uint64_aligned_t first_gfn; /* IN: the first gfn */ - uint64_aligned_t last_gfn; /* IN: the last gfn */ - uint64_aligned_t opaque; /* Must be set to 0 */ - domid_t client_domain; /* IN: the client domain id */ - uint16_t _pad[3]; /* Must be set to 0 */ + struct mem_sharing_op_range { /* OP_RANGE_SHARE */ + uint64_aligned_t first_gfn; /* IN: the first gfn */ + uint64_aligned_t last_gfn; /* IN: the last gfn */ + uint64_aligned_t opaque; /* Must be set to 0 */ + domid_t client_domain; /* IN: the client domain id */ + uint16_t _pad[3]; /* Must be set to 0 */ } range; - struct mem_sharing_op_debug { /* OP_DEBUG_xxx */ + struct mem_sharing_op_debug { /* OP_DEBUG_xxx */ union { - uint64_aligned_t gfn; /* IN: gfn to debug */ - uint64_aligned_t mfn; /* IN: mfn to debug */ - uint32_t gref; /* IN: gref to debug */ + uint64_aligned_t gfn; /* IN: gfn to debug */ + uint64_aligned_t mfn; /* IN: mfn to debug */ + uint32_t gref; /* IN: gref to debug */ } u; } debug; } u; @@ -558,7 +560,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t); * * Caller must be privileged or the hypercall fails. */ -#define XENMEM_claim_pages 24 +#define XENMEM_claim_pages 24 /* * XENMEM_claim_pages flags - the are no flags at this time. @@ -570,7 +572,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t); * be used for other purposes, e.g. to map guest RAM. This hypercall * enumerates those regions so the toolstack can avoid using them. */ -#define XENMEM_reserved_device_memory_map 27 +#define XENMEM_reserved_device_memory_map 27 struct xen_reserved_device_memory { xen_pfn_t start_pfn; xen_ulong_t nr_pages; @@ -611,7 +613,7 @@ struct xen_mem_acquire_resource { uint16_t type; #define XENMEM_resource_ioreq_server 0 -#define XENMEM_resource_grant_table 1 +#define XENMEM_resource_grant_table 1 /* * IN - a type-specific resource identifier, which must be zero @@ -664,7 +666,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_mem_acquire_resource_t); * XENMEM_get_vnumainfo used by guest to get * vNUMA topology from hypervisor. */ -#define XENMEM_get_vnumainfo 26 +#define XENMEM_get_vnumainfo 26 /* vNUMA node memory ranges */ struct xen_vmemrange { diff --git a/include/xen/nmi.h b/include/xen/nmi.h index 4dd7294d7..6706f3dbe 100644 --- a/include/xen/nmi.h +++ b/include/xen/nmi.h @@ -33,20 +33,20 @@ * NMI reason codes: * Currently these are x86-specific, stored in arch_shared_info.nmi_reason. */ - /* I/O-check error reported via ISA port 0x61, bit 6. */ -#define _XEN_NMIREASON_io_error 0 -#define XEN_NMIREASON_io_error (1UL << _XEN_NMIREASON_io_error) - /* PCI SERR reported via ISA port 0x61, bit 7. */ -#define _XEN_NMIREASON_pci_serr 1 -#define XEN_NMIREASON_pci_serr (1UL << _XEN_NMIREASON_pci_serr) +/* I/O-check error reported via ISA port 0x61, bit 6. */ +#define _XEN_NMIREASON_io_error 0 +#define XEN_NMIREASON_io_error (1UL << _XEN_NMIREASON_io_error) +/* PCI SERR reported via ISA port 0x61, bit 7. */ +#define _XEN_NMIREASON_pci_serr 1 +#define XEN_NMIREASON_pci_serr (1UL << _XEN_NMIREASON_pci_serr) #if __XEN_INTERFACE_VERSION__ < 0x00040300 /* legacy alias of the above */ - /* Parity error reported via ISA port 0x61, bit 7. */ +/* Parity error reported via ISA port 0x61, bit 7. */ #define _XEN_NMIREASON_parity_error 1 #define XEN_NMIREASON_parity_error (1UL << _XEN_NMIREASON_parity_error) #endif - /* Unknown hardware-generated NMI. */ -#define _XEN_NMIREASON_unknown 2 -#define XEN_NMIREASON_unknown (1UL << _XEN_NMIREASON_unknown) +/* Unknown hardware-generated NMI. */ +#define _XEN_NMIREASON_unknown 2 +#define XEN_NMIREASON_unknown (1UL << _XEN_NMIREASON_unknown) /* * long nmi_op(unsigned int cmd, void *arg) @@ -58,7 +58,7 @@ * sense for domain 0, vcpu 0. All other callers will be returned EINVAL. * arg == pointer to xennmi_callback structure. */ -#define XENNMI_register_callback 0 +#define XENNMI_register_callback 0 struct xennmi_callback { unsigned long handler_address; unsigned long pad; diff --git a/include/xen/physdev.h b/include/xen/physdev.h index aedb71d67..7a06e22b6 100644 --- a/include/xen/physdev.h +++ b/include/xen/physdev.h @@ -36,7 +36,7 @@ * Notify end-of-interrupt (EOI) for the specified IRQ. * @arg == pointer to physdev_eoi structure. */ -#define PHYSDEVOP_eoi 12 +#define PHYSDEVOP_eoi 12 struct physdev_eoi { /* IN */ uint32_t irq; @@ -51,7 +51,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t); * will automatically get unmasked. The page registered is used as a bit * array indexed by Xen's PIRQ value. */ -#define PHYSDEVOP_pirq_eoi_gmfn_v1 17 +#define PHYSDEVOP_pirq_eoi_gmfn_v1 17 /* * Register a shared page for the hypervisor to indicate whether the * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to @@ -59,7 +59,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t); * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by * Xen's PIRQ value. */ -#define PHYSDEVOP_pirq_eoi_gmfn_v2 28 +#define PHYSDEVOP_pirq_eoi_gmfn_v2 28 struct physdev_pirq_eoi_gmfn { /* IN */ xen_pfn_t gmfn; @@ -71,7 +71,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_pirq_eoi_gmfn_t); * Query the status of an IRQ line. * @arg == pointer to physdev_irq_status_query structure. */ -#define PHYSDEVOP_irq_status_query 5 +#define PHYSDEVOP_irq_status_query 5 struct physdev_irq_status_query { /* IN */ uint32_t irq; @@ -82,18 +82,18 @@ typedef struct physdev_irq_status_query physdev_irq_status_query_t; DEFINE_XEN_GUEST_HANDLE(physdev_irq_status_query_t); /* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */ -#define _XENIRQSTAT_needs_eoi (0) -#define XENIRQSTAT_needs_eoi (1U<<_XENIRQSTAT_needs_eoi) +#define _XENIRQSTAT_needs_eoi (0) +#define XENIRQSTAT_needs_eoi (1U << _XENIRQSTAT_needs_eoi) /* IRQ shared by multiple guests? */ -#define _XENIRQSTAT_shared (1) -#define XENIRQSTAT_shared (1U<<_XENIRQSTAT_shared) +#define _XENIRQSTAT_shared (1) +#define XENIRQSTAT_shared (1U << _XENIRQSTAT_shared) /* * Set the current VCPU's I/O privilege level. * @arg == pointer to physdev_set_iopl structure. */ -#define PHYSDEVOP_set_iopl 6 +#define PHYSDEVOP_set_iopl 6 struct physdev_set_iopl { /* IN */ uint32_t iopl; @@ -105,7 +105,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_set_iopl_t); * Set the current VCPU's I/O-port permissions bitmap. * @arg == pointer to physdev_set_iobitmap structure. */ -#define PHYSDEVOP_set_iobitmap 7 +#define PHYSDEVOP_set_iobitmap 7 struct physdev_set_iobitmap { /* IN */ #if __XEN_INTERFACE_VERSION__ >= 0x00030205 @@ -122,8 +122,8 @@ DEFINE_XEN_GUEST_HANDLE(physdev_set_iobitmap_t); * Read or write an IO-APIC register. * @arg == pointer to physdev_apic structure. */ -#define PHYSDEVOP_apic_read 8 -#define PHYSDEVOP_apic_write 9 +#define PHYSDEVOP_apic_read 8 +#define PHYSDEVOP_apic_write 9 struct physdev_apic { /* IN */ unsigned long apic_physbase; @@ -138,8 +138,8 @@ DEFINE_XEN_GUEST_HANDLE(physdev_apic_t); * Allocate or free a physical upcall vector for the specified IRQ line. * @arg == pointer to physdev_irq structure. */ -#define PHYSDEVOP_alloc_irq_vector 10 -#define PHYSDEVOP_free_irq_vector 11 +#define PHYSDEVOP_alloc_irq_vector 10 +#define PHYSDEVOP_free_irq_vector 11 struct physdev_irq { /* IN */ uint32_t irq; @@ -149,13 +149,13 @@ struct physdev_irq { typedef struct physdev_irq physdev_irq_t; DEFINE_XEN_GUEST_HANDLE(physdev_irq_t); -#define MAP_PIRQ_TYPE_MSI 0x0 -#define MAP_PIRQ_TYPE_GSI 0x1 -#define MAP_PIRQ_TYPE_UNKNOWN 0x2 -#define MAP_PIRQ_TYPE_MSI_SEG 0x3 -#define MAP_PIRQ_TYPE_MULTI_MSI 0x4 +#define MAP_PIRQ_TYPE_MSI 0x0 +#define MAP_PIRQ_TYPE_GSI 0x1 +#define MAP_PIRQ_TYPE_UNKNOWN 0x2 +#define MAP_PIRQ_TYPE_MSI_SEG 0x3 +#define MAP_PIRQ_TYPE_MULTI_MSI 0x4 -#define PHYSDEVOP_map_pirq 13 +#define PHYSDEVOP_map_pirq 13 struct physdev_map_pirq { domid_t domid; /* IN */ @@ -176,7 +176,7 @@ struct physdev_map_pirq { typedef struct physdev_map_pirq physdev_map_pirq_t; DEFINE_XEN_GUEST_HANDLE(physdev_map_pirq_t); -#define PHYSDEVOP_unmap_pirq 14 +#define PHYSDEVOP_unmap_pirq 14 struct physdev_unmap_pirq { domid_t domid; /* IN */ @@ -186,8 +186,8 @@ struct physdev_unmap_pirq { typedef struct physdev_unmap_pirq physdev_unmap_pirq_t; DEFINE_XEN_GUEST_HANDLE(physdev_unmap_pirq_t); -#define PHYSDEVOP_manage_pci_add 15 -#define PHYSDEVOP_manage_pci_remove 16 +#define PHYSDEVOP_manage_pci_add 15 +#define PHYSDEVOP_manage_pci_remove 16 struct physdev_manage_pci { /* IN */ uint8_t bus; @@ -197,7 +197,7 @@ struct physdev_manage_pci { typedef struct physdev_manage_pci physdev_manage_pci_t; DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_t); -#define PHYSDEVOP_restore_msi 19 +#define PHYSDEVOP_restore_msi 19 struct physdev_restore_msi { /* IN */ uint8_t bus; @@ -206,7 +206,7 @@ struct physdev_restore_msi { typedef struct physdev_restore_msi physdev_restore_msi_t; DEFINE_XEN_GUEST_HANDLE(physdev_restore_msi_t); -#define PHYSDEVOP_manage_pci_add_ext 20 +#define PHYSDEVOP_manage_pci_add_ext 20 struct physdev_manage_pci_ext { /* IN */ uint8_t bus; @@ -229,17 +229,17 @@ DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_ext_t); struct physdev_op { uint32_t cmd; union { - struct physdev_irq_status_query irq_status_query; - struct physdev_set_iopl set_iopl; - struct physdev_set_iobitmap set_iobitmap; - struct physdev_apic apic_op; - struct physdev_irq irq_op; + struct physdev_irq_status_query irq_status_query; + struct physdev_set_iopl set_iopl; + struct physdev_set_iobitmap set_iobitmap; + struct physdev_apic apic_op; + struct physdev_irq irq_op; } u; }; typedef struct physdev_op physdev_op_t; DEFINE_XEN_GUEST_HANDLE(physdev_op_t); -#define PHYSDEVOP_setup_gsi 21 +#define PHYSDEVOP_setup_gsi 21 struct physdev_setup_gsi { int gsi; /* IN */ @@ -256,7 +256,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_setup_gsi_t); /* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI * the hypercall returns a free pirq */ -#define PHYSDEVOP_get_free_pirq 23 +#define PHYSDEVOP_get_free_pirq 23 struct physdev_get_free_pirq { /* IN */ int type; @@ -267,9 +267,9 @@ struct physdev_get_free_pirq { typedef struct physdev_get_free_pirq physdev_get_free_pirq_t; DEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t); -#define XEN_PCI_MMCFG_RESERVED 0x1 +#define XEN_PCI_MMCFG_RESERVED 0x1 -#define PHYSDEVOP_pci_mmcfg_reserved 24 +#define PHYSDEVOP_pci_mmcfg_reserved 24 struct physdev_pci_mmcfg_reserved { uint64_t address; uint16_t segment; @@ -280,11 +280,11 @@ struct physdev_pci_mmcfg_reserved { typedef struct physdev_pci_mmcfg_reserved physdev_pci_mmcfg_reserved_t; DEFINE_XEN_GUEST_HANDLE(physdev_pci_mmcfg_reserved_t); -#define XEN_PCI_DEV_EXTFN 0x1 -#define XEN_PCI_DEV_VIRTFN 0x2 -#define XEN_PCI_DEV_PXM 0x4 +#define XEN_PCI_DEV_EXTFN 0x1 +#define XEN_PCI_DEV_VIRTFN 0x2 +#define XEN_PCI_DEV_PXM 0x4 -#define PHYSDEVOP_pci_device_add 25 +#define PHYSDEVOP_pci_device_add 25 struct physdev_pci_device_add { /* IN */ uint16_t seg; @@ -305,14 +305,14 @@ struct physdev_pci_device_add { typedef struct physdev_pci_device_add physdev_pci_device_add_t; DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_add_t); -#define PHYSDEVOP_pci_device_remove 26 -#define PHYSDEVOP_restore_msi_ext 27 +#define PHYSDEVOP_pci_device_remove 26 +#define PHYSDEVOP_restore_msi_ext 27 /* * Dom0 should use these two to announce MMIO resources assigned to * MSI-X capable devices won't (prepare) or may (release) change. */ -#define PHYSDEVOP_prepare_msix 30 -#define PHYSDEVOP_release_msix 31 +#define PHYSDEVOP_prepare_msix 30 +#define PHYSDEVOP_release_msix 31 struct physdev_pci_device { /* IN */ uint16_t seg; @@ -322,13 +322,13 @@ struct physdev_pci_device { typedef struct physdev_pci_device physdev_pci_device_t; DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_t); -#define PHYSDEVOP_DBGP_RESET_PREPARE 1 -#define PHYSDEVOP_DBGP_RESET_DONE 2 +#define PHYSDEVOP_DBGP_RESET_PREPARE 1 +#define PHYSDEVOP_DBGP_RESET_DONE 2 -#define PHYSDEVOP_DBGP_BUS_UNKNOWN 0 -#define PHYSDEVOP_DBGP_BUS_PCI 1 +#define PHYSDEVOP_DBGP_BUS_UNKNOWN 0 +#define PHYSDEVOP_DBGP_BUS_PCI 1 -#define PHYSDEVOP_dbgp_op 29 +#define PHYSDEVOP_dbgp_op 29 struct physdev_dbgp_op { /* IN */ uint8_t op; @@ -345,7 +345,7 @@ DEFINE_XEN_GUEST_HANDLE(physdev_dbgp_op_t); * ** This command is obsolete since interface version 0x00030202 and is ** * ** unsupported by newer versions of Xen. ** */ -#define PHYSDEVOP_IRQ_UNMASK_NOTIFY 4 +#define PHYSDEVOP_IRQ_UNMASK_NOTIFY 4 #if __XEN_INTERFACE_VERSION__ < 0x00040600 /* @@ -353,15 +353,15 @@ DEFINE_XEN_GUEST_HANDLE(physdev_dbgp_op_t); * (defined above) since interface version 0x00030202. The guard above was * added post-4.5 only though and hence shouldn't check for 0x00030202. */ -#define PHYSDEVOP_IRQ_STATUS_QUERY PHYSDEVOP_irq_status_query -#define PHYSDEVOP_SET_IOPL PHYSDEVOP_set_iopl -#define PHYSDEVOP_SET_IOBITMAP PHYSDEVOP_set_iobitmap -#define PHYSDEVOP_APIC_READ PHYSDEVOP_apic_read -#define PHYSDEVOP_APIC_WRITE PHYSDEVOP_apic_write -#define PHYSDEVOP_ASSIGN_VECTOR PHYSDEVOP_alloc_irq_vector -#define PHYSDEVOP_FREE_VECTOR PHYSDEVOP_free_irq_vector +#define PHYSDEVOP_IRQ_STATUS_QUERY PHYSDEVOP_irq_status_query +#define PHYSDEVOP_SET_IOPL PHYSDEVOP_set_iopl +#define PHYSDEVOP_SET_IOBITMAP PHYSDEVOP_set_iobitmap +#define PHYSDEVOP_APIC_READ PHYSDEVOP_apic_read +#define PHYSDEVOP_APIC_WRITE PHYSDEVOP_apic_write +#define PHYSDEVOP_ASSIGN_VECTOR PHYSDEVOP_alloc_irq_vector +#define PHYSDEVOP_FREE_VECTOR PHYSDEVOP_free_irq_vector #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi -#define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared +#define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared #endif #if __XEN_INTERFACE_VERSION__ < 0x00040200 diff --git a/include/xen/platform.h b/include/xen/platform.h index f3c84ebc7..483e4c72a 100644 --- a/include/xen/platform.h +++ b/include/xen/platform.h @@ -35,14 +35,14 @@ * Set clock such that it would read after 00:00:00 UTC, * 1 January, 1970 if the current system time was . */ -#define XENPF_settime32 17 +#define XENPF_settime32 17 struct xenpf_settime32 { /* IN variables. */ uint32_t secs; uint32_t nsecs; uint64_t system_time; }; -#define XENPF_settime64 62 +#define XENPF_settime64 62 struct xenpf_settime64 { /* IN variables. */ uint64_t secs; @@ -67,7 +67,7 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_settime_t); * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting. * (x86-specific). */ -#define XENPF_add_memtype 31 +#define XENPF_add_memtype 31 struct xenpf_add_memtype { /* IN variables. */ xen_pfn_t mfn; @@ -87,7 +87,7 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_add_memtype_t); * then @handle should be set to zero. In all cases @reg must be set. * (x86-specific). */ -#define XENPF_del_memtype 32 +#define XENPF_del_memtype 32 struct xenpf_del_memtype { /* IN variables. */ uint32_t handle; @@ -97,7 +97,7 @@ typedef struct xenpf_del_memtype xenpf_del_memtype_t; DEFINE_XEN_GUEST_HANDLE(xenpf_del_memtype_t); /* Read current type of an MTRR (x86-specific). */ -#define XENPF_read_memtype 33 +#define XENPF_read_memtype 33 struct xenpf_read_memtype { /* IN variables. */ uint32_t reg; @@ -109,19 +109,19 @@ struct xenpf_read_memtype { typedef struct xenpf_read_memtype xenpf_read_memtype_t; DEFINE_XEN_GUEST_HANDLE(xenpf_read_memtype_t); -#define XENPF_microcode_update 35 +#define XENPF_microcode_update 35 struct xenpf_microcode_update { /* IN variables. */ - XEN_GUEST_HANDLE(const_void) data;/* Pointer to microcode data */ - uint32_t length; /* Length of microcode data. */ + XEN_GUEST_HANDLE(const_void) data; /* Pointer to microcode data */ + uint32_t length; /* Length of microcode data. */ }; typedef struct xenpf_microcode_update xenpf_microcode_update_t; DEFINE_XEN_GUEST_HANDLE(xenpf_microcode_update_t); -#define XENPF_platform_quirk 39 -#define QUIRK_NOIRQBALANCING 1 /* Do not restrict IO-APIC RTE targets */ -#define QUIRK_IOAPIC_BAD_REGSEL 2 /* IO-APIC REGSEL forgets its value */ -#define QUIRK_IOAPIC_GOOD_REGSEL 3 /* IO-APIC REGSEL behaves properly */ +#define XENPF_platform_quirk 39 +#define QUIRK_NOIRQBALANCING 1 /* Do not restrict IO-APIC RTE targets */ +#define QUIRK_IOAPIC_BAD_REGSEL 2 /* IO-APIC REGSEL forgets its value */ +#define QUIRK_IOAPIC_GOOD_REGSEL 3 /* IO-APIC REGSEL behaves properly */ struct xenpf_platform_quirk { /* IN variables. */ uint32_t quirk_id; @@ -129,7 +129,7 @@ struct xenpf_platform_quirk { typedef struct xenpf_platform_quirk xenpf_platform_quirk_t; DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); -#define XENPF_efi_runtime_call 49 +#define XENPF_efi_runtime_call 49 #define XEN_EFI_get_time 1 #define XEN_EFI_set_time 2 #define XEN_EFI_get_wakeup_time 3 @@ -139,8 +139,8 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); #define XEN_EFI_set_variable 7 #define XEN_EFI_get_next_variable_name 8 #define XEN_EFI_query_variable_info 9 -#define XEN_EFI_query_capsule_capabilities 10 -#define XEN_EFI_update_capsule 11 +#define XEN_EFI_query_capsule_capabilities 10 +#define XEN_EFI_update_capsule 11 struct xenpf_efi_time { uint16_t year; @@ -192,7 +192,7 @@ struct xenpf_efi_runtime_call { #define XEN_EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 #define XEN_EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 struct { - XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ + XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ xen_ulong_t size; XEN_GUEST_HANDLE(void) data; struct xenpf_efi_guid vendor_guid; @@ -200,11 +200,11 @@ struct xenpf_efi_runtime_call { struct { xen_ulong_t size; - XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ + XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ struct xenpf_efi_guid vendor_guid; } get_next_variable_name; -#define XEN_EFI_VARINFO_BOOT_SNAPSHOT 0x00000001 +#define XEN_EFI_VARINFO_BOOT_SNAPSHOT 0x00000001 struct { uint32_t attr; uint64_t max_store_size; @@ -229,19 +229,19 @@ struct xenpf_efi_runtime_call { typedef struct xenpf_efi_runtime_call xenpf_efi_runtime_call_t; DEFINE_XEN_GUEST_HANDLE(xenpf_efi_runtime_call_t); -#define XENPF_firmware_info 50 -#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ -#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ -#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ -#define XEN_FW_EFI_INFO 4 /* from EFI */ -#define XEN_FW_EFI_VERSION 0 -#define XEN_FW_EFI_CONFIG_TABLE 1 -#define XEN_FW_EFI_VENDOR 2 -#define XEN_FW_EFI_MEM_INFO 3 -#define XEN_FW_EFI_RT_VERSION 4 -#define XEN_FW_EFI_PCI_ROM 5 -#define XEN_FW_EFI_APPLE_PROPERTIES 6 -#define XEN_FW_KBD_SHIFT_FLAGS 5 +#define XENPF_firmware_info 50 +#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ +#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ +#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ +#define XEN_FW_EFI_INFO 4 /* from EFI */ +#define XEN_FW_EFI_VERSION 0 +#define XEN_FW_EFI_CONFIG_TABLE 1 +#define XEN_FW_EFI_VENDOR 2 +#define XEN_FW_EFI_MEM_INFO 3 +#define XEN_FW_EFI_RT_VERSION 4 +#define XEN_FW_EFI_PCI_ROM 5 +#define XEN_FW_EFI_APPLE_PROPERTIES 6 +#define XEN_FW_KBD_SHIFT_FLAGS 5 struct xenpf_firmware_info { /* IN variables. */ uint32_t type; @@ -250,20 +250,20 @@ struct xenpf_firmware_info { union { struct { /* Int13, Fn48: Check Extensions Present. */ - uint8_t device; /* %dl: bios device number */ - uint8_t version; /* %ah: major version */ - uint16_t interface_support; /* %cx: support bitmap */ + uint8_t device; /* %dl: bios device number */ + uint8_t version; /* %ah: major version */ + uint16_t interface_support; /* %cx: support bitmap */ /* Int13, Fn08: Legacy Get Device Parameters. */ - uint16_t legacy_max_cylinder; /* %cl[7:6]:%ch: max cyl # */ - uint8_t legacy_max_head; /* %dh: max head # */ + uint16_t legacy_max_cylinder; /* %cl[7:6]:%ch: max cyl # */ + uint8_t legacy_max_head; /* %dh: max head # */ uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector # */ /* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */ /* NB. First uint16_t of buffer must be set to buffer size. */ XEN_GUEST_HANDLE(void) edd_params; } disk_info; /* XEN_FW_DISK_INFO */ struct { - uint8_t device; /* bios device number */ - uint32_t mbr_signature; /* offset 0x1b8 in mbr */ + uint8_t device; /* bios device number */ + uint32_t mbr_signature; /* offset 0x1b8 in mbr */ } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ struct { /* Int10, AX=4F15: Get EDID info. */ @@ -275,13 +275,13 @@ struct xenpf_firmware_info { union xenpf_efi_info { uint32_t version; struct { - uint64_t addr; /* EFI_CONFIGURATION_TABLE */ + uint64_t addr; /* EFI_CONFIGURATION_TABLE */ uint32_t nent; } cfg; struct { uint32_t revision; - uint32_t bufsz; /* input, in bytes */ - XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ + uint32_t bufsz; /* input, in bytes */ + XEN_GUEST_HANDLE(void) name; /* UCS-2/UTF-16 string */ } vendor; struct { uint64_t addr; @@ -314,29 +314,29 @@ struct xenpf_firmware_info { typedef struct xenpf_firmware_info xenpf_firmware_info_t; DEFINE_XEN_GUEST_HANDLE(xenpf_firmware_info_t); -#define XENPF_enter_acpi_sleep 51 +#define XENPF_enter_acpi_sleep 51 struct xenpf_enter_acpi_sleep { /* IN variables */ #if __XEN_INTERFACE_VERSION__ < 0x00040300 - uint16_t pm1a_cnt_val; /* PM1a control value. */ - uint16_t pm1b_cnt_val; /* PM1b control value. */ + uint16_t pm1a_cnt_val; /* PM1a control value. */ + uint16_t pm1b_cnt_val; /* PM1b control value. */ #else - uint16_t val_a; /* PM1a control / sleep type A. */ - uint16_t val_b; /* PM1b control / sleep type B. */ + uint16_t val_a; /* PM1a control / sleep type A. */ + uint16_t val_b; /* PM1b control / sleep type B. */ #endif - uint32_t sleep_state; /* Which state to enter (Sn). */ + uint32_t sleep_state; /* Which state to enter (Sn). */ #define XENPF_ACPI_SLEEP_EXTENDED 0x00000001 - uint32_t flags; /* XENPF_ACPI_SLEEP_*. */ + uint32_t flags; /* XENPF_ACPI_SLEEP_*. */ }; typedef struct xenpf_enter_acpi_sleep xenpf_enter_acpi_sleep_t; DEFINE_XEN_GUEST_HANDLE(xenpf_enter_acpi_sleep_t); -#define XENPF_change_freq 52 +#define XENPF_change_freq 52 struct xenpf_change_freq { /* IN variables */ uint32_t flags; /* Must be zero. */ - uint32_t cpu; /* Physical cpu. */ - uint64_t freq; /* New frequency (Hz). */ + uint32_t cpu; /* Physical cpu. */ + uint64_t freq; /* New frequency (Hz). */ }; typedef struct xenpf_change_freq xenpf_change_freq_t; DEFINE_XEN_GUEST_HANDLE(xenpf_change_freq_t); @@ -349,7 +349,7 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_change_freq_t); * non-existent CPUs are cleared. Such CPUs have their @idletime array entry * cleared. */ -#define XENPF_getidletime 53 +#define XENPF_getidletime 53 struct xenpf_getidletime { /* IN/OUT variables */ /* IN: CPUs to interrogate; OUT: subset of IN which are present */ @@ -366,83 +366,83 @@ struct xenpf_getidletime { typedef struct xenpf_getidletime xenpf_getidletime_t; DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t); -#define XENPF_set_processor_pminfo 54 +#define XENPF_set_processor_pminfo 54 /* ability bits */ -#define XEN_PROCESSOR_PM_CX 1 -#define XEN_PROCESSOR_PM_PX 2 -#define XEN_PROCESSOR_PM_TX 4 +#define XEN_PROCESSOR_PM_CX 1 +#define XEN_PROCESSOR_PM_PX 2 +#define XEN_PROCESSOR_PM_TX 4 /* cmd type */ -#define XEN_PM_CX 0 -#define XEN_PM_PX 1 -#define XEN_PM_TX 2 -#define XEN_PM_PDC 3 +#define XEN_PM_CX 0 +#define XEN_PM_PX 1 +#define XEN_PM_TX 2 +#define XEN_PM_PDC 3 /* Px sub info type */ -#define XEN_PX_PCT 1 -#define XEN_PX_PSS 2 -#define XEN_PX_PPC 4 -#define XEN_PX_PSD 8 +#define XEN_PX_PCT 1 +#define XEN_PX_PSS 2 +#define XEN_PX_PPC 4 +#define XEN_PX_PSD 8 struct xen_power_register { - uint32_t space_id; - uint32_t bit_width; - uint32_t bit_offset; - uint32_t access_size; - uint64_t address; + uint32_t space_id; + uint32_t bit_width; + uint32_t bit_offset; + uint32_t access_size; + uint64_t address; }; struct xen_processor_csd { - uint32_t domain; /* domain number of one dependent group */ - uint32_t coord_type; /* coordination type */ - uint32_t num; /* number of processors in same domain */ + uint32_t domain; /* domain number of one dependent group */ + uint32_t coord_type; /* coordination type */ + uint32_t num; /* number of processors in same domain */ }; typedef struct xen_processor_csd xen_processor_csd_t; DEFINE_XEN_GUEST_HANDLE(xen_processor_csd_t); struct xen_processor_cx { - struct xen_power_register reg; /* GAS for Cx trigger register */ - uint8_t type; /* cstate value, c0: 0, c1: 1, ... */ - uint32_t latency; /* worst latency (ms) to enter/exit this cstate */ - uint32_t power; /* average power consumption(mW) */ - uint32_t dpcnt; /* number of dependency entries */ + struct xen_power_register reg; /* GAS for Cx trigger register */ + uint8_t type; /* cstate value, c0: 0, c1: 1, ... */ + uint32_t latency; /* worst latency (ms) to enter/exit this cstate */ + uint32_t power; /* average power consumption(mW) */ + uint32_t dpcnt; /* number of dependency entries */ XEN_GUEST_HANDLE(xen_processor_csd_t) dp; /* NULL if no dependency */ }; typedef struct xen_processor_cx xen_processor_cx_t; DEFINE_XEN_GUEST_HANDLE(xen_processor_cx_t); struct xen_processor_flags { - uint32_t bm_control:1; - uint32_t bm_check:1; - uint32_t has_cst:1; - uint32_t power_setup_done:1; - uint32_t bm_rld_set:1; + uint32_t bm_control : 1; + uint32_t bm_check : 1; + uint32_t has_cst : 1; + uint32_t power_setup_done : 1; + uint32_t bm_rld_set : 1; }; struct xen_processor_power { - uint32_t count; /* number of C state entries in array below */ - struct xen_processor_flags flags; /* global flags of this processor */ + uint32_t count; /* number of C state entries in array below */ + struct xen_processor_flags flags; /* global flags of this processor */ XEN_GUEST_HANDLE(xen_processor_cx_t) states; /* supported c states */ }; struct xen_pct_register { - uint8_t descriptor; + uint8_t descriptor; uint16_t length; - uint8_t space_id; - uint8_t bit_width; - uint8_t bit_offset; - uint8_t reserved; + uint8_t space_id; + uint8_t bit_width; + uint8_t bit_offset; + uint8_t reserved; uint64_t address; }; struct xen_processor_px { uint64_t core_frequency; /* megahertz */ - uint64_t power; /* milliWatts */ + uint64_t power; /* milliWatts */ uint64_t transition_latency; /* microseconds */ uint64_t bus_master_latency; /* microseconds */ - uint64_t control; /* control value */ - uint64_t status; /* success indicator */ + uint64_t control; /* control value */ + uint64_t status; /* success indicator */ }; typedef struct xen_processor_px xen_processor_px_t; DEFINE_XEN_GUEST_HANDLE(xen_processor_px_t); @@ -456,26 +456,26 @@ struct xen_psd_package { }; struct xen_processor_performance { - uint32_t flags; /* flag for Px sub info type */ - uint32_t platform_limit; /* Platform limitation on freq usage */ + uint32_t flags; /* flag for Px sub info type */ + uint32_t platform_limit; /* Platform limitation on freq usage */ struct xen_pct_register control_register; struct xen_pct_register status_register; - uint32_t state_count; /* total available performance states */ + uint32_t state_count; /* total available performance states */ XEN_GUEST_HANDLE(xen_processor_px_t) states; struct xen_psd_package domain_info; - uint32_t shared_type; /* coordination type of this processor */ + uint32_t shared_type; /* coordination type of this processor */ }; typedef struct xen_processor_performance xen_processor_performance_t; DEFINE_XEN_GUEST_HANDLE(xen_processor_performance_t); struct xenpf_set_processor_pminfo { /* IN variables */ - uint32_t id; /* ACPI CPU ID */ - uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */ + uint32_t id; /* ACPI CPU ID */ + uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */ union { - struct xen_processor_power power;/* Cx: _CST/_CSD */ - struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ - XEN_GUEST_HANDLE(uint32) pdc; /* _PDC */ + struct xen_processor_power power; /* Cx: _CST/_CSD */ + struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ + XEN_GUEST_HANDLE(uint32) pdc; /* _PDC */ } u; }; typedef struct xenpf_set_processor_pminfo xenpf_set_processor_pminfo_t; @@ -488,9 +488,9 @@ struct xenpf_pcpuinfo { /* OUT */ /* The maxium cpu_id that is present */ uint32_t max_present; -#define XEN_PCPU_FLAGS_ONLINE 1 +#define XEN_PCPU_FLAGS_ONLINE 1 /* Correponding xen_cpuid is not present*/ -#define XEN_PCPU_FLAGS_INVALID 2 +#define XEN_PCPU_FLAGS_INVALID 2 uint32_t flags; uint32_t apic_id; uint32_t acpi_id; @@ -513,33 +513,30 @@ struct xenpf_pcpu_version { typedef struct xenpf_pcpu_version xenpf_pcpu_version_t; DEFINE_XEN_GUEST_HANDLE(xenpf_pcpu_version_t); -#define XENPF_cpu_online 56 -#define XENPF_cpu_offline 57 -struct xenpf_cpu_ol -{ +#define XENPF_cpu_online 56 +#define XENPF_cpu_offline 57 +struct xenpf_cpu_ol { uint32_t cpuid; }; typedef struct xenpf_cpu_ol xenpf_cpu_ol_t; DEFINE_XEN_GUEST_HANDLE(xenpf_cpu_ol_t); -#define XENPF_cpu_hotadd 58 -struct xenpf_cpu_hotadd -{ - uint32_t apic_id; - uint32_t acpi_id; - uint32_t pxm; +#define XENPF_cpu_hotadd 58 +struct xenpf_cpu_hotadd { + uint32_t apic_id; + uint32_t acpi_id; + uint32_t pxm; }; -#define XENPF_mem_hotadd 59 -struct xenpf_mem_hotadd -{ +#define XENPF_mem_hotadd 59 +struct xenpf_mem_hotadd { uint64_t spfn; uint64_t epfn; uint32_t pxm; uint32_t flags; }; -#define XENPF_core_parking 60 +#define XENPF_core_parking 60 #define XEN_CORE_PARKING_SET 1 #define XEN_CORE_PARKING_GET 2 @@ -561,7 +558,7 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t); * non-negative integer for the number of successful operations. For the latter * case, the @ret in the failed entry (if any) indicates the exact error. */ -#define XENPF_resource_op 61 +#define XENPF_resource_op 61 #define XEN_RESOURCE_OP_MSR_READ 0 #define XEN_RESOURCE_OP_MSR_WRITE 1 @@ -578,33 +575,33 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t); struct xenpf_resource_entry { union { - uint32_t cmd; /* IN: XEN_RESOURCE_OP_* */ - int32_t ret; /* OUT: return value for failed entry */ + uint32_t cmd; /* IN: XEN_RESOURCE_OP_* */ + int32_t ret; /* OUT: return value for failed entry */ } u; - uint32_t rsvd; /* IN: padding and must be zero */ - uint64_t idx; /* IN: resource address to access */ - uint64_t val; /* IN/OUT: resource value to set/get */ + uint32_t rsvd; /* IN: padding and must be zero */ + uint64_t idx; /* IN: resource address to access */ + uint64_t val; /* IN/OUT: resource value to set/get */ }; typedef struct xenpf_resource_entry xenpf_resource_entry_t; DEFINE_XEN_GUEST_HANDLE(xenpf_resource_entry_t); struct xenpf_resource_op { - uint32_t nr_entries; /* number of resource entry */ - uint32_t cpu; /* which cpu to run */ + uint32_t nr_entries; /* number of resource entry */ + uint32_t cpu; /* which cpu to run */ XEN_GUEST_HANDLE(xenpf_resource_entry_t) entries; }; typedef struct xenpf_resource_op xenpf_resource_op_t; DEFINE_XEN_GUEST_HANDLE(xenpf_resource_op_t); -#define XENPF_get_symbol 63 +#define XENPF_get_symbol 63 struct xenpf_symdata { /* IN/OUT variables */ uint32_t namelen; /* IN: size of name buffer */ - /* OUT: strlen(name) of hypervisor symbol (may be */ - /* larger than what's been copied to guest) */ - uint32_t symnum; /* IN: Symbol to read */ - /* OUT: Next available symbol. If same as IN then */ - /* we reached the end */ + /* OUT: strlen(name) of hypervisor symbol (may be */ + /* larger than what's been copied to guest) */ + uint32_t symnum; /* IN: Symbol to read */ + /* OUT: Next available symbol. If same as IN then */ + /* we reached the end */ /* OUT variables */ XEN_GUEST_HANDLE(char) name; @@ -622,29 +619,29 @@ struct xen_platform_op { uint32_t cmd; uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ union { - struct xenpf_settime settime; - struct xenpf_settime32 settime32; - struct xenpf_settime64 settime64; - struct xenpf_add_memtype add_memtype; - struct xenpf_del_memtype del_memtype; - struct xenpf_read_memtype read_memtype; - struct xenpf_microcode_update microcode; - struct xenpf_platform_quirk platform_quirk; - struct xenpf_efi_runtime_call efi_runtime_call; - struct xenpf_firmware_info firmware_info; - struct xenpf_enter_acpi_sleep enter_acpi_sleep; - struct xenpf_change_freq change_freq; - struct xenpf_getidletime getidletime; + struct xenpf_settime settime; + struct xenpf_settime32 settime32; + struct xenpf_settime64 settime64; + struct xenpf_add_memtype add_memtype; + struct xenpf_del_memtype del_memtype; + struct xenpf_read_memtype read_memtype; + struct xenpf_microcode_update microcode; + struct xenpf_platform_quirk platform_quirk; + struct xenpf_efi_runtime_call efi_runtime_call; + struct xenpf_firmware_info firmware_info; + struct xenpf_enter_acpi_sleep enter_acpi_sleep; + struct xenpf_change_freq change_freq; + struct xenpf_getidletime getidletime; struct xenpf_set_processor_pminfo set_pminfo; - struct xenpf_pcpuinfo pcpu_info; - struct xenpf_pcpu_version pcpu_version; - struct xenpf_cpu_ol cpu_ol; - struct xenpf_cpu_hotadd cpu_add; - struct xenpf_mem_hotadd mem_add; - struct xenpf_core_parking core_parking; - struct xenpf_resource_op resource_op; - struct xenpf_symdata symdata; - uint8_t pad[128]; + struct xenpf_pcpuinfo pcpu_info; + struct xenpf_pcpu_version pcpu_version; + struct xenpf_cpu_ol cpu_ol; + struct xenpf_cpu_hotadd cpu_add; + struct xenpf_mem_hotadd mem_add; + struct xenpf_core_parking core_parking; + struct xenpf_resource_op resource_op; + struct xenpf_symdata symdata; + uint8_t pad[128]; } u; }; typedef struct xen_platform_op xen_platform_op_t; diff --git a/include/xen/pmu.h b/include/xen/pmu.h index 0e1312cfe..7464ffadf 100644 --- a/include/xen/pmu.h +++ b/include/xen/pmu.h @@ -26,14 +26,14 @@ #include "xen.h" #if defined(__i386__) || defined(__x86_64__) #include "arch-x86/pmu.h" -#elif defined (__arm__) || defined (__aarch64__) +#elif defined(__arm__) || defined(__aarch64__) #include "arch-arm.h" #else #error "Unsupported architecture" #endif -#define XENPMU_VER_MAJ 0 -#define XENPMU_VER_MIN 1 +#define XENPMU_VER_MAJ 0 +#define XENPMU_VER_MIN 1 /* * ` enum neg_errnoval @@ -43,14 +43,14 @@ * @args == struct xenpmu_params */ /* ` enum xenpmu_op { */ -#define XENPMU_mode_get 0 /* Also used for getting PMU version */ -#define XENPMU_mode_set 1 -#define XENPMU_feature_get 2 -#define XENPMU_feature_set 3 -#define XENPMU_init 4 -#define XENPMU_finish 5 -#define XENPMU_lvtpc_set 6 -#define XENPMU_flush 7 /* Write cached MSR values to HW */ +#define XENPMU_mode_get 0 /* Also used for getting PMU version */ +#define XENPMU_mode_set 1 +#define XENPMU_feature_get 2 +#define XENPMU_feature_set 3 +#define XENPMU_init 4 +#define XENPMU_finish 5 +#define XENPMU_lvtpc_set 6 +#define XENPMU_flush 7 /* Write cached MSR values to HW */ /* ` } */ /* Parameters structure for HYPERVISOR_xenpmu_op call */ @@ -77,10 +77,10 @@ DEFINE_XEN_GUEST_HANDLE(xen_pmu_params_t); * - XENPMU_MODE_ALL: Only dom0 has access to VPMU and it profiles * everyone: itself, the hypervisor and the guests. */ -#define XENPMU_MODE_OFF 0 -#define XENPMU_MODE_SELF (1<<0) -#define XENPMU_MODE_HV (1<<1) -#define XENPMU_MODE_ALL (1<<2) +#define XENPMU_MODE_OFF 0 +#define XENPMU_MODE_SELF (1 << 0) +#define XENPMU_MODE_HV (1 << 1) +#define XENPMU_MODE_ALL (1 << 2) /* * PMU features: @@ -94,9 +94,9 @@ DEFINE_XEN_GUEST_HANDLE(xen_pmu_params_t); * cpuid and listed in the Intel developer's manual * (ignored on AMD). */ -#define XENPMU_FEATURE_INTEL_BTS (1<<0) -#define XENPMU_FEATURE_IPC_ONLY (1<<1) -#define XENPMU_FEATURE_ARCH_ONLY (1<<2) +#define XENPMU_FEATURE_INTEL_BTS (1 << 0) +#define XENPMU_FEATURE_IPC_ONLY (1 << 1) +#define XENPMU_FEATURE_ARCH_ONLY (1 << 2) /* * Shared PMU data between hypervisor and PV(H) domains. @@ -122,7 +122,7 @@ struct xen_pmu_data { * On privileged guests can be DOMID_SELF, DOMID_XEN, or, when in * XENPMU_MODE_ALL mode, domain ID of another domain. */ - domid_t domain_id; + domid_t domain_id; uint8_t pad[6]; diff --git a/include/xen/sched.h b/include/xen/sched.h index 811bd87c8..1be0d428a 100644 --- a/include/xen/sched.h +++ b/include/xen/sched.h @@ -61,7 +61,7 @@ * Voluntarily yield the CPU. * @arg == NULL. */ -#define SCHEDOP_yield 0 +#define SCHEDOP_yield 0 /* * Block execution of this VCPU until an event is received for processing. @@ -70,7 +70,7 @@ * VCPU. This avoids a "wakeup waiting" race. * @arg == NULL. */ -#define SCHEDOP_block 1 +#define SCHEDOP_block 1 /* * Halt execution of this domain (all VCPUs) and notify the system controller. @@ -85,14 +85,14 @@ * returns 1 if suspend was cancelled or the domain was merely * checkpointed, and 0 if it is resuming in a new domain. */ -#define SCHEDOP_shutdown 2 +#define SCHEDOP_shutdown 2 /* * Poll a set of event-channel ports. Return when one or more are pending. An * optional timeout may be specified. * @arg == pointer to sched_poll_t structure. */ -#define SCHEDOP_poll 3 +#define SCHEDOP_poll 3 /* * Declare a shutdown for another domain. The main use of this function is @@ -100,7 +100,7 @@ * domains. A para-virtualized domain may use SCHEDOP_shutdown directly. * @arg == pointer to sched_remote_shutdown_t structure. */ -#define SCHEDOP_remote_shutdown 4 +#define SCHEDOP_remote_shutdown 4 /* * Latch a shutdown code, so that when the domain later shuts down it @@ -117,7 +117,7 @@ * With id != 0 and timeout == 0, destroy domain watchdog timer. * With id != 0 and timeout != 0, poke watchdog timer and set new timeout. */ -#define SCHEDOP_watchdog 6 +#define SCHEDOP_watchdog 6 /* * Override the current vcpu affinity by pinning it to one physical cpu or @@ -147,15 +147,15 @@ typedef struct sched_poll sched_poll_t; DEFINE_XEN_GUEST_HANDLE(sched_poll_t); struct sched_remote_shutdown { - domid_t domain_id; /* Remote domain ID */ - unsigned int reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ + domid_t domain_id; /* Remote domain ID */ + unsigned int reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ }; typedef struct sched_remote_shutdown sched_remote_shutdown_t; DEFINE_XEN_GUEST_HANDLE(sched_remote_shutdown_t); struct sched_watchdog { - uint32_t id; /* watchdog ID */ - uint32_t timeout; /* timeout */ + uint32_t id; /* watchdog ID */ + uint32_t timeout; /* timeout */ }; typedef struct sched_watchdog sched_watchdog_t; DEFINE_XEN_GUEST_HANDLE(sched_watchdog_t); @@ -172,11 +172,11 @@ DEFINE_XEN_GUEST_HANDLE(sched_pin_override_t); * not care about the shutdown code. */ /* ` enum sched_shutdown_reason { */ -#define SHUTDOWN_poweroff 0 /* Domain exited normally. Clean up and kill. */ -#define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. */ -#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ -#define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ -#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */ +#define SHUTDOWN_poweroff 0 /* Domain exited normally. Clean up and kill. */ +#define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. */ +#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ +#define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ +#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */ /* * Domain asked to perform 'soft reset' for it. The expected behavior is to @@ -186,7 +186,7 @@ DEFINE_XEN_GUEST_HANDLE(sched_pin_override_t); * interfaces again. */ #define SHUTDOWN_soft_reset 5 -#define SHUTDOWN_MAX 5 /* Maximum valid shutdown reason. */ +#define SHUTDOWN_MAX 5 /* Maximum valid shutdown reason. */ /* ` } */ #endif /* __XEN_PUBLIC_SCHED_H__ */ diff --git a/include/xen/sysctl.h b/include/xen/sysctl.h index 19457a4e3..01daf7b37 100644 --- a/include/xen/sysctl.h +++ b/include/xen/sysctl.h @@ -71,34 +71,34 @@ struct xen_sysctl_tbuf_op { uint32_t cmd; /* IN/OUT variables */ struct xenctl_bitmap cpu_mask; - uint32_t evt_mask; + uint32_t evt_mask; /* OUT variables */ uint64_aligned_t buffer_mfn; - uint32_t size; /* Also an IN variable! */ + uint32_t size; /* Also an IN variable! */ }; /* * Get physical information about the host machine */ /* XEN_SYSCTL_physinfo */ - /* The platform supports HVM guests. */ -#define _XEN_SYSCTL_PHYSCAP_hvm 0 -#define XEN_SYSCTL_PHYSCAP_hvm (1u<<_XEN_SYSCTL_PHYSCAP_hvm) - /* The platform supports PV guests. */ -#define _XEN_SYSCTL_PHYSCAP_pv 1 -#define XEN_SYSCTL_PHYSCAP_pv (1u<<_XEN_SYSCTL_PHYSCAP_pv) - /* The platform supports direct access to I/O devices with IOMMU. */ -#define _XEN_SYSCTL_PHYSCAP_directio 2 -#define XEN_SYSCTL_PHYSCAP_directio (1u<<_XEN_SYSCTL_PHYSCAP_directio) +/* The platform supports HVM guests. */ +#define _XEN_SYSCTL_PHYSCAP_hvm 0 +#define XEN_SYSCTL_PHYSCAP_hvm (1u << _XEN_SYSCTL_PHYSCAP_hvm) +/* The platform supports PV guests. */ +#define _XEN_SYSCTL_PHYSCAP_pv 1 +#define XEN_SYSCTL_PHYSCAP_pv (1u << _XEN_SYSCTL_PHYSCAP_pv) +/* The platform supports direct access to I/O devices with IOMMU. */ +#define _XEN_SYSCTL_PHYSCAP_directio 2 +#define XEN_SYSCTL_PHYSCAP_directio (1u << _XEN_SYSCTL_PHYSCAP_directio) /* The platform supports Hardware Assisted Paging. */ -#define _XEN_SYSCTL_PHYSCAP_hap 3 -#define XEN_SYSCTL_PHYSCAP_hap (1u<<_XEN_SYSCTL_PHYSCAP_hap) +#define _XEN_SYSCTL_PHYSCAP_hap 3 +#define XEN_SYSCTL_PHYSCAP_hap (1u << _XEN_SYSCTL_PHYSCAP_hap) /* The platform supports software paging. */ -#define _XEN_SYSCTL_PHYSCAP_shadow 4 -#define XEN_SYSCTL_PHYSCAP_shadow (1u<<_XEN_SYSCTL_PHYSCAP_shadow) +#define _XEN_SYSCTL_PHYSCAP_shadow 4 +#define XEN_SYSCTL_PHYSCAP_shadow (1u << _XEN_SYSCTL_PHYSCAP_shadow) /* The platform supports sharing of HAP page tables with the IOMMU. */ #define _XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share 5 -#define XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share \ +#define XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share \ (1u << _XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share) /* Max XEN_SYSCTL_PHYSCAP_* constant. Used for ABI checking. */ @@ -107,12 +107,12 @@ struct xen_sysctl_tbuf_op { struct xen_sysctl_physinfo { uint32_t threads_per_core; uint32_t cores_per_socket; - uint32_t nr_cpus; /* # CPUs currently online */ - uint32_t max_cpu_id; /* Largest possible CPU ID on this host */ - uint32_t nr_nodes; /* # nodes currently online */ + uint32_t nr_cpus; /* # CPUs currently online */ + uint32_t max_cpu_id; /* Largest possible CPU ID on this host */ + uint32_t nr_nodes; /* # nodes currently online */ uint32_t max_node_id; /* Largest possible node ID on this host */ uint32_t cpu_khz; - uint32_t capabilities;/* XEN_SYSCTL_PHYSCAP_??? */ + uint32_t capabilities; /* XEN_SYSCTL_PHYSCAP_??? */ uint64_aligned_t total_pages; uint64_aligned_t free_pages; uint64_aligned_t scrub_pages; @@ -133,11 +133,11 @@ struct xen_sysctl_sched_id { /* Interface for controlling Xen software performance counters. */ /* XEN_SYSCTL_perfc_op */ /* Sub-operations: */ -#define XEN_SYSCTL_PERFCOP_reset 1 /* Reset all counters to zero. */ -#define XEN_SYSCTL_PERFCOP_query 2 /* Get perfctr information. */ +#define XEN_SYSCTL_PERFCOP_reset 1 /* Reset all counters to zero. */ +#define XEN_SYSCTL_PERFCOP_query 2 /* Get perfctr information. */ struct xen_sysctl_perfc_desc { - char name[80]; /* name of perf counter */ - uint32_t nr_vals; /* number of values for this counter */ + char name[80]; /* name of perf counter */ + uint32_t nr_vals; /* number of values for this counter */ }; typedef struct xen_sysctl_perfc_desc xen_sysctl_perfc_desc_t; DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_desc_t); @@ -146,10 +146,10 @@ DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t); struct xen_sysctl_perfc_op { /* IN variables. */ - uint32_t cmd; /* XEN_SYSCTL_PERFCOP_??? */ + uint32_t cmd; /* XEN_SYSCTL_PERFCOP_??? */ /* OUT variables. */ - uint32_t nr_counters; /* number of counters description */ - uint32_t nr_vals; /* number of values */ + uint32_t nr_counters; /* number of counters description */ + uint32_t nr_vals; /* number of values */ /* counter information (or NULL) */ XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc; /* counter values (or NULL) */ @@ -159,11 +159,11 @@ struct xen_sysctl_perfc_op { /* XEN_SYSCTL_getdomaininfolist */ struct xen_sysctl_getdomaininfolist { /* IN variables. */ - domid_t first_domain; - uint32_t max_domains; + domid_t first_domain; + uint32_t max_domains; XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer; /* OUT variables. */ - uint32_t num_domains; + uint32_t num_domains; }; /* Inject debug keys into Xen. */ @@ -192,39 +192,39 @@ struct xen_sysctl_getcpuinfo { /* XEN_SYSCTL_availheap */ struct xen_sysctl_availheap { /* IN variables. */ - uint32_t min_bitwidth; /* Smallest address width (zero if don't care). */ - uint32_t max_bitwidth; /* Largest address width (zero if don't care). */ - int32_t node; /* NUMA node of interest (-1 for all nodes). */ + uint32_t min_bitwidth; /* Smallest address width (zero if don't care). */ + uint32_t max_bitwidth; /* Largest address width (zero if don't care). */ + int32_t node; /* NUMA node of interest (-1 for all nodes). */ /* OUT variables. */ - uint64_aligned_t avail_bytes;/* Bytes available in the specified region. */ + uint64_aligned_t avail_bytes; /* Bytes available in the specified region. */ }; /* XEN_SYSCTL_get_pmstat */ struct pm_px_val { - uint64_aligned_t freq; /* Px core frequency */ - uint64_aligned_t residency; /* Px residency time */ - uint64_aligned_t count; /* Px transition count */ + uint64_aligned_t freq; /* Px core frequency */ + uint64_aligned_t residency; /* Px residency time */ + uint64_aligned_t count; /* Px transition count */ }; typedef struct pm_px_val pm_px_val_t; DEFINE_XEN_GUEST_HANDLE(pm_px_val_t); struct pm_px_stat { - uint8_t total; /* total Px states */ - uint8_t usable; /* usable Px states */ - uint8_t last; /* last Px state */ - uint8_t cur; /* current Px state */ - XEN_GUEST_HANDLE_64(uint64) trans_pt; /* Px transition table */ + uint8_t total; /* total Px states */ + uint8_t usable; /* usable Px states */ + uint8_t last; /* last Px state */ + uint8_t cur; /* current Px state */ + XEN_GUEST_HANDLE_64(uint64) trans_pt; /* Px transition table */ XEN_GUEST_HANDLE_64(pm_px_val_t) pt; }; struct pm_cx_stat { - uint32_t nr; /* entry nr in triggers & residencies, including C0 */ - uint32_t last; /* last Cx state */ - uint64_aligned_t idle_time; /* idle time from boot */ - XEN_GUEST_HANDLE_64(uint64) triggers; /* Cx trigger counts */ + uint32_t nr; /* entry nr in triggers & residencies, including C0 */ + uint32_t last; /* last Cx state */ + uint64_aligned_t idle_time; /* idle time from boot */ + XEN_GUEST_HANDLE_64(uint64) triggers; /* Cx trigger counts */ XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */ - uint32_t nr_pc; /* entry nr in pc[] */ - uint32_t nr_cc; /* entry nr in cc[] */ + uint32_t nr_pc; /* entry nr in pc[] */ + uint32_t nr_cc; /* entry nr in cc[] */ /* * These two arrays may (and generally will) have unused slots; slots not * having a corresponding hardware register will not be written by the @@ -258,7 +258,7 @@ struct xen_sysctl_get_pmstat { /* XEN_SYSCTL_cpu_hotplug */ struct xen_sysctl_cpu_hotplug { /* IN variables */ - uint32_t cpu; /* Physical cpu. */ + uint32_t cpu; /* Physical cpu. */ /* Single CPU enable/disable. */ #define XEN_SYSCTL_CPU_HOTPLUG_ONLINE 0 @@ -280,7 +280,7 @@ struct xen_sysctl_cpu_hotplug { */ #define XEN_SYSCTL_CPU_HOTPLUG_SMT_ENABLE 2 #define XEN_SYSCTL_CPU_HOTPLUG_SMT_DISABLE 3 - uint32_t op; /* hotplug opcode */ + uint32_t op; /* hotplug opcode */ }; /* @@ -315,7 +315,7 @@ struct xen_get_cpufreq_para { /* OUT variable */ XEN_GUEST_HANDLE_64(uint32) affected_cpus; XEN_GUEST_HANDLE_64(uint32) scaling_available_frequencies; - XEN_GUEST_HANDLE_64(char) scaling_available_governors; + XEN_GUEST_HANDLE_64(char) scaling_available_governors; char scaling_driver[CPUFREQ_NAME_LEN]; uint32_t cpuinfo_cur_freq; @@ -329,8 +329,8 @@ struct xen_get_cpufreq_para { /* for specific governor */ union { - struct xen_userspace userspace; - struct xen_ondemand ondemand; + struct xen_userspace userspace; + struct xen_ondemand ondemand; } u; int32_t turbo_enabled; @@ -341,65 +341,65 @@ struct xen_set_cpufreq_gov { }; struct xen_set_cpufreq_para { - #define SCALING_MAX_FREQ 1 - #define SCALING_MIN_FREQ 2 - #define SCALING_SETSPEED 3 - #define SAMPLING_RATE 4 - #define UP_THRESHOLD 5 +#define SCALING_MAX_FREQ 1 +#define SCALING_MIN_FREQ 2 +#define SCALING_SETSPEED 3 +#define SAMPLING_RATE 4 +#define UP_THRESHOLD 5 uint32_t ctrl_type; uint32_t ctrl_value; }; struct xen_sysctl_pm_op { - #define PM_PARA_CATEGORY_MASK 0xf0 - #define CPUFREQ_PARA 0x10 +#define PM_PARA_CATEGORY_MASK 0xf0 +#define CPUFREQ_PARA 0x10 - /* cpufreq command type */ - #define GET_CPUFREQ_PARA (CPUFREQ_PARA | 0x01) - #define SET_CPUFREQ_GOV (CPUFREQ_PARA | 0x02) - #define SET_CPUFREQ_PARA (CPUFREQ_PARA | 0x03) - #define GET_CPUFREQ_AVGFREQ (CPUFREQ_PARA | 0x04) +/* cpufreq command type */ +#define GET_CPUFREQ_PARA (CPUFREQ_PARA | 0x01) +#define SET_CPUFREQ_GOV (CPUFREQ_PARA | 0x02) +#define SET_CPUFREQ_PARA (CPUFREQ_PARA | 0x03) +#define GET_CPUFREQ_AVGFREQ (CPUFREQ_PARA | 0x04) - /* set/reset scheduler power saving option */ - #define XEN_SYSCTL_pm_op_set_sched_opt_smt 0x21 +/* set/reset scheduler power saving option */ +#define XEN_SYSCTL_pm_op_set_sched_opt_smt 0x21 - /* - * cpuidle max C-state and max C-sub-state access command: - * Set cpuid to 0 for max C-state. - * Set cpuid to 1 for max C-sub-state. - */ - #define XEN_SYSCTL_pm_op_get_max_cstate 0x22 - #define XEN_SYSCTL_pm_op_set_max_cstate 0x23 +/* + * cpuidle max C-state and max C-sub-state access command: + * Set cpuid to 0 for max C-state. + * Set cpuid to 1 for max C-sub-state. + */ +#define XEN_SYSCTL_pm_op_get_max_cstate 0x22 +#define XEN_SYSCTL_pm_op_set_max_cstate 0x23 - /* set scheduler migration cost value */ - #define XEN_SYSCTL_pm_op_set_vcpu_migration_delay 0x24 - #define XEN_SYSCTL_pm_op_get_vcpu_migration_delay 0x25 +/* set scheduler migration cost value */ +#define XEN_SYSCTL_pm_op_set_vcpu_migration_delay 0x24 +#define XEN_SYSCTL_pm_op_get_vcpu_migration_delay 0x25 - /* enable/disable turbo mode when in dbs governor */ - #define XEN_SYSCTL_pm_op_enable_turbo 0x26 - #define XEN_SYSCTL_pm_op_disable_turbo 0x27 +/* enable/disable turbo mode when in dbs governor */ +#define XEN_SYSCTL_pm_op_enable_turbo 0x26 +#define XEN_SYSCTL_pm_op_disable_turbo 0x27 uint32_t cmd; uint32_t cpuid; union { struct xen_get_cpufreq_para get_para; - struct xen_set_cpufreq_gov set_gov; + struct xen_set_cpufreq_gov set_gov; struct xen_set_cpufreq_para set_para; uint64_aligned_t get_avgfreq; - uint32_t set_sched_opt_smt; + uint32_t set_sched_opt_smt; #define XEN_SYSCTL_CX_UNLIMITED 0xffffffff - uint32_t get_max_cstate; - uint32_t set_max_cstate; + uint32_t get_max_cstate; + uint32_t set_max_cstate; } u; }; /* XEN_SYSCTL_page_offline_op */ struct xen_sysctl_page_offline_op { /* IN: range of page to be offlined */ -#define sysctl_page_offline 1 -#define sysctl_page_online 2 -#define sysctl_query_page_offline 3 +#define sysctl_page_offline 1 +#define sysctl_page_online 2 +#define sysctl_query_page_offline 3 uint32_t cmd; uint32_t start; uint32_t end; @@ -411,72 +411,72 @@ struct xen_sysctl_page_offline_op { XEN_GUEST_HANDLE(uint32) status; }; -#define PG_OFFLINE_STATUS_MASK (0xFFUL) +#define PG_OFFLINE_STATUS_MASK (0xFFUL) /* The result is invalid, i.e. HV does not handle it */ -#define PG_OFFLINE_INVALID (0x1UL << 0) +#define PG_OFFLINE_INVALID (0x1UL << 0) -#define PG_OFFLINE_OFFLINED (0x1UL << 1) -#define PG_OFFLINE_PENDING (0x1UL << 2) -#define PG_OFFLINE_FAILED (0x1UL << 3) -#define PG_OFFLINE_AGAIN (0x1UL << 4) +#define PG_OFFLINE_OFFLINED (0x1UL << 1) +#define PG_OFFLINE_PENDING (0x1UL << 2) +#define PG_OFFLINE_FAILED (0x1UL << 3) +#define PG_OFFLINE_AGAIN (0x1UL << 4) -#define PG_ONLINE_FAILED PG_OFFLINE_FAILED -#define PG_ONLINE_ONLINED PG_OFFLINE_OFFLINED +#define PG_ONLINE_FAILED PG_OFFLINE_FAILED +#define PG_ONLINE_ONLINED PG_OFFLINE_OFFLINED -#define PG_OFFLINE_STATUS_OFFLINED (0x1UL << 1) -#define PG_OFFLINE_STATUS_ONLINE (0x1UL << 2) -#define PG_OFFLINE_STATUS_OFFLINE_PENDING (0x1UL << 3) -#define PG_OFFLINE_STATUS_BROKEN (0x1UL << 4) +#define PG_OFFLINE_STATUS_OFFLINED (0x1UL << 1) +#define PG_OFFLINE_STATUS_ONLINE (0x1UL << 2) +#define PG_OFFLINE_STATUS_OFFLINE_PENDING (0x1UL << 3) +#define PG_OFFLINE_STATUS_BROKEN (0x1UL << 4) -#define PG_OFFLINE_MISC_MASK (0xFFUL << 4) +#define PG_OFFLINE_MISC_MASK (0xFFUL << 4) /* valid when PG_OFFLINE_FAILED or PG_OFFLINE_PENDING */ -#define PG_OFFLINE_XENPAGE (0x1UL << 8) -#define PG_OFFLINE_DOM0PAGE (0x1UL << 9) -#define PG_OFFLINE_ANONYMOUS (0x1UL << 10) -#define PG_OFFLINE_NOT_CONV_RAM (0x1UL << 11) -#define PG_OFFLINE_OWNED (0x1UL << 12) +#define PG_OFFLINE_XENPAGE (0x1UL << 8) +#define PG_OFFLINE_DOM0PAGE (0x1UL << 9) +#define PG_OFFLINE_ANONYMOUS (0x1UL << 10) +#define PG_OFFLINE_NOT_CONV_RAM (0x1UL << 11) +#define PG_OFFLINE_OWNED (0x1UL << 12) -#define PG_OFFLINE_BROKEN (0x1UL << 13) -#define PG_ONLINE_BROKEN PG_OFFLINE_BROKEN +#define PG_OFFLINE_BROKEN (0x1UL << 13) +#define PG_ONLINE_BROKEN PG_OFFLINE_BROKEN #define PG_OFFLINE_OWNER_SHIFT 16 /* XEN_SYSCTL_lockprof_op */ /* Sub-operations: */ -#define XEN_SYSCTL_LOCKPROF_reset 1 /* Reset all profile data to zero. */ -#define XEN_SYSCTL_LOCKPROF_query 2 /* Get lock profile information. */ +#define XEN_SYSCTL_LOCKPROF_reset 1 /* Reset all profile data to zero. */ +#define XEN_SYSCTL_LOCKPROF_query 2 /* Get lock profile information. */ /* Record-type: */ -#define LOCKPROF_TYPE_GLOBAL 0 /* global lock, idx meaningless */ -#define LOCKPROF_TYPE_PERDOM 1 /* per-domain lock, idx is domid */ -#define LOCKPROF_TYPE_N 2 /* number of types */ +#define LOCKPROF_TYPE_GLOBAL 0 /* global lock, idx meaningless */ +#define LOCKPROF_TYPE_PERDOM 1 /* per-domain lock, idx is domid */ +#define LOCKPROF_TYPE_N 2 /* number of types */ struct xen_sysctl_lockprof_data { - char name[40]; /* lock name (may include up to 2 %d specifiers) */ - int32_t type; /* LOCKPROF_TYPE_??? */ - int32_t idx; /* index (e.g. domain id) */ - uint64_aligned_t lock_cnt; /* # of locking succeeded */ - uint64_aligned_t block_cnt; /* # of wait for lock */ - uint64_aligned_t lock_time; /* nsecs lock held */ - uint64_aligned_t block_time; /* nsecs waited for lock */ + char name[40]; /* lock name (may include up to 2 %d specifiers) */ + int32_t type; /* LOCKPROF_TYPE_??? */ + int32_t idx; /* index (e.g. domain id) */ + uint64_aligned_t lock_cnt; /* # of locking succeeded */ + uint64_aligned_t block_cnt; /* # of wait for lock */ + uint64_aligned_t lock_time; /* nsecs lock held */ + uint64_aligned_t block_time; /* nsecs waited for lock */ }; typedef struct xen_sysctl_lockprof_data xen_sysctl_lockprof_data_t; DEFINE_XEN_GUEST_HANDLE(xen_sysctl_lockprof_data_t); struct xen_sysctl_lockprof_op { /* IN variables. */ - uint32_t cmd; /* XEN_SYSCTL_LOCKPROF_??? */ - uint32_t max_elem; /* size of output buffer */ + uint32_t cmd; /* XEN_SYSCTL_LOCKPROF_??? */ + uint32_t max_elem; /* size of output buffer */ /* OUT variables (query only). */ - uint32_t nr_elem; /* number of elements available */ - uint64_aligned_t time; /* nsecs of profile measurement */ + uint32_t nr_elem; /* number of elements available */ + uint64_aligned_t time; /* nsecs of profile measurement */ /* profile information (or NULL) */ XEN_GUEST_HANDLE_64(xen_sysctl_lockprof_data_t) data; }; /* XEN_SYSCTL_cputopoinfo */ -#define XEN_INVALID_CORE_ID (~0U) -#define XEN_INVALID_SOCKET_ID (~0U) -#define XEN_INVALID_NODE_ID (~0U) +#define XEN_INVALID_CORE_ID (~0U) +#define XEN_INVALID_SOCKET_ID (~0U) +#define XEN_INVALID_NODE_ID (~0U) struct xen_sysctl_cputopo { uint32_t core; @@ -504,8 +504,8 @@ struct xen_sysctl_cputopoinfo { }; /* XEN_SYSCTL_numainfo */ -#define XEN_INVALID_MEM_SZ (~0U) -#define XEN_INVALID_NODE_DIST (~0U) +#define XEN_INVALID_MEM_SZ (~0U) +#define XEN_INVALID_NODE_DIST (~0U) struct xen_sysctl_meminfo { uint64_t memsize; @@ -544,21 +544,21 @@ struct xen_sysctl_numainfo { }; /* XEN_SYSCTL_cpupool_op */ -#define XEN_SYSCTL_CPUPOOL_OP_CREATE 1 /* C */ -#define XEN_SYSCTL_CPUPOOL_OP_DESTROY 2 /* D */ -#define XEN_SYSCTL_CPUPOOL_OP_INFO 3 /* I */ -#define XEN_SYSCTL_CPUPOOL_OP_ADDCPU 4 /* A */ -#define XEN_SYSCTL_CPUPOOL_OP_RMCPU 5 /* R */ -#define XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN 6 /* M */ -#define XEN_SYSCTL_CPUPOOL_OP_FREEINFO 7 /* F */ -#define XEN_SYSCTL_CPUPOOL_PAR_ANY 0xFFFFFFFF +#define XEN_SYSCTL_CPUPOOL_OP_CREATE 1 /* C */ +#define XEN_SYSCTL_CPUPOOL_OP_DESTROY 2 /* D */ +#define XEN_SYSCTL_CPUPOOL_OP_INFO 3 /* I */ +#define XEN_SYSCTL_CPUPOOL_OP_ADDCPU 4 /* A */ +#define XEN_SYSCTL_CPUPOOL_OP_RMCPU 5 /* R */ +#define XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN 6 /* M */ +#define XEN_SYSCTL_CPUPOOL_OP_FREEINFO 7 /* F */ +#define XEN_SYSCTL_CPUPOOL_PAR_ANY 0xFFFFFFFF struct xen_sysctl_cpupool_op { - uint32_t op; /* IN */ - uint32_t cpupool_id; /* IN: CDIARM OUT: CI */ - uint32_t sched_id; /* IN: C OUT: I */ - uint32_t domid; /* IN: M */ - uint32_t cpu; /* IN: AR */ - uint32_t n_dom; /* OUT: I */ + uint32_t op; /* IN */ + uint32_t cpupool_id; /* IN: CDIARM OUT: CI */ + uint32_t sched_id; /* IN: C OUT: I */ + uint32_t domid; /* IN: M */ + uint32_t cpu; /* IN: AR */ + uint32_t n_dom; /* OUT: I */ struct xenctl_bitmap cpumap; /* OUT: IF */ }; @@ -598,7 +598,7 @@ struct xen_sysctl_cpupool_op { * all the operations. */ -#define ARINC653_MAX_DOMAINS_PER_SCHEDULE 64 +#define ARINC653_MAX_DOMAINS_PER_SCHEDULE 64 /* * This structure is used to pass a new ARINC653 schedule from a * privileged domain (ie dom0) to Xen. @@ -606,10 +606,10 @@ struct xen_sysctl_cpupool_op { struct xen_sysctl_arinc653_schedule { /* major_frame holds the time for the new schedule's major frame * in nanoseconds. */ - uint64_aligned_t major_frame; + uint64_aligned_t major_frame; /* num_sched_entries holds how many of the entries in the * sched_entries[] array are valid. */ - uint8_t num_sched_entries; + uint8_t num_sched_entries; /* The sched_entries array holds the actual schedule entries. */ struct { /* dom_handle must match a domain's UUID */ @@ -642,7 +642,7 @@ struct xen_sysctl_credit_schedule { /* * How long we consider a vCPU to be cache-hot on the * CPU where it has run (max 100ms, in microseconds) - */ + */ #define XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US (100 * 1000) unsigned vcpu_migr_delay_us; }; @@ -657,8 +657,8 @@ struct xen_sysctl_credit2_schedule { #define XEN_SYSCTL_SCHEDOP_getinfo 1 struct xen_sysctl_scheduler_op { uint32_t cpupool_id; /* Cpupool whose scheduler is to be targetted. */ - uint32_t sched_id; /* XEN_SCHEDULER_* (domctl.h) */ - uint32_t cmd; /* XEN_SYSCTL_SCHEDOP_* */ + uint32_t sched_id; /* XEN_SCHEDULER_* (domctl.h) */ + uint32_t cmd; /* XEN_SYSCTL_SCHEDOP_* */ union { struct xen_sysctl_sched_arinc653 { XEN_GUEST_HANDLE_64(xen_sysctl_arinc653_schedule_t) schedule; @@ -688,7 +688,7 @@ struct xen_sysctl_scheduler_op { * Userspace tool will split the record to different files. */ -#define XEN_GCOV_FORMAT_MAGIC 0x58434f56 /* XCOV */ +#define XEN_GCOV_FORMAT_MAGIC 0x58434f56 /* XCOV */ /* * Ouput format of LLVM coverage data is just a raw stream, as would be @@ -706,19 +706,19 @@ struct xen_sysctl_coverage_op { XEN_GUEST_HANDLE_64(char) buffer; /* OUT */ }; -#define XEN_SYSCTL_PSR_CMT_get_total_rmid 0 -#define XEN_SYSCTL_PSR_CMT_get_l3_upscaling_factor 1 +#define XEN_SYSCTL_PSR_CMT_get_total_rmid 0 +#define XEN_SYSCTL_PSR_CMT_get_l3_upscaling_factor 1 /* The L3 cache size is returned in KB unit */ -#define XEN_SYSCTL_PSR_CMT_get_l3_cache_size 2 -#define XEN_SYSCTL_PSR_CMT_enabled 3 -#define XEN_SYSCTL_PSR_CMT_get_l3_event_mask 4 +#define XEN_SYSCTL_PSR_CMT_get_l3_cache_size 2 +#define XEN_SYSCTL_PSR_CMT_enabled 3 +#define XEN_SYSCTL_PSR_CMT_get_l3_event_mask 4 struct xen_sysctl_psr_cmt_op { - uint32_t cmd; /* IN: XEN_SYSCTL_PSR_CMT_* */ - uint32_t flags; /* padding variable, may be extended for future use */ + uint32_t cmd; /* IN: XEN_SYSCTL_PSR_CMT_* */ + uint32_t flags; /* padding variable, may be extended for future use */ union { - uint64_t data; /* OUT */ + uint64_t data; /* OUT */ struct { - uint32_t cpu; /* IN */ + uint32_t cpu; /* IN */ uint32_t rsvd; } l3_cache; } u; @@ -746,25 +746,25 @@ struct xen_sysctl_pcitopoinfo { XEN_GUEST_HANDLE_64(uint32) nodes; }; -#define XEN_SYSCTL_PSR_get_l3_info 0 -#define XEN_SYSCTL_PSR_get_l2_info 1 -#define XEN_SYSCTL_PSR_get_mba_info 2 +#define XEN_SYSCTL_PSR_get_l3_info 0 +#define XEN_SYSCTL_PSR_get_l2_info 1 +#define XEN_SYSCTL_PSR_get_mba_info 2 struct xen_sysctl_psr_alloc { - uint32_t cmd; /* IN: XEN_SYSCTL_PSR_* */ - uint32_t target; /* IN */ + uint32_t cmd; /* IN: XEN_SYSCTL_PSR_* */ + uint32_t target; /* IN */ union { struct { - uint32_t cbm_len; /* OUT: CBM length */ - uint32_t cos_max; /* OUT: Maximum COS */ -#define XEN_SYSCTL_PSR_CAT_L3_CDP (1u << 0) - uint32_t flags; /* OUT: CAT flags */ + uint32_t cbm_len; /* OUT: CBM length */ + uint32_t cos_max; /* OUT: Maximum COS */ +#define XEN_SYSCTL_PSR_CAT_L3_CDP (1u << 0) + uint32_t flags; /* OUT: CAT flags */ } cat_info; struct { uint32_t thrtl_max; /* OUT: Maximum throttle */ - uint32_t cos_max; /* OUT: Maximum COS */ -#define XEN_SYSCTL_PSR_MBA_LINEAR (1u << 0) - uint32_t flags; /* OUT: MBA flags */ + uint32_t cos_max; /* OUT: Maximum COS */ +#define XEN_SYSCTL_PSR_MBA_LINEAR (1u << 0) + uint32_t flags; /* OUT: MBA flags */ } mba_info; } u; }; @@ -776,15 +776,15 @@ struct xen_sysctl_psr_alloc { * instruction for PV guests. */ struct xen_sysctl_cpu_levelling_caps { -#define XEN_SYSCTL_CPU_LEVELCAP_faulting (1ul << 0) /* CPUID faulting */ -#define XEN_SYSCTL_CPU_LEVELCAP_ecx (1ul << 1) /* 0x00000001.ecx */ -#define XEN_SYSCTL_CPU_LEVELCAP_edx (1ul << 2) /* 0x00000001.edx */ -#define XEN_SYSCTL_CPU_LEVELCAP_extd_ecx (1ul << 3) /* 0x80000001.ecx */ -#define XEN_SYSCTL_CPU_LEVELCAP_extd_edx (1ul << 4) /* 0x80000001.edx */ -#define XEN_SYSCTL_CPU_LEVELCAP_xsave_eax (1ul << 5) /* 0x0000000D:1.eax */ -#define XEN_SYSCTL_CPU_LEVELCAP_thermal_ecx (1ul << 6) /* 0x00000006.ecx */ -#define XEN_SYSCTL_CPU_LEVELCAP_l7s0_eax (1ul << 7) /* 0x00000007:0.eax */ -#define XEN_SYSCTL_CPU_LEVELCAP_l7s0_ebx (1ul << 8) /* 0x00000007:0.ebx */ +#define XEN_SYSCTL_CPU_LEVELCAP_faulting (1ul << 0) /* CPUID faulting */ +#define XEN_SYSCTL_CPU_LEVELCAP_ecx (1ul << 1) /* 0x00000001.ecx */ +#define XEN_SYSCTL_CPU_LEVELCAP_edx (1ul << 2) /* 0x00000001.edx */ +#define XEN_SYSCTL_CPU_LEVELCAP_extd_ecx (1ul << 3) /* 0x80000001.ecx */ +#define XEN_SYSCTL_CPU_LEVELCAP_extd_edx (1ul << 4) /* 0x80000001.edx */ +#define XEN_SYSCTL_CPU_LEVELCAP_xsave_eax (1ul << 5) /* 0x0000000D:1.eax */ +#define XEN_SYSCTL_CPU_LEVELCAP_thermal_ecx (1ul << 6) /* 0x00000006.ecx */ +#define XEN_SYSCTL_CPU_LEVELCAP_l7s0_eax (1ul << 7) /* 0x00000007:0.eax */ +#define XEN_SYSCTL_CPU_LEVELCAP_l7s0_ebx (1ul << 8) /* 0x00000007:0.ebx */ uint32_t caps; }; @@ -798,11 +798,11 @@ struct xen_sysctl_cpu_levelling_caps { * - HVM: Maximum set of features which can be given to a HVM guest. */ struct xen_sysctl_cpu_featureset { -#define XEN_SYSCTL_cpu_featureset_raw 0 -#define XEN_SYSCTL_cpu_featureset_host 1 -#define XEN_SYSCTL_cpu_featureset_pv 2 -#define XEN_SYSCTL_cpu_featureset_hvm 3 - uint32_t index; /* IN: Which featureset to query? */ +#define XEN_SYSCTL_cpu_featureset_raw 0 +#define XEN_SYSCTL_cpu_featureset_host 1 +#define XEN_SYSCTL_cpu_featureset_pv 2 +#define XEN_SYSCTL_cpu_featureset_hvm 3 + uint32_t index; /* IN: Which featureset to query? */ uint32_t nr_features; /* IN/OUT: Number of entries in/written to * 'features', or the maximum number of features if * the guest handle is NULL. NB. All featuresets @@ -827,9 +827,9 @@ struct xen_sysctl_cpu_featureset { * 1) XEN_SYSCTL_LIVEPATCH_UPLOAD to upload the payload. If errors STOP. * 2) XEN_SYSCTL_LIVEPATCH_GET to check the `->rc`. If -XEN_EAGAIN spin. * If zero go to next step. - * 3) XEN_SYSCTL_LIVEPATCH_ACTION with LIVEPATCH_ACTION_APPLY to apply the patch. - * 4) XEN_SYSCTL_LIVEPATCH_GET to check the `->rc`. If in -XEN_EAGAIN spin. - * If zero exit with success. + * 3) XEN_SYSCTL_LIVEPATCH_ACTION with LIVEPATCH_ACTION_APPLY to apply the + * patch. 4) XEN_SYSCTL_LIVEPATCH_GET to check the `->rc`. If in -XEN_EAGAIN + * spin. If zero exit with success. */ #define LIVEPATCH_PAYLOAD_VERSION 1 @@ -841,12 +841,12 @@ struct xen_sysctl_cpu_featureset { */ #ifdef __XEN__ struct livepatch_func { - const char *name; /* Name of function to be patched. */ + const char *name; /* Name of function to be patched. */ void *new_addr; void *old_addr; uint32_t new_size; uint32_t old_size; - uint8_t version; /* MUST be LIVEPATCH_PAYLOAD_VERSION. */ + uint8_t version; /* MUST be LIVEPATCH_PAYLOAD_VERSION. */ uint8_t opaque[31]; }; typedef struct livepatch_func livepatch_func_t; @@ -860,10 +860,10 @@ typedef struct livepatch_func livepatch_func_t; */ #define XEN_LIVEPATCH_NAME_SIZE 128 struct xen_livepatch_name { - XEN_GUEST_HANDLE_64(char) name; /* IN: pointer to name. */ - uint16_t size; /* IN: size of name. May be upto - XEN_LIVEPATCH_NAME_SIZE. */ - uint16_t pad[3]; /* IN: MUST be zero. */ + XEN_GUEST_HANDLE_64(char) name; /* IN: pointer to name. */ + uint16_t size; /* IN: size of name. May be upto + XEN_LIVEPATCH_NAME_SIZE. */ + uint16_t pad[3]; /* IN: MUST be zero. */ }; /* @@ -883,9 +883,9 @@ struct xen_livepatch_name { */ #define XEN_SYSCTL_LIVEPATCH_UPLOAD 0 struct xen_sysctl_livepatch_upload { - struct xen_livepatch_name name; /* IN, name of the patch. */ - uint64_t size; /* IN, size of the ELF file. */ - XEN_GUEST_HANDLE_64(uint8) payload; /* IN, the ELF file. */ + struct xen_livepatch_name name; /* IN, name of the patch. */ + uint64_t size; /* IN, size of the ELF file. */ + XEN_GUEST_HANDLE_64(uint8) payload; /* IN, the ELF file. */ }; /* @@ -899,17 +899,17 @@ struct xen_sysctl_livepatch_upload { #define XEN_SYSCTL_LIVEPATCH_GET 1 struct xen_livepatch_status { -#define LIVEPATCH_STATE_CHECKED 1 -#define LIVEPATCH_STATE_APPLIED 2 - uint32_t state; /* OUT: LIVEPATCH_STATE_*. */ - int32_t rc; /* OUT: 0 if no error, otherwise -XEN_EXX. */ +#define LIVEPATCH_STATE_CHECKED 1 +#define LIVEPATCH_STATE_APPLIED 2 + uint32_t state; /* OUT: LIVEPATCH_STATE_*. */ + int32_t rc; /* OUT: 0 if no error, otherwise -XEN_EXX. */ }; typedef struct xen_livepatch_status xen_livepatch_status_t; DEFINE_XEN_GUEST_HANDLE(xen_livepatch_status_t); struct xen_sysctl_livepatch_get { - struct xen_livepatch_name name; /* IN, name of the payload. */ - struct xen_livepatch_status status; /* IN/OUT, state of it. */ + struct xen_livepatch_name name; /* IN, name of the payload. */ + struct xen_livepatch_status status; /* IN/OUT, state of it. */ }; /* @@ -917,9 +917,9 @@ struct xen_sysctl_livepatch_get { * loaded in the hypervisor. * * If the hypercall returns an positive number, it is the number (up to `nr`) - * of the payloads returned, along with `nr` updated with the number of remaining - * payloads, `version` updated (it may be the same across hypercalls. If it - * varies the data is stale and further calls could fail). The `status`, + * of the payloads returned, along with `nr` updated with the number of + * remaining payloads, `version` updated (it may be the same across hypercalls. + * If it varies the data is stale and further calls could fail). The `status`, * `name`, and `len`' are updated at their designed index value (`idx`) with * the returned value of data. * @@ -935,46 +935,50 @@ struct xen_sysctl_livepatch_get { */ #define XEN_SYSCTL_LIVEPATCH_LIST 2 struct xen_sysctl_livepatch_list { - uint32_t version; /* OUT: Hypervisor stamps value. - If varies between calls, we are - * getting stale data. */ - uint32_t idx; /* IN: Index into hypervisor list. */ - uint32_t nr; /* IN: How many status, name, and len - should fill out. Can be zero to get - amount of payloads and version. - OUT: How many payloads left. */ - uint32_t pad; /* IN: Must be zero. */ - XEN_GUEST_HANDLE_64(xen_livepatch_status_t) status; /* OUT. Must have enough - space allocate for nr of them. */ - XEN_GUEST_HANDLE_64(char) name; /* OUT: Array of names. Each member - MUST XEN_LIVEPATCH_NAME_SIZE in size. - Must have nr of them. */ - XEN_GUEST_HANDLE_64(uint32) len; /* OUT: Array of lengths of name's. - Must have nr of them. */ + uint32_t version; /* OUT: Hypervisor stamps value. + If varies between calls, we are + * getting stale data. */ + uint32_t idx; /* IN: Index into hypervisor list. */ + uint32_t nr; /* IN: How many status, name, and len + should fill out. Can be zero to get + amount of payloads and version. + OUT: How many payloads left. */ + uint32_t pad; /* IN: Must be zero. */ + XEN_GUEST_HANDLE_64(xen_livepatch_status_t) + status; /* OUT. Must have enough + space allocate for nr of them. */ + XEN_GUEST_HANDLE_64(char) + name; /* OUT: Array of names. Each member + MUST XEN_LIVEPATCH_NAME_SIZE in size. + Must have nr of them. */ + XEN_GUEST_HANDLE_64(uint32) + len; /* OUT: Array of lengths of name's. + Must have nr of them. */ }; /* * Perform an operation on the payload structure referenced by the `name` field. * The operation request is asynchronous and the status should be retrieved - * by using either XEN_SYSCTL_LIVEPATCH_GET or XEN_SYSCTL_LIVEPATCH_LIST hypercall. + * by using either XEN_SYSCTL_LIVEPATCH_GET or XEN_SYSCTL_LIVEPATCH_LIST + * hypercall. */ #define XEN_SYSCTL_LIVEPATCH_ACTION 3 struct xen_sysctl_livepatch_action { - struct xen_livepatch_name name; /* IN, name of the patch. */ -#define LIVEPATCH_ACTION_UNLOAD 1 -#define LIVEPATCH_ACTION_REVERT 2 -#define LIVEPATCH_ACTION_APPLY 3 -#define LIVEPATCH_ACTION_REPLACE 4 - uint32_t cmd; /* IN: LIVEPATCH_ACTION_*. */ - uint32_t timeout; /* IN: If zero then uses */ - /* hypervisor default. */ - /* Or upper bound of time (ns) */ - /* for operation to take. */ + struct xen_livepatch_name name; /* IN, name of the patch. */ +#define LIVEPATCH_ACTION_UNLOAD 1 +#define LIVEPATCH_ACTION_REVERT 2 +#define LIVEPATCH_ACTION_APPLY 3 +#define LIVEPATCH_ACTION_REPLACE 4 + uint32_t cmd; /* IN: LIVEPATCH_ACTION_*. */ + uint32_t timeout; /* IN: If zero then uses */ + /* hypervisor default. */ + /* Or upper bound of time (ns) */ + /* for operation to take. */ }; struct xen_sysctl_livepatch_op { - uint32_t cmd; /* IN: XEN_SYSCTL_LIVEPATCH_*. */ - uint32_t pad; /* IN: Always zero. */ + uint32_t cmd; /* IN: XEN_SYSCTL_LIVEPATCH_*. */ + uint32_t pad; /* IN: Always zero. */ union { struct xen_sysctl_livepatch_upload upload; struct xen_sysctl_livepatch_list list; @@ -994,9 +998,9 @@ struct xen_sysctl_livepatch_op { */ struct xen_sysctl_set_parameter { - XEN_GUEST_HANDLE_64(char) params; /* IN: pointer to parameters. */ - uint16_t size; /* IN: size of parameters. */ - uint16_t pad[3]; /* IN: MUST be zero. */ + XEN_GUEST_HANDLE_64(char) params; /* IN: pointer to parameters. */ + uint16_t size; /* IN: size of parameters. */ + uint16_t pad[3]; /* IN: MUST be zero. */ }; #if defined(__i386__) || defined(__x86_64__) @@ -1012,22 +1016,22 @@ struct xen_sysctl_set_parameter { * the security supported set. */ struct xen_sysctl_cpu_policy { -#define XEN_SYSCTL_cpu_policy_raw 0 -#define XEN_SYSCTL_cpu_policy_host 1 -#define XEN_SYSCTL_cpu_policy_pv_max 2 -#define XEN_SYSCTL_cpu_policy_hvm_max 3 -#define XEN_SYSCTL_cpu_policy_pv_default 4 -#define XEN_SYSCTL_cpu_policy_hvm_default 5 - uint32_t index; /* IN: Which policy to query? */ - uint32_t nr_leaves; /* IN/OUT: Number of leaves in/written to - * 'cpuid_policy', or the maximum number of leaves - * if the guest handle is NULL. */ - uint32_t nr_msrs; /* IN/OUT: Number of MSRs in/written to - * 'msr_policy', or the maximum number of MSRs if - * the guest handle is NULL. */ - uint32_t _rsvd; /* Must be zero. */ +#define XEN_SYSCTL_cpu_policy_raw 0 +#define XEN_SYSCTL_cpu_policy_host 1 +#define XEN_SYSCTL_cpu_policy_pv_max 2 +#define XEN_SYSCTL_cpu_policy_hvm_max 3 +#define XEN_SYSCTL_cpu_policy_pv_default 4 +#define XEN_SYSCTL_cpu_policy_hvm_default 5 + uint32_t index; /* IN: Which policy to query? */ + uint32_t nr_leaves; /* IN/OUT: Number of leaves in/written to + * 'cpuid_policy', or the maximum number of leaves + * if the guest handle is NULL. */ + uint32_t nr_msrs; /* IN/OUT: Number of MSRs in/written to + * 'msr_policy', or the maximum number of MSRs if + * the guest handle is NULL. */ + uint32_t _rsvd; /* Must be zero. */ XEN_GUEST_HANDLE_64(xen_cpuid_leaf_t) cpuid_policy; /* OUT */ - XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_policy; /* OUT */ + XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_policy; /* OUT */ }; typedef struct xen_sysctl_cpu_policy xen_sysctl_cpu_policy_t; DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_policy_t); @@ -1035,66 +1039,66 @@ DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_policy_t); struct xen_sysctl { uint32_t cmd; -#define XEN_SYSCTL_readconsole 1 -#define XEN_SYSCTL_tbuf_op 2 -#define XEN_SYSCTL_physinfo 3 -#define XEN_SYSCTL_sched_id 4 -#define XEN_SYSCTL_perfc_op 5 -#define XEN_SYSCTL_getdomaininfolist 6 -#define XEN_SYSCTL_debug_keys 7 -#define XEN_SYSCTL_getcpuinfo 8 -#define XEN_SYSCTL_availheap 9 -#define XEN_SYSCTL_get_pmstat 10 -#define XEN_SYSCTL_cpu_hotplug 11 -#define XEN_SYSCTL_pm_op 12 -#define XEN_SYSCTL_page_offline_op 14 -#define XEN_SYSCTL_lockprof_op 15 -#define XEN_SYSCTL_cputopoinfo 16 -#define XEN_SYSCTL_numainfo 17 -#define XEN_SYSCTL_cpupool_op 18 -#define XEN_SYSCTL_scheduler_op 19 -#define XEN_SYSCTL_coverage_op 20 -#define XEN_SYSCTL_psr_cmt_op 21 -#define XEN_SYSCTL_pcitopoinfo 22 -#define XEN_SYSCTL_psr_alloc 23 +#define XEN_SYSCTL_readconsole 1 +#define XEN_SYSCTL_tbuf_op 2 +#define XEN_SYSCTL_physinfo 3 +#define XEN_SYSCTL_sched_id 4 +#define XEN_SYSCTL_perfc_op 5 +#define XEN_SYSCTL_getdomaininfolist 6 +#define XEN_SYSCTL_debug_keys 7 +#define XEN_SYSCTL_getcpuinfo 8 +#define XEN_SYSCTL_availheap 9 +#define XEN_SYSCTL_get_pmstat 10 +#define XEN_SYSCTL_cpu_hotplug 11 +#define XEN_SYSCTL_pm_op 12 +#define XEN_SYSCTL_page_offline_op 14 +#define XEN_SYSCTL_lockprof_op 15 +#define XEN_SYSCTL_cputopoinfo 16 +#define XEN_SYSCTL_numainfo 17 +#define XEN_SYSCTL_cpupool_op 18 +#define XEN_SYSCTL_scheduler_op 19 +#define XEN_SYSCTL_coverage_op 20 +#define XEN_SYSCTL_psr_cmt_op 21 +#define XEN_SYSCTL_pcitopoinfo 22 +#define XEN_SYSCTL_psr_alloc 23 /* #define XEN_SYSCTL_tmem_op 24 */ -#define XEN_SYSCTL_get_cpu_levelling_caps 25 -#define XEN_SYSCTL_get_cpu_featureset 26 -#define XEN_SYSCTL_livepatch_op 27 -#define XEN_SYSCTL_set_parameter 28 -#define XEN_SYSCTL_get_cpu_policy 29 +#define XEN_SYSCTL_get_cpu_levelling_caps 25 +#define XEN_SYSCTL_get_cpu_featureset 26 +#define XEN_SYSCTL_livepatch_op 27 +#define XEN_SYSCTL_set_parameter 28 +#define XEN_SYSCTL_get_cpu_policy 29 uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */ union { - struct xen_sysctl_readconsole readconsole; - struct xen_sysctl_tbuf_op tbuf_op; - struct xen_sysctl_physinfo physinfo; - struct xen_sysctl_cputopoinfo cputopoinfo; - struct xen_sysctl_pcitopoinfo pcitopoinfo; - struct xen_sysctl_numainfo numainfo; - struct xen_sysctl_sched_id sched_id; - struct xen_sysctl_perfc_op perfc_op; + struct xen_sysctl_readconsole readconsole; + struct xen_sysctl_tbuf_op tbuf_op; + struct xen_sysctl_physinfo physinfo; + struct xen_sysctl_cputopoinfo cputopoinfo; + struct xen_sysctl_pcitopoinfo pcitopoinfo; + struct xen_sysctl_numainfo numainfo; + struct xen_sysctl_sched_id sched_id; + struct xen_sysctl_perfc_op perfc_op; struct xen_sysctl_getdomaininfolist getdomaininfolist; - struct xen_sysctl_debug_keys debug_keys; - struct xen_sysctl_getcpuinfo getcpuinfo; - struct xen_sysctl_availheap availheap; - struct xen_sysctl_get_pmstat get_pmstat; - struct xen_sysctl_cpu_hotplug cpu_hotplug; - struct xen_sysctl_pm_op pm_op; - struct xen_sysctl_page_offline_op page_offline; - struct xen_sysctl_lockprof_op lockprof_op; - struct xen_sysctl_cpupool_op cpupool_op; - struct xen_sysctl_scheduler_op scheduler_op; - struct xen_sysctl_coverage_op coverage_op; - struct xen_sysctl_psr_cmt_op psr_cmt_op; - struct xen_sysctl_psr_alloc psr_alloc; + struct xen_sysctl_debug_keys debug_keys; + struct xen_sysctl_getcpuinfo getcpuinfo; + struct xen_sysctl_availheap availheap; + struct xen_sysctl_get_pmstat get_pmstat; + struct xen_sysctl_cpu_hotplug cpu_hotplug; + struct xen_sysctl_pm_op pm_op; + struct xen_sysctl_page_offline_op page_offline; + struct xen_sysctl_lockprof_op lockprof_op; + struct xen_sysctl_cpupool_op cpupool_op; + struct xen_sysctl_scheduler_op scheduler_op; + struct xen_sysctl_coverage_op coverage_op; + struct xen_sysctl_psr_cmt_op psr_cmt_op; + struct xen_sysctl_psr_alloc psr_alloc; struct xen_sysctl_cpu_levelling_caps cpu_levelling_caps; - struct xen_sysctl_cpu_featureset cpu_featureset; - struct xen_sysctl_livepatch_op livepatch; - struct xen_sysctl_set_parameter set_parameter; + struct xen_sysctl_cpu_featureset cpu_featureset; + struct xen_sysctl_livepatch_op livepatch; + struct xen_sysctl_set_parameter set_parameter; #if defined(__i386__) || defined(__x86_64__) - struct xen_sysctl_cpu_policy cpu_policy; + struct xen_sysctl_cpu_policy cpu_policy; #endif - uint8_t pad[128]; + uint8_t pad[128]; } u; }; typedef struct xen_sysctl xen_sysctl_t; diff --git a/include/xen/tmem.h b/include/xen/tmem.h index 362ba45d5..95f1d444e 100644 --- a/include/xen/tmem.h +++ b/include/xen/tmem.h @@ -32,42 +32,42 @@ #if __XEN_INTERFACE_VERSION__ < 0x00041300 /* version of ABI */ -#define TMEM_SPEC_VERSION 1 +#define TMEM_SPEC_VERSION 1 -#define TMEM_NEW_POOL 1 -#define TMEM_DESTROY_POOL 2 -#define TMEM_PUT_PAGE 4 -#define TMEM_GET_PAGE 5 -#define TMEM_FLUSH_PAGE 6 -#define TMEM_FLUSH_OBJECT 7 +#define TMEM_NEW_POOL 1 +#define TMEM_DESTROY_POOL 2 +#define TMEM_PUT_PAGE 4 +#define TMEM_GET_PAGE 5 +#define TMEM_FLUSH_PAGE 6 +#define TMEM_FLUSH_OBJECT 7 #if __XEN_INTERFACE_VERSION__ < 0x00040400 -#define TMEM_NEW_PAGE 3 -#define TMEM_READ 8 -#define TMEM_WRITE 9 -#define TMEM_XCHG 10 +#define TMEM_NEW_PAGE 3 +#define TMEM_READ 8 +#define TMEM_WRITE 9 +#define TMEM_XCHG 10 #endif /* Privileged commands now called via XEN_SYSCTL_tmem_op. */ -#define TMEM_AUTH 101 /* as XEN_SYSCTL_TMEM_OP_SET_AUTH. */ -#define TMEM_RESTORE_NEW 102 /* as XEN_SYSCTL_TMEM_OP_SET_POOL. */ +#define TMEM_AUTH 101 /* as XEN_SYSCTL_TMEM_OP_SET_AUTH. */ +#define TMEM_RESTORE_NEW 102 /* as XEN_SYSCTL_TMEM_OP_SET_POOL. */ /* Bits for HYPERVISOR_tmem_op(TMEM_NEW_POOL) */ -#define TMEM_POOL_PERSIST 1 -#define TMEM_POOL_SHARED 2 -#define TMEM_POOL_PRECOMPRESSED 4 -#define TMEM_POOL_PAGESIZE_SHIFT 4 +#define TMEM_POOL_PERSIST 1 +#define TMEM_POOL_SHARED 2 +#define TMEM_POOL_PRECOMPRESSED 4 +#define TMEM_POOL_PAGESIZE_SHIFT 4 #define TMEM_POOL_PAGESIZE_MASK 0xf -#define TMEM_POOL_VERSION_SHIFT 24 -#define TMEM_POOL_VERSION_MASK 0xff +#define TMEM_POOL_VERSION_SHIFT 24 +#define TMEM_POOL_VERSION_MASK 0xff #define TMEM_POOL_RESERVED_BITS 0x00ffff00 /* Bits for client flags (save/restore) */ -#define TMEM_CLIENT_COMPRESS 1 -#define TMEM_CLIENT_FROZEN 2 +#define TMEM_CLIENT_COMPRESS 1 +#define TMEM_CLIENT_FROZEN 2 /* Special errno values */ -#define EFROZEN 1000 -#define EEMPTY 1001 +#define EFROZEN 1000 +#define EEMPTY 1001 struct xen_tmem_oid { uint64_t oid[3]; @@ -107,7 +107,7 @@ typedef struct tmem_op tmem_op_t; DEFINE_XEN_GUEST_HANDLE(tmem_op_t); #endif -#endif /* __XEN_INTERFACE_VERSION__ < 0x00041300 */ +#endif /* __XEN_INTERFACE_VERSION__ < 0x00041300 */ #endif /* __XEN_PUBLIC_TMEM_H__ */ diff --git a/include/xen/trace.h b/include/xen/trace.h index d5fa4aea8..7d01c392f 100644 --- a/include/xen/trace.h +++ b/include/xen/trace.h @@ -26,37 +26,37 @@ #ifndef __XEN_PUBLIC_TRACE_H__ #define __XEN_PUBLIC_TRACE_H__ -#define TRACE_EXTRA_MAX 7 +#define TRACE_EXTRA_MAX 7 #define TRACE_EXTRA_SHIFT 28 /* Trace classes */ -#define TRC_CLS_SHIFT 16 -#define TRC_GEN 0x0001f000 /* General trace */ -#define TRC_SCHED 0x0002f000 /* Xen Scheduler trace */ -#define TRC_DOM0OP 0x0004f000 /* Xen DOM0 operation trace */ -#define TRC_HVM 0x0008f000 /* Xen HVM trace */ -#define TRC_MEM 0x0010f000 /* Xen memory trace */ -#define TRC_PV 0x0020f000 /* Xen PV traces */ -#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */ -#define TRC_HW 0x0080f000 /* Xen hardware-related traces */ -#define TRC_GUEST 0x0800f000 /* Guest-generated traces */ -#define TRC_ALL 0x0ffff000 -#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff) -#define TRC_HD_CYCLE_FLAG (1UL<<31) -#define TRC_HD_INCLUDES_CYCLE_COUNT(x) ( !!( (x) & TRC_HD_CYCLE_FLAG ) ) -#define TRC_HD_EXTRA(x) (((x)>>TRACE_EXTRA_SHIFT)&TRACE_EXTRA_MAX) +#define TRC_CLS_SHIFT 16 +#define TRC_GEN 0x0001f000 /* General trace */ +#define TRC_SCHED 0x0002f000 /* Xen Scheduler trace */ +#define TRC_DOM0OP 0x0004f000 /* Xen DOM0 operation trace */ +#define TRC_HVM 0x0008f000 /* Xen HVM trace */ +#define TRC_MEM 0x0010f000 /* Xen memory trace */ +#define TRC_PV 0x0020f000 /* Xen PV traces */ +#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */ +#define TRC_HW 0x0080f000 /* Xen hardware-related traces */ +#define TRC_GUEST 0x0800f000 /* Guest-generated traces */ +#define TRC_ALL 0x0ffff000 +#define TRC_HD_TO_EVENT(x) ((x) & 0x0fffffff) +#define TRC_HD_CYCLE_FLAG (1UL << 31) +#define TRC_HD_INCLUDES_CYCLE_COUNT(x) (!!((x) & TRC_HD_CYCLE_FLAG)) +#define TRC_HD_EXTRA(x) (((x) >> TRACE_EXTRA_SHIFT) & TRACE_EXTRA_MAX) /* Trace subclasses */ #define TRC_SUBCLS_SHIFT 12 /* trace subclasses for SVM */ -#define TRC_HVM_ENTRYEXIT 0x00081000 /* VMENTRY and #VMEXIT */ -#define TRC_HVM_HANDLER 0x00082000 /* various HVM handlers */ -#define TRC_HVM_EMUL 0x00084000 /* emulated devices */ +#define TRC_HVM_ENTRYEXIT 0x00081000 /* VMENTRY and #VMEXIT */ +#define TRC_HVM_HANDLER 0x00082000 /* various HVM handlers */ +#define TRC_HVM_EMUL 0x00084000 /* emulated devices */ -#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */ -#define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */ -#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */ +#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */ +#define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */ +#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */ /* * The highest 3 bits of the last 12 bits of TRC_SCHED_CLASS above are @@ -67,80 +67,81 @@ * schedulers generating events) and, in each scheduler, up to 512 * different events. */ -#define TRC_SCHED_ID_BITS 3 +#define TRC_SCHED_ID_BITS 3 #define TRC_SCHED_ID_SHIFT (TRC_SUBCLS_SHIFT - TRC_SCHED_ID_BITS) -#define TRC_SCHED_ID_MASK (((1UL<cpu_offset[cpu]). + * Offset is an offset into the mapped structure where the mfn list will be + * held. MFNs will be at ((unsigned long *)(t_info))+(t_info->cpu_offset[cpu]). */ struct t_info { uint16_t tbuf_size; /* Size in pages of each trace buffer */ - uint16_t mfn_offset[]; /* Offset within t_info structure of the page list per cpu */ + uint16_t mfn_offset[]; /* Offset within t_info structure of the page list + per cpu */ /* MFN lists immediately after the header */ }; diff --git a/include/xen/vcpu.h b/include/xen/vcpu.h index 3623af932..69c9855ad 100644 --- a/include/xen/vcpu.h +++ b/include/xen/vcpu.h @@ -46,13 +46,13 @@ * HVM based guests this is a pointer to a vcpu_hvm_context * structure. */ -#define VCPUOP_initialise 0 +#define VCPUOP_initialise 0 /* * Bring up a VCPU. This makes the VCPU runnable. This operation will fail * if the VCPU has not been initialised (VCPUOP_initialise). */ -#define VCPUOP_up 1 +#define VCPUOP_up 1 /* * Bring down a VCPU (i.e., make it non-runnable). @@ -68,19 +68,19 @@ * practise to move a VCPU onto an 'idle' or default page table, LDT and * GDT before bringing it down. */ -#define VCPUOP_down 2 +#define VCPUOP_down 2 /* Returns 1 if the given VCPU is up. */ -#define VCPUOP_is_up 3 +#define VCPUOP_is_up 3 /* * Return information about the state and running time of a VCPU. * @extra_arg == pointer to vcpu_runstate_info structure. */ -#define VCPUOP_get_runstate_info 4 +#define VCPUOP_get_runstate_info 4 struct vcpu_runstate_info { /* VCPU's current state (RUNSTATE_*). */ - int state; + int state; /* When was current state entered (system time, ns)? */ uint64_t state_entry_time; /* @@ -88,7 +88,7 @@ struct vcpu_runstate_info { * When activated via VMASST_TYPE_runstate_update_flag, set during * updates in guest memory mapped copy of vcpu_runstate_info. */ -#define XEN_RUNSTATE_UPDATE (xen_mk_ullong(1) << 63) +#define XEN_RUNSTATE_UPDATE (xen_mk_ullong(1) << 63) /* * Time spent in each RUNSTATE_* (ns). The sum of these times is * guaranteed not to drift from system time. @@ -99,13 +99,13 @@ typedef struct vcpu_runstate_info vcpu_runstate_info_t; DEFINE_XEN_GUEST_HANDLE(vcpu_runstate_info_t); /* VCPU is currently running on a physical CPU. */ -#define RUNSTATE_running 0 +#define RUNSTATE_running 0 /* VCPU is runnable, but not currently scheduled on any physical CPU. */ #define RUNSTATE_runnable 1 /* VCPU is blocked (a.k.a. idle). It is therefore not runnable. */ -#define RUNSTATE_blocked 2 +#define RUNSTATE_blocked 2 /* * VCPU is not runnable, but it is not blocked. @@ -113,7 +113,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_runstate_info_t); * system administrator (or for critical sections in the hypervisor). * RUNSTATE_blocked dominates this state (it is the preferred state). */ -#define RUNSTATE_offline 3 +#define RUNSTATE_offline 3 /* * Register a shared memory area from which the guest may obtain its own @@ -137,7 +137,8 @@ struct vcpu_register_runstate_memory_area { uint64_t p; } addr; }; -typedef struct vcpu_register_runstate_memory_area vcpu_register_runstate_memory_area_t; +typedef struct vcpu_register_runstate_memory_area + vcpu_register_runstate_memory_area_t; DEFINE_XEN_GUEST_HANDLE(vcpu_register_runstate_memory_area_t); /* @@ -145,8 +146,8 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_register_runstate_memory_area_t); * which can be set via these commands. Periods smaller than one millisecond * may not be supported. */ -#define VCPUOP_set_periodic_timer 6 /* arg == vcpu_set_periodic_timer_t */ -#define VCPUOP_stop_periodic_timer 7 /* arg == NULL */ +#define VCPUOP_set_periodic_timer 6 /* arg == vcpu_set_periodic_timer_t */ +#define VCPUOP_stop_periodic_timer 7 /* arg == NULL */ struct vcpu_set_periodic_timer { uint64_t period_ns; }; @@ -160,14 +161,14 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_set_periodic_timer_t); #define VCPUOP_set_singleshot_timer 8 /* arg == vcpu_set_singleshot_timer_t */ #define VCPUOP_stop_singleshot_timer 9 /* arg == NULL */ struct vcpu_set_singleshot_timer { - uint64_t timeout_abs_ns; /* Absolute system time value in nanoseconds. */ - uint32_t flags; /* VCPU_SSHOTTMR_??? */ + uint64_t timeout_abs_ns; /* Absolute system time value in nanoseconds. */ + uint32_t flags; /* VCPU_SSHOTTMR_??? */ }; typedef struct vcpu_set_singleshot_timer vcpu_set_singleshot_timer_t; DEFINE_XEN_GUEST_HANDLE(vcpu_set_singleshot_timer_t); /* Flags to VCPUOP_set_singleshot_timer. */ - /* Require the timeout to be in the future (return -ETIME if it's passed). */ +/* Require the timeout to be in the future (return -ETIME if it's passed). */ #define _VCPU_SSHOTTMR_future (0) #define VCPU_SSHOTTMR_future (1U << _VCPU_SSHOTTMR_future) @@ -180,17 +181,17 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_set_singleshot_timer_t); * * This may be called only once per vcpu. */ -#define VCPUOP_register_vcpu_info 10 /* arg == vcpu_register_vcpu_info_t */ +#define VCPUOP_register_vcpu_info 10 /* arg == vcpu_register_vcpu_info_t */ struct vcpu_register_vcpu_info { - uint64_t mfn; /* mfn of page to place vcpu_info */ + uint64_t mfn; /* mfn of page to place vcpu_info */ uint32_t offset; /* offset within page */ - uint32_t rsvd; /* unused */ + uint32_t rsvd; /* unused */ }; typedef struct vcpu_register_vcpu_info vcpu_register_vcpu_info_t; DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t); /* Send an NMI to the specified VCPU. @extra_arg == NULL. */ -#define VCPUOP_send_nmi 11 +#define VCPUOP_send_nmi 11 /* * Get the physical ID information for a pinned vcpu's underlying physical @@ -198,7 +199,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t); * On x86: id[31:0]=apic_id, id[63:32]=acpi_id. * This command returns -EINVAL if it is not a valid operation for this VCPU. */ -#define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */ +#define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */ struct vcpu_get_physid { uint64_t phys_id; }; @@ -223,7 +224,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t); * * @extra_arg == pointer to vcpu_register_time_info_memory_area structure. */ -#define VCPUOP_register_vcpu_time_memory_area 13 +#define VCPUOP_register_vcpu_time_memory_area 13 DEFINE_XEN_GUEST_HANDLE(vcpu_time_info_t); struct vcpu_register_time_memory_area { union { diff --git a/include/xen/version.h b/include/xen/version.h index 17a81e23c..adf3db1af 100644 --- a/include/xen/version.h +++ b/include/xen/version.h @@ -34,7 +34,7 @@ * XENVER_{version,pagesize,build_id} */ /* arg == NULL; returns major:minor (16:16). */ -#define XENVER_version 0 +#define XENVER_version 0 /* arg == xen_extraversion_t. */ #define XENVER_extraversion 1 @@ -67,8 +67,8 @@ typedef struct xen_platform_parameters xen_platform_parameters_t; #define XENVER_get_features 6 struct xen_feature_info { - unsigned int submap_idx; /* IN: which 32-bit submap to return */ - uint32_t submap; /* OUT: 32-bit submap */ + unsigned int submap_idx; /* IN: which 32-bit submap to return */ + uint32_t submap; /* OUT: 32-bit submap */ }; typedef struct xen_feature_info xen_feature_info_t; @@ -94,9 +94,9 @@ typedef char xen_commandline_t[1024]; */ #define XENVER_build_id 10 struct xen_build_id { - uint32_t len; /* IN: size of buf[]. */ - unsigned char buf[XEN_FLEX_ARRAY_DIM]; - /* OUT: Variable length buffer with build_id. */ + uint32_t len; /* IN: size of buf[]. */ + unsigned char buf[XEN_FLEX_ARRAY_DIM]; + /* OUT: Variable length buffer with build_id. */ }; typedef struct xen_build_id xen_build_id_t; diff --git a/include/xen/vm_event.h b/include/xen/vm_event.h index 959083d8c..570b249e5 100644 --- a/include/xen/vm_event.h +++ b/include/xen/vm_event.h @@ -44,9 +44,9 @@ * paused * VCPU_PAUSED in a response signals to unpause the vCPU */ -#define VM_EVENT_FLAG_VCPU_PAUSED (1 << 0) +#define VM_EVENT_FLAG_VCPU_PAUSED (1 << 0) /* Flags to aid debugging vm_event */ -#define VM_EVENT_FLAG_FOREIGN (1 << 1) +#define VM_EVENT_FLAG_FOREIGN (1 << 1) /* * The following flags can be set in response to a mem_access event. * @@ -54,17 +54,17 @@ * This will allow the guest to continue execution without lifting the page * access restrictions. */ -#define VM_EVENT_FLAG_EMULATE (1 << 2) +#define VM_EVENT_FLAG_EMULATE (1 << 2) /* * Same as VM_EVENT_FLAG_EMULATE, but with write operations or operations * potentially having side effects (like memory mapped or port I/O) disabled. */ -#define VM_EVENT_FLAG_EMULATE_NOWRITE (1 << 3) +#define VM_EVENT_FLAG_EMULATE_NOWRITE (1 << 3) /* * Toggle singlestepping on vm_event response. * Requires the vCPU to be paused already (synchronous events only). */ -#define VM_EVENT_FLAG_TOGGLE_SINGLESTEP (1 << 4) +#define VM_EVENT_FLAG_TOGGLE_SINGLESTEP (1 << 4) /* * Data is being sent back to the hypervisor in the event response, to be * returned by the read function when emulating an instruction. @@ -79,7 +79,7 @@ * Currently only useful for MSR and control-register write events. * Requires the vCPU to be paused already (synchronous events only). */ -#define VM_EVENT_FLAG_DENY (1 << 6) +#define VM_EVENT_FLAG_DENY (1 << 6) /* * This flag can be set in a request or a response * @@ -89,14 +89,14 @@ * On a response, indicates that the VCPU should resume in the alternate p2m * specified by the altp2m_idx response field if possible. */ -#define VM_EVENT_FLAG_ALTERNATE_P2M (1 << 7) +#define VM_EVENT_FLAG_ALTERNATE_P2M (1 << 7) /* * Set the vCPU registers to the values in the vm_event response. * At the moment x86-only, applies to EAX-EDX, ESP, EBP, ESI, EDI, R8-R15, * EFLAGS, and EIP. * Requires the vCPU to be paused already (synchronous events only). */ -#define VM_EVENT_FLAG_SET_REGISTERS (1 << 8) +#define VM_EVENT_FLAG_SET_REGISTERS (1 << 8) /* * Instruction cache is being sent back to the hypervisor in the event response * to be used by the emulator. This flag is only useful when combined with @@ -116,51 +116,51 @@ */ /* Default case */ -#define VM_EVENT_REASON_UNKNOWN 0 +#define VM_EVENT_REASON_UNKNOWN 0 /* Memory access violation */ -#define VM_EVENT_REASON_MEM_ACCESS 1 +#define VM_EVENT_REASON_MEM_ACCESS 1 /* Memory sharing event */ -#define VM_EVENT_REASON_MEM_SHARING 2 +#define VM_EVENT_REASON_MEM_SHARING 2 /* Memory paging event */ -#define VM_EVENT_REASON_MEM_PAGING 3 +#define VM_EVENT_REASON_MEM_PAGING 3 /* A control register was updated */ -#define VM_EVENT_REASON_WRITE_CTRLREG 4 +#define VM_EVENT_REASON_WRITE_CTRLREG 4 /* An MSR was updated. */ -#define VM_EVENT_REASON_MOV_TO_MSR 5 +#define VM_EVENT_REASON_MOV_TO_MSR 5 /* Debug operation executed (e.g. int3) */ -#define VM_EVENT_REASON_SOFTWARE_BREAKPOINT 6 +#define VM_EVENT_REASON_SOFTWARE_BREAKPOINT 6 /* Single-step (e.g. MTF) */ -#define VM_EVENT_REASON_SINGLESTEP 7 +#define VM_EVENT_REASON_SINGLESTEP 7 /* An event has been requested via HVMOP_guest_request_vm_event. */ -#define VM_EVENT_REASON_GUEST_REQUEST 8 +#define VM_EVENT_REASON_GUEST_REQUEST 8 /* A debug exception was caught */ -#define VM_EVENT_REASON_DEBUG_EXCEPTION 9 +#define VM_EVENT_REASON_DEBUG_EXCEPTION 9 /* CPUID executed */ -#define VM_EVENT_REASON_CPUID 10 +#define VM_EVENT_REASON_CPUID 10 /* * Privileged call executed (e.g. SMC). * Note: event may be generated even if SMC condition check fails on some CPUs. * As this behavior is CPU-specific, users are advised to not rely on it. * These kinds of events will be filtered out in future versions. */ -#define VM_EVENT_REASON_PRIVILEGED_CALL 11 +#define VM_EVENT_REASON_PRIVILEGED_CALL 11 /* An interrupt has been delivered. */ -#define VM_EVENT_REASON_INTERRUPT 12 +#define VM_EVENT_REASON_INTERRUPT 12 /* A descriptor table register was accessed. */ -#define VM_EVENT_REASON_DESCRIPTOR_ACCESS 13 +#define VM_EVENT_REASON_DESCRIPTOR_ACCESS 13 /* Current instruction is not implemented by the emulator */ -#define VM_EVENT_REASON_EMUL_UNIMPLEMENTED 14 +#define VM_EVENT_REASON_EMUL_UNIMPLEMENTED 14 /* Supported values for the vm_event_write_ctrlreg index. */ -#define VM_EVENT_X86_CR0 0 -#define VM_EVENT_X86_CR3 1 -#define VM_EVENT_X86_CR4 2 -#define VM_EVENT_X86_XCR0 3 +#define VM_EVENT_X86_CR0 0 +#define VM_EVENT_X86_CR3 1 +#define VM_EVENT_X86_CR4 2 +#define VM_EVENT_X86_XCR0 3 /* The limit field is right-shifted by 12 bits if .ar.g is set. */ struct vm_event_x86_selector_reg { - uint32_t limit : 20; - uint32_t ar : 12; + uint32_t limit : 20; + uint32_t ar : 12; }; /* @@ -246,21 +246,21 @@ struct vm_event_regs_arm { * FAULT_WITH_GLA: If the violation was triggered by accessing gla * FAULT_IN_GPT: If the violation was triggered during translating gla */ -#define MEM_ACCESS_R (1 << 0) -#define MEM_ACCESS_W (1 << 1) -#define MEM_ACCESS_X (1 << 2) -#define MEM_ACCESS_RWX (MEM_ACCESS_R | MEM_ACCESS_W | MEM_ACCESS_X) -#define MEM_ACCESS_RW (MEM_ACCESS_R | MEM_ACCESS_W) -#define MEM_ACCESS_RX (MEM_ACCESS_R | MEM_ACCESS_X) -#define MEM_ACCESS_WX (MEM_ACCESS_W | MEM_ACCESS_X) -#define MEM_ACCESS_GLA_VALID (1 << 3) -#define MEM_ACCESS_FAULT_WITH_GLA (1 << 4) -#define MEM_ACCESS_FAULT_IN_GPT (1 << 5) +#define MEM_ACCESS_R (1 << 0) +#define MEM_ACCESS_W (1 << 1) +#define MEM_ACCESS_X (1 << 2) +#define MEM_ACCESS_RWX (MEM_ACCESS_R | MEM_ACCESS_W | MEM_ACCESS_X) +#define MEM_ACCESS_RW (MEM_ACCESS_R | MEM_ACCESS_W) +#define MEM_ACCESS_RX (MEM_ACCESS_R | MEM_ACCESS_X) +#define MEM_ACCESS_WX (MEM_ACCESS_W | MEM_ACCESS_X) +#define MEM_ACCESS_GLA_VALID (1 << 3) +#define MEM_ACCESS_FAULT_WITH_GLA (1 << 4) +#define MEM_ACCESS_FAULT_IN_GPT (1 << 5) struct vm_event_mem_access { uint64_t gfn; uint64_t offset; - uint64_t gla; /* if flags has MEM_ACCESS_GLA_VALID set */ + uint64_t gla; /* if flags has MEM_ACCESS_GLA_VALID set */ uint32_t flags; /* MEM_ACCESS_* */ uint32_t _pad; }; @@ -279,7 +279,7 @@ struct vm_event_singlestep { struct vm_event_debug { uint64_t gfn; uint32_t insn_length; - uint8_t type; /* HVMOP_TRAP_* */ + uint8_t type; /* HVMOP_TRAP_* */ uint8_t _pad[3]; }; @@ -289,24 +289,24 @@ struct vm_event_mov_to_msr { uint64_t old_value; }; -#define VM_EVENT_DESC_IDTR 1 -#define VM_EVENT_DESC_GDTR 2 -#define VM_EVENT_DESC_LDTR 3 -#define VM_EVENT_DESC_TR 4 +#define VM_EVENT_DESC_IDTR 1 +#define VM_EVENT_DESC_GDTR 2 +#define VM_EVENT_DESC_LDTR 3 +#define VM_EVENT_DESC_TR 4 struct vm_event_desc_access { union { struct { - uint32_t instr_info; /* VMX: VMCS Instruction-Information */ + uint32_t instr_info; /* VMX: VMCS Instruction-Information */ uint32_t _pad1; uint64_t exit_qualification; /* VMX: VMCS Exit Qualification */ } vmx; struct { - uint64_t exitinfo; /* SVM: VMCB EXITINFO */ + uint64_t exitinfo; /* SVM: VMCB EXITINFO */ uint64_t _pad2; } svm; } arch; - uint8_t descriptor; /* VM_EVENT_DESC_* */ + uint8_t descriptor; /* VM_EVENT_DESC_* */ uint8_t is_write; uint8_t _pad[6]; }; @@ -326,8 +326,8 @@ struct vm_event_interrupt_x86 { uint64_t cr2; }; -#define MEM_PAGING_DROP_PAGE (1 << 0) -#define MEM_PAGING_EVICT_FAIL (1 << 1) +#define MEM_PAGING_DROP_PAGE (1 << 0) +#define MEM_PAGING_EVICT_FAIL (1 << 1) struct vm_event_paging { uint64_t gfn; @@ -344,7 +344,7 @@ struct vm_event_sharing { struct vm_event_emul_read_data { uint32_t size; /* The struct is used in a union with vm_event_regs_x86. */ - uint8_t data[sizeof(struct vm_event_regs_x86) - sizeof(uint32_t)]; + uint8_t data[sizeof(struct vm_event_regs_x86) - sizeof(uint32_t)]; }; struct vm_event_emul_insn_data { @@ -352,26 +352,26 @@ struct vm_event_emul_insn_data { }; typedef struct vm_event_st { - uint32_t version; /* VM_EVENT_INTERFACE_VERSION */ - uint32_t flags; /* VM_EVENT_FLAG_* */ - uint32_t reason; /* VM_EVENT_REASON_* */ + uint32_t version; /* VM_EVENT_INTERFACE_VERSION */ + uint32_t flags; /* VM_EVENT_FLAG_* */ + uint32_t reason; /* VM_EVENT_REASON_* */ uint32_t vcpu_id; uint16_t altp2m_idx; /* may be used during request and response */ uint16_t _pad[3]; union { - struct vm_event_paging mem_paging; - struct vm_event_sharing mem_sharing; - struct vm_event_mem_access mem_access; - struct vm_event_write_ctrlreg write_ctrlreg; - struct vm_event_mov_to_msr mov_to_msr; - struct vm_event_desc_access desc_access; - struct vm_event_singlestep singlestep; - struct vm_event_debug software_breakpoint; - struct vm_event_debug debug_exception; - struct vm_event_cpuid cpuid; + struct vm_event_paging mem_paging; + struct vm_event_sharing mem_sharing; + struct vm_event_mem_access mem_access; + struct vm_event_write_ctrlreg write_ctrlreg; + struct vm_event_mov_to_msr mov_to_msr; + struct vm_event_desc_access desc_access; + struct vm_event_singlestep singlestep; + struct vm_event_debug software_breakpoint; + struct vm_event_debug debug_exception; + struct vm_event_cpuid cpuid; union { - struct vm_event_interrupt_x86 x86; + struct vm_event_interrupt_x86 x86; } interrupt; } u; diff --git a/include/xen/xen.h b/include/xen/xen.h index d2198dffa..c11d9189d 100644 --- a/include/xen/xen.h +++ b/include/xen/xen.h @@ -31,7 +31,7 @@ #if defined(__i386__) || defined(__x86_64__) #include "arch-x86/xen.h" -#elif defined(__arm__) || defined (__aarch64__) +#elif defined(__arm__) || defined(__aarch64__) #include "arch-arm.h" #else #error "Unsupported architecture" @@ -42,7 +42,7 @@ DEFINE_XEN_GUEST_HANDLE(char); __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); DEFINE_XEN_GUEST_HANDLE(int); -__DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); +__DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); #if __XEN_INTERFACE_VERSION__ < 0x00040300 DEFINE_XEN_GUEST_HANDLE(long); __DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); @@ -57,20 +57,20 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define XEN_FLEX_ARRAY_DIM #elif defined(__GNUC__) -#define XEN_FLEX_ARRAY_DIM 0 +#define XEN_FLEX_ARRAY_DIM 0 #else -#define XEN_FLEX_ARRAY_DIM 1 /* variable size */ +#define XEN_FLEX_ARRAY_DIM 1 /* variable size */ #endif /* Turn a plain number into a C unsigned (long (long)) constant. */ -#define __xen_mk_uint(x) x ## U -#define __xen_mk_ulong(x) x ## UL +#define __xen_mk_uint(x) x##U +#define __xen_mk_ulong(x) x##UL #ifndef __xen_mk_ullong -# define __xen_mk_ullong(x) x ## ULL +#define __xen_mk_ullong(x) x##ULL #endif -#define xen_mk_uint(x) __xen_mk_uint(x) -#define xen_mk_ulong(x) __xen_mk_ulong(x) -#define xen_mk_ullong(x) __xen_mk_ullong(x) +#define xen_mk_uint(x) __xen_mk_uint(x) +#define xen_mk_ulong(x) __xen_mk_ulong(x) +#define xen_mk_ullong(x) __xen_mk_ullong(x) #else @@ -89,57 +89,57 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); * ` enum hypercall_num { // __HYPERVISOR_* => HYPERVISOR_*() */ -#define __HYPERVISOR_set_trap_table 0 -#define __HYPERVISOR_mmu_update 1 -#define __HYPERVISOR_set_gdt 2 -#define __HYPERVISOR_stack_switch 3 -#define __HYPERVISOR_set_callbacks 4 -#define __HYPERVISOR_fpu_taskswitch 5 -#define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */ -#define __HYPERVISOR_platform_op 7 -#define __HYPERVISOR_set_debugreg 8 -#define __HYPERVISOR_get_debugreg 9 -#define __HYPERVISOR_update_descriptor 10 -#define __HYPERVISOR_memory_op 12 -#define __HYPERVISOR_multicall 13 -#define __HYPERVISOR_update_va_mapping 14 -#define __HYPERVISOR_set_timer_op 15 +#define __HYPERVISOR_set_trap_table 0 +#define __HYPERVISOR_mmu_update 1 +#define __HYPERVISOR_set_gdt 2 +#define __HYPERVISOR_stack_switch 3 +#define __HYPERVISOR_set_callbacks 4 +#define __HYPERVISOR_fpu_taskswitch 5 +#define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */ +#define __HYPERVISOR_platform_op 7 +#define __HYPERVISOR_set_debugreg 8 +#define __HYPERVISOR_get_debugreg 9 +#define __HYPERVISOR_update_descriptor 10 +#define __HYPERVISOR_memory_op 12 +#define __HYPERVISOR_multicall 13 +#define __HYPERVISOR_update_va_mapping 14 +#define __HYPERVISOR_set_timer_op 15 #define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202 */ -#define __HYPERVISOR_xen_version 17 -#define __HYPERVISOR_console_io 18 -#define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */ -#define __HYPERVISOR_grant_table_op 20 -#define __HYPERVISOR_vm_assist 21 +#define __HYPERVISOR_xen_version 17 +#define __HYPERVISOR_console_io 18 +#define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */ +#define __HYPERVISOR_grant_table_op 20 +#define __HYPERVISOR_vm_assist 21 #define __HYPERVISOR_update_va_mapping_otherdomain 22 -#define __HYPERVISOR_iret 23 /* x86 only */ -#define __HYPERVISOR_vcpu_op 24 -#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */ -#define __HYPERVISOR_mmuext_op 26 -#define __HYPERVISOR_xsm_op 27 -#define __HYPERVISOR_nmi_op 28 -#define __HYPERVISOR_sched_op 29 -#define __HYPERVISOR_callback_op 30 -#define __HYPERVISOR_xenoprof_op 31 -#define __HYPERVISOR_event_channel_op 32 -#define __HYPERVISOR_physdev_op 33 -#define __HYPERVISOR_hvm_op 34 -#define __HYPERVISOR_sysctl 35 -#define __HYPERVISOR_domctl 36 -#define __HYPERVISOR_kexec_op 37 -#define __HYPERVISOR_tmem_op 38 -#define __HYPERVISOR_argo_op 39 -#define __HYPERVISOR_xenpmu_op 40 -#define __HYPERVISOR_dm_op 41 +#define __HYPERVISOR_iret 23 /* x86 only */ +#define __HYPERVISOR_vcpu_op 24 +#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */ +#define __HYPERVISOR_mmuext_op 26 +#define __HYPERVISOR_xsm_op 27 +#define __HYPERVISOR_nmi_op 28 +#define __HYPERVISOR_sched_op 29 +#define __HYPERVISOR_callback_op 30 +#define __HYPERVISOR_xenoprof_op 31 +#define __HYPERVISOR_event_channel_op 32 +#define __HYPERVISOR_physdev_op 33 +#define __HYPERVISOR_hvm_op 34 +#define __HYPERVISOR_sysctl 35 +#define __HYPERVISOR_domctl 36 +#define __HYPERVISOR_kexec_op 37 +#define __HYPERVISOR_tmem_op 38 +#define __HYPERVISOR_argo_op 39 +#define __HYPERVISOR_xenpmu_op 40 +#define __HYPERVISOR_dm_op 41 /* Architecture-specific hypercall definitions. */ -#define __HYPERVISOR_arch_0 48 -#define __HYPERVISOR_arch_1 49 -#define __HYPERVISOR_arch_2 50 -#define __HYPERVISOR_arch_3 51 -#define __HYPERVISOR_arch_4 52 -#define __HYPERVISOR_arch_5 53 -#define __HYPERVISOR_arch_6 54 -#define __HYPERVISOR_arch_7 55 +#define __HYPERVISOR_arch_0 48 +#define __HYPERVISOR_arch_1 49 +#define __HYPERVISOR_arch_2 50 +#define __HYPERVISOR_arch_3 51 +#define __HYPERVISOR_arch_4 52 +#define __HYPERVISOR_arch_5 53 +#define __HYPERVISOR_arch_6 54 +#define __HYPERVISOR_arch_7 55 /* ` } */ @@ -177,32 +177,32 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); * allocated to VCPU0 but can subsequently be re-bound. */ /* ` enum virq { */ -#define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout. */ -#define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */ -#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */ -#define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */ -#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */ -#define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */ -#define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */ -#define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console */ -#define VIRQ_PCPU_STATE 9 /* G. (DOM0) PCPU state changed */ +#define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout. */ +#define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */ +#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */ +#define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */ +#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */ +#define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */ +#define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */ +#define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console */ +#define VIRQ_PCPU_STATE 9 /* G. (DOM0) PCPU state changed */ #define VIRQ_MEM_EVENT 10 /* G. (DOM0) A memory event has occurred */ #define VIRQ_ARGO 11 /* G. Argo interdomain message notification */ #define VIRQ_ENOMEM 12 /* G. (DOM0) Low on heap memory */ #define VIRQ_XENPMU 13 /* V. PMC interrupt */ /* Architecture-specific VIRQ definitions. */ -#define VIRQ_ARCH_0 16 -#define VIRQ_ARCH_1 17 -#define VIRQ_ARCH_2 18 -#define VIRQ_ARCH_3 19 -#define VIRQ_ARCH_4 20 -#define VIRQ_ARCH_5 21 -#define VIRQ_ARCH_6 22 -#define VIRQ_ARCH_7 23 +#define VIRQ_ARCH_0 16 +#define VIRQ_ARCH_1 17 +#define VIRQ_ARCH_2 18 +#define VIRQ_ARCH_3 19 +#define VIRQ_ARCH_4 20 +#define VIRQ_ARCH_5 21 +#define VIRQ_ARCH_6 22 +#define VIRQ_ARCH_7 23 /* ` } */ -#define NR_VIRQS 24 +#define NR_VIRQS 24 /* * ` enum neg_errnoval @@ -316,7 +316,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); * +-----+-----+----+----+----+-----+----+----+ * | UC | UC- | WC | WB | UC | UC- | WC | WB | <= Linux * +-----+-----+----+----+----+-----+----+----+ - * | UC | UC- | WT | WB | UC | UC- | WT | WB | <= BIOS (default when machine boots) + * | UC | UC- | WT | WB | UC | UC- | WT | WB | <= BIOS (default when machine + * boots) * +-----+-----+----+----+----+-----+----+----+ * | rsv | rsv | WP | WC | UC | UC- | WT | WB | <= Xen * +-----+-----+----+----+----+-----+----+----+ @@ -347,11 +348,13 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); * * PAT (bit 7 on) --> PWT (bit 3 on) and clear bit 7. */ -#define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr = val'. ptr is MA. */ -#define MMU_MACHPHYS_UPDATE 1 /* ptr = MA of frame to modify entry for */ -#define MMU_PT_UPDATE_PRESERVE_AD 2 /* atomically: *ptr = val | (*ptr&(A|D)) */ -#define MMU_PT_UPDATE_NO_TRANSLATE 3 /* checked '*ptr = val'. ptr is MA. */ - /* val never translated. */ +#define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr = val'. ptr is MA. */ +#define MMU_MACHPHYS_UPDATE 1 /* ptr = MA of frame to modify entry for */ +#define MMU_PT_UPDATE_PRESERVE_AD \ + 2 /* atomically: *ptr = val | (*ptr&(A|D)) \ + */ +#define MMU_PT_UPDATE_NO_TRANSLATE 3 /* checked '*ptr = val'. ptr is MA. */ +/* val never translated. */ /* * MMU EXTENDED OPERATIONS @@ -418,26 +421,26 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); * mfn: Machine frame number of head of superpage to be [un]marked. */ /* ` enum mmuext_cmd { */ -#define MMUEXT_PIN_L1_TABLE 0 -#define MMUEXT_PIN_L2_TABLE 1 -#define MMUEXT_PIN_L3_TABLE 2 -#define MMUEXT_PIN_L4_TABLE 3 -#define MMUEXT_UNPIN_TABLE 4 -#define MMUEXT_NEW_BASEPTR 5 -#define MMUEXT_TLB_FLUSH_LOCAL 6 -#define MMUEXT_INVLPG_LOCAL 7 -#define MMUEXT_TLB_FLUSH_MULTI 8 -#define MMUEXT_INVLPG_MULTI 9 -#define MMUEXT_TLB_FLUSH_ALL 10 -#define MMUEXT_INVLPG_ALL 11 -#define MMUEXT_FLUSH_CACHE 12 -#define MMUEXT_SET_LDT 13 -#define MMUEXT_NEW_USER_BASEPTR 15 -#define MMUEXT_CLEAR_PAGE 16 -#define MMUEXT_COPY_PAGE 17 +#define MMUEXT_PIN_L1_TABLE 0 +#define MMUEXT_PIN_L2_TABLE 1 +#define MMUEXT_PIN_L3_TABLE 2 +#define MMUEXT_PIN_L4_TABLE 3 +#define MMUEXT_UNPIN_TABLE 4 +#define MMUEXT_NEW_BASEPTR 5 +#define MMUEXT_TLB_FLUSH_LOCAL 6 +#define MMUEXT_INVLPG_LOCAL 7 +#define MMUEXT_TLB_FLUSH_MULTI 8 +#define MMUEXT_INVLPG_MULTI 9 +#define MMUEXT_TLB_FLUSH_ALL 10 +#define MMUEXT_INVLPG_ALL 11 +#define MMUEXT_FLUSH_CACHE 12 +#define MMUEXT_SET_LDT 13 +#define MMUEXT_NEW_USER_BASEPTR 15 +#define MMUEXT_CLEAR_PAGE 16 +#define MMUEXT_COPY_PAGE 17 #define MMUEXT_FLUSH_CACHE_GLOBAL 18 -#define MMUEXT_MARK_SUPER 19 -#define MMUEXT_UNMARK_SUPER 20 +#define MMUEXT_MARK_SUPER 19 +#define MMUEXT_UNMARK_SUPER 20 /* ` } */ #ifndef __ASSEMBLY__ @@ -446,7 +449,7 @@ struct mmuext_op { union { /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR * CLEAR_PAGE, COPY_PAGE, [UN]MARK_SUPER */ - xen_pfn_t mfn; + xen_pfn_t mfn; /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */ unsigned long linear_addr; } arg1; @@ -485,13 +488,13 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); /* When specifying UVMF_MULTI, also OR in a pointer to a CPU bitmap. */ /* UVMF_LOCAL is merely UVMF_MULTI with a NULL bitmap pointer. */ /* ` enum uvm_flags { */ -#define UVMF_NONE (xen_mk_ulong(0)<<0) /* No flushing at all. */ -#define UVMF_TLB_FLUSH (xen_mk_ulong(1)<<0) /* Flush entire TLB(s). */ -#define UVMF_INVLPG (xen_mk_ulong(2)<<0) /* Flush only one entry. */ -#define UVMF_FLUSHTYPE_MASK (xen_mk_ulong(3)<<0) -#define UVMF_MULTI (xen_mk_ulong(0)<<2) /* Flush subset of TLBs. */ -#define UVMF_LOCAL (xen_mk_ulong(0)<<2) /* Flush local TLB. */ -#define UVMF_ALL (xen_mk_ulong(1)<<2) /* Flush all TLBs. */ +#define UVMF_NONE (xen_mk_ulong(0) << 0) /* No flushing at all. */ +#define UVMF_TLB_FLUSH (xen_mk_ulong(1) << 0) /* Flush entire TLB(s). */ +#define UVMF_INVLPG (xen_mk_ulong(2) << 0) /* Flush only one entry. */ +#define UVMF_FLUSHTYPE_MASK (xen_mk_ulong(3) << 0) +#define UVMF_MULTI (xen_mk_ulong(0) << 2) /* Flush subset of TLBs. */ +#define UVMF_LOCAL (xen_mk_ulong(0) << 2) /* Flush local TLB. */ +#define UVMF_ALL (xen_mk_ulong(1) << 2) /* Flush all TLBs. */ /* ` } */ /* @@ -518,30 +521,30 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); * @return the number of characters read on success, otherwise return * an error code. */ -#define CONSOLEIO_write 0 -#define CONSOLEIO_read 1 +#define CONSOLEIO_write 0 +#define CONSOLEIO_read 1 /* * Commands to HYPERVISOR_vm_assist(). */ -#define VMASST_CMD_enable 0 -#define VMASST_CMD_disable 1 +#define VMASST_CMD_enable 0 +#define VMASST_CMD_disable 1 /* x86/32 guests: simulate full 4GB segment limits. */ -#define VMASST_TYPE_4gb_segments 0 +#define VMASST_TYPE_4gb_segments 0 /* x86/32 guests: trap (vector 15) whenever above vmassist is used. */ -#define VMASST_TYPE_4gb_segments_notify 1 +#define VMASST_TYPE_4gb_segments_notify 1 /* * x86 guests: support writes to bottom-level PTEs. * NB1. Page-directory entries cannot be written. * NB2. Guest must continue to remove all writable mappings of PTEs. */ -#define VMASST_TYPE_writable_pagetables 2 +#define VMASST_TYPE_writable_pagetables 2 /* x86/PAE guests: support PDPTs above 4GB. */ -#define VMASST_TYPE_pae_extended_cr3 3 +#define VMASST_TYPE_pae_extended_cr3 3 /* * x86 guests: Sane behaviour for virtual iopl @@ -549,7 +552,7 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); * - virtual iopl reported in bounce frames. * - guest kernels assumed to be level 0 for the purpose of iopl checks. */ -#define VMASST_TYPE_architectural_iopl 4 +#define VMASST_TYPE_architectural_iopl 4 /* * All guests: activate update indicator in vcpu_runstate_info @@ -568,17 +571,17 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); * as before, and whenever the L4 table gets used as a user one the * mapping gets zapped. */ -#define VMASST_TYPE_m2p_strict 32 +#define VMASST_TYPE_m2p_strict 32 #if __XEN_INTERFACE_VERSION__ < 0x00040600 -#define MAX_VMASST_TYPE 3 +#define MAX_VMASST_TYPE 3 #endif /* Domain ids >= DOMID_FIRST_RESERVED cannot be used for ordinary domains. */ #define DOMID_FIRST_RESERVED xen_mk_uint(0x7FF0) /* DOMID_SELF is used in certain contexts to refer to oneself. */ -#define DOMID_SELF xen_mk_uint(0x7FF0) +#define DOMID_SELF xen_mk_uint(0x7FF0) /* * DOMID_IO is used to restrict page-table updates to mapping I/O memory. @@ -591,7 +594,7 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); * HYPERVISOR_mmu_update() context it can be specified by any calling domain, * otherwise it's only permitted if the caller is privileged. */ -#define DOMID_IO xen_mk_uint(0x7FF1) +#define DOMID_IO xen_mk_uint(0x7FF1) /* * DOMID_XEN is used to allow privileged domains to map restricted parts of @@ -602,17 +605,17 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); * - with XENMAPSPACE_gmfn_foreign, * and is only permitted if the caller is privileged. */ -#define DOMID_XEN xen_mk_uint(0x7FF2) +#define DOMID_XEN xen_mk_uint(0x7FF2) /* * DOMID_COW is used as the owner of sharable pages */ -#define DOMID_COW xen_mk_uint(0x7FF3) +#define DOMID_COW xen_mk_uint(0x7FF3) /* DOMID_INVALID is used to identify pages with unknown owner. */ -#define DOMID_INVALID xen_mk_uint(0x7FF4) +#define DOMID_INVALID xen_mk_uint(0x7FF4) /* Idle domain. */ -#define DOMID_IDLE xen_mk_uint(0x7FFF) +#define DOMID_IDLE xen_mk_uint(0x7FFF) #ifndef __ASSEMBLY__ @@ -623,8 +626,8 @@ typedef uint16_t domid_t; * NB. The fields are natural pointer/address size for this architecture. */ struct mmu_update { - uint64_t ptr; /* Machine address of PTE. */ - uint64_t val; /* New contents of PTE. */ + uint64_t ptr; /* Machine address of PTE. */ + uint64_t val; /* New contents of PTE. */ }; typedef struct mmu_update mmu_update_t; DEFINE_XEN_GUEST_HANDLE(mmu_update_t); @@ -665,8 +668,8 @@ struct vcpu_time_info { */ uint32_t version; uint32_t pad0; - uint64_t tsc_timestamp; /* TSC at last update of time vals. */ - uint64_t system_time; /* Time, in nanosecs, since boot. */ + uint64_t tsc_timestamp; /* TSC at last update of time vals. */ + uint64_t system_time; /* Time, in nanosecs, since boot. */ /* * Current system time: * system_time + @@ -675,18 +678,18 @@ struct vcpu_time_info { * ((10^9 << 32) / tsc_to_system_mul) >> tsc_shift */ uint32_t tsc_to_system_mul; - int8_t tsc_shift; + int8_t tsc_shift; #if __XEN_INTERFACE_VERSION__ > 0x040600 - uint8_t flags; - uint8_t pad1[2]; + uint8_t flags; + uint8_t pad1[2]; #else - int8_t pad1[3]; + int8_t pad1[3]; #endif }; /* 32 bytes */ typedef struct vcpu_time_info vcpu_time_info_t; -#define XEN_PVCLOCK_TSC_STABLE_BIT (1 << 0) -#define XEN_PVCLOCK_GUEST_STOPPED (1 << 1) +#define XEN_PVCLOCK_TSC_STABLE_BIT (1 << 0) +#define XEN_PVCLOCK_GUEST_STOPPED (1 << 1) struct vcpu_info { /* @@ -783,18 +786,17 @@ struct shared_info { * by XEN_DOMCTL_settimeoffset, or adjusted via a guest write to the * emulated RTC. */ - uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ + uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ uint32_t wc_sec; uint32_t wc_nsec; #if !defined(__i386__) uint32_t wc_sec_hi; -# define xen_wc_sec_hi wc_sec_hi +#define xen_wc_sec_hi wc_sec_hi #elif !defined(__XEN__) && !defined(__XEN_TOOLS__) -# define xen_wc_sec_hi arch.wc_sec_hi +#define xen_wc_sec_hi arch.wc_sec_hi #endif struct arch_shared_info arch; - }; #ifndef __XEN__ typedef struct shared_info shared_info_t; @@ -840,35 +842,35 @@ typedef struct shared_info shared_info_t; #ifdef XEN_HAVE_PV_GUEST_ENTRY struct start_info { /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */ - char magic[32]; /* "xen--". */ - unsigned long nr_pages; /* Total pages allocated to this domain. */ - unsigned long shared_info; /* MACHINE address of shared info struct. */ - uint32_t flags; /* SIF_xxx flags. */ - xen_pfn_t store_mfn; /* MACHINE page number of shared page. */ - uint32_t store_evtchn; /* Event channel for store communication. */ + char magic[32]; /* "xen--". */ + unsigned long nr_pages; /* Total pages allocated to this domain. */ + unsigned long shared_info; /* MACHINE address of shared info struct. */ + uint32_t flags; /* SIF_xxx flags. */ + xen_pfn_t store_mfn; /* MACHINE page number of shared page. */ + uint32_t store_evtchn; /* Event channel for store communication. */ union { struct { - xen_pfn_t mfn; /* MACHINE page number of console page. */ - uint32_t evtchn; /* Event channel for console page. */ + xen_pfn_t mfn; /* MACHINE page number of console page. */ + uint32_t evtchn; /* Event channel for console page. */ } domU; struct { - uint32_t info_off; /* Offset of console_info struct. */ + uint32_t info_off; /* Offset of console_info struct. */ uint32_t info_size; /* Size of console_info struct from start.*/ } dom0; } console; /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */ - unsigned long pt_base; /* VIRTUAL address of page directory. */ + unsigned long pt_base; /* VIRTUAL address of page directory. */ unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames. */ - unsigned long mfn_list; /* VIRTUAL address of page-frame list. */ - unsigned long mod_start; /* VIRTUAL address of pre-loaded module */ - /* (PFN of pre-loaded module if */ - /* SIF_MOD_START_PFN set in flags). */ - unsigned long mod_len; /* Size (bytes) of pre-loaded module. */ + unsigned long mfn_list; /* VIRTUAL address of page-frame list. */ + unsigned long mod_start; /* VIRTUAL address of pre-loaded module */ + /* (PFN of pre-loaded module if */ + /* SIF_MOD_START_PFN set in flags). */ + unsigned long mod_len; /* Size (bytes) of pre-loaded module. */ #define MAX_GUEST_CMDLINE 1024 int8_t cmd_line[MAX_GUEST_CMDLINE]; /* The pfn range here covers both page table and p->m table frames. */ - unsigned long first_p2m_pfn;/* 1st pfn forming initial P->M table. */ - unsigned long nr_p2m_frames;/* # of pfns forming initial P->M table. */ + unsigned long first_p2m_pfn; /* 1st pfn forming initial P->M table. */ + unsigned long nr_p2m_frames; /* # of pfns forming initial P->M table. */ }; typedef struct start_info start_info_t; @@ -880,13 +882,14 @@ typedef struct start_info start_info_t; #endif /* XEN_HAVE_PV_GUEST_ENTRY */ /* These flags are passed in the 'flags' field of start_info_t. */ -#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */ -#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */ -#define SIF_MULTIBOOT_MOD (1<<2) /* Is mod_start a multiboot module? */ -#define SIF_MOD_START_PFN (1<<3) /* Is mod_start a PFN? */ -#define SIF_VIRT_P2M_4TOOLS (1<<4) /* Do Xen tools understand a virt. mapped */ - /* P->M making the 3 level tree obsolete? */ -#define SIF_PM_MASK (0xFF<<8) /* reserve 1 byte for xen-pm options */ +#define SIF_PRIVILEGED (1 << 0) /* Is the domain privileged? */ +#define SIF_INITDOMAIN (1 << 1) /* Is this the initial control domain? */ +#define SIF_MULTIBOOT_MOD (1 << 2) /* Is mod_start a multiboot module? */ +#define SIF_MOD_START_PFN (1 << 3) /* Is mod_start a PFN? */ +#define SIF_VIRT_P2M_4TOOLS \ + (1 << 4) /* Do Xen tools understand a virt. mapped */ +/* P->M making the 3 level tree obsolete? */ +#define SIF_PM_MASK (0xFF << 8) /* reserve 1 byte for xen-pm options */ /* * A multiboot module is a package containing modules very similar to a @@ -902,8 +905,7 @@ typedef struct start_info start_info_t; * file, and let the PV guest easily rebase the addresses to virtual addresses * and at the same time count the number of modules. */ -struct xen_multiboot_mod_list -{ +struct xen_multiboot_mod_list { /* Address of first byte of the module */ uint32_t mod_start; /* Address of last byte of the module (inclusive) */ @@ -948,10 +950,10 @@ typedef struct dom0_vga_console_info { uint32_t lfb_base; uint32_t lfb_size; /* RGB mask offsets and sizes, as defined by VBE 1.2+ */ - uint8_t red_pos, red_size; - uint8_t green_pos, green_size; - uint8_t blue_pos, blue_size; - uint8_t rsvd_pos, rsvd_size; + uint8_t red_pos, red_size; + uint8_t green_pos, green_size; + uint8_t blue_pos, blue_size; + uint8_t rsvd_pos, rsvd_size; #if __XEN_INTERFACE_VERSION__ >= 0x00030206 /* VESA capabilities (offset 0xa, VESA command 0x4f00). */ uint32_t gbl_caps; @@ -966,12 +968,12 @@ typedef struct dom0_vga_console_info { } vesa_lfb; } u; } dom0_vga_console_info_t; -#define xen_vga_console_info dom0_vga_console_info +#define xen_vga_console_info dom0_vga_console_info #define xen_vga_console_info_t dom0_vga_console_info_t typedef uint8_t xen_domain_handle_t[16]; -__DEFINE_XEN_GUEST_HANDLE(uint8, uint8_t); +__DEFINE_XEN_GUEST_HANDLE(uint8, uint8_t); __DEFINE_XEN_GUEST_HANDLE(uint16, uint16_t); __DEFINE_XEN_GUEST_HANDLE(uint32, uint32_t); __DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t); @@ -991,19 +993,21 @@ typedef struct { * compatible with Microsoft, as they use mixed-endian encoding (some * components are little-endian, some are big-endian). */ -#define XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) \ - {{((a) >> 24) & 0xFF, ((a) >> 16) & 0xFF, \ - ((a) >> 8) & 0xFF, ((a) >> 0) & 0xFF, \ - ((b) >> 8) & 0xFF, ((b) >> 0) & 0xFF, \ - ((c) >> 8) & 0xFF, ((c) >> 0) & 0xFF, \ - ((d) >> 8) & 0xFF, ((d) >> 0) & 0xFF, \ - e1, e2, e3, e4, e5, e6}} +#define XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) \ + { \ + { \ + ((a) >> 24) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 8) & 0xFF, \ + ((a) >> 0) & 0xFF, ((b) >> 8) & 0xFF, ((b) >> 0) & 0xFF, \ + ((c) >> 8) & 0xFF, ((c) >> 0) & 0xFF, ((d) >> 8) & 0xFF, \ + ((d) >> 0) & 0xFF, e1, e2, e3, e4, e5, e6 \ + } \ + } #if defined(__STDC_VERSION__) ? __STDC_VERSION__ >= 199901L : defined(__GNUC__) -#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \ +#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \ ((xen_uuid_t)XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6)) #else -#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \ +#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \ XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) #endif /* __STDC_VERSION__ / __GNUC__ */ diff --git a/include/xen/xencomm.h b/include/xen/xencomm.h index ac45e0712..87543d6ec 100644 --- a/include/xen/xencomm.h +++ b/include/xen/xencomm.h @@ -29,7 +29,7 @@ * to and from the virtually contiguous area. */ -#define XENCOMM_MAGIC 0x58434F4D /* 'XCOM' */ +#define XENCOMM_MAGIC 0x58434F4D /* 'XCOM' */ #define XENCOMM_INVALID (~0UL) struct xencomm_desc { diff --git a/include/xen/xenoprof.h b/include/xen/xenoprof.h index 9f5ca87d9..06fb4aaf7 100644 --- a/include/xen/xenoprof.h +++ b/include/xen/xenoprof.h @@ -34,16 +34,16 @@ /* * Commands to HYPERVISOR_xenoprof_op(). */ -#define XENOPROF_init 0 -#define XENOPROF_reset_active_list 1 -#define XENOPROF_reset_passive_list 2 -#define XENOPROF_set_active 3 -#define XENOPROF_set_passive 4 -#define XENOPROF_reserve_counters 5 -#define XENOPROF_counter 6 -#define XENOPROF_setup_events 7 -#define XENOPROF_enable_virq 8 -#define XENOPROF_start 9 +#define XENOPROF_init 0 +#define XENOPROF_reset_active_list 1 +#define XENOPROF_reset_passive_list 2 +#define XENOPROF_set_active 3 +#define XENOPROF_set_passive 4 +#define XENOPROF_reserve_counters 5 +#define XENOPROF_counter 6 +#define XENOPROF_setup_events 7 +#define XENOPROF_enable_virq 8 +#define XENOPROF_start 9 #define XENOPROF_stop 10 #define XENOPROF_disable_virq 11 #define XENOPROF_release_counters 12 @@ -52,12 +52,12 @@ #define XENOPROF_set_backtrace 15 /* AMD IBS support */ -#define XENOPROF_get_ibs_caps 16 -#define XENOPROF_ibs_counter 17 -#define XENOPROF_last_op 17 +#define XENOPROF_get_ibs_caps 16 +#define XENOPROF_ibs_counter 17 +#define XENOPROF_last_op 17 -#define MAX_OPROF_EVENTS 32 -#define MAX_OPROF_DOMAINS 25 +#define MAX_OPROF_EVENTS 32 +#define MAX_OPROF_DOMAINS 25 #define XENOPROF_CPU_TYPE_SIZE 64 /* Xenoprof performance events (not Xen events) */ @@ -90,17 +90,17 @@ DEFINE_XEN_GUEST_HANDLE(xenoprof_buf_t); #endif struct xenoprof_init { - int32_t num_events; - int32_t is_primary; + int32_t num_events; + int32_t is_primary; char cpu_type[XENOPROF_CPU_TYPE_SIZE]; }; typedef struct xenoprof_init xenoprof_init_t; DEFINE_XEN_GUEST_HANDLE(xenoprof_init_t); struct xenoprof_get_buffer { - int32_t max_samples; - int32_t nbuf; - int32_t bufsize; + int32_t max_samples; + int32_t nbuf; + int32_t bufsize; uint64_t buf_gmaddr; }; typedef struct xenoprof_get_buffer xenoprof_get_buffer_t; @@ -121,9 +121,9 @@ DEFINE_XEN_GUEST_HANDLE(xenoprof_counter_t); typedef struct xenoprof_passive { uint16_t domain_id; - int32_t max_samples; - int32_t nbuf; - int32_t bufsize; + int32_t max_samples; + int32_t nbuf; + int32_t bufsize; uint64_t buf_gmaddr; } xenoprof_passive_t; DEFINE_XEN_GUEST_HANDLE(xenoprof_passive_t); diff --git a/include/xen/xsm/flask_op.h b/include/xen/xsm/flask_op.h index 970ec07f0..89bc5381f 100644 --- a/include/xen/xsm/flask_op.h +++ b/include/xen/xsm/flask_op.h @@ -161,31 +161,31 @@ struct xen_flask_devicetree_label { struct xen_flask_op { uint32_t cmd; -#define FLASK_LOAD 1 -#define FLASK_GETENFORCE 2 -#define FLASK_SETENFORCE 3 -#define FLASK_CONTEXT_TO_SID 4 -#define FLASK_SID_TO_CONTEXT 5 -#define FLASK_ACCESS 6 -#define FLASK_CREATE 7 -#define FLASK_RELABEL 8 -#define FLASK_USER 9 /* No longer implemented */ -#define FLASK_POLICYVERS 10 -#define FLASK_GETBOOL 11 -#define FLASK_SETBOOL 12 -#define FLASK_COMMITBOOLS 13 -#define FLASK_MLS 14 -#define FLASK_DISABLE 15 -#define FLASK_GETAVC_THRESHOLD 16 -#define FLASK_SETAVC_THRESHOLD 17 -#define FLASK_AVC_HASHSTATS 18 -#define FLASK_AVC_CACHESTATS 19 -#define FLASK_MEMBER 20 -#define FLASK_ADD_OCONTEXT 21 -#define FLASK_DEL_OCONTEXT 22 -#define FLASK_GET_PEER_SID 23 -#define FLASK_RELABEL_DOMAIN 24 -#define FLASK_DEVICETREE_LABEL 25 +#define FLASK_LOAD 1 +#define FLASK_GETENFORCE 2 +#define FLASK_SETENFORCE 3 +#define FLASK_CONTEXT_TO_SID 4 +#define FLASK_SID_TO_CONTEXT 5 +#define FLASK_ACCESS 6 +#define FLASK_CREATE 7 +#define FLASK_RELABEL 8 +#define FLASK_USER 9 /* No longer implemented */ +#define FLASK_POLICYVERS 10 +#define FLASK_GETBOOL 11 +#define FLASK_SETBOOL 12 +#define FLASK_COMMITBOOLS 13 +#define FLASK_MLS 14 +#define FLASK_DISABLE 15 +#define FLASK_GETAVC_THRESHOLD 16 +#define FLASK_SETAVC_THRESHOLD 17 +#define FLASK_AVC_HASHSTATS 18 +#define FLASK_AVC_CACHESTATS 19 +#define FLASK_MEMBER 20 +#define FLASK_ADD_OCONTEXT 21 +#define FLASK_DEL_OCONTEXT 22 +#define FLASK_GET_PEER_SID 23 +#define FLASK_RELABEL_DOMAIN 24 +#define FLASK_DEVICETREE_LABEL 25 uint32_t interface_version; /* XEN_FLASK_INTERFACE_VERSION */ union { struct xen_flask_load load; diff --git a/tenders/common/cc.h b/tenders/common/cc.h index 8ec1e46bb..62e55f764 100644 --- a/tenders/common/cc.h +++ b/tenders/common/cc.h @@ -45,7 +45,7 @@ * Compiler supports __builtin_add_overflow(), use it for checked arithmetic. */ -#define add_overflow(a,b,r) __builtin_add_overflow(a,b,&r) +#define add_overflow(a, b, r) __builtin_add_overflow(a, b, &r) #else /* !_HAS_BUILTIN_ADD_OVERFLOW */ @@ -56,26 +56,30 @@ */ #define __HALF_MAX_SIGNED(type) ((type)1 << (sizeof(type) * 8 - 2)) -#define __MAX_SIGNED(type) (__HALF_MAX_SIGNED(type) - 1 + __HALF_MAX_SIGNED(type)) +#define __MAX_SIGNED(type) \ + (__HALF_MAX_SIGNED(type) - 1 + __HALF_MAX_SIGNED(type)) #define __MIN_SIGNED(type) (-1 - __MAX_SIGNED(type)) -#define __MIN(type) ((type)-1 < 1 ? __MIN_SIGNED(type) : (type)0) +#define __MIN(type) ((type) - 1 < 1 ? __MIN_SIGNED(type) : (type)0) #define __MAX(type) ((type)~__MIN(type)) -#define __assign(dest,src) \ +#define __assign(dest, src) \ ({ \ __typeof(src) __x = (src); \ __typeof(dest) __y = __x; \ - (__x == __y && ((__x < 1) == (__y < 1)) ? (void)((dest) = __y),0 : 1); \ + (__x == __y && ((__x < 1) == (__y < 1)) ? (void)((dest) = __y), \ + 0 : 1); \ }) -#define add_overflow(a,b,r) \ +#define add_overflow(a, b, r) \ ({ \ - __typeof(a) __a = a; \ - __typeof(b) __b = b; \ - (__b) < 1 ? \ - ((__MIN(__typeof(r)) - (__b) <= (__a)) ? __assign(r, __a + __b) : 1) : \ - ((__MAX(__typeof(r)) - (__b) >= (__a)) ? __assign(r, __a + __b) : 1); \ + __typeof(a) __a = a; \ + __typeof(b) __b = b; \ + (__b) < 1 \ + ? ((__MIN(__typeof(r)) - (__b) <= (__a)) ? __assign(r, __a + __b) \ + : 1) \ + : ((__MAX(__typeof(r)) - (__b) >= (__a)) ? __assign(r, __a + __b) \ + : 1); \ }) #endif /* _HAS_BUILTIN_ADD_OVERFLOW */ @@ -84,7 +88,7 @@ /* * Generic macros for stringification. */ -#define STR(arg) #arg +#define STR(arg) #arg #define XSTR(arg) STR(arg) #endif /* HVT_CC_H */ diff --git a/tenders/common/elf.c b/tenders/common/elf.c index 37a7017c1..aba51ddd0 100644 --- a/tenders/common/elf.c +++ b/tenders/common/elf.c @@ -50,13 +50,13 @@ * are compiling on. */ #if defined(__x86_64__) -#define EM_TARGET EM_X86_64 +#define EM_TARGET EM_X86_64 #define EM_PAGE_SIZE 0x1000 #elif defined(__aarch64__) -#define EM_TARGET EM_AARCH64 +#define EM_TARGET EM_AARCH64 #define EM_PAGE_SIZE 0x1000 #elif defined(__powerpc64__) -#define EM_TARGET EM_PPC64 +#define EM_TARGET EM_PPC64 #define EM_PAGE_SIZE 0x10000 #else #error Unsupported target @@ -88,8 +88,8 @@ struct solo5_nhdr { }; _Static_assert((sizeof(struct solo5_nhdr)) == - (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + 8), - "struct solo5_nhdr alignment issue"); + (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint32_t) + 8), + "struct solo5_nhdr alignment issue"); static ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset) { @@ -130,23 +130,23 @@ static bool ehdr_is_valid(const Elf64_Ehdr *hdr) * checked as compilers do not provide a way to override this without * building the entire toolchain from scratch. */ - if (!(hdr->e_ident[EI_MAG0] == ELFMAG0 - && hdr->e_ident[EI_MAG1] == ELFMAG1 - && hdr->e_ident[EI_MAG2] == ELFMAG2 - && hdr->e_ident[EI_MAG3] == ELFMAG3 - && hdr->e_ident[EI_CLASS] == ELFCLASS64 - && hdr->e_ident[EI_DATA] == EI_DATA_TARGET - && hdr->e_version == EV_CURRENT)) + if (!(hdr->e_ident[EI_MAG0] == ELFMAG0 && + hdr->e_ident[EI_MAG1] == ELFMAG1 && + hdr->e_ident[EI_MAG2] == ELFMAG2 && + hdr->e_ident[EI_MAG3] == ELFMAG3 && + hdr->e_ident[EI_CLASS] == ELFCLASS64 && + hdr->e_ident[EI_DATA] == EI_DATA_TARGET && + hdr->e_version == EV_CURRENT)) return false; /* * 2. Validate ELF64 header internal sizes match what we expect, and that * at least one program header entry is present. */ - if (hdr->e_ehsize != sizeof (Elf64_Ehdr)) + if (hdr->e_ehsize != sizeof(Elf64_Ehdr)) return false; if (hdr->e_phnum < 1) return false; - if (hdr->e_phentsize != sizeof (Elf64_Phdr)) + if (hdr->e_phentsize != sizeof(Elf64_Phdr)) return false; /* * 3. Validate that this is an executable for our target architecture. @@ -164,13 +164,12 @@ static bool ehdr_is_valid(const Elf64_Ehdr *hdr) * non-zero power of 2. */ static int align_down(Elf64_Addr addr, Elf64_Xword align, - Elf64_Addr *out_result) + Elf64_Addr *out_result) { if (align > 0 && (align & (align - 1)) == 0) { *out_result = addr & -align; return 0; - } - else + } else return 1; } @@ -189,22 +188,21 @@ static int align_up(Elf64_Addr addr, Elf64_Xword align, Elf64_Addr *out_result) result = result & -align; *out_result = result; return 0; - } - else + } else return 1; } #define INV_EXE "invalid executable" void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, - uint64_t p_min_loadaddr, guest_mprotect_fn_t t_guest_mprotect, - void *t_guest_mprotect_arg, uint64_t *p_entry, uint64_t *p_end) + uint64_t p_min_loadaddr, guest_mprotect_fn_t t_guest_mprotect, + void *t_guest_mprotect_arg, uint64_t *p_entry, uint64_t *p_end) { ssize_t nbytes; Elf64_Phdr *phdr = NULL; Elf64_Ehdr *ehdr = NULL; - Elf64_Addr e_entry; /* Program entry point */ - Elf64_Addr e_end; /* Highest memory address occupied */ + Elf64_Addr e_entry; /* Program entry point */ + Elf64_Addr e_end; /* Highest memory address occupied */ ehdr = malloc(sizeof(Elf64_Ehdr)); if (ehdr == NULL) { @@ -215,17 +213,20 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, nbytes = pread_in_full(bin_fd, ehdr, sizeof(Elf64_Ehdr), 0); if (nbytes < 0) { warnx("%s: pread_in_full for elf header while loading elf returned" - " %zu < 0", bin_name, nbytes); + " %zu < 0", + bin_name, nbytes); goto mem_cleanup; } if (nbytes != sizeof(Elf64_Ehdr)) { warnx("%s: %s: elf header does not match the expected size" - " (%zu != %lu)", bin_name, INV_EXE, nbytes, sizeof(Elf64_Ehdr)); + " (%zu != %lu)", + bin_name, INV_EXE, nbytes, sizeof(Elf64_Ehdr)); goto mem_cleanup; } if (!ehdr_is_valid(ehdr)) { warnx("%s: invalid or unsupported executable (elf header invalid while" - " loading elf)", bin_name); + " loading elf)", + bin_name); goto mem_cleanup; } /* @@ -233,8 +234,8 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, */ if (ehdr->e_entry < p_min_loadaddr || ehdr->e_entry >= mem_size) { warnx("%s: %s: e_entry does not fall within the memory allocation" - " range (%llu < %llu || %llu >= %zu)", bin_name, INV_EXE, - (unsigned long long)ehdr->e_entry, + " range (%llu < %llu || %llu >= %zu)", + bin_name, INV_EXE, (unsigned long long)ehdr->e_entry, (unsigned long long)p_min_loadaddr, (unsigned long long)ehdr->e_entry, mem_size); goto mem_cleanup; @@ -250,13 +251,14 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, nbytes = pread_in_full(bin_fd, phdr, ph_size, ehdr->e_phoff); if (nbytes < 0) { warnx("%s: pread_in_full for ph_size returned %zu < 0 while loading" - " elf", bin_name, nbytes); + " elf", + bin_name, nbytes); goto mem_cleanup; } if ((size_t)nbytes != ph_size) { warnx("%s: %s: program header does not match the expected size" - " (%zu != %zu while loading elf)", bin_name, INV_EXE, nbytes, - ph_size); + " (%zu != %zu while loading elf)", + bin_name, INV_EXE, nbytes, ph_size); goto mem_cleanup; } @@ -280,8 +282,8 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, if (p_vaddr < p_min_loadaddr) { warnx("%s: %s: phdr[%u].p_vaddr outside of valid memory range" - " (%llu < %llu)", bin_name, INV_EXE, ph_i, - (unsigned long long)p_vaddr, + " (%llu < %llu)", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr, (unsigned long long)p_min_loadaddr); goto mem_cleanup; } @@ -292,12 +294,11 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, */ if (p_vaddr < plast_vaddr) { warnx("%s: %s: phdr[%u].p_vaddr is not in ascending order" - " (%llu < %llu)", bin_name, INV_EXE, ph_i, - (unsigned long long)p_vaddr, + " (%llu < %llu)", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr, (unsigned long long)plast_vaddr); goto mem_cleanup; - } - else + } else plast_vaddr = p_vaddr; /* * Compute p_vaddr_start = p_vaddr, aligned down to requested alignment @@ -312,8 +313,8 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, } if (p_vaddr_start < p_min_loadaddr) { warnx("%s: %s: phdr[%u].p_vaddr_start is outside of memory" - " range (%llu < %llu (p_min_loadaddr))", bin_name, INV_EXE, - ph_i, (unsigned long long)p_vaddr_start, + " range (%llu < %llu (p_min_loadaddr))", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr_start, (unsigned long long)p_min_loadaddr); goto mem_cleanup; } @@ -323,8 +324,9 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, */ if (p_vaddr_start < e_end) { warnx("%s: %s: phdr[%u].p_vaddr_start is outside of memory" - " range (%llu < %llu (e_end))", bin_name, INV_EXE, ph_i, - (unsigned long long)p_vaddr_start, (unsigned long long)e_end); + " range (%llu < %llu (e_end))", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr_start, + (unsigned long long)e_end); goto mem_cleanup; } /* @@ -332,8 +334,9 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, */ if (p_vaddr >= mem_size) { warnx("%s: %s: phdr[%u] program file segment falls outside of" - " valid range (%llu >= %zu (mem_size))", bin_name, INV_EXE, - ph_i, (unsigned long long)p_vaddr, mem_size); + " valid range (%llu >= %zu (mem_size))", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr, + mem_size); goto mem_cleanup; } if (add_overflow(p_vaddr, p_filesz, temp)) { @@ -370,8 +373,9 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, if (align_up(p_vaddr_end, p_align, &p_vaddr_end)) { warnx("%s: %s: phdr[%u] program memory segment falls outside" " of valid range (align_up with %llu (p_vaddr_end) and %llu" - " (p_align) failed)", bin_name, INV_EXE, ph_i, - (unsigned long long)p_vaddr_end, (unsigned long long)p_align); + " (p_align) failed)", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr_end, + (unsigned long long)p_align); goto mem_cleanup; } if (p_vaddr_end > mem_size) { @@ -390,10 +394,10 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, * Double check result for host (caller) address space overflow. */ if ((mem + e_end) < (mem + p_min_loadaddr)) { - warnx("%s: %s: phdr[%u] address space overflow" - " ((mem + e_end) < (mem + p_min_loaddr))", - bin_name, INV_EXE, ph_i); - goto mem_cleanup; + warnx("%s: %s: phdr[%u] address space overflow" + " ((mem + e_end) < (mem + p_min_loaddr))", + bin_name, INV_EXE, ph_i); + goto mem_cleanup; } } @@ -408,11 +412,12 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, */ if (host_vaddr < (mem + p_min_loadaddr)) { warnx("%s: %s: phdr[%u] address space overflow (host_vaddr <" - " (mem + p_min_loaddr))", bin_name, INV_EXE, ph_i); + " (mem + p_min_loaddr))", + bin_name, INV_EXE, ph_i); goto mem_cleanup; } - nbytes = pread_in_full(bin_fd, host_vaddr, p_filesz, - phdr[ph_i].p_offset); + nbytes = + pread_in_full(bin_fd, host_vaddr, p_filesz, phdr[ph_i].p_offset); if (nbytes < 0) { warnx("%s: phdr[%u] pread_in_full returned %zu", bin_name, ph_i, nbytes); @@ -420,8 +425,8 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, } if ((size_t)nbytes != p_filesz) { warnx("%s: phdr[%u] host file segment mismatched (pread_in_full" - " returned %zu != %llu (p_filesz))", bin_name, ph_i, nbytes, - (unsigned long long)p_filesz); + " returned %zu != %llu (p_filesz))", + bin_name, ph_i, nbytes, (unsigned long long)p_filesz); goto mem_cleanup; } memset(host_vaddr + p_filesz, 0, p_memsz - p_filesz); @@ -434,15 +439,16 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, */ if (p_vaddr_start & (EM_PAGE_SIZE - 1)) { warnx("%s: %s: phdr[%u] p_vaddr_start not aligned with" - " architectural page size (%llu & (%u - 1))", bin_name, - INV_EXE, ph_i, (unsigned long long)p_vaddr_start, + " architectural page size (%llu & (%u - 1))", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr_start, EM_PAGE_SIZE - 1); goto mem_cleanup; } if (p_vaddr_end & (EM_PAGE_SIZE - 1)) { warnx("%s: %s: phdr[%u] p_vaddr_end not aligned with architectural" - " page size (%llu & (%u - 1))", bin_name, INV_EXE, ph_i, - (unsigned long long)p_vaddr_end, EM_PAGE_SIZE - 1); + " page size (%llu & (%u - 1))", + bin_name, INV_EXE, ph_i, (unsigned long long)p_vaddr_end, + EM_PAGE_SIZE - 1); goto mem_cleanup; } int prot = PROT_NONE; @@ -459,7 +465,7 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, } assert(t_guest_mprotect != NULL); if (t_guest_mprotect(t_guest_mprotect_arg, p_vaddr_start, p_vaddr_end, - prot) == -1) { + prot) == -1) { warnx("%s: mprotect failed", bin_name); goto mem_cleanup; } @@ -478,8 +484,8 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, } int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, - size_t note_align, size_t max_note_size, void **out_note_data, - size_t *out_note_size) + size_t note_align, size_t max_note_size, void **out_note_data, + size_t *out_note_size) { ssize_t nbytes; Elf64_Phdr *phdr = NULL; @@ -496,17 +502,20 @@ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, nbytes = pread_in_full(bin_fd, ehdr, sizeof(Elf64_Ehdr), 0); if (nbytes < 0) { warnx("%s: pread_in_full for elf header while loading note returned" - " %zu < 0", bin_name, nbytes); + " %zu < 0", + bin_name, nbytes); goto mem_cleanup; } if (nbytes != sizeof(Elf64_Ehdr)) { warnx("%s: %s: elf header does not match the expected size" - " (%zu != %lu)", bin_name, INV_EXE, nbytes, sizeof(Elf64_Ehdr)); + " (%zu != %lu)", + bin_name, INV_EXE, nbytes, sizeof(Elf64_Ehdr)); goto mem_cleanup; } if (!ehdr_is_valid(ehdr)) { warnx("%s: %s: invalid or unsupported executable (elf header invalid" - " while loading note)", bin_name, INV_EXE); + " while loading note)", + bin_name, INV_EXE); goto mem_cleanup; } @@ -519,13 +528,14 @@ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, nbytes = pread_in_full(bin_fd, phdr, ph_size, ehdr->e_phoff); if (nbytes < 0) { warnx("%s: pread_in_full for ph_size returned %zu < 0 while loading" - " note", bin_name, nbytes); + " note", + bin_name, nbytes); goto mem_cleanup; } if ((size_t)nbytes != ph_size) { warnx("%s: %s: program header does not match the expected size" - " (%zu != %zu while loading note)", bin_name, INV_EXE, nbytes, - ph_size); + " (%zu != %zu while loading note)", + bin_name, INV_EXE, nbytes, ph_size); goto mem_cleanup; } @@ -545,7 +555,8 @@ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, * reject the executable. */ warnx("%s: %s: phdr[%u].p_filesz note does not fall within" - " valid size (%llu < %lu)", bin_name, INV_EXE, ph_i, + " valid size (%llu < %lu)", + bin_name, INV_EXE, ph_i, (unsigned long long)phdr[ph_i].p_filesz, sizeof(Elf64_Nhdr)); goto mem_cleanup; } @@ -555,8 +566,7 @@ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, * header, ignore the note. */ continue; - nbytes = pread_in_full(bin_fd, &nhdr, sizeof nhdr, - phdr[ph_i].p_offset); + nbytes = pread_in_full(bin_fd, &nhdr, sizeof nhdr, phdr[ph_i].p_offset); if (nbytes < 0) { warnx("%s: phdr[%u] pread_in_full returned %zu", bin_name, ph_i, nbytes); @@ -588,13 +598,15 @@ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, */ if (nhdr.h.n_descsz < 1 || nhdr.h.n_descsz > max_note_size) { warnx("%s: %s: phdr[%u] note does not fall within valid size" - " (%u < 1 || %u > %zu)", bin_name, INV_EXE, ph_i, - nhdr.h.n_descsz, nhdr.h.n_descsz, max_note_size); + " (%u < 1 || %u > %zu)", + bin_name, INV_EXE, ph_i, nhdr.h.n_descsz, nhdr.h.n_descsz, + max_note_size); goto mem_cleanup; } if (phdr[ph_i].p_filesz < sizeof nhdr + nhdr.h.n_descsz) { warnx("%s: %s: phdr[%u] note does not fall within valid size" - " (%llu < %lu)", bin_name, INV_EXE, ph_i, + " (%llu < %lu)", + bin_name, INV_EXE, ph_i, (unsigned long long)phdr[ph_i].p_filesz, sizeof nhdr + nhdr.h.n_descsz); goto mem_cleanup; @@ -622,10 +634,10 @@ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, assert(note_offset >= sizeof nhdr); note_pad = note_offset - sizeof nhdr; note_size = nhdr.h.n_descsz - note_pad; - if(note_size <= 0 || note_size > nhdr.h.n_descsz) { + if (note_size <= 0 || note_size > nhdr.h.n_descsz) { warnx("%s: INV_EXE: phdr[%u] note does not fall within valid size" - " (%zu <= 0 || %zu > %u)", bin_name, ph_i, note_size, note_size, - nhdr.h.n_descsz); + " (%zu <= 0 || %zu > %u)", + bin_name, ph_i, note_size, note_size, nhdr.h.n_descsz); goto mem_cleanup; } note_data = malloc(note_size); @@ -634,7 +646,7 @@ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, goto mem_cleanup; } nbytes = pread_in_full(bin_fd, note_data, note_size, - phdr[ph_i].p_offset + note_offset); + phdr[ph_i].p_offset + note_offset); if (nbytes < 0) { warnx("%s: phdr[%u] pread_in_full for note_data returned %zu < 0", bin_name, ph_i, nbytes); diff --git a/tenders/common/elf.h b/tenders/common/elf.h index f4f7962b9..a548c2ace 100644 --- a/tenders/common/elf.h +++ b/tenders/common/elf.h @@ -34,7 +34,7 @@ * Returns 0 on success, -1 and errno set on failure. */ typedef int (*guest_mprotect_fn_t)(void *t_arg, uint64_t addr_start, - uint64_t addr_end, int prot); + uint64_t addr_end, int prot); /* * Load an ELF binary from (bin_fd) into (mem_size) bytes of memory at (*mem). @@ -50,8 +50,8 @@ typedef int (*guest_mprotect_fn_t)(void *t_arg, uint64_t addr_start, * terminates the program. */ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, - uint64_t p_min_loadaddr, guest_mprotect_fn_t t_guest_mprotect, - void *t_guest_mprotect_arg, uint64_t *p_entry, uint64_t *p_end); + uint64_t p_min_loadaddr, guest_mprotect_fn_t t_guest_mprotect, + void *t_guest_mprotect_arg, uint64_t *p_entry, uint64_t *p_end); /* * Load the Solo5-owned NOTE of (note_type) from the ELF binary (file). @@ -77,7 +77,7 @@ void elf_load(int bin_fd, const char *bin_name, uint8_t *mem, size_t mem_size, * In all other cases, reports any errors to stderr and terminates the program. */ int elf_load_note(int bin_fd, const char *bin_name, uint32_t note_type, - size_t note_align, size_t max_note_size, void **note_data, - size_t *note_size); + size_t note_align, size_t max_note_size, void **note_data, + size_t *note_size); #endif /* COMMON_ELF_H */ diff --git a/tenders/common/mft.c b/tenders/common/mft.c index f2d8f237b..a80d75b8e 100644 --- a/tenders/common/mft.c +++ b/tenders/common/mft.c @@ -49,8 +49,8 @@ int mft_validate(const struct mft *mft, size_t mft_size) * If you are debugging this and it does not match up, the most likely * cause is an internal structure alignment issue (see mft_abi.h). */ - if (mft_size != (sizeof(struct mft) + - (mft->entries * sizeof(struct mft_entry)))) + if (mft_size != + (sizeof(struct mft) + (mft->entries * sizeof(struct mft_entry)))) return -1; /* * The manifest must contain at least one entry, and the first entry must @@ -77,14 +77,14 @@ int mft_validate(const struct mft *mft, size_t mft_size) * uninitialised). */ if (mft->e[i].attached != false) - return -1; + return -1; } return 0; } void mft_get_builtin_mft1(const struct mft1_note *note, - const struct mft **out_mft, size_t *out_mft_size) + const struct mft **out_mft, size_t *out_mft_size) { /* * Get the built-in manifest out of the ELF NOTE. Note that the size must @@ -92,15 +92,15 @@ void mft_get_builtin_mft1(const struct mft1_note *note, */ *out_mft = ¬e->m; *out_mft_size = note->h.n_descsz - - (offsetof(struct mft1_note, m) - sizeof (struct mft1_nhdr)); + (offsetof(struct mft1_note, m) - sizeof(struct mft1_nhdr)); } struct mft_entry *_mft_get_by_name(const struct mft *mft, const char *name, - mft_type_t type, unsigned *index) + mft_type_t type, unsigned *index) { for (unsigned i = 0; i != mft->entries; i++) { - if (mft->e[i].type == type - && strncmp(mft->e[i].name, name, MFT_NAME_SIZE) == 0) { + if (mft->e[i].type == type && + strncmp(mft->e[i].name, name, MFT_NAME_SIZE) == 0) { if (index != NULL) *index = i; return (struct mft_entry *)(uintptr_t)&mft->e[i]; @@ -110,7 +110,7 @@ struct mft_entry *_mft_get_by_name(const struct mft *mft, const char *name, } struct mft_entry *_mft_get_by_index(const struct mft *mft, unsigned index, - mft_type_t type) + mft_type_t type) { if (index >= mft->entries) return NULL; @@ -122,17 +122,17 @@ struct mft_entry *_mft_get_by_index(const struct mft *mft, unsigned index, const char *mft_type_to_string(mft_type_t type) { - switch(type) { - case MFT_DEV_BLOCK_BASIC: - return "BLOCK_BASIC"; - case MFT_DEV_NET_BASIC: - return "NET_BASIC"; - case MFT_RESERVED_FIRST: - return "RESERVED_FIRST"; - default: - /* This is used only to pretty print the content of the manifest so - a generic error is probably good enough, if only partially - informative */ - return ""; + switch (type) { + case MFT_DEV_BLOCK_BASIC: + return "BLOCK_BASIC"; + case MFT_DEV_NET_BASIC: + return "NET_BASIC"; + case MFT_RESERVED_FIRST: + return "RESERVED_FIRST"; + default: + /* This is used only to pretty print the content of the manifest so + a generic error is probably good enough, if only partially + informative */ + return ""; } } diff --git a/tenders/common/mft.h b/tenders/common/mft.h index 972789509..6762011b4 100644 --- a/tenders/common/mft.h +++ b/tenders/common/mft.h @@ -47,10 +47,8 @@ int mft_validate(const struct mft *mft, size_t mft_size); * - https://inbox.sourceware.org/libc-alpha/mvm5x8wpsmi.fsf@suse.de/T/ * - and https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2973.pdf */ -#define __const_generic(PTR, CTYPE, CALL) \ - _Generic (0 ? (PTR) : (void *) 1, \ - const void *: (CTYPE) (CALL), \ - void *: (CALL)) +#define __const_generic(PTR, CTYPE, CALL) \ + _Generic(0 ? (PTR) : (void *)1, const void *: (CTYPE)(CALL), void *: (CALL)) /* * Given the address of a MFT1 ELF note at (note), returns the address of the @@ -64,7 +62,7 @@ int mft_validate(const struct mft *mft, size_t mft_size); * the returned (*out_mft). */ void mft_get_builtin_mft1(const struct mft1_note *note, - const struct mft **out_mft, size_t *out_mft_size); + const struct mft **out_mft, size_t *out_mft_size); /* * Return the manifest entry matching (name), of type (type), or NULL if none @@ -72,10 +70,10 @@ void mft_get_builtin_mft1(const struct mft1_note *note, * (*index). */ struct mft_entry *_mft_get_by_name(const struct mft *mft, const char *name, - mft_type_t type, unsigned *index); + mft_type_t type, unsigned *index); -#define mft_get_by_name(X, N, T, I) \ - __const_generic(X, const struct mft_entry *, _mft_get_by_name(X, N, T, I)) +#define mft_get_by_name(X, N, T, I) \ + __const_generic(X, const struct mft_entry *, _mft_get_by_name(X, N, T, I)) /* * Return the manifest entry at (index), of type (type), or NULL if the entry @@ -83,10 +81,10 @@ struct mft_entry *_mft_get_by_name(const struct mft *mft, const char *name, */ struct mft_entry *_mft_get_by_index(const struct mft *mft, unsigned index, - mft_type_t type); + mft_type_t type); -#define mft_get_by_index(X, I, T) \ - __const_generic(X, const struct mft_entry *, _mft_get_by_index(X, I, T)) +#define mft_get_by_index(X, I, T) \ + __const_generic(X, const struct mft_entry *, _mft_get_by_index(X, I, T)) /* * Return a string representation of (type). diff --git a/tenders/common/tap_attach.c b/tenders/common/tap_attach.c index 119ba32ea..7b932d6a7 100644 --- a/tenders/common/tap_attach.c +++ b/tenders/common/tap_attach.c @@ -83,8 +83,7 @@ int tap_attach(const char *ifname, int *mtu) return -1; return fd; - } - else if (strlen(ifname) >= IFNAMSIZ) { + } else if (strlen(ifname) >= IFNAMSIZ) { errno = ENAMETOOLONG; return -1; } @@ -167,7 +166,7 @@ int tap_attach(const char *ifname, int *mtu) * is only up once open() was called by the process. */ if (!up) - ; + ; char devname[strlen(ifname) + 6]; diff --git a/tenders/hvt/hvt.h b/tenders/hvt/hvt.h index 6b0cb73d3..86e9f48d2 100644 --- a/tenders/hvt/hvt.h +++ b/tenders/hvt/hvt.h @@ -64,20 +64,19 @@ struct hvt { * Check that (gpa) and (gpa + sz) are within guest memory. Returns a host-side * pointer to (gpa) if successful, aborts if not. */ -#define HVT_CHECKED_GPA_P(hvt, gpa, sz) \ +#define HVT_CHECKED_GPA_P(hvt, gpa, sz) \ hvt_checked_gpa_p((hvt), (gpa), (sz), __FILE__, __LINE__) inline void *hvt_checked_gpa_p(struct hvt *hvt, hvt_gpa_t gpa, size_t sz, - const char *file, int line) + const char *file, int line) { hvt_gpa_t r; if ((gpa >= hvt->mem_size) || add_overflow(gpa, sz, r) || - (r >= hvt->mem_size)) { - errx(1, "%s:%d: Invalid guest access: gpa=0x%" PRIx64 ", sz=%zu", - file, line, gpa, sz); - } - else { + (r >= hvt->mem_size)) { + errx(1, "%s:%d: Invalid guest access: gpa=0x%" PRIx64 ", sz=%zu", file, + line, gpa, sz); + } else { return (void *)(hvt->mem + gpa); } } @@ -105,14 +104,14 @@ void hvt_vcpu_init(struct hvt *hvt, hvt_gpa_t gpa_ep); * The manifest provided will be *copied* into guest memory. */ void hvt_boot_info_init(struct hvt *hvt, hvt_gpa_t gpa_kend, int cmdline_argc, - char **cmdline_argv, struct mft *mft, size_t mft_size); + char **cmdline_argv, struct mft *mft, size_t mft_size); /* * Apply page protections to guest memory. See guest_mprotect_fn_t in elf.h for * a full description. */ int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, - int prot); + int prot); #if HVT_DROP_PRIVILEGES /* @@ -191,13 +190,10 @@ struct hvt_module { * Note that alignment of the struct is explicitly set, otherwise the linker * will pick a default that does not match the compiler's alignment. */ -#define DECLARE_MODULE(module_name, ...) \ - static struct hvt_module __module_ ##module_name \ - __attribute((section("modules"), aligned(8))) \ - __attribute((used)) = { \ - .name = #module_name, \ - .ops = { __VA_ARGS__ } \ - }; +#define DECLARE_MODULE(module_name, ...) \ + static struct hvt_module __module_##module_name \ + __attribute((section("modules"), aligned(8))) \ + __attribute((used)) = {.name = #module_name, .ops = {__VA_ARGS__}}; /* * GDB specific functions to be implemented on all backends for all @@ -248,7 +244,7 @@ int hvt_gdb_read_last_signal(struct hvt *hvt, int *signal); * Returns 0 if success, -1 otherwise. */ int hvt_gdb_add_breakpoint(struct hvt *hvt, gdb_breakpoint_type type, - hvt_gpa_t addr, size_t len); + hvt_gpa_t addr, size_t len); /* * Remove a breakpoint of type software or hardware, at address addr. len is @@ -256,6 +252,6 @@ int hvt_gdb_add_breakpoint(struct hvt *hvt, gdb_breakpoint_type type, * Returns 0 if success, -1 otherwise. */ int hvt_gdb_remove_breakpoint(struct hvt *hvt, gdb_breakpoint_type type, - hvt_gpa_t addr, size_t len); + hvt_gpa_t addr, size_t len); #endif /* HVT_H */ diff --git a/tenders/hvt/hvt_boot_info.c b/tenders/hvt/hvt_boot_info.c index 84788843e..8ab58a021 100644 --- a/tenders/hvt/hvt_boot_info.c +++ b/tenders/hvt/hvt_boot_info.c @@ -38,10 +38,10 @@ static void setup_cmdline(uint8_t *cmdline, int argc, char **argv) for (; *argv; argc--, argv++) { size_t alen = snprintf((char *)cmdline, cmdline_free, "%s%s", *argv, - (argc > 1) ? " " : ""); + (argc > 1) ? " " : ""); if (alen >= cmdline_free) { errx(1, "Guest command line too long (max=%d characters)", - HVT_CMDLINE_SIZE - 1); + HVT_CMDLINE_SIZE - 1); break; } cmdline_free -= alen; @@ -50,7 +50,7 @@ static void setup_cmdline(uint8_t *cmdline, int argc, char **argv) } void hvt_boot_info_init(struct hvt *hvt, hvt_gpa_t gpa_kend, int cmdline_argc, - char **cmdline_argv, struct mft *mft, size_t mft_size) + char **cmdline_argv, struct mft *mft, size_t mft_size) { assert(hvt->cpu_boot_info_base); assert(hvt->cpu_cycle_freq); @@ -59,9 +59,8 @@ void hvt_boot_info_init(struct hvt *hvt, hvt_gpa_t gpa_kend, int cmdline_argc, /* * Start with (struct hvt_boot_info) itself. */ - struct hvt_boot_info *bi = - (struct hvt_boot_info *)(hvt->mem + lowmem_pos); - lowmem_pos += sizeof (struct hvt_boot_info); + struct hvt_boot_info *bi = (struct hvt_boot_info *)(hvt->mem + lowmem_pos); + lowmem_pos += sizeof(struct hvt_boot_info); bi->mem_size = hvt->mem_size; bi->kernel_end = gpa_kend; bi->cpu_cycle_freq = hvt->cpu_cycle_freq; diff --git a/tenders/hvt/hvt_core.c b/tenders/hvt/hvt_core.c index cc1471b35..e15015605 100644 --- a/tenders/hvt/hvt_core.c +++ b/tenders/hvt/hvt_core.c @@ -56,7 +56,7 @@ #include "hvt.h" -hvt_hypercall_fn_t hvt_core_hypercalls[HVT_HYPERCALL_MAX] = { 0 }; +hvt_hypercall_fn_t hvt_core_hypercalls[HVT_HYPERCALL_MAX] = {0}; int hvt_core_register_hypercall(int nr, hvt_hypercall_fn_t fn) { @@ -88,7 +88,7 @@ int hvt_core_hypercall_halt(struct hvt *hvt, hvt_gpa_t gpa) void *cookie; int idx; struct hvt_hc_halt *t = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_halt)); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_halt)); /* * If the guest set a non-NULL cookie (non-zero before conversion), verify @@ -110,7 +110,7 @@ int hvt_core_hypercall_halt(struct hvt *hvt, hvt_gpa_t gpa) } #define NUM_MODULES 8 -hvt_vmexit_fn_t hvt_core_vmexits[NUM_MODULES + 1] = { 0 }; +hvt_vmexit_fn_t hvt_core_vmexits[NUM_MODULES + 1] = {0}; static int nvmexits = 0; int hvt_core_register_vmexit(hvt_vmexit_fn_t fn) @@ -126,7 +126,7 @@ int hvt_core_register_vmexit(hvt_vmexit_fn_t fn) static void hypercall_walltime(struct hvt *hvt, hvt_gpa_t gpa) { struct hvt_hc_walltime *t = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_walltime)); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_walltime)); struct timespec ts; int rc = clock_gettime(CLOCK_REALTIME, &ts); @@ -137,7 +137,7 @@ static void hypercall_walltime(struct hvt *hvt, hvt_gpa_t gpa) static void hypercall_puts(struct hvt *hvt, hvt_gpa_t gpa) { struct hvt_hc_puts *p = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_puts)); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_puts)); int rc = write(1, HVT_CHECKED_GPA_P(hvt, p->data, p->len), p->len); assert(rc >= 0); } @@ -204,7 +204,7 @@ int hvt_core_register_pollfd(int fd, uintptr_t waitset_data) static void hypercall_poll(struct hvt *hvt, hvt_gpa_t gpa) { struct hvt_hc_poll *t = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_poll)); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_poll)); #if defined(__linux__) /* @@ -218,12 +218,9 @@ static void hypercall_poll(struct hvt *hvt, hvt_gpa_t gpa) struct epoll_event revents[nevents]; struct itimerspec it = { - .it_interval = { 0 }, - .it_value = { - .tv_sec = t->timeout_nsecs / 1000000000ULL, - .tv_nsec = t->timeout_nsecs % 1000000000ULL - } - }; + .it_interval = {0}, + .it_value = {.tv_sec = t->timeout_nsecs / 1000000000ULL, + .tv_nsec = t->timeout_nsecs % 1000000000ULL}}; /* * Ensure that it.it_value is always non-zero, otherwise the following * epoll_wait() will hang if there are no other descriptors in the waitset @@ -243,7 +240,7 @@ static void hypercall_poll(struct hvt *hvt, hvt_gpa_t gpa) int orig_nrevents = nrevents; for (int i = 0; i < orig_nrevents; i++) if (revents[i].data.u64 == INTERNAL_TIMERFD) - nrevents -= 1; /* Disregard in total reported events */ + nrevents -= 1; /* Disregard in total reported events */ else ready_set |= (1ULL << revents[i].data.u64); } @@ -296,15 +293,13 @@ static int setup(struct hvt *hvt, struct mft *mft) setup_waitset(); assert(hvt_core_register_hypercall(HVT_HYPERCALL_WALLTIME, - hypercall_walltime) == 0); - assert(hvt_core_register_hypercall(HVT_HYPERCALL_PUTS, - hypercall_puts) == 0); - assert(hvt_core_register_hypercall(HVT_HYPERCALL_POLL, - hypercall_poll) == 0); + hypercall_walltime) == 0); + assert(hvt_core_register_hypercall(HVT_HYPERCALL_PUTS, hypercall_puts) == + 0); + assert(hvt_core_register_hypercall(HVT_HYPERCALL_POLL, hypercall_poll) == + 0); return 0; } -DECLARE_MODULE(core, - .setup = setup -) +DECLARE_MODULE(core, .setup = setup) diff --git a/tenders/hvt/hvt_cpu_aarch64.c b/tenders/hvt/hvt_cpu_aarch64.c index 5f9976782..1b41a8d71 100644 --- a/tenders/hvt/hvt_cpu_aarch64.c +++ b/tenders/hvt/hvt_cpu_aarch64.c @@ -52,7 +52,7 @@ void aarch64_setup_memory_mapping(uint8_t *mem, uint64_t mem_size) * Address above 4GB is using for MMIO space now. This would be changed * easily if the design of hvt_hypercall would be changed in the future. */ - assert((mem_size & (AARCH64_GUEST_BLOCK_SIZE -1)) == 0); + assert((mem_size & (AARCH64_GUEST_BLOCK_SIZE - 1)) == 0); assert(mem_size <= AARCH64_MMIO_BASE); assert(mem_size >= AARCH64_GUEST_BLOCK_SIZE); @@ -99,11 +99,10 @@ void aarch64_setup_memory_mapping(uint8_t *mem, uint64_t mem_size) /* RAM address should not exceed MMIO_BASE */ assert(paddr <= AARCH64_MMIO_BASE); - + /* Mapping MMIO */ pud += ((AARCH64_MMIO_BASE - paddr) >> PUD_SHIFT); - for (paddr = AARCH64_MMIO_BASE; - paddr < AARCH64_MMIO_BASE + AARCH64_MMIO_SZ; + for (paddr = AARCH64_MMIO_BASE; paddr < AARCH64_MMIO_BASE + AARCH64_MMIO_SZ; paddr += PUD_SIZE, pud++) *pud = paddr | PROT_SECT_DEVICE_nGnRE; @@ -111,16 +110,17 @@ void aarch64_setup_memory_mapping(uint8_t *mem, uint64_t mem_size) *pgd = AARCH64_PUD_PGT_BASE | PGT_DESC_TYPE_TABLE; } -void aarch64_mem_size(size_t *mem_size) { +void aarch64_mem_size(size_t *mem_size) +{ size_t mem; mem = (*mem_size / AARCH64_GUEST_BLOCK_SIZE) * AARCH64_GUEST_BLOCK_SIZE; - assert (mem <= *mem_size); + assert(mem <= *mem_size); if (mem == 0) mem = AARCH64_GUEST_BLOCK_SIZE; if (mem != *mem_size) warnx("adjusting memory to %zu bytes", mem); if (mem > AARCH64_MMIO_BASE) errx(1, "guest memory size %zu bytes exceeds the max size %lu bytes", - mem, AARCH64_MMIO_BASE); + mem, AARCH64_MMIO_BASE); *mem_size = mem; } diff --git a/tenders/hvt/hvt_cpu_aarch64.h b/tenders/hvt/hvt_cpu_aarch64.h index 74cee45f5..927047fe4 100644 --- a/tenders/hvt/hvt_cpu_aarch64.h +++ b/tenders/hvt/hvt_cpu_aarch64.h @@ -31,16 +31,16 @@ #ifndef _BITUL #ifdef __ASSEMBLY__ -#define _AC(X,Y) X -#define _AT(T,X) X +#define _AC(X, Y) X +#define _AT(T, X) X #else -#define __AC(X,Y) (X##Y) -#define _AC(X,Y) __AC(X,Y) -#define _AT(T,X) ((T)(X)) +#define __AC(X, Y) (X##Y) +#define _AC(X, Y) __AC(X, Y) +#define _AT(T, X) ((T)(X)) #endif -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) +#define _BITUL(x) (_AC(1, UL) << (x)) +#define _BITULL(x) (_AC(1, ULL) << (x)) #endif @@ -80,16 +80,14 @@ #define AARCH64_MMIO_BASE _AC(0x100000000, UL) #define AARCH64_MMIO_SZ _AC(0x40000000, UL) #define AARCH64_GUEST_BLOCK_SIZE _AC(0x200000, UL) -#define AARCH64_PGT_MAP_START AARCH64_BOOT_INFO +#define AARCH64_PGT_MAP_START AARCH64_BOOT_INFO -#define GENMASK32(h, l) \ - (((~0U) << (l)) & (~0U >> (31 - (h)))) -#define GENMASK64(h, l) \ - (((~0UL) << (l)) & (~0UL >> (63 - (h)))) +#define GENMASK32(h, l) (((~0U) << (l)) & (~0U >> (31 - (h)))) +#define GENMASK64(h, l) (((~0UL) << (l)) & (~0UL >> (63 - (h)))) /* Definitions of Page tables */ -#define PAGE_SHIFT 12 -#define PAGE_SIZE (1 << (PAGE_SHIFT)) +#define PAGE_SHIFT 12 +#define PAGE_SIZE (1 << (PAGE_SHIFT)) /* * Hardware page table definitions. @@ -103,42 +101,47 @@ /* * Bit definition for section type descriptor */ -#define SECT_VALID (_AC(1, UL) << 0) -#define SECT_USER (_AC(1, UL) << 6) /* AP[1] */ -#define SECT_RDONLY (_AC(1, UL) << 7) /* AP[2] */ -#define SECT_S (_AC(3, UL) << 8) -#define SECT_AF (_AC(1, UL) << 10) -#define SECT_NG (_AC(1, UL) << 11) -#define SECT_CONT (_AC(1, UL) << 52) -#define SECT_PXN (_AC(1, UL) << 53) -#define SECT_UXN (_AC(1, UL) << 54) +#define SECT_VALID (_AC(1, UL) << 0) +#define SECT_USER (_AC(1, UL) << 6) /* AP[1] */ +#define SECT_RDONLY (_AC(1, UL) << 7) /* AP[2] */ +#define SECT_S (_AC(3, UL) << 8) +#define SECT_AF (_AC(1, UL) << 10) +#define SECT_NG (_AC(1, UL) << 11) +#define SECT_CONT (_AC(1, UL) << 52) +#define SECT_PXN (_AC(1, UL) << 53) +#define SECT_UXN (_AC(1, UL) << 54) /* * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). */ -#define ATTRINDX(t) (_AC(t, UL) << 2) +#define ATTRINDX(t) (_AC(t, UL) << 2) /* Memory types available. */ -#define MT_DEVICE_nGnRnE 0 -#define MT_DEVICE_nGnRE 1 -#define MT_DEVICE_GRE 2 -#define MT_NORMAL_NC 3 -#define MT_NORMAL 4 -#define MT_NORMAL_WT 5 - -#define PROT_SECT_DEFAULT (PGT_DESC_TYPE_SECT | SECT_AF | SECT_S) -#define PROT_SECT_NORMAL (PROT_SECT_DEFAULT | SECT_PXN | SECT_UXN | ATTRINDX(MT_NORMAL)) -#define PROT_SECT_NORMAL_EXEC (PROT_SECT_DEFAULT | SECT_UXN | ATTRINDX(MT_NORMAL)) -#define PROT_SECT_DEVICE_nGnRE (PROT_SECT_DEFAULT | SECT_PXN | SECT_UXN | ATTRINDX(MT_DEVICE_nGnRE)) - -#define PROT_PAGE_DEFAULT (PGT_DESC_TYPE_PAGE | SECT_AF | SECT_S) -#define PROT_PAGE_DEFAULT_NORMAL (PROT_PAGE_DEFAULT | ATTRINDX(MT_NORMAL)) -#define PROT_PAGE_DEFAULT_DEVICE (PROT_PAGE_DEFAULT | ATTRINDX(MT_DEVICE_nGnRE)) -#define PROT_PAGE_NORMAL (PROT_PAGE_DEFAULT_NORMAL | SECT_PXN | SECT_UXN) -#define PROT_PAGE_NORMAL_RO (PROT_PAGE_DEFAULT_NORMAL | SECT_PXN | SECT_UXN | SECT_RDONLY) -#define PROT_PAGE_NORMAL_EXEC (PROT_PAGE_DEFAULT_NORMAL | SECT_UXN) -#define PROT_PAGE_NORMAL_EXEC_RO (PROT_PAGE_DEFAULT_NORMAL | SECT_UXN | SECT_RDONLY) -#define PROT_PAGE_DEVICE_nGnRE (PROT_PAGE_DEFAULT_DEVICE | SECT_PXN | SECT_UXN) +#define MT_DEVICE_nGnRnE 0 +#define MT_DEVICE_nGnRE 1 +#define MT_DEVICE_GRE 2 +#define MT_NORMAL_NC 3 +#define MT_NORMAL 4 +#define MT_NORMAL_WT 5 + +#define PROT_SECT_DEFAULT (PGT_DESC_TYPE_SECT | SECT_AF | SECT_S) +#define PROT_SECT_NORMAL \ + (PROT_SECT_DEFAULT | SECT_PXN | SECT_UXN | ATTRINDX(MT_NORMAL)) +#define PROT_SECT_NORMAL_EXEC \ + (PROT_SECT_DEFAULT | SECT_UXN | ATTRINDX(MT_NORMAL)) +#define PROT_SECT_DEVICE_nGnRE \ + (PROT_SECT_DEFAULT | SECT_PXN | SECT_UXN | ATTRINDX(MT_DEVICE_nGnRE)) + +#define PROT_PAGE_DEFAULT (PGT_DESC_TYPE_PAGE | SECT_AF | SECT_S) +#define PROT_PAGE_DEFAULT_NORMAL (PROT_PAGE_DEFAULT | ATTRINDX(MT_NORMAL)) +#define PROT_PAGE_DEFAULT_DEVICE (PROT_PAGE_DEFAULT | ATTRINDX(MT_DEVICE_nGnRE)) +#define PROT_PAGE_NORMAL (PROT_PAGE_DEFAULT_NORMAL | SECT_PXN | SECT_UXN) +#define PROT_PAGE_NORMAL_RO \ + (PROT_PAGE_DEFAULT_NORMAL | SECT_PXN | SECT_UXN | SECT_RDONLY) +#define PROT_PAGE_NORMAL_EXEC (PROT_PAGE_DEFAULT_NORMAL | SECT_UXN) +#define PROT_PAGE_NORMAL_EXEC_RO \ + (PROT_PAGE_DEFAULT_NORMAL | SECT_UXN | SECT_RDONLY) +#define PROT_PAGE_DEVICE_nGnRE (PROT_PAGE_DEFAULT_DEVICE | SECT_PXN | SECT_UXN) /* * Define the MMU transfer block size: @@ -147,15 +150,15 @@ * PMD entry size: 2MB -- Translation Level 2 * PTE entry size: 4KB -- Translation Level 3 */ -#define PGD_SHIFT 39 -#define PGD_SIZE (_AC(1, UL) << PGD_SHIFT) -#define PGD_MASK (~(PGD_SIZE-1)) -#define PUD_SHIFT 30 -#define PUD_SIZE (_AC(1, UL) << PUD_SHIFT) -#define PUD_MASK (~(PUD_SIZE-1)) -#define PMD_SHIFT 21 -#define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) -#define PMD_MASK (~(PMD_SIZE-1)) +#define PGD_SHIFT 39 +#define PGD_SIZE (_AC(1, UL) << PGD_SHIFT) +#define PGD_MASK (~(PGD_SIZE - 1)) +#define PUD_SHIFT 30 +#define PUD_SIZE (_AC(1, UL) << PUD_SHIFT) +#define PUD_MASK (~(PUD_SIZE - 1)) +#define PMD_SHIFT 21 +#define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) +#define PMD_MASK (~(PMD_SIZE - 1)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) diff --git a/tenders/hvt/hvt_cpu_x86_64.c b/tenders/hvt/hvt_cpu_x86_64.c index 0eee47314..b96200ff8 100644 --- a/tenders/hvt/hvt_cpu_x86_64.c +++ b/tenders/hvt/hvt_cpu_x86_64.c @@ -31,17 +31,18 @@ #include "hvt_cpu_x86_64.h" -void hvt_x86_mem_size(size_t *mem_size) { +void hvt_x86_mem_size(size_t *mem_size) +{ size_t mem; mem = (*mem_size / X86_GUEST_PAGE_SIZE) * X86_GUEST_PAGE_SIZE; - assert (mem <= *mem_size); + assert(mem <= *mem_size); if (mem == 0) mem = X86_GUEST_PAGE_SIZE; if (mem != *mem_size) warnx("adjusting memory to %zu bytes", mem); if (mem > X86_GUEST_MAX_MEM_SIZE) errx(1, "guest memory size %zu bytes exceeds the max size %zu bytes", - mem, X86_GUEST_MAX_MEM_SIZE); + mem, X86_GUEST_MAX_MEM_SIZE); *mem_size = mem; } @@ -96,14 +97,14 @@ void hvt_x86_setup_pagetables(uint8_t *mem, size_t mem_size) */ if (paddr < X86_PT0_MAP_START) continue; - /* - * Map the remainder of the pages below X86_GUEST_MIN_BASE as read-only; - * these are used for input from hvt to the guest only, with the rest - * reserved for future use. - */ + /* + * Map the remainder of the pages below X86_GUEST_MIN_BASE as read-only; + * these are used for input from hvt to the guest only, with the rest + * reserved for future use. + */ if (paddr < X86_GUEST_MIN_BASE) *pt0e = paddr | X86_PDPT_P; - else + else *pt0e = paddr | (X86_PDPT_P | X86_PDPT_RW); } assert(paddr == X86_GUEST_PAGE_SIZE); @@ -123,23 +124,27 @@ static struct x86_gdt_desc sreg_to_desc(const struct x86_sreg *sreg) * set, everything will work fine with no GDT until the guest attempts to * load a segment register. */ - uint32_t limit = (sreg->g) ? ((sreg->limit & 0xfffff000) >> 12) - : sreg->limit; - struct x86_gdt_desc desc = { - .base_lo = sreg->base & 0xffffff, - .base_hi = (sreg->base & 0xff000000) >> 24, - .limit_lo = limit & 0xffff, - .limit_hi = (limit & 0xf0000) >> 16, - .type = sreg->type, .s = sreg->s, .dpl = sreg->dpl, .p = sreg->p, - .avl = sreg->avl, .l = sreg->l, .db = sreg->db, .g = sreg->g - }; + uint32_t limit = + (sreg->g) ? ((sreg->limit & 0xfffff000) >> 12) : sreg->limit; + struct x86_gdt_desc desc = {.base_lo = sreg->base & 0xffffff, + .base_hi = (sreg->base & 0xff000000) >> 24, + .limit_lo = limit & 0xffff, + .limit_hi = (limit & 0xf0000) >> 16, + .type = sreg->type, + .s = sreg->s, + .dpl = sreg->dpl, + .p = sreg->p, + .avl = sreg->avl, + .l = sreg->l, + .db = sreg->db, + .g = sreg->g}; return desc; } void hvt_x86_setup_gdt(uint8_t *mem) { struct x86_gdt_desc *gdt = (struct x86_gdt_desc *)(mem + X86_GDT_BASE); - struct x86_gdt_desc null = { 0 }; + struct x86_gdt_desc null = {0}; gdt[X86_GDT_NULL] = null; gdt[X86_GDT_CODE] = sreg_to_desc(&hvt_x86_sreg_code); diff --git a/tenders/hvt/hvt_cpu_x86_64.h b/tenders/hvt/hvt_cpu_x86_64.h index 613aeb719..7897397aa 100644 --- a/tenders/hvt/hvt_cpu_x86_64.h +++ b/tenders/hvt/hvt_cpu_x86_64.h @@ -31,48 +31,48 @@ #ifndef _BITUL #ifdef __ASSEMBLY__ -#define _AC(X,Y) X -#define _AT(T,X) X +#define _AC(X, Y) X +#define _AT(T, X) X #else -#define __AC(X,Y) (X##Y) -#define _AC(X,Y) __AC(X,Y) -#define _AT(T,X) ((T)(X)) +#define __AC(X, Y) (X##Y) +#define _AC(X, Y) __AC(X, Y) +#define _AT(T, X) ((T)(X)) #endif -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) +#define _BITUL(x) (_AC(1, UL) << (x)) +#define _BITULL(x) (_AC(1, ULL) << (x)) #endif /* * Basic CPU control in CR0 */ -#define X86_CR0_PE_BIT 0 /* Protection Enable */ -#define X86_CR0_PE _BITUL(X86_CR0_PE_BIT) -#define X86_CR0_MP_BIT 1 /* Monitor Coprocessor */ -#define X86_CR0_MP _BITUL(X86_CR0_MP_BIT) -#define X86_CR0_EM_BIT 2 /* Emulation */ -#define X86_CR0_EM _BITUL(X86_CR0_EM_BIT) -#define X86_CR0_NE_BIT 5 /* Numeric Exception */ -#define X86_CR0_NE _BITUL(X86_CR0_NE_BIT) -#define X86_CR0_WP_BIT 16 /* Write Protect */ -#define X86_CR0_WP _BITUL(X86_CR0_WP_BIT) -#define X86_CR0_PG_BIT 31 /* Paging */ -#define X86_CR0_PG _BITUL(X86_CR0_PG_BIT) - -#define X86_CR0_INIT (X86_CR0_PE | X86_CR0_PG | X86_CR0_NE | X86_CR0_WP) +#define X86_CR0_PE_BIT 0 /* Protection Enable */ +#define X86_CR0_PE _BITUL(X86_CR0_PE_BIT) +#define X86_CR0_MP_BIT 1 /* Monitor Coprocessor */ +#define X86_CR0_MP _BITUL(X86_CR0_MP_BIT) +#define X86_CR0_EM_BIT 2 /* Emulation */ +#define X86_CR0_EM _BITUL(X86_CR0_EM_BIT) +#define X86_CR0_NE_BIT 5 /* Numeric Exception */ +#define X86_CR0_NE _BITUL(X86_CR0_NE_BIT) +#define X86_CR0_WP_BIT 16 /* Write Protect */ +#define X86_CR0_WP _BITUL(X86_CR0_WP_BIT) +#define X86_CR0_PG_BIT 31 /* Paging */ +#define X86_CR0_PG _BITUL(X86_CR0_PG_BIT) + +#define X86_CR0_INIT (X86_CR0_PE | X86_CR0_PG | X86_CR0_NE | X86_CR0_WP) /* * Intel CPU features in CR4 */ -#define X86_CR4_PAE_BIT 5 /* enable physical address extensions */ -#define X86_CR4_PAE _BITUL(X86_CR4_PAE_BIT) -#define X86_CR4_OSFXSR_BIT 9 /* OS support for FXSAVE/FXRSTOR */ -#define X86_CR4_OSFXSR _BITUL(X86_CR4_OSFXSR_BIT) -#define X86_CR4_OSXMMEXCPT_BIT 10 /* OS support for FP exceptions */ -#define X86_CR4_OSXMMEXCPT _BITUL(X86_CR4_OSXMMEXCPT_BIT) -#define X86_CR4_VMXE_BIT 13 /* VMX enabled */ -#define X86_CR4_VMXE _BITUL(X86_CR4_VMXE_BIT) +#define X86_CR4_PAE_BIT 5 /* enable physical address extensions */ +#define X86_CR4_PAE _BITUL(X86_CR4_PAE_BIT) +#define X86_CR4_OSFXSR_BIT 9 /* OS support for FXSAVE/FXRSTOR */ +#define X86_CR4_OSFXSR _BITUL(X86_CR4_OSFXSR_BIT) +#define X86_CR4_OSXMMEXCPT_BIT 10 /* OS support for FP exceptions */ +#define X86_CR4_OSXMMEXCPT _BITUL(X86_CR4_OSXMMEXCPT_BIT) +#define X86_CR4_VMXE_BIT 13 /* VMX enabled */ +#define X86_CR4_VMXE _BITUL(X86_CR4_VMXE_BIT) /* * Intel SDM section 24.8 "Restrictions on VMX Operation" seems to imply that @@ -80,55 +80,49 @@ * (but not FreeBSD vmm) does not like us setting this bit. Leave it cleared * for now and revisit later. */ -#define X86_CR4_INIT (X86_CR4_PAE | X86_CR4_OSFXSR | \ - X86_CR4_OSXMMEXCPT) +#define X86_CR4_INIT (X86_CR4_PAE | X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT) /* * Intel CPU features in EFER */ -#define X86_EFER_LME_BIT 8 /* Long mode enable (R/W) */ -#define X86_EFER_LME _BITUL(X86_EFER_LME_BIT) -#define X86_EFER_LMA_BIT 10 /* Long mode active (R/O) */ -#define X86_EFER_LMA _BITUL(X86_EFER_LMA_BIT) +#define X86_EFER_LME_BIT 8 /* Long mode enable (R/W) */ +#define X86_EFER_LME _BITUL(X86_EFER_LME_BIT) +#define X86_EFER_LMA_BIT 10 /* Long mode active (R/O) */ +#define X86_EFER_LMA _BITUL(X86_EFER_LMA_BIT) -#define X86_EFER_INIT (X86_EFER_LME | X86_EFER_LMA) +#define X86_EFER_INIT (X86_EFER_LME | X86_EFER_LMA) /* * Intel long mode page directory/table entries */ -#define X86_PDPT_P_BIT 0 /* Present */ -#define X86_PDPT_P _BITUL(X86_PDPT_P_BIT) -#define X86_PDPT_RW_BIT 1 /* Writable */ -#define X86_PDPT_RW _BITUL(X86_PDPT_RW_BIT) -#define X86_PDPT_PS_BIT 7 /* Page size */ -#define X86_PDPT_PS _BITUL(X86_PDPT_PS_BIT) +#define X86_PDPT_P_BIT 0 /* Present */ +#define X86_PDPT_P _BITUL(X86_PDPT_P_BIT) +#define X86_PDPT_RW_BIT 1 /* Writable */ +#define X86_PDPT_RW _BITUL(X86_PDPT_RW_BIT) +#define X86_PDPT_PS_BIT 7 /* Page size */ +#define X86_PDPT_PS _BITUL(X86_PDPT_PS_BIT) /* * x86 segment descriptor as seen by the CPU in the GDT. */ struct x86_gdt_desc { - uint64_t limit_lo:16; - uint64_t base_lo:24; - uint64_t type:4; - uint64_t s:1; - uint64_t dpl:2; - uint64_t p:1; - uint64_t limit_hi:4; - uint64_t avl:1; - uint64_t l:1; - uint64_t db:1; - uint64_t g:1; - uint64_t base_hi:8; + uint64_t limit_lo : 16; + uint64_t base_lo : 24; + uint64_t type : 4; + uint64_t s : 1; + uint64_t dpl : 2; + uint64_t p : 1; + uint64_t limit_hi : 4; + uint64_t avl : 1; + uint64_t l : 1; + uint64_t db : 1; + uint64_t g : 1; + uint64_t base_hi : 8; } __attribute__((packed)); -enum x86_gdt_selector { - X86_GDT_NULL, - X86_GDT_CODE, - X86_GDT_DATA, - X86_GDT_MAX -}; +enum x86_gdt_selector { X86_GDT_NULL, X86_GDT_CODE, X86_GDT_DATA, X86_GDT_MAX }; -#define X86_GDTR_LIMIT ((sizeof (struct x86_gdt_desc) * X86_GDT_MAX) - 1) +#define X86_GDTR_LIMIT ((sizeof(struct x86_gdt_desc) * X86_GDT_MAX) - 1) /* * Representation of an x86_64 shadow register (a.k.a. descriptor cache @@ -137,7 +131,7 @@ enum x86_gdt_selector { struct x86_sreg { uint16_t selector; uint64_t base; - uint32_t limit; /* NOTE: Value is always in bytes (!) */ + uint32_t limit; /* NOTE: Value is always in bytes (!) */ uint8_t type; uint8_t p, dpl, db, s, l, g, avl, unusable; }; @@ -145,8 +139,8 @@ struct x86_sreg { /* * Shadow register fields */ -#define X86_SREG_UNUSABLE_BIT 16 -#define X86_SREG_UNUSABLE _BITUL(X86_SREG_UNUSABLE_BIT) +#define X86_SREG_UNUSABLE_BIT 16 +#define X86_SREG_UNUSABLE _BITUL(X86_SREG_UNUSABLE_BIT) /* * Initial shadow register values @@ -161,30 +155,35 @@ static const struct x86_sreg hvt_x86_sreg_code = { .selector = X86_GDT_CODE, .base = 0, .limit = 0xffffffff, - .type = 9, /* Execute-only, accessed */ - .p = 1, .dpl = 0, .db = 0, .s = 1, .l = 1, .g = 1 -}; + .type = 9, /* Execute-only, accessed */ + .p = 1, + .dpl = 0, + .db = 0, + .s = 1, + .l = 1, + .g = 1}; static const struct x86_sreg hvt_x86_sreg_data = { .selector = X86_GDT_DATA, .base = 0, .limit = 0xffffffff, - .type = 3, /* Read-write, accessed */ - .p = 1, .dpl = 0, .db = 1, .s = 1, .l = 0, .g = 1 -}; - -static const struct x86_sreg hvt_x86_sreg_tr = { - .selector = X86_GDT_NULL, - .base = 0, - .limit = 0, - .type = 11, /* 64-bit TSS, busy */ - .p = 1 -}; - -static const struct x86_sreg hvt_x86_sreg_unusable = { - .selector = X86_GDT_NULL, - .unusable = 1 -}; + .type = 3, /* Read-write, accessed */ + .p = 1, + .dpl = 0, + .db = 1, + .s = 1, + .l = 0, + .g = 1}; + +static const struct x86_sreg hvt_x86_sreg_tr = {.selector = X86_GDT_NULL, + .base = 0, + .limit = 0, + .type = + 11, /* 64-bit TSS, busy */ + .p = 1}; + +static const struct x86_sreg hvt_x86_sreg_unusable = {.selector = X86_GDT_NULL, + .unusable = 1}; /* * Monitor memory map for x86 CPUs: @@ -192,35 +191,35 @@ static const struct x86_sreg hvt_x86_sreg_unusable = { * (unused) X86_ZEROPAGE_BASE 0x0 * (unused) X86_ZEROPAGE_SIZE 0x1000 */ -#define X86_GDT_BASE 0x1000 -#define X86_GDT_SIZE 0x1000 -#define X86_PML4_BASE 0x2000 -#define X86_PML4_SIZE 0x1000 -#define X86_PDPTE_BASE 0x3000 -#define X86_PDPTE_SIZE 0x1000 -#define X86_PDE_BASE 0x4000 +#define X86_GDT_BASE 0x1000 +#define X86_GDT_SIZE 0x1000 +#define X86_PML4_BASE 0x2000 +#define X86_PML4_SIZE 0x1000 +#define X86_PDPTE_BASE 0x3000 +#define X86_PDPTE_SIZE 0x1000 +#define X86_PDE_BASE 0x4000 /* 4 PDE entries of 0x1000 bytes each */ -#define X86_PDE_SIZE 0x4000 -#define X86_PT0E_BASE 0x8000 -#define X86_PTE_SIZE 0x1000 -#define X86_BOOT_INFO_BASE 0x10000 -#define X86_PT0_MAP_START X86_BOOT_INFO_BASE -#define X86_GUEST_MIN_BASE HVT_GUEST_MIN_BASE +#define X86_PDE_SIZE 0x4000 +#define X86_PT0E_BASE 0x8000 +#define X86_PTE_SIZE 0x1000 +#define X86_BOOT_INFO_BASE 0x10000 +#define X86_PT0_MAP_START X86_BOOT_INFO_BASE +#define X86_GUEST_MIN_BASE HVT_GUEST_MIN_BASE -#define X86_GUEST_PAGE_SIZE 0x200000UL +#define X86_GUEST_PAGE_SIZE 0x200000UL -#define X86_CR3_INIT X86_PML4_BASE +#define X86_CR3_INIT X86_PML4_BASE /* * Maximum guest allocation size; must fit in 4 PDE entries. */ -#define X86_GUEST_MAX_MEM_SIZE (2048UL * X86_GUEST_PAGE_SIZE) +#define X86_GUEST_MAX_MEM_SIZE (2048UL * X86_GUEST_PAGE_SIZE) /* * Initial RFLAGS value. Bit 1 is reserved and must be set. */ -#define X86_RFLAGS_INIT 0x2 +#define X86_RFLAGS_INIT 0x2 void hvt_x86_mem_size(size_t *mem_size); void hvt_x86_setup_pagetables(uint8_t *mem, size_t mem_size); diff --git a/tenders/hvt/hvt_dumpcore_freebsd_x86_64.c b/tenders/hvt/hvt_dumpcore_freebsd_x86_64.c index e782d368b..1a7f4c51a 100644 --- a/tenders/hvt/hvt_dumpcore_freebsd_x86_64.c +++ b/tenders/hvt/hvt_dumpcore_freebsd_x86_64.c @@ -36,14 +36,12 @@ size_t hvt_dumpcore_prstatus_size(void) { - return sizeof (prstatus_t); + return sizeof(prstatus_t); } static uint64_t vmm_get_reg(int vmfd, int reg) { - struct vm_register vmreg = { - .cpuid = 0, .regnum = reg - }; + struct vm_register vmreg = {.cpuid = 0, .regnum = reg}; if (ioctl(vmfd, VM_GET_REGISTER, &vmreg) == -1) err(1, "VM_GET_REGISTER (%d)", reg); @@ -54,7 +52,7 @@ int hvt_dumpcore_write_prstatus(int fd, struct hvt *hvt, void *cookie) { struct hvt_b *hvb = hvt->b; - prstatus_t prstatus = { 0 }; + prstatus_t prstatus = {0}; /* * Force version to (1), in case there's every a new version with more * required fields. We only fill out a minimum of the prstatus_t structure. @@ -63,8 +61,8 @@ int hvt_dumpcore_write_prstatus(int fd, struct hvt *hvt, void *cookie) * base system, however gdb from ports works fine. */ prstatus.pr_version = 1; - prstatus.pr_statussz = sizeof (prstatus_t); - prstatus.pr_gregsetsz = sizeof (gregset_t); + prstatus.pr_statussz = sizeof(prstatus_t); + prstatus.pr_gregsetsz = sizeof(gregset_t); /* * prstatus_t.pr_reg is actually a (struct reg) in disguise. @@ -116,8 +114,7 @@ int hvt_dumpcore_write_prstatus(int fd, struct hvt *hvt, void *cookie) if (nbytes < 0) { warn("dumpcore: Error writing prstatus"); return -1; - } - else if (nbytes != sizeof prstatus) { + } else if (nbytes != sizeof prstatus) { warnx("dumpcore: Short write() writing prstatus: %zd", nbytes); return -1; } diff --git a/tenders/hvt/hvt_dumpcore_kvm_x86_64.c b/tenders/hvt/hvt_dumpcore_kvm_x86_64.c index 190fe6f0a..ba59d1cf9 100644 --- a/tenders/hvt/hvt_dumpcore_kvm_x86_64.c +++ b/tenders/hvt/hvt_dumpcore_kvm_x86_64.c @@ -33,7 +33,7 @@ size_t hvt_dumpcore_prstatus_size(void) { - return sizeof (prstatus_t); + return sizeof(prstatus_t); } int hvt_dumpcore_write_prstatus(int fd, struct hvt *hvt, void *cookie) @@ -108,8 +108,7 @@ int hvt_dumpcore_write_prstatus(int fd, struct hvt *hvt, void *cookie) if (nbytes < 0) { warn("dumpcore: Error writing prstatus"); return -1; - } - else if (nbytes != sizeof prstatus) { + } else if (nbytes != sizeof prstatus) { warnx("dumpcore: Short write() writing prstatus: %zd", nbytes); return -1; } diff --git a/tenders/hvt/hvt_freebsd.c b/tenders/hvt/hvt_freebsd.c index 3ddbbc00c..107839498 100644 --- a/tenders/hvt/hvt_freebsd.c +++ b/tenders/hvt/hvt_freebsd.c @@ -70,12 +70,13 @@ static void cleanup_vm(void) { if (cleanup_hvt != NULL) { #if HVT_FREEBSD_ENABLE_CAPSICUM - cap_sysctlbyname(capsysctl, "hw.vmm.destroy", NULL, NULL, - cleanup_hvt->b->vmname, strlen(cleanup_hvt->b->vmname)); - cap_close(capsysctl); + cap_sysctlbyname(capsysctl, "hw.vmm.destroy", NULL, NULL, + cleanup_hvt->b->vmname, + strlen(cleanup_hvt->b->vmname)); + cap_close(capsysctl); #else - sysctlbyname("hw.vmm.destroy", NULL, NULL, cleanup_hvt->b->vmname, - strlen(cleanup_hvt->b->vmname)); + sysctlbyname("hw.vmm.destroy", NULL, NULL, cleanup_hvt->b->vmname, + strlen(cleanup_hvt->b->vmname)); #endif } } @@ -90,14 +91,14 @@ struct hvt *hvt_init(size_t mem_size) { int ret; - struct hvt *hvt = malloc(sizeof (struct hvt)); + struct hvt *hvt = malloc(sizeof(struct hvt)); if (hvt == NULL) err(1, "malloc"); - memset(hvt, 0, sizeof (struct hvt)); - struct hvt_b *hvb = malloc(sizeof (struct hvt_b)); + memset(hvt, 0, sizeof(struct hvt)); + struct hvt_b *hvb = malloc(sizeof(struct hvt_b)); if (hvb == NULL) err(1, "malloc"); - memset(hvb, 0, sizeof (struct hvt_b)); + memset(hvb, 0, sizeof(struct hvt_b)); hvt->b = hvb; hvb->vmfd = -1; @@ -119,40 +120,44 @@ struct hvt *hvt_init(size_t mem_size) err(1, "open(%s)", vmmdevname); atexit(cleanup_vmfd); - struct vm_capability vmcap = { - .cpuid = 0, .captype = VM_CAP_HALT_EXIT, .capval = 1 - }; + struct vm_capability vmcap = {.cpuid = 0, + .captype = VM_CAP_HALT_EXIT, + .capval = 1}; ret = ioctl(hvb->vmfd, VM_SET_CAPABILITY, &vmcap); if (ret == -1) err(1, "set VM_CAP_HALT_EXIT"); - struct vm_memseg memseg = { - .segid = 0, .len = mem_size - }; + struct vm_memseg memseg = {.segid = 0, .len = mem_size}; ret = ioctl(hvb->vmfd, VM_ALLOC_MEMSEG, &memseg); if (ret == -1) err(1, "VM_ALLOC_MEMSEG"); - struct vm_memmap memmap = { - .gpa = 0, .len = mem_size, .segid = 0, .segoff = 0, - .prot = PROT_READ | PROT_WRITE | PROT_EXEC, .flags = 0 - }; + struct vm_memmap memmap = {.gpa = 0, + .len = mem_size, + .segid = 0, + .segoff = 0, + .prot = PROT_READ | PROT_WRITE | PROT_EXEC, + .flags = 0}; ret = ioctl(hvb->vmfd, VM_MMAP_MEMSEG, &memmap); if (ret == -1) err(1, "VM_MMAP_MEMSEG"); - hvt->mem = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, - hvb->vmfd, 0); + hvt->mem = + mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, hvb->vmfd, 0); if (hvt->mem == MAP_FAILED) err(1, "mmap"); hvt->mem_size = mem_size; #if HVT_FREEBSD_ENABLE_CAPSICUM cap_rights_t rights; - const cap_ioctl_t cmds[] = { VM_RUN, VM_SET_CAPABILITY, VM_ALLOC_MEMSEG, - VM_MMAP_MEMSEG, VM_SET_SEGMENT_DESCRIPTOR, - VM_SET_REGISTER, VM_GET_REGISTER, - VM_ACTIVATE_CPU }; + const cap_ioctl_t cmds[] = {VM_RUN, + VM_SET_CAPABILITY, + VM_ALLOC_MEMSEG, + VM_MMAP_MEMSEG, + VM_SET_SEGMENT_DESCRIPTOR, + VM_SET_REGISTER, + VM_GET_REGISTER, + VM_ACTIVATE_CPU}; cap_rights_init(&rights, CAP_IOCTL, CAP_MMAP_RW); if (cap_rights_limit(hvb->vmfd, &rights) == -1) err(1, "cap_rights_limit() failed"); @@ -195,7 +200,7 @@ void hvt_drop_privileges() #endif int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, - int prot) + int prot) { struct hvt *hvt = t_arg; @@ -219,7 +224,7 @@ int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, * Manipulating guest-side (EPT) mappings is currently not supported by * FreeBSD vmm, so there is nothing more we can do. */ - if(prot & PROT_EXEC) { + if (prot & PROT_EXEC) { prot &= ~(PROT_EXEC); prot |= PROT_READ; } diff --git a/tenders/hvt/hvt_freebsd.h b/tenders/hvt/hvt_freebsd.h index 77e61a9a1..7e01eb6ee 100644 --- a/tenders/hvt/hvt_freebsd.h +++ b/tenders/hvt/hvt_freebsd.h @@ -25,8 +25,8 @@ #ifndef HVT_HV_FREEBSD_H #define HVT_HV_FREEBSD_H -#define VMM_USER "nobody" -#define VMM_CHROOT "/var/empty" +#define VMM_USER "nobody" +#define VMM_CHROOT "/var/empty" struct hvt_b { char *vmname; diff --git a/tenders/hvt/hvt_freebsd_x86_64.c b/tenders/hvt/hvt_freebsd_x86_64.c index d42c2b97e..ad1ebb8ed 100644 --- a/tenders/hvt/hvt_freebsd_x86_64.c +++ b/tenders/hvt/hvt_freebsd_x86_64.c @@ -45,21 +45,20 @@ #include "hvt_freebsd.h" #include "hvt_cpu_x86_64.h" -void hvt_mem_size(size_t *mem_size) { +void hvt_mem_size(size_t *mem_size) +{ hvt_x86_mem_size(mem_size); } static void vmm_set_desc(int vmfd, int reg, uint64_t base, uint32_t limit, - uint32_t access) + uint32_t access) { int ret; - struct vm_seg_desc vmsegdesc = { - .cpuid = 0, - .regnum = reg, - .desc.base = base, - .desc.limit = limit, - .desc.access = access - }; + struct vm_seg_desc vmsegdesc = {.cpuid = 0, + .regnum = reg, + .desc.base = base, + .desc.limit = limit, + .desc.access = access}; ret = ioctl(vmfd, VM_SET_SEGMENT_DESCRIPTOR, &vmsegdesc); if (ret == -1) @@ -68,9 +67,7 @@ static void vmm_set_desc(int vmfd, int reg, uint64_t base, uint32_t limit, static void vmm_set_reg(int vmfd, int reg, uint64_t val) { - struct vm_register vmreg = { - .cpuid = 0, .regnum = reg, .regval = val - }; + struct vm_register vmreg = {.cpuid = 0, .regnum = reg, .regval = val}; if (ioctl(vmfd, VM_SET_REGISTER, &vmreg) == -1) err(1, "VM_SET_REGISTER (%d)", reg); @@ -80,14 +77,10 @@ static void vmm_set_sreg(int vmfd, int reg, const struct x86_sreg *sreg) { uint64_t base = sreg->base; uint32_t limit = sreg->limit; - uint32_t access = (sreg->type - | (sreg->s << 4) - | (sreg->dpl << 5) - | (sreg->p << 7) - | (sreg->l << 13) - | (sreg->db << 14) - | (sreg->g << 15) - | (sreg->unusable << X86_SREG_UNUSABLE_BIT)); + uint32_t access = + (sreg->type | (sreg->s << 4) | (sreg->dpl << 5) | (sreg->p << 7) | + (sreg->l << 13) | (sreg->db << 14) | (sreg->g << 15) | + (sreg->unusable << X86_SREG_UNUSABLE_BIT)); vmm_set_desc(vmfd, reg, base, limit, access); vmm_set_reg(vmfd, reg, sreg->selector * 8); @@ -118,14 +111,14 @@ void hvt_vcpu_init(struct hvt *hvt, hvt_gpa_t gpa_ep) uint64_t cpu_cycle_freq; size_t outsz = sizeof cpu_cycle_freq; - int ret = sysctlbyname("machdep.tsc_freq", &cpu_cycle_freq, &outsz, NULL, - 0); + int ret = + sysctlbyname("machdep.tsc_freq", &cpu_cycle_freq, &outsz, NULL, 0); if (ret == -1) err(1, "sysctl(machdep.tsc_freq)"); int invariant_tsc = 0; outsz = sizeof invariant_tsc; ret = sysctlbyname("kern.timecounter.invariant_tsc", &invariant_tsc, &outsz, - NULL, 0); + NULL, 0); if (ret == -1) err(1, "sysctl(kern.timecounter.invariant_tsc"); if (invariant_tsc != 1) @@ -137,9 +130,7 @@ void hvt_vcpu_init(struct hvt *hvt, hvt_gpa_t gpa_ep) vmm_set_reg(hvb->vmfd, VM_REG_GUEST_RSP, hvt->mem_size - 8); vmm_set_reg(hvb->vmfd, VM_REG_GUEST_RDI, X86_BOOT_INFO_BASE); - struct vm_activate_cpu ac = { - .vcpuid = 0 - }; + struct vm_activate_cpu ac = {.vcpuid = 0}; ret = ioctl(hvb->vmfd, VM_ACTIVATE_CPU, &ac); if (ret == -1) err(1, "VM_ACTIVATE_CPU"); @@ -192,11 +183,12 @@ int hvt_vcpu_loop(struct hvt *hvt) case VM_EXITCODE_INOUT: { if (vme->u.inout.in || vme->u.inout.bytes != 4) errx(1, "Invalid guest port access: port=0x%x", - vme->u.inout.port); + vme->u.inout.port); if (vme->u.inout.port < HVT_HYPERCALL_PIO_BASE || - vme->u.inout.port >= (HVT_HYPERCALL_PIO_BASE + HVT_HYPERCALL_MAX)) + vme->u.inout.port >= + (HVT_HYPERCALL_PIO_BASE + HVT_HYPERCALL_MAX)) errx(1, "Invalid guest port access: port=0x%x", - vme->u.inout.port); + vme->u.inout.port); int nr = vme->u.inout.port - HVT_HYPERCALL_PIO_BASE; @@ -220,8 +212,8 @@ int hvt_vcpu_loop(struct hvt *hvt) * XXX: I've no idea what this actually means, so just do what * bhyve does. */ - assert(vme->inst_length == 0); - break; + assert(vme->inst_length == 0); + break; } case VM_EXITCODE_VMX: { @@ -231,7 +223,7 @@ int hvt_vcpu_loop(struct hvt *hvt) default: { errx(1, "unhandled exit: exitcode=%d, rip=0x%" PRIx64, - vme->exitcode, vme->rip); + vme->exitcode, vme->rip); } } /* switch(vme->exitcode) */ } diff --git a/tenders/hvt/hvt_gdb.h b/tenders/hvt/hvt_gdb.h index 17a828199..4e54d14e0 100644 --- a/tenders/hvt/hvt_gdb.h +++ b/tenders/hvt/hvt_gdb.h @@ -33,13 +33,13 @@ typedef enum _gdb_breakpoint_type { GDB_BREAKPOINT_MAX } gdb_breakpoint_type; -#define GDB_SIGNAL_FIRST 0 -#define GDB_SIGNAL_QUIT 3 -#define GDB_SIGNAL_KILL 9 -#define GDB_SIGNAL_TRAP 5 -#define GDB_SIGNAL_SEGV 11 -#define GDB_SIGNAL_TERM 15 -#define GDB_SIGNAL_IO 23 -#define GDB_SIGNAL_DEFAULT 144 +#define GDB_SIGNAL_FIRST 0 +#define GDB_SIGNAL_QUIT 3 +#define GDB_SIGNAL_KILL 9 +#define GDB_SIGNAL_TRAP 5 +#define GDB_SIGNAL_SEGV 11 +#define GDB_SIGNAL_TERM 15 +#define GDB_SIGNAL_IO 23 +#define GDB_SIGNAL_DEFAULT 144 #endif /* #ifndef HVT_GDB_H */ diff --git a/tenders/hvt/hvt_gdb_freebsd_x86_64.c b/tenders/hvt/hvt_gdb_freebsd_x86_64.c index b0012c73a..3b52db99a 100644 --- a/tenders/hvt/hvt_gdb_freebsd_x86_64.c +++ b/tenders/hvt/hvt_gdb_freebsd_x86_64.c @@ -42,16 +42,12 @@ int hvt_gdb_supported(void) return -1; } -int hvt_gdb_read_registers(struct hvt *hvt, - uint8_t *registers, - size_t *len) +int hvt_gdb_read_registers(struct hvt *hvt, uint8_t *registers, size_t *len) { return -1; } -int hvt_gdb_write_registers(struct hvt *hvt, - uint8_t *registers, - size_t len) +int hvt_gdb_write_registers(struct hvt *hvt, uint8_t *registers, size_t len) { return -1; } @@ -71,14 +67,14 @@ int hvt_gdb_read_last_signal(struct hvt *hvt, int *signal) return -1; } -int hvt_gdb_add_breakpoint(struct hvt *hvt, uint32_t type, - hvt_gpa_t addr, size_t len) +int hvt_gdb_add_breakpoint(struct hvt *hvt, uint32_t type, hvt_gpa_t addr, + size_t len) { return -1; } -int hvt_gdb_remove_breakpoint(struct hvt *hvt, uint32_t type, - hvt_gpa_t addr, size_t len) +int hvt_gdb_remove_breakpoint(struct hvt *hvt, uint32_t type, hvt_gpa_t addr, + size_t len) { return -1; } diff --git a/tenders/hvt/hvt_gdb_kvm_aarch64.c b/tenders/hvt/hvt_gdb_kvm_aarch64.c index af0a1c5ef..6836131b9 100644 --- a/tenders/hvt/hvt_gdb_kvm_aarch64.c +++ b/tenders/hvt/hvt_gdb_kvm_aarch64.c @@ -54,16 +54,12 @@ int hvt_gdb_supported(void) return -1; } -int hvt_gdb_read_registers(struct hvt *hvt, - uint8_t *registers, - size_t *len) +int hvt_gdb_read_registers(struct hvt *hvt, uint8_t *registers, size_t *len) { return -1; } -int hvt_gdb_write_registers(struct hvt *hvt, - uint8_t *registers, - size_t len) +int hvt_gdb_write_registers(struct hvt *hvt, uint8_t *registers, size_t len) { return -1; } @@ -84,13 +80,13 @@ int hvt_gdb_read_last_signal(struct hvt *hvt, int *signal) } int hvt_gdb_add_breakpoint(struct hvt *hvt, gdb_breakpoint_type type, - hvt_gpa_t addr, size_t len) + hvt_gpa_t addr, size_t len) { return -1; } int hvt_gdb_remove_breakpoint(struct hvt *hvt, gdb_breakpoint_type type, - hvt_gpa_t addr, size_t len) + hvt_gpa_t addr, size_t len) { return -1; } diff --git a/tenders/hvt/hvt_gdb_kvm_x86_64.c b/tenders/hvt/hvt_gdb_kvm_x86_64.c index 99958bf13..39971d922 100644 --- a/tenders/hvt/hvt_gdb_kvm_x86_64.c +++ b/tenders/hvt/hvt_gdb_kvm_x86_64.c @@ -67,7 +67,7 @@ static struct breakpoints_head sw_breakpoints; static struct breakpoints_head hw_breakpoints; /* The Intel SDM specifies that the DR7 has space for 4 breakpoints. */ -#define MAX_HW_BREAKPOINTS 4 +#define MAX_HW_BREAKPOINTS 4 static uint32_t nr_hw_breakpoints = 0; /* Stepping is disabled by default. */ @@ -75,9 +75,11 @@ static bool stepping = false; /* This is the trap instruction used for software breakpoints. */ static const uint8_t int3 = 0xcc; -static uint16_t to_fsave_tag(uint16_t fsw, uint8_t tag, const struct fpu_reg regs[FPU_REGS]); +static uint16_t to_fsave_tag(uint16_t fsw, uint8_t tag, + const struct fpu_reg regs[FPU_REGS]); -static int kvm_arch_insert_sw_breakpoint(struct hvt *hvt, struct breakpoint_t *bp) +static int kvm_arch_insert_sw_breakpoint(struct hvt *hvt, + struct breakpoint_t *bp) { /* The address check at the GDB server just returned an error if addr was * bad. HVT_CHECKED_GPA_P will panic if that's the case. */ @@ -93,7 +95,8 @@ static int kvm_arch_insert_sw_breakpoint(struct hvt *hvt, struct breakpoint_t *b return 0; } -static int kvm_arch_remove_sw_breakpoint(struct hvt *hvt, struct breakpoint_t *bp) +static int kvm_arch_remove_sw_breakpoint(struct hvt *hvt, + struct breakpoint_t *bp) { uint8_t *insn = HVT_CHECKED_GPA_P(hvt, bp->addr, bp->len); assert(*insn == int3); @@ -113,17 +116,17 @@ static int hvt_gdb_update_guest_debug(struct hvt *hvt) /* Break on data reads only. */ [GDB_WATCHPOINT_READ] = 0x2, /* Break on data reads or writes but not instruction fetches. */ - [GDB_WATCHPOINT_ACCESS] = 0x3 - }; - const uint8_t len_code[] = { - /* - * 00 — 1-byte length. - * 01 — 2-byte length. - * 10 — 8-byte length. - * 11 — 4-byte length. - */ - [1] = 0x0, [2] = 0x1, [4] = 0x3, [8] = 0x2 - }; + [GDB_WATCHPOINT_ACCESS] = 0x3}; + const uint8_t len_code[] = {/* + * 00 — 1-byte length. + * 01 — 2-byte length. + * 10 — 8-byte length. + * 11 — 4-byte length. + */ + [1] = 0x0, + [2] = 0x1, + [4] = 0x3, + [8] = 0x2}; int n = 0; if (stepping) @@ -139,15 +142,17 @@ static int hvt_gdb_update_guest_debug(struct hvt *hvt) * debug register. */ dbg.arch.debugreg[7] = 1 << 9; dbg.arch.debugreg[7] |= 1 << 10; - SLIST_FOREACH(bp, &hw_breakpoints, entries) { + SLIST_FOREACH(bp, &hw_breakpoints, entries) + { assert(bp->type != GDB_BREAKPOINT_SW); dbg.arch.debugreg[n] = bp->addr; /* global breakpointing */ dbg.arch.debugreg[7] |= (2 << (n * 2)); /* read/write fields */ - dbg.arch.debugreg[7] |= (type_code[bp->type] << (16 + n*4)); + dbg.arch.debugreg[7] |= (type_code[bp->type] << (16 + n * 4)); /* Length fields */ - dbg.arch.debugreg[7] |= ((uint32_t)len_code[bp->len] << (18 + n*4)); + dbg.arch.debugreg[7] |= + ((uint32_t)len_code[bp->len] << (18 + n * 4)); n++; } } @@ -161,13 +166,15 @@ static int hvt_gdb_update_guest_debug(struct hvt *hvt) return 0; } -static struct breakpoint_t *bp_list_find(gdb_breakpoint_type type, hvt_gpa_t addr, size_t len) +static struct breakpoint_t *bp_list_find(gdb_breakpoint_type type, + hvt_gpa_t addr, size_t len) { struct breakpoint_t *bp; switch (type) { case GDB_BREAKPOINT_SW: - SLIST_FOREACH(bp, &sw_breakpoints, entries) { + SLIST_FOREACH(bp, &sw_breakpoints, entries) + { if (bp->addr == addr && bp->len == len) return bp; } @@ -178,7 +185,8 @@ static struct breakpoint_t *bp_list_find(gdb_breakpoint_type type, hvt_gpa_t add case GDB_WATCHPOINT_READ: case GDB_WATCHPOINT_ACCESS: /* We only support hardware watchpoints. */ - SLIST_FOREACH(bp, &hw_breakpoints, entries) { + SLIST_FOREACH(bp, &hw_breakpoints, entries) + { if (bp->addr == addr && bp->len == len) return bp; } @@ -197,8 +205,7 @@ static struct breakpoint_t *bp_list_find(gdb_breakpoint_type type, hvt_gpa_t add * number of allowed hardware breakpoints (4). */ static struct breakpoint_t *bp_list_insert(gdb_breakpoint_type type, - hvt_gpa_t addr, - size_t len) + hvt_gpa_t addr, size_t len) { struct breakpoint_t *bp; @@ -208,7 +215,7 @@ static struct breakpoint_t *bp_list_insert(gdb_breakpoint_type type, return bp; } - bp = malloc(sizeof (struct breakpoint_t)); + bp = malloc(sizeof(struct breakpoint_t)); if (bp == NULL) return NULL; @@ -244,8 +251,7 @@ static struct breakpoint_t *bp_list_insert(gdb_breakpoint_type type, * Removes a breakpoint from the list of breakpoints. * Returns -1 if the breakpoint is not in the list. */ -static int bp_list_remove(gdb_breakpoint_type type, - hvt_gpa_t addr, size_t len) +static int bp_list_remove(gdb_breakpoint_type type, hvt_gpa_t addr, size_t len) { struct breakpoint_t *bp = NULL; @@ -285,14 +291,12 @@ int hvt_gdb_supported(void) return 0; } -int hvt_gdb_read_registers(struct hvt *hvt, - uint8_t *registers, - size_t *len) +int hvt_gdb_read_registers(struct hvt *hvt, uint8_t *registers, size_t *len) { struct kvm_regs kregs; struct kvm_sregs sregs; struct kvm_fpu fregs; - struct hvt_gdb_regs *gregs = (struct hvt_gdb_regs *) registers; + struct hvt_gdb_regs *gregs = (struct hvt_gdb_regs *)registers; int ret; if (*len < sizeof(struct hvt_gdb_regs)) @@ -350,13 +354,13 @@ int hvt_gdb_read_registers(struct hvt *hvt, // The following code is tricky. KVM provides FPU state as dumped by FXSAVE // x86 instruction, which has been available since Pentium 2/AMD K6. // GDB on the other hand has wire format hardcoded as given by FSAVE - // instruction, probably for some very stupid reason. Therefore, a conversion - // is required. - // This doesn't result in an exact FPU state that could be i.e. loaded back - // with KVM_SET_FPU, yet this still can be handful for debugging. + // instruction, probably for some very stupid reason. Therefore, a + // conversion is required. This doesn't result in an exact FPU state that + // could be i.e. loaded back with KVM_SET_FPU, yet this still can be handful + // for debugging. // Copy STx/MMx registers. - for(int i = 0; i < FPU_REGS; i++) { + for (int i = 0; i < FPU_REGS; i++) { memcpy(&gregs->st[i].data, fregs.fpr[i], sizeof(gregs->st[i].data)); } // Bottom 16 bits of these fields are reserved? @@ -366,9 +370,9 @@ int hvt_gdb_read_registers(struct hvt *hvt, gregs->ftag = to_fsave_tag(fregs.fsw, fregs.ftwx, gregs->st); gregs->fop = fregs.last_opcode; - // These fields are 8 and 24 bits for segment and offset respectively in x86, - // but in GDB wire protocol they all are 32 bits. Hence, sending as much info - // as we can here. + // These fields are 8 and 24 bits for segment and offset respectively in + // x86, but in GDB wire protocol they all are 32 bits. Hence, sending as + // much info as we can here. gregs->fiseg = (fregs.last_ip >> 32) & 0xffffffff; gregs->fioff = fregs.last_ip & 0xffffffff; gregs->foseg = (fregs.last_dp >> 32) & 0xffffffff; @@ -377,13 +381,11 @@ int hvt_gdb_read_registers(struct hvt *hvt, return 0; } -int hvt_gdb_write_registers(struct hvt *hvt, - uint8_t *registers, - size_t len) +int hvt_gdb_write_registers(struct hvt *hvt, uint8_t *registers, size_t len) { struct kvm_regs kregs; struct kvm_sregs sregs; - struct hvt_gdb_regs *gregs = (struct hvt_gdb_regs *) registers; + struct hvt_gdb_regs *gregs = (struct hvt_gdb_regs *)registers; int ret; /* Let's read all registers just in case we miss filling one of them. */ @@ -443,9 +445,8 @@ int hvt_gdb_write_registers(struct hvt *hvt, return 0; } -int hvt_gdb_add_breakpoint(struct hvt *hvt, - gdb_breakpoint_type type, - hvt_gpa_t addr, size_t len) +int hvt_gdb_add_breakpoint(struct hvt *hvt, gdb_breakpoint_type type, + hvt_gpa_t addr, size_t len) { struct breakpoint_t *bp; @@ -467,9 +468,8 @@ int hvt_gdb_add_breakpoint(struct hvt *hvt, return 0; } -int hvt_gdb_remove_breakpoint(struct hvt *hvt, - gdb_breakpoint_type type, - hvt_gpa_t addr, size_t len) +int hvt_gdb_remove_breakpoint(struct hvt *hvt, gdb_breakpoint_type type, + hvt_gpa_t addr, size_t len) { struct breakpoint_t *bp; @@ -544,46 +544,44 @@ int hvt_gdb_read_last_signal(struct hvt *hvt, int *signal) // Convert FXSAVE tag to full tag format from FSAVE. // This is what GDB expects in its wire protocol for some dumb reason. -static uint16_t to_fsave_tag(uint16_t fsw, uint8_t tag, const struct fpu_reg regs[FPU_REGS]) +static uint16_t to_fsave_tag(uint16_t fsw, uint8_t tag, + const struct fpu_reg regs[FPU_REGS]) { - int stack_top = (fsw >> 11) & 0x7; - - uint16_t fsave_tag = 0; - for (int phys_idx = 0; phys_idx < FPU_REGS; phys_idx++) { - bool fxsave_bit = (tag & (1 << phys_idx)) != 0; - uint8_t fsave_bits = 0; - - if (fxsave_bit) { - int st_idx = (phys_idx + FPU_REGS - stack_top) % FPU_REGS; - const unsigned char *st = regs[st_idx].data; - bool integer_bit = (st[7] & 0x80) != 0; - uint16_t exponent = ((st[9] & 0x7f) << 8) | st[8]; - uint64_t fraction = (((uint64_t)st[7] & 0x7f) << 56) - | ((uint64_t)st[6] << 48) - | ((uint64_t)st[5] << 40) - | ((uint64_t)st[4] << 32) - | ((uint64_t)st[3] << 24) - | ((uint64_t)st[2] << 16) - | ((uint64_t)st[1] << 8) - | (uint64_t)st[0]; - - if (exponent == 0x7fff) { - // Infinity, NaN, pseudo-infinity, or pseudo-NaN. - // Mostly the case for MMX values. - fsave_bits = 2; - } else if (exponent == 0) { - // J bit. - fsave_bits = !integer_bit && !fraction ? 1 : 2; - } else if (integer_bit) { - fsave_bits = 0; - } else { - fsave_bits = 1; - } - } else { - fsave_bits = 3; + int stack_top = (fsw >> 11) & 0x7; + + uint16_t fsave_tag = 0; + for (int phys_idx = 0; phys_idx < FPU_REGS; phys_idx++) { + bool fxsave_bit = (tag & (1 << phys_idx)) != 0; + uint8_t fsave_bits = 0; + + if (fxsave_bit) { + int st_idx = (phys_idx + FPU_REGS - stack_top) % FPU_REGS; + const unsigned char *st = regs[st_idx].data; + bool integer_bit = (st[7] & 0x80) != 0; + uint16_t exponent = ((st[9] & 0x7f) << 8) | st[8]; + uint64_t fraction = + (((uint64_t)st[7] & 0x7f) << 56) | ((uint64_t)st[6] << 48) | + ((uint64_t)st[5] << 40) | ((uint64_t)st[4] << 32) | + ((uint64_t)st[3] << 24) | ((uint64_t)st[2] << 16) | + ((uint64_t)st[1] << 8) | (uint64_t)st[0]; + + if (exponent == 0x7fff) { + // Infinity, NaN, pseudo-infinity, or pseudo-NaN. + // Mostly the case for MMX values. + fsave_bits = 2; + } else if (exponent == 0) { + // J bit. + fsave_bits = !integer_bit && !fraction ? 1 : 2; + } else if (integer_bit) { + fsave_bits = 0; + } else { + fsave_bits = 1; + } + } else { + fsave_bits = 3; + } + fsave_tag |= (fsave_bits << (phys_idx * 2)); } - fsave_tag |= (fsave_bits << (phys_idx * 2)); - } - return fsave_tag; + return fsave_tag; } diff --git a/tenders/hvt/hvt_gdb_openbsd_x86_64.c b/tenders/hvt/hvt_gdb_openbsd_x86_64.c index 96a591a8f..d49327d34 100644 --- a/tenders/hvt/hvt_gdb_openbsd_x86_64.c +++ b/tenders/hvt/hvt_gdb_openbsd_x86_64.c @@ -39,16 +39,12 @@ int hvt_gdb_supported(void) return -1; } -int hvt_gdb_read_registers(struct hvt *hvt, - uint8_t *registers, - size_t *len) +int hvt_gdb_read_registers(struct hvt *hvt, uint8_t *registers, size_t *len) { return -1; } -int hvt_gdb_write_registers(struct hvt *hvt, - uint8_t *registers, - size_t len) +int hvt_gdb_write_registers(struct hvt *hvt, uint8_t *registers, size_t len) { return -1; } @@ -68,14 +64,14 @@ int hvt_gdb_read_last_signal(struct hvt *hvt, int *signal) return -1; } -int hvt_gdb_add_breakpoint(struct hvt *hvt, uint32_t type, - hvt_gpa_t addr, size_t len) +int hvt_gdb_add_breakpoint(struct hvt *hvt, uint32_t type, hvt_gpa_t addr, + size_t len) { return -1; } -int hvt_gdb_remove_breakpoint(struct hvt *hvt, uint32_t type, - hvt_gpa_t addr, size_t len) +int hvt_gdb_remove_breakpoint(struct hvt *hvt, uint32_t type, hvt_gpa_t addr, + size_t len) { return -1; } diff --git a/tenders/hvt/hvt_gdb_x86_64.h b/tenders/hvt/hvt_gdb_x86_64.h index e3234507a..41b9db76c 100644 --- a/tenders/hvt/hvt_gdb_x86_64.h +++ b/tenders/hvt/hvt_gdb_x86_64.h @@ -32,7 +32,9 @@ // GDB expects FPU registers as 80 bit numbers, // but C doesn't have a type for this. -struct fpu_reg { unsigned char data[10]; } __attribute__((packed)); +struct fpu_reg { + unsigned char data[10]; +} __attribute__((packed)); #define FPU_REGS 8 diff --git a/tenders/hvt/hvt_kvm.c b/tenders/hvt/hvt_kvm.c index dc0afa098..cf83e5b74 100644 --- a/tenders/hvt/hvt_kvm.c +++ b/tenders/hvt/hvt_kvm.c @@ -40,14 +40,14 @@ struct hvt *hvt_init(size_t mem_size) { int ret; - struct hvt *hvt = malloc(sizeof (struct hvt)); + struct hvt *hvt = malloc(sizeof(struct hvt)); if (hvt == NULL) err(1, "malloc"); - memset(hvt, 0, sizeof (struct hvt)); - struct hvt_b *hvb = malloc(sizeof (struct hvt_b)); + memset(hvt, 0, sizeof(struct hvt)); + struct hvt_b *hvb = malloc(sizeof(struct hvt_b)); if (hvb == NULL) err(1, "malloc"); - memset(hvb, 0, sizeof (struct hvt_b)); + memset(hvb, 0, sizeof(struct hvt_b)); hvb->kvmfd = open("/dev/kvm", O_RDWR | O_CLOEXEC); if (hvb->kvmfd == -1) @@ -70,8 +70,7 @@ struct hvt *hvt_init(size_t mem_size) if (runsize < sizeof(*hvb->vcpurun)) errx(1, "KVM: invalid VCPU_MMAP_SIZE: %zd", runsize); hvb->vcpurun = - mmap(NULL, runsize, PROT_READ | PROT_WRITE, MAP_SHARED, hvb->vcpufd, - 0); + mmap(NULL, runsize, PROT_READ | PROT_WRITE, MAP_SHARED, hvb->vcpufd, 0); if (hvb->vcpurun == MAP_FAILED) err(1, "KVM: VCPU mmap failed"); @@ -82,7 +81,7 @@ struct hvt *hvt_init(size_t mem_size) if (ret != 1) errx(1, "KVM: host does not support KVM_CAP_USER_MEMORY"); hvt->mem = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_ANONYMOUS, -1, 0); + MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (hvt->mem == MAP_FAILED) err(1, "Error allocating guest memory"); hvt->mem_size = mem_size; @@ -125,7 +124,7 @@ void hvt_drop_privileges() #endif int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, - int prot) + int prot) { struct hvt *hvt = t_arg; @@ -149,7 +148,7 @@ int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, * KVM will propagate guest-side R/W protections to its EPT mappings, * guest-side X/NX protection is currently not supported by the hypervisor. */ - if(prot & PROT_EXEC) { + if (prot & PROT_EXEC) { prot &= ~(PROT_EXEC); prot |= PROT_READ; } diff --git a/tenders/hvt/hvt_kvm_aarch64.c b/tenders/hvt/hvt_kvm_aarch64.c index 355a86c38..10a333d04 100644 --- a/tenders/hvt/hvt_kvm_aarch64.c +++ b/tenders/hvt/hvt_kvm_aarch64.c @@ -47,115 +47,114 @@ */ /* Normal registers are mapped as coprocessor 16. */ -#define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT) +#define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT) -#define ARM64_CORE_REG(x) \ - (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \ - KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(x)) +#define ARM64_CORE_REG(x) \ + (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | \ + KVM_REG_ARM_CORE_REG(x)) /* Saved Program Status Register EL1 */ -#define SPSR_EL1 ARM64_CORE_REG(regs.pstate) +#define SPSR_EL1 ARM64_CORE_REG(regs.pstate) /* * Default PSTATE flags: * Mask Debug, Abort, IRQ and FIQ. Switch to EL1h mode */ -#define AARCH64_PSTATE_INIT \ - (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | \ - PSR_F_BIT | PSR_MODE_EL1h) +#define AARCH64_PSTATE_INIT \ + (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT | PSR_MODE_EL1h) /* PC Register */ -#define REG_PC ARM64_CORE_REG(regs.pc) +#define REG_PC ARM64_CORE_REG(regs.pc) /* Stack Pointer EL1 */ -#define SP_EL1 ARM64_CORE_REG(sp_el1) +#define SP_EL1 ARM64_CORE_REG(sp_el1) /* Generic Purpose register x0 */ -#define REG_X0 ARM64_CORE_REG(regs.regs[0]) +#define REG_X0 ARM64_CORE_REG(regs.regs[0]) /* Architectural Feature Access Control Register EL1 */ -#define CPACR_EL1 ARM64_SYS_REG(3, 0, 1, 0, 2) -#define _FPEN_NOTRAP 0x3 -#define _FPEN_SHIFT 20 -#define _FPEN_MASK GENMASK32(21, 20) +#define CPACR_EL1 ARM64_SYS_REG(3, 0, 1, 0, 2) +#define _FPEN_NOTRAP 0x3 +#define _FPEN_SHIFT 20 +#define _FPEN_MASK GENMASK32(21, 20) /* Memory Attribute Indirection Register EL1 */ -#define MAIR_EL1 ARM64_SYS_REG(3, 0, 10, 2, 0) +#define MAIR_EL1 ARM64_SYS_REG(3, 0, 10, 2, 0) -#define MAIR(attr, mt) (_AC(attr, UL) << ((mt) * 8)) +#define MAIR(attr, mt) (_AC(attr, UL) << ((mt) * 8)) -#define MAIR_EL1_INIT \ - MAIR(0x00, MT_DEVICE_nGnRnE) | MAIR(0x04, MT_DEVICE_nGnRE) | \ - MAIR(0x0C, MT_DEVICE_GRE) | MAIR(0x44, MT_NORMAL_NC) | \ +#define MAIR_EL1_INIT \ + MAIR(0x00, MT_DEVICE_nGnRnE) | MAIR(0x04, MT_DEVICE_nGnRE) | \ + MAIR(0x0C, MT_DEVICE_GRE) | MAIR(0x44, MT_NORMAL_NC) | \ MAIR(0xFF, MT_NORMAL) | MAIR(0xBB, MT_NORMAL_WT) /* Translation Control Register EL1 */ -#define TCR_EL1 ARM64_SYS_REG(3, 0, 2, 0, 2) +#define TCR_EL1 ARM64_SYS_REG(3, 0, 2, 0, 2) /* * TCR flags. */ -#define TCR_T0SZ_OFFSET 0 -#define TCR_T1SZ_OFFSET 16 -#define TCR_T0SZ(x) ((_AC(64, UL) - (x)) << TCR_T0SZ_OFFSET) -#define TCR_T1SZ(x) ((_AC(64, UL) - (x)) << TCR_T1SZ_OFFSET) -#define TCR_TxSZ(x) (TCR_T0SZ(x) | TCR_T1SZ(x)) - -#define TCR_IRGN0_SHIFT 8 -#define TCR_IRGN0_WBWA (_AC(1, UL) << TCR_IRGN0_SHIFT) -#define TCR_IRGN1_SHIFT 24 -#define TCR_IRGN1_WBWA (_AC(1, UL) << TCR_IRGN1_SHIFT) -#define TCR_IRGN_WBWA (TCR_IRGN0_WBWA | TCR_IRGN1_WBWA) - -#define TCR_ORGN0_SHIFT 10 -#define TCR_ORGN0_WBWA (_AC(1, UL) << TCR_ORGN0_SHIFT) -#define TCR_ORGN1_SHIFT 26 -#define TCR_ORGN1_WBWA (_AC(1, UL) << TCR_ORGN1_SHIFT) -#define TCR_ORGN_WBWA (TCR_ORGN0_WBWA | TCR_ORGN1_WBWA) - -#define TCR_SH0_SHIFT 12 -#define TCR_SH0_INNER (_AC(3, UL) << TCR_SH0_SHIFT) -#define TCR_SH1_SHIFT 28 -#define TCR_SH1_INNER (_AC(3, UL) << TCR_SH1_SHIFT) -#define TCR_SHARED (TCR_SH0_INNER | TCR_SH1_INNER) - -#define TCR_TG0_SHIFT 14 -#define TCR_TG0_4K (_AC(0, UL) << TCR_TG0_SHIFT) -#define TCR_TG1_SHIFT 30 -#define TCR_TG1_4K (_AC(2, UL) << TCR_TG1_SHIFT) - -#define TCR_ASID16 (_AC(1, UL) << 36) -#define TCR_TBI0 (_AC(1, UL) << 37) -#define TCR_IPS_1TB (_AC(2, UL) << 32) - -#define TCR_TG_FLAGS TCR_TG0_4K | TCR_TG1_4K -#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA +#define TCR_T0SZ_OFFSET 0 +#define TCR_T1SZ_OFFSET 16 +#define TCR_T0SZ(x) ((_AC(64, UL) - (x)) << TCR_T0SZ_OFFSET) +#define TCR_T1SZ(x) ((_AC(64, UL) - (x)) << TCR_T1SZ_OFFSET) +#define TCR_TxSZ(x) (TCR_T0SZ(x) | TCR_T1SZ(x)) + +#define TCR_IRGN0_SHIFT 8 +#define TCR_IRGN0_WBWA (_AC(1, UL) << TCR_IRGN0_SHIFT) +#define TCR_IRGN1_SHIFT 24 +#define TCR_IRGN1_WBWA (_AC(1, UL) << TCR_IRGN1_SHIFT) +#define TCR_IRGN_WBWA (TCR_IRGN0_WBWA | TCR_IRGN1_WBWA) + +#define TCR_ORGN0_SHIFT 10 +#define TCR_ORGN0_WBWA (_AC(1, UL) << TCR_ORGN0_SHIFT) +#define TCR_ORGN1_SHIFT 26 +#define TCR_ORGN1_WBWA (_AC(1, UL) << TCR_ORGN1_SHIFT) +#define TCR_ORGN_WBWA (TCR_ORGN0_WBWA | TCR_ORGN1_WBWA) + +#define TCR_SH0_SHIFT 12 +#define TCR_SH0_INNER (_AC(3, UL) << TCR_SH0_SHIFT) +#define TCR_SH1_SHIFT 28 +#define TCR_SH1_INNER (_AC(3, UL) << TCR_SH1_SHIFT) +#define TCR_SHARED (TCR_SH0_INNER | TCR_SH1_INNER) + +#define TCR_TG0_SHIFT 14 +#define TCR_TG0_4K (_AC(0, UL) << TCR_TG0_SHIFT) +#define TCR_TG1_SHIFT 30 +#define TCR_TG1_4K (_AC(2, UL) << TCR_TG1_SHIFT) + +#define TCR_ASID16 (_AC(1, UL) << 36) +#define TCR_TBI0 (_AC(1, UL) << 37) +#define TCR_IPS_1TB (_AC(2, UL) << 32) + +#define TCR_TG_FLAGS TCR_TG0_4K | TCR_TG1_4K +#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA /* * We will do 1:1 VA to PA Mapping, so we define the same address size * for VA and PA. 1TB size for Virtual and Physical Address Space. */ -#define VA_BITS 40 -#define VA_SIZE (_AC(1, UL) << VA_BITS) -#define PA_SIZE (_AC(1, UL) << VA_BITS) +#define VA_BITS 40 +#define VA_SIZE (_AC(1, UL) << VA_BITS) +#define PA_SIZE (_AC(1, UL) << VA_BITS) -#define TCR_EL1_INIT \ - TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SHARED | \ - TCR_TG_FLAGS | TCR_ASID16 | TCR_TBI0 | TCR_IPS_1TB +#define TCR_EL1_INIT \ + TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SHARED | TCR_TG_FLAGS | \ + TCR_ASID16 | TCR_TBI0 | TCR_IPS_1TB /* Translation Table Base Register 0 EL1 */ -#define TTBR0_EL1 ARM64_SYS_REG(3, 0, 2, 0, 0) +#define TTBR0_EL1 ARM64_SYS_REG(3, 0, 2, 0, 0) /* System Control Register EL1 */ -#define SCTLR_EL1 ARM64_SYS_REG(3, 0, 1, 0, 0) -#define _SCTLR_M _BITUL(0) -#define _SCTLR_C _BITUL(2) -#define _SCTLR_I _BITUL(12) +#define SCTLR_EL1 ARM64_SYS_REG(3, 0, 1, 0, 0) +#define _SCTLR_M _BITUL(0) +#define _SCTLR_C _BITUL(2) +#define _SCTLR_I _BITUL(12) static int aarch64_set_one_register(int vcpufd, uint64_t id, uint64_t data) { struct kvm_one_reg one_reg = { - .id = id, + .id = id, .addr = (uint64_t)&data, }; @@ -165,7 +164,7 @@ static int aarch64_set_one_register(int vcpufd, uint64_t id, uint64_t data) static int aarch64_get_one_register(int vcpufd, uint64_t id, uint64_t *pdata) { struct kvm_one_reg one_reg = { - .id = id, + .id = id, .addr = (uint64_t)pdata, }; @@ -180,13 +179,14 @@ static void aarch64_enable_guest_float(int vcpufd) /* Enable the floating-point and Advanced SIMD registers for Guest */ ret = aarch64_get_one_register(vcpufd, CPACR_EL1, &data); if (ret == -1) - err(1, "KVM: Get Architectural Feature Access Control Register failed"); + err(1, "KVM: Get Architectural Feature Access Control Register failed"); data &= ~(_FPEN_MASK); data |= (_FPEN_NOTRAP << _FPEN_SHIFT); ret = aarch64_set_one_register(vcpufd, CPACR_EL1, data); if (ret == -1) - err(1, "KVM: Enable the floating-point and Advanced SIMD for Guest failed"); + err(1, "KVM: Enable the floating-point and Advanced SIMD for Guest " + "failed"); } static void aarch64_setup_preferred_target(int vmfd, int vcpufd) @@ -207,7 +207,7 @@ static uint64_t aarch64_get_counter_frequency(void) { uint64_t frq; - __asm__ __volatile__("mrs %0, cntfrq_el0" : "=r" (frq):: "memory"); + __asm__ __volatile__("mrs %0, cntfrq_el0" : "=r"(frq)::"memory"); return frq; } @@ -224,13 +224,13 @@ static void aarch64_enable_guest_mmu(int vcpufd) data = MAIR_EL1_INIT; ret = aarch64_set_one_register(vcpufd, MAIR_EL1, data); if (ret == -1) - err(1, "KVM: Setup Memory Attribute Indirection Register failed"); + err(1, "KVM: Setup Memory Attribute Indirection Register failed"); /* Setup Translation Control Register EL1 */ data = TCR_EL1_INIT; ret = aarch64_set_one_register(vcpufd, TCR_EL1, data); if (ret == -1) - err(1, "KVM: Setup Translation Control Register EL1 failed"); + err(1, "KVM: Setup Translation Control Register EL1 failed"); /* * Setup Translation Table Base Register 0 EL1. The translation range @@ -239,13 +239,13 @@ static void aarch64_enable_guest_mmu(int vcpufd) data = AARCH64_PGD_PGT_BASE; ret = aarch64_set_one_register(vcpufd, TTBR0_EL1, data); if (ret == -1) - err(1, "KVM: Translation Table Base Register 0 EL1 failed"); + err(1, "KVM: Translation Table Base Register 0 EL1 failed"); /* Enable MMU and I/D Cache for EL1 */ data = (_SCTLR_M | _SCTLR_C | _SCTLR_I); ret = aarch64_set_one_register(vcpufd, SCTLR_EL1, data); if (ret == -1) - err(1, "KVM: Setup System Control Register EL1 failed"); + err(1, "KVM: Setup System Control Register EL1 failed"); } /* @@ -254,26 +254,23 @@ static void aarch64_enable_guest_mmu(int vcpufd) * Arguments to the kernel main are passed using the ARM64 calling * convention: x0 ~ x7 */ -static void aarch64_setup_core_registers(struct hvt *hvt, - hvt_gpa_t gpa_ep) +static void aarch64_setup_core_registers(struct hvt *hvt, hvt_gpa_t gpa_ep) { int ret; struct hvt_b *hvb = hvt->b; /* Set default PSTATE flags to SPSR_EL1 */ - ret = aarch64_set_one_register(hvb->vcpufd, SPSR_EL1, - AARCH64_PSTATE_INIT); + ret = aarch64_set_one_register(hvb->vcpufd, SPSR_EL1, AARCH64_PSTATE_INIT); if (ret == -1) - err(1, "Initialize spsr[EL1] failed!\n"); + err(1, "Initialize spsr[EL1] failed!\n"); /* * Set Stack Poniter for Guest. ARM64 require stack be 16-bytes * alignment by default. */ - ret = aarch64_set_one_register(hvb->vcpufd, SP_EL1, - hvt->mem_size - 16); + ret = aarch64_set_one_register(hvb->vcpufd, SP_EL1, hvt->mem_size - 16); if (ret == -1) - err(1, "Initialize sp[EL1] failed!\n"); + err(1, "Initialize sp[EL1] failed!\n"); /* * KVM on aarch64 doesn't support KVM_CAP_GET_TSC_KHZ. But we can use @@ -285,13 +282,13 @@ static void aarch64_setup_core_registers(struct hvt *hvt, /* Passing hvt_boot_info through x0 */ ret = aarch64_set_one_register(hvb->vcpufd, REG_X0, AARCH64_BOOT_INFO); if (ret == -1) - err(1, "Set boot info to x0 failed!\n"); + err(1, "Set boot info to x0 failed!\n"); hvt->cpu_boot_info_base = AARCH64_BOOT_INFO; /* Set guest reset PC entry here */ ret = aarch64_set_one_register(hvb->vcpufd, REG_PC, gpa_ep); if (ret == -1) - err(1, "Set guest reset entry to PC failed!\n"); + err(1, "Set guest reset entry to PC failed!\n"); } void hvt_vcpu_init(struct hvt *hvt, hvt_gpa_t gpa_ep) @@ -337,8 +334,7 @@ int hvt_vcpu_loop(struct hvt *hvt) if (ret == -1) err(1, "KVM: Dump PC failed after guest fault"); errx(1, "KVM: host/guest translation fault: pc=0x%lx", pc); - } - else + } else err(1, "KVM: ioctl (RUN) failed"); } @@ -353,11 +349,13 @@ int hvt_vcpu_loop(struct hvt *hvt) switch (run->exit_reason) { case KVM_EXIT_MMIO: { if (!run->mmio.is_write || run->mmio.len != 4) - errx(1, "Invalid guest mmio access: mmio=0x%llx len=%d", run->mmio.phys_addr, run->mmio.len); + errx(1, "Invalid guest mmio access: mmio=0x%llx len=%d", + run->mmio.phys_addr, run->mmio.len); if (run->mmio.phys_addr < HVT_HYPERCALL_MMIO_BASE || run->mmio.phys_addr >= HVT_HYPERCALL_ADDRESS(HVT_HYPERCALL_MAX)) - errx(1, "Invalid guest mmio access: mmio=0x%llx", run->mmio.phys_addr); + errx(1, "Invalid guest mmio access: mmio=0x%llx", + run->mmio.phys_addr); int nr = HVT_HYPERCALL_NR(run->mmio.phys_addr); @@ -390,12 +388,13 @@ int hvt_vcpu_loop(struct hvt *hvt) if (ret == -1) err(1, "KVM: Dump PC failed after unhandled exit"); errx(1, "KVM: unhandled exit: exit_reason=0x%x, pc=0x%lx", - run->exit_reason, pc); + run->exit_reason, pc); } } /* switch(run->exit_reason) */ } } -void hvt_mem_size(size_t *mem_size) { +void hvt_mem_size(size_t *mem_size) +{ aarch64_mem_size(mem_size); } diff --git a/tenders/hvt/hvt_kvm_x86_64.c b/tenders/hvt/hvt_kvm_x86_64.c index 3d151822f..91c6391f0 100644 --- a/tenders/hvt/hvt_kvm_x86_64.c +++ b/tenders/hvt/hvt_kvm_x86_64.c @@ -38,7 +38,8 @@ #include "hvt_kvm.h" #include "hvt_cpu_x86_64.h" -void hvt_mem_size(size_t *mem_size) { +void hvt_mem_size(size_t *mem_size) +{ hvt_x86_mem_size(mem_size); } @@ -48,7 +49,7 @@ static void setup_cpuid(struct hvt_b *hvb) int max_entries = 100; kvm_cpuid = calloc(1, sizeof(*kvm_cpuid) + - max_entries * sizeof(*kvm_cpuid->entries)); + max_entries * sizeof(*kvm_cpuid->entries)); assert(kvm_cpuid); kvm_cpuid->nent = max_entries; @@ -67,14 +68,18 @@ static struct kvm_segment sreg_to_kvm(const struct x86_sreg *sreg) * On x86, (struct kvm_segment) maps 1:1 to our shadow register * representation. */ - struct kvm_segment kvm = { - .base = sreg->base, - .limit = sreg->limit, - .selector = sreg->selector * 8, - .type = sreg->type, .present = sreg->p, .dpl = sreg->dpl, - .db = sreg->db, .s = sreg->s, .l = sreg->l, .g = sreg->g, - .avl = sreg->avl, .unusable = sreg->unusable - }; + struct kvm_segment kvm = {.base = sreg->base, + .limit = sreg->limit, + .selector = sreg->selector * 8, + .type = sreg->type, + .present = sreg->p, + .dpl = sreg->dpl, + .db = sreg->db, + .s = sreg->s, + .l = sreg->l, + .g = sreg->g, + .avl = sreg->avl, + .unusable = sreg->unusable}; return kvm; } @@ -101,10 +106,9 @@ void hvt_vcpu_init(struct hvt *hvt, hvt_gpa_t gpa_ep) .fs = sreg_to_kvm(&hvt_x86_sreg_data), .gs = sreg_to_kvm(&hvt_x86_sreg_data), - .gdt = { .base = X86_GDT_BASE, .limit = X86_GDTR_LIMIT }, + .gdt = {.base = X86_GDT_BASE, .limit = X86_GDTR_LIMIT}, .tr = sreg_to_kvm(&hvt_x86_sreg_tr), - .ldt = sreg_to_kvm(&hvt_x86_sreg_unusable) - }; + .ldt = sreg_to_kvm(&hvt_x86_sreg_unusable)}; ret = ioctl(hvb->vcpufd, KVM_SET_SREGS, &sregs); if (ret == -1) @@ -164,9 +168,8 @@ int hvt_vcpu_loop(struct hvt *hvt) if (ret == -1) err(1, "KVM: ioctl (GET_REGS) failed after guest fault"); errx(1, "KVM: host/guest translation fault: rip=0x%llx", - regs.rip); - } - else + regs.rip); + } else err(1, "KVM: ioctl (RUN) failed"); } @@ -180,11 +183,10 @@ int hvt_vcpu_loop(struct hvt *hvt) switch (run->exit_reason) { case KVM_EXIT_IO: { - if (run->io.direction != KVM_EXIT_IO_OUT - || run->io.size != 4) + if (run->io.direction != KVM_EXIT_IO_OUT || run->io.size != 4) errx(1, "Invalid guest port access: port=0x%x", run->io.port); if (run->io.port < HVT_HYPERCALL_PIO_BASE || - run->io.port >= (HVT_HYPERCALL_PIO_BASE + HVT_HYPERCALL_MAX)) + run->io.port >= (HVT_HYPERCALL_PIO_BASE + HVT_HYPERCALL_MAX)) errx(1, "Invalid guest port access: port=0x%x", run->io.port); int nr = run->io.port - HVT_HYPERCALL_PIO_BASE; @@ -200,8 +202,7 @@ int hvt_vcpu_loop(struct hvt *hvt) if (fn == NULL) errx(1, "Invalid guest hypercall: num=%d", nr); - hvt_gpa_t gpa = - *(uint32_t *)((uint8_t *)run + run->io.data_offset); + hvt_gpa_t gpa = *(uint32_t *)((uint8_t *)run + run->io.data_offset); fn(hvt, gpa); break; } @@ -220,7 +221,7 @@ int hvt_vcpu_loop(struct hvt *hvt) if (ret == -1) err(1, "KVM: ioctl (GET_REGS) failed after unhandled exit"); errx(1, "KVM: unhandled exit: exit_reason=0x%x, rip=0x%llx", - run->exit_reason, regs.rip); + run->exit_reason, regs.rip); } } /* switch(run->exit_reason) */ } diff --git a/tenders/hvt/hvt_main.c b/tenders/hvt/hvt_main.c index 552443fec..418132b27 100644 --- a/tenders/hvt/hvt_main.c +++ b/tenders/hvt/hvt_main.c @@ -50,7 +50,7 @@ static void setup_modules(struct hvt *hvt, struct mft *mft) warnx("Module `%s' setup failed", m->name); if (m->ops.usage) { warnx("Please check you have correctly specified:\n %s", - m->ops.usage()); + m->ops.usage()); } exit(1); } @@ -62,7 +62,7 @@ static void setup_modules(struct hvt *hvt, struct mft *mft) continue; if (!mft->e[i].attached) { warnx("Device '%s' of type %s declared but not attached.", - mft->e[i].name, mft_type_to_string(mft->e[i].type)); + mft->e[i].name, mft_type_to_string(mft->e[i].type)); fail = true; } } @@ -101,8 +101,10 @@ static void handle_mem(char *cmdarg, size_t *mem_size) static void usage(const char *prog) { - fprintf(stderr, "usage: %s [ CORE OPTIONS ] [ MODULE OPTIONS ] [ -- ] " - "KERNEL [ ARGS ]\n", prog); + fprintf(stderr, + "usage: %s [ CORE OPTIONS ] [ MODULE OPTIONS ] [ -- ] " + "KERNEL [ ARGS ]\n", + prog); fprintf(stderr, "KERNEL is the filename of the unikernel to run.\n"); fprintf(stderr, "ARGS are optional arguments passed to the unikernel.\n"); fprintf(stderr, "Core options:\n"); @@ -154,8 +156,7 @@ int main(int argc, char **argv) */ char **argv1 = argv; while (*argv1 && *argv1[0] == '-') { - if (strcmp("--", *argv1) == 0) - { + if (strcmp("--", *argv1) == 0) { /* Consume and stop option processing */ argv1++; break; @@ -163,7 +164,7 @@ int main(int argc, char **argv) if (strcmp("--help", *argv1) == 0) usage(prog); - else if(strcmp("--version", *argv1) == 0) + else if (strcmp("--version", *argv1) == 0) version(prog); argv1++; @@ -187,20 +188,20 @@ int main(int argc, char **argv) struct abi1_info *abi1; size_t abi1_size; if (elf_load_note(elf_fd, elf_filename, ABI1_NOTE_TYPE, ABI1_NOTE_ALIGN, - ABI1_NOTE_MAX_SIZE, (void **)&abi1, &abi1_size) == -1) + ABI1_NOTE_MAX_SIZE, (void **)&abi1, &abi1_size) == -1) errx(1, "%s: No Solo5 ABI information found in executable", - elf_filename); + elf_filename); if (abi1->abi_target != HVT_ABI_TARGET) errx(1, "%s: Executable is not for the solo5-hvt target", elf_filename); if (abi1->abi_version != HVT_ABI_VERSION) errx(1, "%s: Executable requests unsupported ABI version %u", - elf_filename, abi1->abi_version); + elf_filename, abi1->abi_version); free(abi1); struct mft *mft; size_t mft_size; if (elf_load_note(elf_fd, elf_filename, MFT1_NOTE_TYPE, MFT1_NOTE_ALIGN, - MFT1_NOTE_MAX_SIZE, (void **)&mft, &mft_size) == -1) + MFT1_NOTE_MAX_SIZE, (void **)&mft, &mft_size) == -1) errx(1, "%s: No Solo5 manifest found in executable", elf_filename); if (mft_validate(mft, mft_size) == -1) { free(mft); @@ -242,7 +243,7 @@ int main(int argc, char **argv) argv++; struct sigaction sa; - memset (&sa, 0, sizeof (struct sigaction)); + memset(&sa, 0, sizeof(struct sigaction)); sa.sa_handler = sig_handler; sigfillset(&sa.sa_mask); if (sigaction(SIGINT, &sa, NULL) == -1) @@ -254,8 +255,8 @@ int main(int argc, char **argv) struct hvt *hvt = hvt_init(mem_size); elf_load(elf_fd, elf_filename, hvt->mem, hvt->mem_size, HVT_GUEST_MIN_BASE, - hvt_guest_mprotect, hvt, &gpa_ep, &gpa_kend); - close(elf_fd); /* Done with ELF binary */ + hvt_guest_mprotect, hvt, &gpa_ep, &gpa_kend); + close(elf_fd); /* Done with ELF binary */ hvt_vcpu_init(hvt, gpa_ep); diff --git a/tenders/hvt/hvt_module_blk.c b/tenders/hvt/hvt_module_blk.c index f8f33c155..a5541f7d3 100644 --- a/tenders/hvt/hvt_module_blk.c +++ b/tenders/hvt/hvt_module_blk.c @@ -47,9 +47,9 @@ static struct mft *host_mft; static void hypercall_block_write(struct hvt *hvt, hvt_gpa_t gpa) { struct hvt_hc_block_write *wr = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_block_write)); - const struct mft_entry *e = mft_get_by_index(host_mft, wr->handle, - MFT_DEV_BLOCK_BASIC); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_block_write)); + const struct mft_entry *e = + mft_get_by_index(host_mft, wr->handle, MFT_DEV_BLOCK_BASIC); if (e == NULL) { wr->ret = SOLO5_R_EINVAL; return; @@ -63,20 +63,20 @@ static void hypercall_block_write(struct hvt *hvt, hvt_gpa_t gpa) return; } pos = wr->offset; - if (add_overflow(pos, wr->len, end) - || (end > (off_t) e->u.block_basic.capacity)) { + if (add_overflow(pos, wr->len, end) || + (end > (off_t)e->u.block_basic.capacity)) { wr->ret = SOLO5_R_EINVAL; return; } ret = pwrite(e->b.hostfd, HVT_CHECKED_GPA_P(hvt, wr->data, wr->len), - wr->len, pos); + wr->len, pos); if (ret == -1) { fprintf(stderr, "Fatal error when writing: %s\n", strerror(errno)); exit(1); - } else if ((size_t) ret != wr->len) { - fprintf(stderr, "Fatal error: wrote only %ld out of %ld bytes\n", - ret, wr->len); + } else if ((size_t)ret != wr->len) { + fprintf(stderr, "Fatal error: wrote only %ld out of %ld bytes\n", ret, + wr->len); exit(1); } wr->ret = SOLO5_R_OK; @@ -85,9 +85,9 @@ static void hypercall_block_write(struct hvt *hvt, hvt_gpa_t gpa) static void hypercall_block_read(struct hvt *hvt, hvt_gpa_t gpa) { struct hvt_hc_block_read *rd = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_block_read)); - const struct mft_entry *e = mft_get_by_index(host_mft, rd->handle, - MFT_DEV_BLOCK_BASIC); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_block_read)); + const struct mft_entry *e = + mft_get_by_index(host_mft, rd->handle, MFT_DEV_BLOCK_BASIC); if (e == NULL) { rd->ret = SOLO5_R_EINVAL; return; @@ -101,26 +101,26 @@ static void hypercall_block_read(struct hvt *hvt, hvt_gpa_t gpa) return; } pos = rd->offset; - if (add_overflow(pos, rd->len, end) - || (end > (off_t) e->u.block_basic.capacity)) { + if (add_overflow(pos, rd->len, end) || + (end > (off_t)e->u.block_basic.capacity)) { rd->ret = SOLO5_R_EINVAL; return; } ret = pread(e->b.hostfd, HVT_CHECKED_GPA_P(hvt, rd->data, rd->len), rd->len, - pos); + pos); if (ret == -1) { fprintf(stderr, "Fatal error when reading: %s\n", strerror(errno)); exit(1); - } else if ((size_t) ret != rd->len) { - fprintf(stderr, "Fatal error: read only %ld out of %ld bytes\n", - ret, rd->len); + } else if ((size_t)ret != rd->len) { + fprintf(stderr, "Fatal error: read only %ld out of %ld bytes\n", ret, + rd->len); exit(1); } rd->ret = SOLO5_R_OK; } -#define BLOCK_PREFIX "--block:" +#define BLOCK_PREFIX "--block:" #define BLOCK_SECTOR_SIZE_PREFIX "--block-sector-size:" static int handle_cmdarg(char *cmdarg, struct mft *mft) @@ -132,7 +132,7 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) if (strncmp(BLOCK_PREFIX, cmdarg, sizeof(BLOCK_PREFIX) - 1) == 0) which = opt_block; else if (strncmp(BLOCK_SECTOR_SIZE_PREFIX, cmdarg, - sizeof(BLOCK_SECTOR_SIZE_PREFIX) - 1) == 0) + sizeof(BLOCK_SECTOR_SIZE_PREFIX) - 1) == 0) which = opt_block_size; else return -1; @@ -140,13 +140,16 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) char name[MFT_NAME_SIZE]; if (which == opt_block) { char path[PATH_MAX + 1]; - int rc = sscanf(cmdarg, - BLOCK_PREFIX "%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%" XSTR(PATH_MAX) "s", name, path); + int rc = + sscanf(cmdarg, + BLOCK_PREFIX "%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%" XSTR(PATH_MAX) "s", + name, path); if (rc != 2) return -1; - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -163,17 +166,20 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) } else if (which == opt_block_size) { uint16_t block_size; int rc = sscanf(cmdarg, - BLOCK_SECTOR_SIZE_PREFIX "%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%hu", - name, &block_size); + BLOCK_SECTOR_SIZE_PREFIX + "%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%hu", + name, &block_size); if (rc != 2) return -1; if (block_size < 512 || block_size & (block_size - 1)) { - warnx("Block size must be a multiple of 2 greater than or equal 512"); + warnx( + "Block size must be a multiple of 2 greater than or equal 512"); return -1; } - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -191,9 +197,9 @@ static int setup(struct hvt *hvt, struct mft *mft) host_mft = mft; assert(hvt_core_register_hypercall(HVT_HYPERCALL_BLOCK_WRITE, - hypercall_block_write) == 0); + hypercall_block_write) == 0); assert(hvt_core_register_hypercall(HVT_HYPERCALL_BLOCK_READ, - hypercall_block_read) == 0); + hypercall_block_read) == 0); for (unsigned i = 0; i != mft->entries; i++) { if (mft->e[i].type != MFT_DEV_BLOCK_BASIC || !mft->e[i].attached) @@ -212,18 +218,23 @@ static int setup(struct hvt *hvt, struct mft *mft) assert((block_size & (block_size - 1)) == 0); /* this assumes block_size is a power of 2 */ if ((capacity & (block_size - 1)) != 0) - errx(1, "%." XSTR(MFT_NAME_MAX) "s: Backing storage size must be block aligned (%hu bytes)", - name, block_size); + errx(1, + "%." XSTR(MFT_NAME_MAX) "s: Backing storage size must be " + "block aligned (%hu bytes)", + name, block_size); if (capacity < block_size) - errx(1, "%." XSTR(MFT_NAME_MAX) "s: Backing storage must be at least 1 block (%hu bytes) " - "in size", name, block_size); + errx(1, + "%." XSTR(MFT_NAME_MAX) "s: Backing storage must be at least " + "1 block (%hu bytes) " + "in size", + name, block_size); } #if HVT_FREEBSD_ENABLE_CAPSICUM cap_rights_t rights; cap_rights_init(&rights, CAP_READ, CAP_WRITE, CAP_SEEK); if (cap_rights_limit(diskfd, &rights) == -1) - err(1, "cap_rights_limit() failed"); + err(1, "cap_rights_limit() failed"); #endif return 0; @@ -231,12 +242,12 @@ static int setup(struct hvt *hvt, struct mft *mft) static const char *usage(void) { - return "--block:NAME=PATH (attach block device/file at PATH as block storage NAME)\n" - " [ --block-sector-size:NAME=SECTORSIZE ] (set sector size for block device NAME; must be a power of two greater than or equal 512)"; + return "--block:NAME=PATH (attach block device/file at PATH as block " + "storage NAME)\n" + " [ --block-sector-size:NAME=SECTORSIZE ] (set sector size for " + "block device NAME; must be a power of two greater than or equal " + "512)"; } -DECLARE_MODULE(block, - .setup = setup, - .handle_cmdarg = handle_cmdarg, - .usage = usage -) +DECLARE_MODULE(block, .setup = setup, .handle_cmdarg = handle_cmdarg, + .usage = usage) diff --git a/tenders/hvt/hvt_module_dumpcore.c b/tenders/hvt/hvt_module_dumpcore.c index 86775d9ef..fb353eef5 100644 --- a/tenders/hvt/hvt_module_dumpcore.c +++ b/tenders/hvt/hvt_module_dumpcore.c @@ -89,7 +89,8 @@ void hvt_dumpcore_hook(struct hvt *hvt, int status, void *cookie) * Note that O_APPEND must not be set as this modifies the behaviour of * pwrite() on Linux. */ - int fd = openat(dir, filename, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); + int fd = + openat(dir, filename, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); close(dir); if (fd < 0) { warn("dumpcore: open(%s)", filename); @@ -101,30 +102,27 @@ void hvt_dumpcore_hook(struct hvt *hvt, int status, void *cookie) * Core file structure: * (1) ELF header with e_type=ET_CORE */ - size_t offset = sizeof (Elf64_Ehdr); + size_t offset = sizeof(Elf64_Ehdr); Elf64_Ehdr ehdr = { - .e_ident = { - ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, - ELFCLASS64, ELFDATA2LSB, - EV_CURRENT, ELFOSABI_STANDALONE, 0 - }, + .e_ident = {ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, ELFCLASS64, ELFDATA2LSB, + EV_CURRENT, ELFOSABI_STANDALONE, 0}, .e_type = ET_CORE, .e_version = EV_CURRENT, .e_machine = EM_HOST, - .e_ehsize = sizeof (Elf64_Ehdr), + .e_ehsize = sizeof(Elf64_Ehdr), .e_phnum = 2, /* PT_NOTE, PT_LOAD */ - .e_phentsize = sizeof (Elf64_Phdr), + .e_phentsize = sizeof(Elf64_Phdr), .e_phoff = offset, }; - offset += ehdr.e_phnum * sizeof (Elf64_Phdr); + offset += ehdr.e_phnum * sizeof(Elf64_Phdr); /* * (2) PT_NOTE pointing to NT_PRSTATUS descriptor * name[] must be a multiple of the ELF word size, SVR4 uses "CORE". */ const char name[8] = "CORE"; - size_t pnote_size = sizeof (Elf64_Nhdr) + sizeof name \ - + hvt_dumpcore_prstatus_size(); + size_t pnote_size = + sizeof(Elf64_Nhdr) + sizeof name + hvt_dumpcore_prstatus_size(); Elf64_Phdr pnote = { .p_type = PT_NOTE, .p_filesz = pnote_size, @@ -136,14 +134,14 @@ void hvt_dumpcore_hook(struct hvt *hvt, int status, void *cookie) /* * (3) PT_LOAD pointing to guest memory dump */ - Elf64_Phdr pload = { - .p_type = PT_LOAD, - .p_align = 0, .p_paddr = 0, .p_vaddr = 0, - .p_memsz = hvt->mem_size, - .p_filesz = hvt->mem_size, - .p_flags = 0, - .p_offset = offset - }; + Elf64_Phdr pload = {.p_type = PT_LOAD, + .p_align = 0, + .p_paddr = 0, + .p_vaddr = 0, + .p_memsz = hvt->mem_size, + .p_filesz = hvt->mem_size, + .p_flags = 0, + .p_offset = offset}; /* * (4) NT_PRSTATUS descriptor @@ -155,14 +153,13 @@ void hvt_dumpcore_hook(struct hvt *hvt, int status, void *cookie) }; const struct iovec iov[] = { - { .iov_base = &ehdr, .iov_len = sizeof ehdr }, - { .iov_base = &pnote, .iov_len = sizeof pnote }, - { .iov_base = &pload, .iov_len = sizeof pload }, - { .iov_base = &nhdr, .iov_len = sizeof nhdr }, - { .iov_base = (void *)(uintptr_t)name, .iov_len = nhdr.n_namesz } - }; - ssize_t iovlen = sizeof ehdr + sizeof pnote + sizeof pload + sizeof nhdr \ - + nhdr.n_namesz; + {.iov_base = &ehdr, .iov_len = sizeof ehdr}, + {.iov_base = &pnote, .iov_len = sizeof pnote}, + {.iov_base = &pload, .iov_len = sizeof pload}, + {.iov_base = &nhdr, .iov_len = sizeof nhdr}, + {.iov_base = (void *)(uintptr_t)name, .iov_len = nhdr.n_namesz}}; + ssize_t iovlen = + sizeof ehdr + sizeof pnote + sizeof pload + sizeof nhdr + nhdr.n_namesz; if (writev(fd, iov, 5) != iovlen) { warn("dumpcore: Error writing ELF headers"); goto failure; @@ -192,11 +189,11 @@ void hvt_dumpcore_hook(struct hvt *hvt, int status, void *cookie) warn("dumpcore: Could not determine _SC_PAGESIZE"); goto failure; } - assert (hvt->mem_size % page_size == 0); + assert(hvt->mem_size % page_size == 0); size_t npages = hvt->mem_size / page_size; size_t ndumped = 0; host_mvec_t mvec = malloc(npages); - assert (mvec); + assert(mvec); if (mincore(hvt->mem, hvt->mem_size, mvec) == -1) { warn("dumpcore: mincore() failed"); goto failure; @@ -211,10 +208,10 @@ void hvt_dumpcore_hook(struct hvt *hvt, int status, void *cookie) warn("dumpcore: Error dumping guest memory page %zd", pg); free(mvec); goto failure; - } - else if (nbytes != page_size) { + } else if (nbytes != page_size) { warnx("dumpcore: Short write dumping guest memory page" - "%zd: %zd bytes", pg, nbytes); + "%zd: %zd bytes", + pg, nbytes); free(mvec); goto failure; } @@ -234,7 +231,7 @@ void hvt_dumpcore_hook(struct hvt *hvt, int status, void *cookie) static int handle_cmdarg(char *cmdarg, struct mft *mft) { if (strncmp("--dumpcore=", cmdarg, 11)) - return -1; + return -1; dumpcoredir = cmdarg + 11; return 0; @@ -273,8 +270,5 @@ static int setup(struct hvt *hvt, struct mft *mft) return 0; } -DECLARE_MODULE(dumpcore, - .setup = setup, - .handle_cmdarg = handle_cmdarg, - .usage = usage -) +DECLARE_MODULE(dumpcore, .setup = setup, .handle_cmdarg = handle_cmdarg, + .usage = usage) diff --git a/tenders/hvt/hvt_module_gdb.c b/tenders/hvt/hvt_module_gdb.c index 03281b5ee..cd9b46acf 100644 --- a/tenders/hvt/hvt_module_gdb.c +++ b/tenders/hvt/hvt_module_gdb.c @@ -76,12 +76,12 @@ static int socket_fd = 0; static int portno = 1234; /* Default port number */ static const char hexchars[] = "0123456789abcdef"; -#define BUFMAX 4096 +#define BUFMAX 4096 static char in_buffer[BUFMAX]; static unsigned char registers[BUFMAX]; /* The actual error code is ignored by GDB, so any number will do. */ -#define GDB_ERROR_MSG "E01" +#define GDB_ERROR_MSG "E01" static int hex(unsigned char ch) { @@ -116,8 +116,7 @@ static char *mem2hex(const unsigned char *mem, char *buf, size_t count) * Converts the hex string in buf into binary in mem. * Returns a pointer to the character AFTER the last byte written. */ -static unsigned char *hex2mem(const char *buf, - unsigned char *mem, size_t count) +static unsigned char *hex2mem(const char *buf, unsigned char *mem, size_t count) { size_t i; unsigned char ch; @@ -162,7 +161,7 @@ static int wait_for_connect() return -1; } - if (listen(listen_socket_fd , 0) == -1) { + if (listen(listen_socket_fd, 0) == -1) { err(1, "listen failed"); return -1; } @@ -245,7 +244,7 @@ static char *recv_packet(void) return NULL; } while (ch != '$'); -retry: + retry: checksum = 0; xmitcsum = -1; count = 0; @@ -354,11 +353,20 @@ static void send_packet(const char *buffer) } } -#define send_error_msg() do { send_packet(GDB_ERROR_MSG); } while (0) +#define send_error_msg() \ + do { \ + send_packet(GDB_ERROR_MSG); \ + } while (0) -#define send_not_supported_msg() do { send_packet(""); } while (0) +#define send_not_supported_msg() \ + do { \ + send_packet(""); \ + } while (0) -#define send_okay_msg() do { send_packet("OK"); } while (0) +#define send_okay_msg() \ + do { \ + send_packet("OK"); \ + } while (0) /* * This is a response to 'c' and 's'. In other words, the VM was @@ -413,44 +421,42 @@ static void gdb_handle_exception(struct hvt *hvt, int sigval) switch (command) { case 's': { /* Step */ - if (sscanf(packet, "s%"PRIx64, &addr) == 1) { + if (sscanf(packet, "s%" PRIx64, &addr) == 1) { /* not supported, but that's OK as GDB will retry with the * slower version of this: update all registers. */ send_not_supported_msg(); break; /* Wait for another command. */ } if (hvt_gdb_enable_ss(hvt) == -1) { - send_error_msg(); - break; /* Wait for another command. */ + send_error_msg(); + break; /* Wait for another command. */ } return; /* Continue with program */ } case 'c': { /* Continue (and disable stepping for the next instruction) */ - if (sscanf(packet, "c%"PRIx64, &addr) == 1) { + if (sscanf(packet, "c%" PRIx64, &addr) == 1) { /* not supported, but that's OK as GDB will retry with the * slower version of this: update all registers. */ send_not_supported_msg(); break; /* Wait for another command. */ } if (hvt_gdb_disable_ss(hvt) == -1) { - send_error_msg(); - break; /* Wait for another command. */ + send_error_msg(); + break; /* Wait for another command. */ } return; /* Continue with program */ } case 'm': { /* Read memory content */ - if (sscanf(packet, "m%"PRIx64",%zx", - &addr, &len) != 2) { + if (sscanf(packet, "m%" PRIx64 ",%zx", &addr, &len) != 2) { send_error_msg(); break; } - if ((addr > hvt->mem_size) || - add_overflow(addr, len, result) || + if ((addr > hvt->mem_size) || add_overflow(addr, len, result) || (result > hvt->mem_size)) { /* Don't panic about this, just return error so the debugger * tries again. */ @@ -465,13 +471,12 @@ static void gdb_handle_exception(struct hvt *hvt, int sigval) case 'M': { /* Write memory content */ assert(strlen(packet) <= sizeof(obuf)); - if (sscanf(packet, "M%"PRIx64",%zx:%s", &addr, &len, obuf) != 3) { + if (sscanf(packet, "M%" PRIx64 ",%zx:%s", &addr, &len, obuf) != 3) { send_error_msg(); break; } - if ((addr > hvt->mem_size) || - add_overflow(addr, len, result) || + if ((addr > hvt->mem_size) || add_overflow(addr, len, result) || (result > hvt->mem_size)) { /* Don't panic about this, just return error so the debugger * tries again. */ @@ -524,14 +529,13 @@ static void gdb_handle_exception(struct hvt *hvt, int sigval) case 'z': { /* Remove a breakpoint */ packet++; - if (sscanf(packet, "%"PRIx32",%"PRIx64",%zx", - &type, &addr, &len) != 3) { + if (sscanf(packet, "%" PRIx32 ",%" PRIx64 ",%zx", &type, &addr, + &len) != 3) { send_error_msg(); break; } - if ((addr > hvt->mem_size) || - add_overflow(addr, len, result) || + if ((addr > hvt->mem_size) || add_overflow(addr, len, result) || (result > hvt->mem_size)) { /* Don't panic about this, just return error so the debugger * tries again. */ @@ -591,7 +595,7 @@ static int handle_exit(struct hvt *hvt) /* Handle this exit in the vcpu loop */ return -1; - switch(sigval) { + switch (sigval) { case GDB_SIGNAL_TRAP: gdb_handle_exception(hvt, sigval); return 0; @@ -635,8 +639,8 @@ static int setup(struct hvt *hvt, struct mft *mft) * GDB clients can change memory, and software breakpoints work by * replacing instructions with int3's. */ - if (mprotect(hvt->mem, hvt->mem_size, - PROT_READ | PROT_WRITE | PROT_EXEC) == -1) + if (mprotect(hvt->mem, hvt->mem_size, PROT_READ | PROT_WRITE | PROT_EXEC) == + -1) err(1, "GDB: Cannot remove guest memory protection"); /* Notify the debugger that we are dying. */ @@ -665,11 +669,8 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) static const char *usage(void) { return "--gdb (optional flag for running in a gdb debug session)\n" - " [ --gdb-port=1234 ] (port to use) "; + " [ --gdb-port=1234 ] (port to use) "; } -DECLARE_MODULE(gdb, - .setup = setup, - .handle_cmdarg = handle_cmdarg, - .usage = usage -) +DECLARE_MODULE(gdb, .setup = setup, .handle_cmdarg = handle_cmdarg, + .usage = usage) diff --git a/tenders/hvt/hvt_module_net.c b/tenders/hvt/hvt_module_net.c index c88541917..ce95562f3 100644 --- a/tenders/hvt/hvt_module_net.c +++ b/tenders/hvt/hvt_module_net.c @@ -46,9 +46,9 @@ static struct mft *host_mft; static void hypercall_net_write(struct hvt *hvt, hvt_gpa_t gpa) { struct hvt_hc_net_write *wr = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_net_write)); - struct mft_entry *e = mft_get_by_index(host_mft, wr->handle, - MFT_DEV_NET_BASIC); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_net_write)); + struct mft_entry *e = + mft_get_by_index(host_mft, wr->handle, MFT_DEV_NET_BASIC); if (e == NULL) { wr->ret = SOLO5_R_EINVAL; return; @@ -56,14 +56,14 @@ static void hypercall_net_write(struct hvt *hvt, hvt_gpa_t gpa) ssize_t ret; - ret = write(e->b.hostfd, HVT_CHECKED_GPA_P(hvt, wr->data, wr->len), - wr->len); + ret = + write(e->b.hostfd, HVT_CHECKED_GPA_P(hvt, wr->data, wr->len), wr->len); if (ret == -1) { fprintf(stderr, "Fatal error when writing: %s\n", strerror(errno)); exit(1); - } else if ((size_t) ret != wr->len) { - fprintf(stderr, "Fatal error: wrote only %ld out of %ld bytes\n", - ret, wr->len); + } else if ((size_t)ret != wr->len) { + fprintf(stderr, "Fatal error: wrote only %ld out of %ld bytes\n", ret, + wr->len); exit(1); } wr->ret = SOLO5_R_OK; @@ -72,9 +72,9 @@ static void hypercall_net_write(struct hvt *hvt, hvt_gpa_t gpa) static void hypercall_net_read(struct hvt *hvt, hvt_gpa_t gpa) { struct hvt_hc_net_read *rd = - HVT_CHECKED_GPA_P(hvt, gpa, sizeof (struct hvt_hc_net_read)); - struct mft_entry *e = mft_get_by_index(host_mft, rd->handle, - MFT_DEV_NET_BASIC); + HVT_CHECKED_GPA_P(hvt, gpa, sizeof(struct hvt_hc_net_read)); + struct mft_entry *e = + mft_get_by_index(host_mft, rd->handle, MFT_DEV_NET_BASIC); if (e == NULL) { rd->ret = SOLO5_R_EINVAL; return; @@ -83,8 +83,7 @@ static void hypercall_net_read(struct hvt *hvt, hvt_gpa_t gpa) ssize_t ret; ret = read(e->b.hostfd, HVT_CHECKED_GPA_P(hvt, rd->data, rd->len), rd->len); - if ((ret == 0) || - (ret == -1 && errno == EAGAIN)) { + if ((ret == 0) || (ret == -1 && errno == EAGAIN)) { rd->ret = SOLO5_R_AGAIN; return; } @@ -101,10 +100,7 @@ static void hypercall_net_read(struct hvt *hvt, hvt_gpa_t gpa) static int handle_cmdarg(char *cmdarg, struct mft *mft) { - enum { - opt_net, - opt_net_mac - } which; + enum { opt_net, opt_net_mac } which; if (strncmp("--net:", cmdarg, 6) == 0) which = opt_net; @@ -118,12 +114,13 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) int rc; if (which == opt_net) { rc = sscanf(cmdarg, - "--net:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%19s", name, iface); + "--net:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%19s", + name, iface); if (rc != 2) return -1; - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, - NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -142,19 +139,19 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) e->b.hostfd = fd; e->attached = true; module_in_use = true; - } - else if (which == opt_net_mac) { + } else if (which == opt_net_mac) { uint8_t mac[6]; rc = sscanf(cmdarg, - "--net-mac:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%02"SCNx8":%02"SCNx8":%02"SCNx8":" - "%02"SCNx8":%02"SCNx8":%02"SCNx8, - name, - &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); + "--net-mac:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%02" SCNx8 ":%02" SCNx8 + ":%02" SCNx8 ":" + "%02" SCNx8 ":%02" SCNx8 + ":%02" SCNx8, + name, &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); if (rc != 7) return -1; - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, - NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -172,14 +169,14 @@ static int setup(struct hvt *hvt, struct mft *mft) host_mft = mft; assert(hvt_core_register_hypercall(HVT_HYPERCALL_NET_WRITE, - hypercall_net_write) == 0); + hypercall_net_write) == 0); assert(hvt_core_register_hypercall(HVT_HYPERCALL_NET_READ, - hypercall_net_read) == 0); + hypercall_net_read) == 0); for (unsigned i = 0; i != mft->entries; i++) { if (mft->e[i].type != MFT_DEV_NET_BASIC || !mft->e[i].attached) continue; - char no_mac[6] = { 0 }; + char no_mac[6] = {0}; if (memcmp(mft->e[i].u.net_basic.mac, no_mac, sizeof no_mac) == 0) tap_attach_genmac(mft->e[i].u.net_basic.mac); assert(hvt_core_register_pollfd(mft->e[i].b.hostfd, i) == 0); @@ -197,12 +194,10 @@ static int setup(struct hvt *hvt, struct mft *mft) static const char *usage(void) { - return "--net:NAME=IFACE | @NN (attach tap at IFACE or at fd @NN as network NAME)\n" - " [ --net-mac:NAME=HWADDR ] (set HWADDR for network NAME)"; + return "--net:NAME=IFACE | @NN (attach tap at IFACE or at fd @NN as " + "network NAME)\n" + " [ --net-mac:NAME=HWADDR ] (set HWADDR for network NAME)"; } -DECLARE_MODULE(net, - .setup = setup, - .handle_cmdarg = handle_cmdarg, - .usage = usage -) +DECLARE_MODULE(net, .setup = setup, .handle_cmdarg = handle_cmdarg, + .usage = usage) diff --git a/tenders/hvt/hvt_openbsd.c b/tenders/hvt/hvt_openbsd.c index 285b05f53..2e4ae423d 100644 --- a/tenders/hvt/hvt_openbsd.c +++ b/tenders/hvt/hvt_openbsd.c @@ -62,7 +62,7 @@ static struct hvt *cleanup_hvt; static void cleanup_vmd_fd(void) { if (cleanup_hvt != NULL && cleanup_hvt->b->vmd_fd != -1) { - if(close(cleanup_hvt->b->vmd_fd) == -1) + if (close(cleanup_hvt->b->vmd_fd) == -1) warn("close vmd_fd failed - still exiting"); } } @@ -86,16 +86,16 @@ struct hvt *hvt_init(size_t mem_size) void *p; #endif - if(geteuid() != 0) { + if (geteuid() != 0) { errno = EPERM; err(1, "need root privileges"); } - hvt = calloc(1, sizeof (struct hvt)); + hvt = calloc(1, sizeof(struct hvt)); if (hvt == NULL) err(1, "calloc hv"); - hvb = calloc(1, sizeof (struct hvt_b)); + hvb = calloc(1, sizeof(struct hvt_b)); if (hvb == NULL) err(1, "calloc"); @@ -109,7 +109,7 @@ struct hvt *hvt_init(size_t mem_size) cleanup_hvt = hvt; atexit(cleanup_vmd_fd); - vcp = calloc(1, sizeof (struct vm_create_params)); + vcp = calloc(1, sizeof(struct vm_create_params)); if (vcp == NULL) err(1, "calloc"); @@ -125,7 +125,7 @@ struct hvt *hvt_init(size_t mem_size) vmr = &vcp->vcp_memranges[0]; #if OpenBSD <= 202504 p = mmap(NULL, vmr->vmr_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -1, 0); + MAP_PRIVATE | MAP_ANON, -1, 0); if (p == MAP_FAILED) err(1, "mmap"); @@ -164,9 +164,8 @@ void hvt_drop_privileges() if (chdir("/") == -1) err(1, "chdir(/)"); - if (setgroups(1, &gid) || - setresgid(gid, gid, gid) || - setresuid(uid, uid, uid)) + if (setgroups(1, &gid) || setresgid(gid, gid, gid) || + setresuid(uid, uid, uid)) err(1, "unable to revoke privs"); /* @@ -180,7 +179,7 @@ void hvt_drop_privileges() #endif int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, - int prot) + int prot) { struct hvt *hvt = t_arg; @@ -203,7 +202,7 @@ int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, int host_prot = prot; host_prot &= ~(PROT_EXEC); host_prot |= PROT_READ; - if(mprotect(vaddr_start, size, host_prot) == -1) + if (mprotect(vaddr_start, size, host_prot) == -1) return -1; /* @@ -212,7 +211,7 @@ int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, struct hvt_b *hvb = hvt->b; struct vm_mprotect_ept_params *vmep; - vmep = calloc(1, sizeof (struct vm_mprotect_ept_params)); + vmep = calloc(1, sizeof(struct vm_mprotect_ept_params)); if (vmep == NULL) { warn("calloc"); return -1; @@ -226,7 +225,7 @@ int hvt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, vmep->vmep_prot = prot; if (ioctl(hvb->vmd_fd, VMM_IOC_MPROTECT_EPT, vmep) < 0) { - err(1, "mprotect ept vmm ioctl failed - exiting"); + err(1, "mprotect ept vmm ioctl failed - exiting"); } #endif return 0; diff --git a/tenders/hvt/hvt_openbsd.h b/tenders/hvt/hvt_openbsd.h index 29e40984f..93c29d3f0 100644 --- a/tenders/hvt/hvt_openbsd.h +++ b/tenders/hvt/hvt_openbsd.h @@ -25,13 +25,13 @@ #ifndef HVT_HV_OPENBSD_H #define HVT_HV_OPENBSD_H -#define VMM_NODE "/dev/vmm" -#define VMD_USER "_vmd" +#define VMM_NODE "/dev/vmm" +#define VMD_USER "_vmd" struct hvt_b { - int vmd_fd; - int32_t vcp_id; - int32_t vcpu_id; + int vmd_fd; + int32_t vcp_id; + int32_t vcpu_id; }; #endif /* HVT_HV_OPENBSD_H */ diff --git a/tenders/hvt/hvt_openbsd_x86_64.c b/tenders/hvt/hvt_openbsd_x86_64.c index 0b043e0cb..105e56f02 100644 --- a/tenders/hvt/hvt_openbsd_x86_64.c +++ b/tenders/hvt/hvt_openbsd_x86_64.c @@ -61,8 +61,8 @@ static struct vcpu_segment_info sreg_to_vsi(const struct x86_sreg *); static uint64_t get_tsc_freq(void) { int invariant_tsc; - static const int invar_mib[2] = { CTL_MACHDEP, CPU_INVARIANTTSC }; - static const int freq_mib[2] = { CTL_MACHDEP, CPU_TSCFREQ }; + static const int invar_mib[2] = {CTL_MACHDEP, CPU_INVARIANTTSC}; + static const int freq_mib[2] = {CTL_MACHDEP, CPU_TSCFREQ}; uint64_t tsc_freq; size_t len; @@ -70,7 +70,7 @@ static uint64_t get_tsc_freq(void) if (sysctl(invar_mib, 2, &invariant_tsc, &len, NULL, 0) == -1) err(1, "sysctl invariant_tsc"); - if(invariant_tsc) { + if (invariant_tsc) { len = sizeof(tsc_freq); if (sysctl(freq_mib, 2, &tsc_freq, &len, NULL, 0) == -1) err(1, "sysctl tsc_freq"); @@ -86,20 +86,15 @@ static struct vcpu_segment_info sreg_to_vsi(const struct x86_sreg *sreg) struct vcpu_segment_info vsi = { .vsi_sel = sreg->selector * 8, .vsi_limit = sreg->limit, - .vsi_ar = (sreg->type - | (sreg->s << 4) - | (sreg->dpl << 5) - | (sreg->p << 7) - | (sreg->l << 13) - | (sreg->db << 14) - | (sreg->g << 15) - | (sreg->unusable << X86_SREG_UNUSABLE_BIT)), - .vsi_base = sreg->base - }; + .vsi_ar = (sreg->type | (sreg->s << 4) | (sreg->dpl << 5) | + (sreg->p << 7) | (sreg->l << 13) | (sreg->db << 14) | + (sreg->g << 15) | (sreg->unusable << X86_SREG_UNUSABLE_BIT)), + .vsi_base = sreg->base}; return vsi; } -void hvt_mem_size(size_t *mem_size) { +void hvt_mem_size(size_t *mem_size) +{ hvt_x86_mem_size(mem_size); } @@ -124,8 +119,8 @@ void hvt_vcpu_init(struct hvt *hvt, hvt_gpa_t gpa_ep) .vrs_sregs[VCPU_REGS_FS] = sreg_to_vsi(&hvt_x86_sreg_data), .vrs_sregs[VCPU_REGS_GS] = sreg_to_vsi(&hvt_x86_sreg_data), .vrs_sregs[VCPU_REGS_SS] = sreg_to_vsi(&hvt_x86_sreg_data), - .vrs_gdtr = { 0x0, X86_GDTR_LIMIT, 0x0, X86_GDT_BASE}, - .vrs_idtr = { 0x0, 0xFFFF, 0x0, 0x0}, + .vrs_gdtr = {0x0, X86_GDTR_LIMIT, 0x0, X86_GDT_BASE}, + .vrs_idtr = {0x0, 0xFFFF, 0x0, 0x0}, .vrs_sregs[VCPU_REGS_LDTR] = sreg_to_vsi(&hvt_x86_sreg_unusable), .vrs_sregs[VCPU_REGS_TR] = sreg_to_vsi(&hvt_x86_sreg_tr), .vrs_msrs[VCPU_REGS_EFER] = X86_EFER_INIT, @@ -134,9 +129,7 @@ void hvt_vcpu_init(struct hvt *hvt, hvt_gpa_t gpa_ep) .vrs_msrs[VCPU_REGS_CSTAR] = 0ULL, .vrs_msrs[VCPU_REGS_SFMASK] = 0ULL, .vrs_msrs[VCPU_REGS_KGSBASE] = 0ULL, - .vrs_crs[VCPU_REGS_XCR0] = XFEATURE_X87 - } - }; + .vrs_crs[VCPU_REGS_XCR0] = XFEATURE_X87}}; hvt_x86_setup_gdt(hvt->mem); hvt_x86_setup_pagetables(hvt->mem, hvt->mem_size); @@ -173,46 +166,48 @@ int hvt_vcpu_loop(struct hvt *hvt) struct vm_exit *vei = vrp->vrp_exit; if (vrp->vrp_exit_reason != VM_EXIT_NONE) { switch (vrp->vrp_exit_reason) { - case VMX_EXIT_IO: - case SVM_VMEXIT_IOIO: - if (vei->vei.vei_dir != VEI_DIR_OUT - || vei->vei.vei_size != 4) - errx(1, "Invalid guest port access: port=0x%x", vei->vei.vei_port); - if (vei->vei.vei_port < HVT_HYPERCALL_PIO_BASE || - vei->vei.vei_port >= (HVT_HYPERCALL_PIO_BASE + HVT_HYPERCALL_MAX)) - errx(1, "Invalid guest port access: port=0x%x", vei->vei.vei_port); - - int nr = vei->vei.vei_port - HVT_HYPERCALL_PIO_BASE; - - /* Guest has halted the CPU. */ - if (nr == HVT_HYPERCALL_HALT) { - hvt_gpa_t gpa = vei->vei.vei_data; - return hvt_core_hypercall_halt(hvt, gpa); - } - - hvt_hypercall_fn_t fn = hvt_core_hypercalls[nr]; - if (fn == NULL) - errx(1, "Invalid guest hypercall: num=%d", nr); - + case VMX_EXIT_IO: + case SVM_VMEXIT_IOIO: + if (vei->vei.vei_dir != VEI_DIR_OUT || vei->vei.vei_size != 4) + errx(1, "Invalid guest port access: port=0x%x", + vei->vei.vei_port); + if (vei->vei.vei_port < HVT_HYPERCALL_PIO_BASE || + vei->vei.vei_port >= + (HVT_HYPERCALL_PIO_BASE + HVT_HYPERCALL_MAX)) + errx(1, "Invalid guest port access: port=0x%x", + vei->vei.vei_port); + + int nr = vei->vei.vei_port - HVT_HYPERCALL_PIO_BASE; + + /* Guest has halted the CPU. */ + if (nr == HVT_HYPERCALL_HALT) { hvt_gpa_t gpa = vei->vei.vei_data; - fn(hvt, gpa); - vei->vrs.vrs_gprs[VCPU_REGS_RIP] += vei->vei.vei_insn_len; - break; + return hvt_core_hypercall_halt(hvt, gpa); + } + + hvt_hypercall_fn_t fn = hvt_core_hypercalls[nr]; + if (fn == NULL) + errx(1, "Invalid guest hypercall: num=%d", nr); + + hvt_gpa_t gpa = vei->vei.vei_data; + fn(hvt, gpa); + vei->vrs.vrs_gprs[VCPU_REGS_RIP] += vei->vei.vei_insn_len; + break; #if defined(VMM_IOC_MPROTECT_EPT) - case VMX_EXIT_EPT_VIOLATION: - if(vei->vee.vee_fault_type == VEE_FAULT_PROTECT) { - errx(1, "VMM: host/guest translation fault: rip=0x%llx", - vei->vrs.vrs_gprs[VCPU_REGS_RIP]); - } - break; + case VMX_EXIT_EPT_VIOLATION: + if (vei->vee.vee_fault_type == VEE_FAULT_PROTECT) { + errx(1, "VMM: host/guest translation fault: rip=0x%llx", + vei->vrs.vrs_gprs[VCPU_REGS_RIP]); + } + break; #endif - case VMX_EXIT_TRIPLE_FAULT: - case SVM_VMEXIT_SHUTDOWN: - /* reset VM */ - errx(1, "Triple Fault"); - default: - errx(1, "unhandled exit: unknown exit reason 0x%x", - vrp->vrp_exit_reason); + case VMX_EXIT_TRIPLE_FAULT: + case SVM_VMEXIT_SHUTDOWN: + /* reset VM */ + errx(1, "Triple Fault"); + default: + errx(1, "unhandled exit: unknown exit reason 0x%x", + vrp->vrp_exit_reason); } } } diff --git a/tenders/hvt/queue.h b/tenders/hvt/queue.h index 94bbf2346..00706da79 100644 --- a/tenders/hvt/queue.h +++ b/tenders/hvt/queue.h @@ -31,8 +31,8 @@ * @(#)queue.h 8.5 (Berkeley) 8/20/94 */ -#ifndef _QUEUE_H_ -#define _QUEUE_H_ +#ifndef _QUEUE_H_ +#define _QUEUE_H_ /* * This file defines five types of data structures: singly-linked lists, @@ -83,556 +83,564 @@ /* * Singly-linked List definitions. */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} +#define SLIST_HEAD(name, type) \ + struct name { \ + struct type *slh_first; /* first element */ \ + } -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } +#define SLIST_HEAD_INITIALIZER(head) {NULL} -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} +#define SLIST_ENTRY(type) \ + struct { \ + struct type *sle_next; /* next element */ \ + } /* * Singly-linked List access methods. */ -#define SLIST_FIRST(head) ((head)->slh_first) -#define SLIST_END(head) NULL -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - -#define SLIST_FOREACH(var, head, field) \ - for((var) = (head)->slh_first; \ - (var) != SLIST_END(head); \ - (var) = (var)->field.sle_next) - -#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = SLIST_FIRST((head)); \ - (var) != SLIST_END(head) && \ - ((tvar) = SLIST_NEXT((var), field), 1); \ - (var) = (tvar)) +#define SLIST_FIRST(head) ((head)->slh_first) +#define SLIST_END(head) NULL +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = (head)->slh_first; (var) != SLIST_END(head); \ + (var) = (var)->field.sle_next) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) != SLIST_END(head) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) /* * Singly-linked List functions. */ -#define SLIST_INIT(head) do { \ - (head)->slh_first = SLIST_END(head); \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - (elm)->field.sle_next = (slistelm)->field.sle_next; \ - (slistelm)->field.sle_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.sle_next = (head)->slh_first; \ - (head)->slh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE_AFTER(slistelm, field) do { \ - (slistelm)->field.sle_next = \ - SLIST_NEXT(SLIST_NEXT((slistelm), field), field); \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - (head)->slh_first = (head)->slh_first->field.sle_next; \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if ((head)->slh_first == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = (head)->slh_first; \ - while(curelm->field.sle_next != (elm)) \ - curelm = curelm->field.sle_next; \ - curelm->field.sle_next = \ - curelm->field.sle_next->field.sle_next; \ - } \ -} while (/*CONSTCOND*/0) +#define SLIST_INIT(head) \ + do { \ + (head)->slh_first = SLIST_END(head); \ + } while (/*CONSTCOND*/ 0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) \ + do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ + } while (/*CONSTCOND*/ 0) + +#define SLIST_INSERT_HEAD(head, elm, field) \ + do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ + } while (/*CONSTCOND*/ 0) + +#define SLIST_REMOVE_AFTER(slistelm, field) \ + do { \ + (slistelm)->field.sle_next = \ + SLIST_NEXT(SLIST_NEXT((slistelm), field), field); \ + } while (/*CONSTCOND*/ 0) + +#define SLIST_REMOVE_HEAD(head, field) \ + do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ + } while (/*CONSTCOND*/ 0) + +#define SLIST_REMOVE(head, elm, type, field) \ + do { \ + if ((head)->slh_first == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->slh_first; \ + while (curelm->field.sle_next != (elm)) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = curelm->field.sle_next->field.sle_next; \ + } \ + } while (/*CONSTCOND*/ 0) /* * List definitions. */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} +#define LIST_HEAD(name, type) \ + struct name { \ + struct type *lh_first; /* first element */ \ + } -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } +#define LIST_HEAD_INITIALIZER(head) {NULL} -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} +#define LIST_ENTRY(type) \ + struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ + } /* * List access methods. */ -#define LIST_FIRST(head) ((head)->lh_first) -#define LIST_END(head) NULL -#define LIST_EMPTY(head) ((head)->lh_first == LIST_END(head)) -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = ((head)->lh_first); \ - (var) != LIST_END(head); \ - (var) = ((var)->field.le_next)) - -#define LIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = LIST_FIRST((head)); \ - (var) != LIST_END(head) && \ - ((tvar) = LIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define LIST_MOVE(head1, head2) do { \ - LIST_INIT((head2)); \ - if (!LIST_EMPTY((head1))) { \ - (head2)->lh_first = (head1)->lh_first; \ - LIST_INIT((head1)); \ - } \ -} while (/*CONSTCOND*/0) +#define LIST_FIRST(head) ((head)->lh_first) +#define LIST_END(head) NULL +#define LIST_EMPTY(head) ((head)->lh_first == LIST_END(head)) +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = ((head)->lh_first); (var) != LIST_END(head); \ + (var) = ((var)->field.le_next)) + +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) != LIST_END(head) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_MOVE(head1, head2) \ + do { \ + LIST_INIT((head2)); \ + if (!LIST_EMPTY((head1))) { \ + (head2)->lh_first = (head1)->lh_first; \ + LIST_INIT((head1)); \ + } \ + } while (/*CONSTCOND*/ 0) /* * List functions. */ #if defined(QUEUEDEBUG) -#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) \ - if ((head)->lh_first && \ - (head)->lh_first->field.le_prev != &(head)->lh_first) \ - QUEUEDEBUG_ABORT("LIST_INSERT_HEAD %p %s:%d", (head), \ - __FILE__, __LINE__); -#define QUEUEDEBUG_LIST_OP(elm, field) \ - if ((elm)->field.le_next && \ - (elm)->field.le_next->field.le_prev != \ - &(elm)->field.le_next) \ - QUEUEDEBUG_ABORT("LIST_* forw %p %s:%d", (elm), \ - __FILE__, __LINE__); \ - if (*(elm)->field.le_prev != (elm)) \ - QUEUEDEBUG_ABORT("LIST_* back %p %s:%d", (elm), \ - __FILE__, __LINE__); -#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) \ - (elm)->field.le_next = (void *)1L; \ - (elm)->field.le_prev = (void *)1L; +#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) \ + if ((head)->lh_first && \ + (head)->lh_first->field.le_prev != &(head)->lh_first) \ + QUEUEDEBUG_ABORT("LIST_INSERT_HEAD %p %s:%d", (head), __FILE__, \ + __LINE__); +#define QUEUEDEBUG_LIST_OP(elm, field) \ + if ((elm)->field.le_next && \ + (elm)->field.le_next->field.le_prev != &(elm)->field.le_next) \ + QUEUEDEBUG_ABORT("LIST_* forw %p %s:%d", (elm), __FILE__, __LINE__); \ + if (*(elm)->field.le_prev != (elm)) \ + QUEUEDEBUG_ABORT("LIST_* back %p %s:%d", (elm), __FILE__, __LINE__); +#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) \ + (elm)->field.le_next = (void *)1L; \ + (elm)->field.le_prev = (void *)1L; #else -#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) -#define QUEUEDEBUG_LIST_OP(elm, field) -#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) +#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) +#define QUEUEDEBUG_LIST_OP(elm, field) +#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) #endif -#define LIST_INIT(head) do { \ - (head)->lh_first = LIST_END(head); \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - QUEUEDEBUG_LIST_OP((listelm), field) \ - if (((elm)->field.le_next = (listelm)->field.le_next) != \ - LIST_END(head)) \ - (listelm)->field.le_next->field.le_prev = \ - &(elm)->field.le_next; \ - (listelm)->field.le_next = (elm); \ - (elm)->field.le_prev = &(listelm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - QUEUEDEBUG_LIST_OP((listelm), field) \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - (elm)->field.le_next = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &(elm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field) \ - if (((elm)->field.le_next = (head)->lh_first) != LIST_END(head))\ - (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ - (head)->lh_first = (elm); \ - (elm)->field.le_prev = &(head)->lh_first; \ -} while (/*CONSTCOND*/0) - -#define LIST_REMOVE(elm, field) do { \ - QUEUEDEBUG_LIST_OP((elm), field) \ - if ((elm)->field.le_next != NULL) \ - (elm)->field.le_next->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = (elm)->field.le_next; \ - QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ -} while (/*CONSTCOND*/0) - -#define LIST_REPLACE(elm, elm2, field) do { \ - if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ - (elm2)->field.le_next->field.le_prev = \ - &(elm2)->field.le_next; \ - (elm2)->field.le_prev = (elm)->field.le_prev; \ - *(elm2)->field.le_prev = (elm2); \ - QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ -} while (/*CONSTCOND*/0) +#define LIST_INIT(head) \ + do { \ + (head)->lh_first = LIST_END(head); \ + } while (/*CONSTCOND*/ 0) + +#define LIST_INSERT_AFTER(listelm, elm, field) \ + do { \ + QUEUEDEBUG_LIST_OP((listelm), field) \ + if (((elm)->field.le_next = (listelm)->field.le_next) != \ + LIST_END(head)) \ + (listelm)->field.le_next->field.le_prev = &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ + } while (/*CONSTCOND*/ 0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) \ + do { \ + QUEUEDEBUG_LIST_OP((listelm), field) \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ + } while (/*CONSTCOND*/ 0) + +#define LIST_INSERT_HEAD(head, elm, field) \ + do { \ + QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field) \ + if (((elm)->field.le_next = (head)->lh_first) != LIST_END(head)) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next; \ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ + } while (/*CONSTCOND*/ 0) + +#define LIST_REMOVE(elm, field) \ + do { \ + QUEUEDEBUG_LIST_OP((elm), field) \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ + QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ + } while (/*CONSTCOND*/ 0) + +#define LIST_REPLACE(elm, elm2, field) \ + do { \ + if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ + (elm2)->field.le_next->field.le_prev = &(elm2)->field.le_next; \ + (elm2)->field.le_prev = (elm)->field.le_prev; \ + *(elm2)->field.le_prev = (elm2); \ + QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ + } while (/*CONSTCOND*/ 0) /* * Simple queue definitions. */ -#define SIMPLEQ_HEAD(name, type) \ -struct name { \ - struct type *sqh_first; /* first element */ \ - struct type **sqh_last; /* addr of last next element */ \ -} +#define SIMPLEQ_HEAD(name, type) \ + struct name { \ + struct type *sqh_first; /* first element */ \ + struct type **sqh_last; /* addr of last next element */ \ + } -#define SIMPLEQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).sqh_first } +#define SIMPLEQ_HEAD_INITIALIZER(head) {NULL, &(head).sqh_first} -#define SIMPLEQ_ENTRY(type) \ -struct { \ - struct type *sqe_next; /* next element */ \ -} +#define SIMPLEQ_ENTRY(type) \ + struct { \ + struct type *sqe_next; /* next element */ \ + } /* * Simple queue access methods. */ -#define SIMPLEQ_FIRST(head) ((head)->sqh_first) -#define SIMPLEQ_END(head) NULL -#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == SIMPLEQ_END(head)) -#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) - -#define SIMPLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->sqh_first); \ - (var) != SIMPLEQ_END(head); \ - (var) = ((var)->field.sqe_next)) - -#define SIMPLEQ_FOREACH_SAFE(var, head, field, next) \ - for ((var) = ((head)->sqh_first); \ - (var) != SIMPLEQ_END(head) && \ - ((next = ((var)->field.sqe_next)), 1); \ - (var) = (next)) +#define SIMPLEQ_FIRST(head) ((head)->sqh_first) +#define SIMPLEQ_END(head) NULL +#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == SIMPLEQ_END(head)) +#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) + +#define SIMPLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->sqh_first); (var) != SIMPLEQ_END(head); \ + (var) = ((var)->field.sqe_next)) + +#define SIMPLEQ_FOREACH_SAFE(var, head, field, next) \ + for ((var) = ((head)->sqh_first); \ + (var) != SIMPLEQ_END(head) && ((next = ((var)->field.sqe_next)), 1); \ + (var) = (next)) /* * Simple queue functions. */ -#define SIMPLEQ_INIT(head) do { \ - (head)->sqh_first = NULL; \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (head)->sqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.sqe_next = NULL; \ - *(head)->sqh_last = (elm); \ - (head)->sqh_last = &(elm)->field.sqe_next; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (listelm)->field.sqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ - if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \ - if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \ - == NULL) \ - (head)->sqh_last = &(elm)->field.sqe_next; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ - if ((head)->sqh_first == (elm)) { \ - SIMPLEQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->sqh_first; \ - while (curelm->field.sqe_next != (elm)) \ - curelm = curelm->field.sqe_next; \ - if ((curelm->field.sqe_next = \ - curelm->field.sqe_next->field.sqe_next) == NULL) \ - (head)->sqh_last = &(curelm)->field.sqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_CONCAT(head1, head2) do { \ - if (!SIMPLEQ_EMPTY((head2))) { \ - *(head1)->sqh_last = (head2)->sqh_first; \ - (head1)->sqh_last = (head2)->sqh_last; \ - SIMPLEQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_LAST(head, type, field) \ - (SIMPLEQ_EMPTY((head)) ? \ - NULL : \ - ((struct type *)(void *) \ - ((char *)((head)->sqh_last) - offsetof(struct type, field)))) +#define SIMPLEQ_INIT(head) \ + do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_INSERT_HEAD(head, elm, field) \ + do { \ + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (head)->sqh_first = (elm); \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_INSERT_TAIL(head, elm, field) \ + do { \ + (elm)->field.sqe_next = NULL; \ + *(head)->sqh_last = (elm); \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) \ + do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_REMOVE_HEAD(head, field) \ + do { \ + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ + (head)->sqh_last = &(head)->sqh_first; \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_REMOVE_AFTER(head, elm, field) \ + do { \ + if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) == \ + NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_REMOVE(head, elm, type, field) \ + do { \ + if ((head)->sqh_first == (elm)) { \ + SIMPLEQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->sqh_first; \ + while (curelm->field.sqe_next != (elm)) \ + curelm = curelm->field.sqe_next; \ + if ((curelm->field.sqe_next = \ + curelm->field.sqe_next->field.sqe_next) == NULL) \ + (head)->sqh_last = &(curelm)->field.sqe_next; \ + } \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_CONCAT(head1, head2) \ + do { \ + if (!SIMPLEQ_EMPTY((head2))) { \ + *(head1)->sqh_last = (head2)->sqh_first; \ + (head1)->sqh_last = (head2)->sqh_last; \ + SIMPLEQ_INIT((head2)); \ + } \ + } while (/*CONSTCOND*/ 0) + +#define SIMPLEQ_LAST(head, type, field) \ + (SIMPLEQ_EMPTY((head)) \ + ? NULL \ + : ((struct type *)(void *)((char *)((head)->sqh_last) - \ + offsetof(struct type, field)))) /* * Tail queue definitions. */ -#define _TAILQ_HEAD(name, type, qual) \ -struct name { \ - qual type *tqh_first; /* first element */ \ - qual type *qual *tqh_last; /* addr of last next element */ \ -} -#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) - -#define TAILQ_HEAD_INITIALIZER(head) \ - { TAILQ_END(head), &(head).tqh_first } - -#define _TAILQ_ENTRY(type, qual) \ -struct { \ - qual type *tqe_next; /* next element */ \ - qual type *qual *tqe_prev; /* address of previous next element */\ -} -#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) +#define _TAILQ_HEAD(name, type, qual) \ + struct name { \ + qual type *tqh_first; /* first element */ \ + qual type * qual * tqh_last; /* addr of last next element */ \ + } +#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type, ) + +#define TAILQ_HEAD_INITIALIZER(head) {TAILQ_END(head), &(head).tqh_first} + +#define _TAILQ_ENTRY(type, qual) \ + struct { \ + qual type *tqe_next; /* next element */ \ + qual type * qual * tqe_prev; /* address of previous next element */ \ + } +#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type, ) /* * Tail queue access methods. */ -#define TAILQ_FIRST(head) ((head)->tqh_first) -#define TAILQ_END(head) (NULL) -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) -#define TAILQ_EMPTY(head) (TAILQ_FIRST(head) == TAILQ_END(head)) - - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->tqh_first); \ - (var) != TAILQ_END(head); \ - (var) = ((var)->field.tqe_next)) - -#define TAILQ_FOREACH_SAFE(var, head, field, next) \ - for ((var) = ((head)->tqh_first); \ - (var) != TAILQ_END(head) && \ - ((next) = TAILQ_NEXT(var, field), 1); (var) = (next)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));\ - (var) != TAILQ_END(head); \ - (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) - -#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var) != TAILQ_END(head) && \ - ((prev) = TAILQ_PREV((var), headname, field), 1); (var) = (prev)) +#define TAILQ_FIRST(head) ((head)->tqh_first) +#define TAILQ_END(head) (NULL) +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) +#define TAILQ_EMPTY(head) (TAILQ_FIRST(head) == TAILQ_END(head)) + + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->tqh_first); (var) != TAILQ_END(head); \ + (var) = ((var)->field.tqe_next)) + +#define TAILQ_FOREACH_SAFE(var, head, field, next) \ + for ((var) = ((head)->tqh_first); \ + (var) != TAILQ_END(head) && ((next) = TAILQ_NEXT(var, field), 1); \ + (var) = (next)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ + (var) != TAILQ_END(head); \ + (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) + +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) != TAILQ_END(head) && \ + ((prev) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (prev)) /* * Tail queue functions. */ #if defined(QUEUEDEBUG) -#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) \ - if ((head)->tqh_first && \ - (head)->tqh_first->field.tqe_prev != &(head)->tqh_first) \ - QUEUEDEBUG_ABORT("TAILQ_INSERT_HEAD %p %s:%d", (head), \ - __FILE__, __LINE__); -#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) \ - if (*(head)->tqh_last != NULL) \ - QUEUEDEBUG_ABORT("TAILQ_INSERT_TAIL %p %s:%d", (head), \ - __FILE__, __LINE__); -#define QUEUEDEBUG_TAILQ_OP(elm, field) \ - if ((elm)->field.tqe_next && \ - (elm)->field.tqe_next->field.tqe_prev != \ - &(elm)->field.tqe_next) \ - QUEUEDEBUG_ABORT("TAILQ_* forw %p %s:%d", (elm), \ - __FILE__, __LINE__); \ - if (*(elm)->field.tqe_prev != (elm)) \ - QUEUEDEBUG_ABORT("TAILQ_* back %p %s:%d", (elm), \ - __FILE__, __LINE__); -#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) \ - if ((elm)->field.tqe_next == NULL && \ - (head)->tqh_last != &(elm)->field.tqe_next) \ - QUEUEDEBUG_ABORT("TAILQ_PREREMOVE head %p elm %p %s:%d",\ - (head), (elm), __FILE__, __LINE__); -#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) \ - (elm)->field.tqe_next = (void *)1L; \ - (elm)->field.tqe_prev = (void *)1L; +#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) \ + if ((head)->tqh_first && \ + (head)->tqh_first->field.tqe_prev != &(head)->tqh_first) \ + QUEUEDEBUG_ABORT("TAILQ_INSERT_HEAD %p %s:%d", (head), __FILE__, \ + __LINE__); +#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) \ + if (*(head)->tqh_last != NULL) \ + QUEUEDEBUG_ABORT("TAILQ_INSERT_TAIL %p %s:%d", (head), __FILE__, \ + __LINE__); +#define QUEUEDEBUG_TAILQ_OP(elm, field) \ + if ((elm)->field.tqe_next && \ + (elm)->field.tqe_next->field.tqe_prev != &(elm)->field.tqe_next) \ + QUEUEDEBUG_ABORT("TAILQ_* forw %p %s:%d", (elm), __FILE__, __LINE__); \ + if (*(elm)->field.tqe_prev != (elm)) \ + QUEUEDEBUG_ABORT("TAILQ_* back %p %s:%d", (elm), __FILE__, __LINE__); +#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) \ + if ((elm)->field.tqe_next == NULL && \ + (head)->tqh_last != &(elm)->field.tqe_next) \ + QUEUEDEBUG_ABORT("TAILQ_PREREMOVE head %p elm %p %s:%d", (head), \ + (elm), __FILE__, __LINE__); +#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) \ + (elm)->field.tqe_next = (void *)1L; \ + (elm)->field.tqe_prev = (void *)1L; #else -#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) -#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) -#define QUEUEDEBUG_TAILQ_OP(elm, field) -#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) -#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) +#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) +#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) +#define QUEUEDEBUG_TAILQ_OP(elm, field) +#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) +#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) #endif -#define TAILQ_INIT(head) do { \ - (head)->tqh_first = TAILQ_END(head); \ - (head)->tqh_last = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field) \ - if (((elm)->field.tqe_next = (head)->tqh_first) != TAILQ_END(head))\ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field) \ - (elm)->field.tqe_next = TAILQ_END(head); \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - QUEUEDEBUG_TAILQ_OP((listelm), field) \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != \ - TAILQ_END(head)) \ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - QUEUEDEBUG_TAILQ_OP((listelm), field) \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_REMOVE(head, elm, field) do { \ - QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field) \ - QUEUEDEBUG_TAILQ_OP((elm), field) \ - if (((elm)->field.tqe_next) != TAILQ_END(head)) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ - QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ -} while (/*CONSTCOND*/0) - -#define TAILQ_REPLACE(head, elm, elm2, field) do { \ - if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != \ - TAILQ_END(head)) \ - (elm2)->field.tqe_next->field.tqe_prev = \ - &(elm2)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm2)->field.tqe_next; \ - (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ - *(elm2)->field.tqe_prev = (elm2); \ - QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ -} while (/*CONSTCOND*/0) - -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) +#define TAILQ_INIT(head) \ + do { \ + (head)->tqh_first = TAILQ_END(head); \ + (head)->tqh_last = &(head)->tqh_first; \ + } while (/*CONSTCOND*/ 0) + +#define TAILQ_INSERT_HEAD(head, elm, field) \ + do { \ + QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field) \ + if (((elm)->field.tqe_next = (head)->tqh_first) != TAILQ_END(head)) \ + (head)->tqh_first->field.tqe_prev = &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ + } while (/*CONSTCOND*/ 0) + +#define TAILQ_INSERT_TAIL(head, elm, field) \ + do { \ + QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field) \ + (elm)->field.tqe_next = TAILQ_END(head); \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + } while (/*CONSTCOND*/ 0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) \ + do { \ + QUEUEDEBUG_TAILQ_OP((listelm), field) \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != \ + TAILQ_END(head)) \ + (elm)->field.tqe_next->field.tqe_prev = &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ + } while (/*CONSTCOND*/ 0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) \ + do { \ + QUEUEDEBUG_TAILQ_OP((listelm), field) \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ + } while (/*CONSTCOND*/ 0) + +#define TAILQ_REMOVE(head, elm, field) \ + do { \ + QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field) \ + QUEUEDEBUG_TAILQ_OP((elm), field) \ + if (((elm)->field.tqe_next) != TAILQ_END(head)) \ + (elm)->field.tqe_next->field.tqe_prev = (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ + QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ + } while (/*CONSTCOND*/ 0) + +#define TAILQ_REPLACE(head, elm, elm2, field) \ + do { \ + if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != \ + TAILQ_END(head)) \ + (elm2)->field.tqe_next->field.tqe_prev = &(elm2)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm2)->field.tqe_next; \ + (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ + *(elm2)->field.tqe_prev = (elm2); \ + QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ + } while (/*CONSTCOND*/ 0) + +#define TAILQ_CONCAT(head1, head2, field) \ + do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + } \ + } while (/*CONSTCOND*/ 0) /* * Singly-linked Tail queue declarations. */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first; /* first element */ \ - struct type **stqh_last; /* addr of last next element */ \ -} +#define STAILQ_HEAD(name, type) \ + struct name { \ + struct type *stqh_first; /* first element */ \ + struct type **stqh_last; /* addr of last next element */ \ + } -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } +#define STAILQ_HEAD_INITIALIZER(head) {NULL, &(head).stqh_first} -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} +#define STAILQ_ENTRY(type) \ + struct { \ + struct type *stqe_next; /* next element */ \ + } /* * Singly-linked Tail queue access methods. */ -#define STAILQ_FIRST(head) ((head)->stqh_first) -#define STAILQ_END(head) NULL -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) -#define STAILQ_EMPTY(head) (STAILQ_FIRST(head) == STAILQ_END(head)) +#define STAILQ_FIRST(head) ((head)->stqh_first) +#define STAILQ_END(head) NULL +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) +#define STAILQ_EMPTY(head) (STAILQ_FIRST(head) == STAILQ_END(head)) /* * Singly-linked Tail queue functions. */ -#define STAILQ_INIT(head) do { \ - (head)->stqh_first = NULL; \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (head)->stqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.stqe_next = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &(elm)->field.stqe_next; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (listelm)->field.stqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if ((head)->stqh_first == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->stqh_first; \ - while (curelm->field.stqe_next != (elm)) \ - curelm = curelm->field.stqe_next; \ - if ((curelm->field.stqe_next = \ - curelm->field.stqe_next->field.stqe_next) == NULL) \ - (head)->stqh_last = &(curelm)->field.stqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define STAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->stqh_first); \ - (var); \ - (var) = ((var)->field.stqe_next)) - -#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = STAILQ_FIRST((head)); \ - (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY((head)) ? \ - NULL : \ - ((struct type *)(void *) \ - ((char *)((head)->stqh_last) - offsetof(struct type, field)))) - -#endif /* !_QUEUE_H_ */ +#define STAILQ_INIT(head) \ + do { \ + (head)->stqh_first = NULL; \ + (head)->stqh_last = &(head)->stqh_first; \ + } while (/*CONSTCOND*/ 0) + +#define STAILQ_INSERT_HEAD(head, elm, field) \ + do { \ + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (head)->stqh_first = (elm); \ + } while (/*CONSTCOND*/ 0) + +#define STAILQ_INSERT_TAIL(head, elm, field) \ + do { \ + (elm)->field.stqe_next = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + } while (/*CONSTCOND*/ 0) + +#define STAILQ_INSERT_AFTER(head, listelm, elm, field) \ + do { \ + if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (listelm)->field.stqe_next = (elm); \ + } while (/*CONSTCOND*/ 0) + +#define STAILQ_REMOVE_HEAD(head, field) \ + do { \ + if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == \ + NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ + } while (/*CONSTCOND*/ 0) + +#define STAILQ_REMOVE(head, elm, type, field) \ + do { \ + if ((head)->stqh_first == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->stqh_first; \ + while (curelm->field.stqe_next != (elm)) \ + curelm = curelm->field.stqe_next; \ + if ((curelm->field.stqe_next = \ + curelm->field.stqe_next->field.stqe_next) == NULL) \ + (head)->stqh_last = &(curelm)->field.stqe_next; \ + } \ + } while (/*CONSTCOND*/ 0) + +#define STAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->stqh_first); (var); (var) = ((var)->field.stqe_next)) + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); (var) = (tvar)) + +#define STAILQ_CONCAT(head1, head2) \ + do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ + } while (/*CONSTCOND*/ 0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) \ + ? NULL \ + : ((struct type *)(void *)((char *)((head)->stqh_last) - \ + offsetof(struct type, field)))) + +#endif /* !_QUEUE_H_ */ diff --git a/tenders/spt/spt.h b/tenders/spt/spt.h index 79969e81c..9aaf5ce5f 100644 --- a/tenders/spt/spt.h +++ b/tenders/spt/spt.h @@ -46,10 +46,10 @@ struct spt { struct spt *spt_init(size_t mem_size); int spt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, - int prot); + int prot); void spt_boot_info_init(struct spt *spt, uint64_t p_end, int cmdline_argc, - char **cmdline_argv, struct mft *mft, size_t mft_size); + char **cmdline_argv, struct mft *mft, size_t mft_size); void spt_run(struct spt *spt, uint64_t p_entry); @@ -78,12 +78,9 @@ struct spt_module { * Note that alignment of the struct is explicitly set, otherwise the linker * will pick a default that does not match the compiler's alignment. */ -#define DECLARE_MODULE(module_name, ...) \ - static struct spt_module __module_ ##module_name \ - __attribute((section("modules"), aligned(8))) \ - __attribute((used)) = { \ - .name = #module_name, \ - .ops = { __VA_ARGS__ } \ - }; +#define DECLARE_MODULE(module_name, ...) \ + static struct spt_module __module_##module_name \ + __attribute((section("modules"), aligned(8))) \ + __attribute((used)) = {.name = #module_name, .ops = {__VA_ARGS__}}; #endif /* SPT_H */ diff --git a/tenders/spt/spt_core.c b/tenders/spt/spt_core.c index 4a36bd6dc..8c3a04958 100644 --- a/tenders/spt/spt_core.c +++ b/tenders/spt/spt_core.c @@ -69,10 +69,10 @@ static bool use_exec_heap = false; struct spt *spt_init(size_t mem_size) { - struct spt *spt = malloc(sizeof (struct spt)); + struct spt *spt = malloc(sizeof(struct spt)); if (spt == NULL) err(1, "malloc"); - memset(spt, 0, sizeof (struct spt)); + memset(spt, 0, sizeof(struct spt)); #if defined(__PIE__) /* @@ -100,8 +100,7 @@ struct spt *spt_init(size_t mem_size) assert((uint64_t)&__executable_start >= (1ULL << 30)); if ((uint64_t)(mem_size - 1) >= (uint64_t)&__executable_start) { uint64_t max_mem_size_mb = (uint64_t)&__executable_start >> 20; - warnx("Maximum guest memory size (%lu MB) exceeded.", - max_mem_size_mb); + warnx("Maximum guest memory size (%lu MB) exceeded.", max_mem_size_mb); errx(1, "Either decrease --mem-size, or recompile solo5-spt" " as a PIE executable."); } @@ -130,7 +129,7 @@ struct spt *spt_init(size_t mem_size) */ int prot = PROT_READ | PROT_WRITE | (use_exec_heap ? PROT_EXEC : 0); spt->mem = mmap((void *)SPT_HOST_MEM_BASE, mem_size - SPT_HOST_MEM_BASE, - prot, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + prot, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); if (spt->mem == MAP_FAILED) err(1, "Error allocating guest memory"); assert(spt->mem == (void *)SPT_HOST_MEM_BASE); @@ -156,7 +155,7 @@ struct spt *spt_init(size_t mem_size) } int spt_guest_mprotect(void *t_arg, uint64_t addr_start, uint64_t addr_end, - int prot) + int prot) { struct spt *spt = t_arg; @@ -185,10 +184,10 @@ static void setup_cmdline(uint8_t *cmdline, int argc, char **argv) for (; *argv; argc--, argv++) { size_t alen = snprintf((char *)cmdline, cmdline_free, "%s%s", *argv, - (argc > 1) ? " " : ""); + (argc > 1) ? " " : ""); if (alen >= cmdline_free) { errx(1, "Guest command line too long (max=%d characters)", - SPT_CMDLINE_SIZE - 1); + SPT_CMDLINE_SIZE - 1); break; } cmdline_free -= alen; @@ -197,13 +196,12 @@ static void setup_cmdline(uint8_t *cmdline, int argc, char **argv) } void spt_boot_info_init(struct spt *spt, uint64_t p_end, int cmdline_argc, - char **cmdline_argv, struct mft *mft, size_t mft_size) + char **cmdline_argv, struct mft *mft, size_t mft_size) { uint64_t lowmem_pos = SPT_BOOT_INFO_BASE; - struct spt_boot_info *bi = - (struct spt_boot_info *)(spt->mem + lowmem_pos); - lowmem_pos += sizeof (struct spt_boot_info); + struct spt_boot_info *bi = (struct spt_boot_info *)(spt->mem + lowmem_pos); + lowmem_pos += sizeof(struct spt_boot_info); bi->mem_size = spt->mem_size; bi->kernel_end = p_end; bi->epollfd = spt->epollfd; @@ -287,9 +285,8 @@ void spt_run(struct spt *spt, uint64_t p_entry) err(1, "prctl(PR_SET_NO_NEW_PRIVS) failed"); struct sock_filter dummy[1]; struct sock_fprog prog = { - .len = (unsigned short) (sb.st_size / sizeof dummy[0]), - .filter = (struct sock_filter *)bpf_prgm - }; + .len = (unsigned short)(sb.st_size / sizeof dummy[0]), + .filter = (struct sock_filter *)bpf_prgm}; /* * Check that we did not truncate the BPF filter due to overflow in the * calculation above. @@ -320,36 +317,37 @@ static int setup(struct spt *spt, struct mft *mft) int rc = -1; rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, - SCMP_A0(SCMP_CMP_EQ, 1)); + SCMP_A0(SCMP_CMP_EQ, 1)); if (rc != 0) errx(1, "seccomp_rule_add(write, fd=1) failed: %s", strerror(-rc)); rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0); if (rc != 0) errx(1, "seccomp_rule_add(exit_group) failed: %s", strerror(-rc)); rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(epoll_pwait), 1, - SCMP_A0(SCMP_CMP_EQ, spt->epollfd)); + SCMP_A0(SCMP_CMP_EQ, spt->epollfd)); if (rc != 0) errx(1, "seccomp_rule_add(epoll_pwait) failed: %s", strerror(-rc)); - rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, - SCMP_SYS(timerfd_settime), 1, SCMP_A0(SCMP_CMP_EQ, spt->timerfd)); + rc = + seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(timerfd_settime), + 1, SCMP_A0(SCMP_CMP_EQ, spt->timerfd)); if (rc != 0) errx(1, "seccomp_rule_add(timerfd_settime) failed: %s", strerror(-rc)); rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(clock_gettime), - 1, SCMP_A0(SCMP_CMP_EQ, CLOCK_MONOTONIC)); + 1, SCMP_A0(SCMP_CMP_EQ, CLOCK_MONOTONIC)); if (rc != 0) errx(1, "seccomp_rule_add(clock_gettime, CLOCK_MONOTONIC) failed: %s", - strerror(-rc)); + strerror(-rc)); rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(clock_gettime), - 1, SCMP_A0(SCMP_CMP_EQ, CLOCK_REALTIME)); + 1, SCMP_A0(SCMP_CMP_EQ, CLOCK_REALTIME)); if (rc != 0) errx(1, "seccomp_rule_add(clock_gettime, CLOCK_REALTIME) failed: %s", - strerror(-rc)); + strerror(-rc)); #if defined(__x86_64__) - rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(arch_prctl), - 1, SCMP_A0(SCMP_CMP_EQ, ARCH_SET_FS)); + rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(arch_prctl), 1, + SCMP_A0(SCMP_CMP_EQ, ARCH_SET_FS)); if (rc != 0) errx(1, "seccomp_rule_add(arch_prctl, ARCH_SET_FS) failed: %s", - strerror(-rc)); + strerror(-rc)); #endif return 0; @@ -362,8 +360,5 @@ static const char *usage(void) " makes the heap and stack executable."; } -DECLARE_MODULE(core, - .setup = setup, - .handle_cmdarg = handle_cmdarg, - .usage = usage -) +DECLARE_MODULE(core, .setup = setup, .handle_cmdarg = handle_cmdarg, + .usage = usage) diff --git a/tenders/spt/spt_main.c b/tenders/spt/spt_main.c index 847ccdff1..865a29162 100644 --- a/tenders/spt/spt_main.c +++ b/tenders/spt/spt_main.c @@ -49,7 +49,7 @@ static void setup_modules(struct spt *spt, struct mft *mft) warnx("Module `%s' setup failed", m->name); if (m->ops.usage) { warnx("Please check you have correctly specified:\n %s", - m->ops.usage()); + m->ops.usage()); } exit(1); } @@ -61,7 +61,7 @@ static void setup_modules(struct spt *spt, struct mft *mft) continue; if (!mft->e[i].attached) { warnx("Device '%s' of type %s declared but not attached.", - mft->e[i].name, mft_type_to_string(mft->e[i].type)); + mft->e[i].name, mft_type_to_string(mft->e[i].type)); fail = true; } } @@ -95,8 +95,10 @@ static void handle_mem(char *cmdarg, size_t *mem_size) static void usage(const char *prog) { - fprintf(stderr, "usage: %s [ CORE OPTIONS ] [ -- ] " - "KERNEL [ ARGS ]\n", prog); + fprintf(stderr, + "usage: %s [ CORE OPTIONS ] [ -- ] " + "KERNEL [ ARGS ]\n", + prog); fprintf(stderr, "KERNEL is the filename of the unikernel to run.\n"); fprintf(stderr, "ARGS are optional arguments passed to the unikernel.\n"); fprintf(stderr, "Core options:\n"); @@ -147,8 +149,7 @@ int main(int argc, char **argv) */ char **argv1 = argv; while (*argv1 && *argv1[0] == '-') { - if (strcmp("--", *argv1) == 0) - { + if (strcmp("--", *argv1) == 0) { /* Consume and stop option processing */ argv1++; break; @@ -156,7 +157,7 @@ int main(int argc, char **argv) if (strcmp("--help", *argv1) == 0) usage(prog); - else if(strcmp("--version", *argv1) == 0) + else if (strcmp("--version", *argv1) == 0) version(prog); argv1++; @@ -180,20 +181,20 @@ int main(int argc, char **argv) struct abi1_info *abi1; size_t abi1_size; if (elf_load_note(elf_fd, elf_filename, ABI1_NOTE_TYPE, ABI1_NOTE_ALIGN, - ABI1_NOTE_MAX_SIZE, (void **)&abi1, &abi1_size) == -1) + ABI1_NOTE_MAX_SIZE, (void **)&abi1, &abi1_size) == -1) errx(1, "%s: No Solo5 ABI information found in executable", - elf_filename); + elf_filename); if (abi1->abi_target != SPT_ABI_TARGET) errx(1, "%s: Executable is not for the solo5-spt target", elf_filename); if (abi1->abi_version != SPT_ABI_VERSION) errx(1, "%s: Executable requests unsupported ABI version %u", - elf_filename, abi1->abi_version); + elf_filename, abi1->abi_version); free(abi1); struct mft *mft; size_t mft_size; if (elf_load_note(elf_fd, elf_filename, MFT1_NOTE_TYPE, MFT1_NOTE_ALIGN, - MFT1_NOTE_MAX_SIZE, (void **)&mft, &mft_size) == -1) + MFT1_NOTE_MAX_SIZE, (void **)&mft, &mft_size) == -1) errx(1, "%s: No Solo5 manifest found in executable", elf_filename); if (mft_validate(mft, mft_size) == -1) { free(mft); @@ -242,7 +243,7 @@ int main(int argc, char **argv) struct spt *spt = spt_init(mem_size); elf_load(elf_fd, elf_filename, spt->mem, spt->mem_size, SPT_GUEST_MIN_BASE, - spt_guest_mprotect, spt, &p_entry, &p_end); + spt_guest_mprotect, spt, &p_entry, &p_end); close(elf_fd); setup_modules(spt, mft); diff --git a/tenders/spt/spt_module_block.c b/tenders/spt/spt_module_block.c index 0c3a87eaf..355736823 100644 --- a/tenders/spt/spt_module_block.c +++ b/tenders/spt/spt_module_block.c @@ -37,7 +37,7 @@ static bool module_in_use; -#define BLOCK_PREFIX "--block:" +#define BLOCK_PREFIX "--block:" #define BLOCK_SECTOR_SIZE_PREFIX "--block-sector-size:" static int handle_cmdarg(char *cmdarg, struct mft *mft) @@ -49,7 +49,7 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) if (strncmp(BLOCK_PREFIX, cmdarg, sizeof(BLOCK_PREFIX) - 1) == 0) which = opt_block; else if (strncmp(BLOCK_SECTOR_SIZE_PREFIX, cmdarg, - sizeof(BLOCK_SECTOR_SIZE_PREFIX) - 1) == 0) + sizeof(BLOCK_SECTOR_SIZE_PREFIX) - 1) == 0) which = opt_block_size; else return -1; @@ -58,12 +58,14 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) if (which == opt_block) { char path[PATH_MAX + 1]; int rc = sscanf(cmdarg, - "--block:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%" XSTR(PATH_MAX) "s", name, path); + "--block:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%" XSTR(PATH_MAX) "s", + name, path); if (rc != 2) return -1; - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -79,18 +81,21 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) module_in_use = true; } else if (which == opt_block_size) { uint16_t block_size; - int rc = sscanf(cmdarg, - "--block-sector-size:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%hu", - name, &block_size); + int rc = + sscanf(cmdarg, + "--block-sector-size:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%hu", + name, &block_size); if (rc != 2) return -1; if (block_size < 512 || block_size & (block_size - 1)) { - warnx("Block size must be a multiple of 2 greater than or equal 512"); + warnx( + "Block size must be a multiple of 2 greater than or equal 512"); return -1; } - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_BLOCK_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -123,11 +128,16 @@ static int setup(struct spt *spt, struct mft *mft) assert((block_size & (block_size - 1)) == 0); /* this assumes block_size is a power of 2 */ if ((capacity & (block_size - 1)) != 0) - errx(1, "%." XSTR(MFT_NAME_MAX) "s: Backing storage size must be block aligned (%hu bytes)", - name, block_size); + errx(1, + "%." XSTR(MFT_NAME_MAX) "s: Backing storage size must be " + "block aligned (%hu bytes)", + name, block_size); if (capacity < block_size) - errx(1, "%." XSTR(MFT_NAME_MAX) "s: Backing storage must be at least 1 block (%hu bytes) " - "in size", name, block_size); + errx(1, + "%." XSTR(MFT_NAME_MAX) "s: Backing storage must be at least " + "1 block (%hu bytes) " + "in size", + name, block_size); int rc = -1; @@ -141,24 +151,24 @@ static int setup(struct spt *spt, struct mft *mft) * block_size, so we implement the above by ensuring that (A2 == * block_size) && (A3 <= (capacity - block_size) holds. */ - rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, - SCMP_SYS(pread64), 3, - SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd), - SCMP_A2(SCMP_CMP_EQ, mft->e[i].u.block_basic.block_size), - SCMP_A3(SCMP_CMP_LE, - (mft->e[i].u.block_basic.capacity - mft->e[i].u.block_basic.block_size))); + rc = seccomp_rule_add( + spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(pread64), 3, + SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd), + SCMP_A2(SCMP_CMP_EQ, mft->e[i].u.block_basic.block_size), + SCMP_A3(SCMP_CMP_LE, (mft->e[i].u.block_basic.capacity - + mft->e[i].u.block_basic.block_size))); if (rc != 0) errx(1, "seccomp_rule_add(pread64, fd=%d) failed: %s", - mft->e[i].b.hostfd, strerror(-rc)); - rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, - SCMP_SYS(pwrite64), 3, - SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd), - SCMP_A2(SCMP_CMP_EQ, mft->e[i].u.block_basic.block_size), - SCMP_A3(SCMP_CMP_LE, - (mft->e[i].u.block_basic.capacity - mft->e[i].u.block_basic.block_size))); + mft->e[i].b.hostfd, strerror(-rc)); + rc = seccomp_rule_add( + spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(pwrite64), 3, + SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd), + SCMP_A2(SCMP_CMP_EQ, mft->e[i].u.block_basic.block_size), + SCMP_A3(SCMP_CMP_LE, (mft->e[i].u.block_basic.capacity - + mft->e[i].u.block_basic.block_size))); if (rc != 0) errx(1, "seccomp_rule_add(pwrite64, fd=%d) failed: %s", - mft->e[i].b.hostfd, strerror(-rc)); + mft->e[i].b.hostfd, strerror(-rc)); } return 0; @@ -166,12 +176,12 @@ static int setup(struct spt *spt, struct mft *mft) static const char *usage(void) { - return "--block:NAME=PATH (attach block device/file at PATH as block storage NAME)\n" - " [ --block-sector-size:NAME=SECTORSIZE ] (set sector size for block device NAME; must be a power of two greater than or equal 512)"; + return "--block:NAME=PATH (attach block device/file at PATH as block " + "storage NAME)\n" + " [ --block-sector-size:NAME=SECTORSIZE ] (set sector size for " + "block device NAME; must be a power of two greater than or equal " + "512)"; } -DECLARE_MODULE(block, - .setup = setup, - .handle_cmdarg = handle_cmdarg, - .usage = usage -) +DECLARE_MODULE(block, .setup = setup, .handle_cmdarg = handle_cmdarg, + .usage = usage) diff --git a/tenders/spt/spt_module_net.c b/tenders/spt/spt_module_net.c index 046baaad6..3b8442f39 100644 --- a/tenders/spt/spt_module_net.c +++ b/tenders/spt/spt_module_net.c @@ -39,10 +39,7 @@ static bool module_in_use; static int handle_cmdarg(char *cmdarg, struct mft *mft) { - enum { - opt_net, - opt_net_mac - } which; + enum { opt_net, opt_net_mac } which; if (strncmp("--net:", cmdarg, 6) == 0) which = opt_net; @@ -56,12 +53,13 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) int rc; if (which == opt_net) { rc = sscanf(cmdarg, - "--net:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%19s", name, iface); + "--net:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%19s", + name, iface); if (rc != 2) return -1; - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, - NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -80,19 +78,19 @@ static int handle_cmdarg(char *cmdarg, struct mft *mft) e->b.hostfd = fd; e->attached = true; module_in_use = true; - } - else if (which == opt_net_mac) { + } else if (which == opt_net_mac) { uint8_t mac[6]; rc = sscanf(cmdarg, - "--net-mac:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" - "%02"SCNx8":%02"SCNx8":%02"SCNx8":" - "%02"SCNx8":%02"SCNx8":%02"SCNx8, - name, - &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); + "--net-mac:%" XSTR(MFT_NAME_MAX) "[A-Za-z0-9]=" + "%02" SCNx8 ":%02" SCNx8 + ":%02" SCNx8 ":" + "%02" SCNx8 ":%02" SCNx8 + ":%02" SCNx8, + name, &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); if (rc != 7) return -1; - struct mft_entry *e = mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, - NULL); + struct mft_entry *e = + mft_get_by_name(mft, name, MFT_DEV_NET_BASIC, NULL); if (e == NULL) { warnx("Resource not declared in manifest: '%s'", name); return -1; @@ -111,7 +109,7 @@ static int setup(struct spt *spt, struct mft *mft) for (unsigned i = 0; i != mft->entries; i++) { if (mft->e[i].type != MFT_DEV_NET_BASIC || !mft->e[i].attached) continue; - char no_mac[6] = { 0 }; + char no_mac[6] = {0}; if (memcmp(mft->e[i].u.net_basic.mac, no_mac, sizeof no_mac) == 0) tap_attach_genmac(mft->e[i].u.net_basic.mac); @@ -126,18 +124,18 @@ static int setup(struct spt *spt, struct mft *mft) rc = epoll_ctl(spt->epollfd, EPOLL_CTL_ADD, mft->e[i].b.hostfd, &ev); if (rc == -1) err(1, "epoll_ctl(EPOLL_CTL_ADD, hostfd=%d) failed", - mft->e[i].b.hostfd); + mft->e[i].b.hostfd); rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1, - SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd)); + SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd)); if (rc != 0) errx(1, "seccomp_rule_add(read, fd=%d) failed: %s", - mft->e[i].b.hostfd, strerror(-rc)); + mft->e[i].b.hostfd, strerror(-rc)); rc = seccomp_rule_add(spt->sc_ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1, - SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd)); + SCMP_A0(SCMP_CMP_EQ, mft->e[i].b.hostfd)); if (rc != 0) errx(1, "seccomp_rule_add(write, fd=%d) failed: %s", - mft->e[i].b.hostfd, strerror(-rc)); + mft->e[i].b.hostfd, strerror(-rc)); } return 0; @@ -145,12 +143,10 @@ static int setup(struct spt *spt, struct mft *mft) static const char *usage(void) { - return "--net:NAME=IFACE | @NN (attach tap at IFACE or at fd @NN as network NAME)\n" - " [ --net-mac:NAME=HWADDR ] (set HWADDR for network NAME)"; + return "--net:NAME=IFACE | @NN (attach tap at IFACE or at fd @NN as " + "network NAME)\n" + " [ --net-mac:NAME=HWADDR ] (set HWADDR for network NAME)"; } -DECLARE_MODULE(net, - .setup = setup, - .handle_cmdarg = handle_cmdarg, - .usage = usage -) +DECLARE_MODULE(net, .setup = setup, .handle_cmdarg = handle_cmdarg, + .usage = usage) diff --git a/tests/test_blk/test_blk.c b/tests/test_blk/test_blk.c index b46dc40cb..9efd0c8b3 100644 --- a/tests/test_blk/test_blk.c +++ b/tests/test_blk/test_blk.c @@ -29,8 +29,7 @@ static void puts(const char *s) bool check_one_block(solo5_handle_t h, solo5_off_t offset, size_t block_size) { size_t i; - uint8_t wbuf[block_size], - rbuf[block_size]; + uint8_t wbuf[block_size], rbuf[block_size]; for (i = 0; i < block_size; i++) { wbuf[i] = '0' + i % 10; @@ -66,7 +65,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) * Write and read/check one tenth of the disk. */ for (solo5_off_t offset = 0; offset < bi.capacity; - offset += (10 * bi.block_size)) { + offset += (10 * bi.block_size)) { if (!check_one_block(h, offset, bi.block_size)) /* Check failed */ return 1; @@ -86,7 +85,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) /* * Check edge cases: should not be able to read or write beyond end * of device. - * + * * XXX: Current implementations may return either SOLO5_R_EINVAL or * SOLO5_R_EUNSPEC here, that is fine for now. */ @@ -118,11 +117,11 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) * XXX: Current implementations may return either SOLO5_R_EINVAL or * SOLO5_R_EUNSPEC here, that is fine for now. */ - if (solo5_block_write(h, bi.block_size - 1, buf, bi.block_size) - == SOLO5_R_OK) + if (solo5_block_write(h, bi.block_size - 1, buf, bi.block_size) == + SOLO5_R_OK) return 10; - if (solo5_block_read(h, bi.block_size - 1, buf, bi.block_size) - == SOLO5_R_OK) + if (solo5_block_read(h, bi.block_size - 1, buf, bi.block_size) == + SOLO5_R_OK) return 11; puts("SUCCESS\n"); diff --git a/tests/test_fpu/test_fpu.c b/tests/test_fpu/test_fpu.c index 621dee7b6..6069f374b 100644 --- a/tests/test_fpu/test_fpu.c +++ b/tests/test_fpu/test_fpu.c @@ -38,46 +38,38 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) c[3] = 8.0; #if defined(__x86_64__) - __asm__ ( - "movaps %0,%%xmm1;" - "mulps %%xmm1, %%xmm1;" - "movaps %%xmm1, %0" - : "=m" (c) - : "m" (c) - : "xmm1" - ); + __asm__("movaps %0,%%xmm1;" + "mulps %%xmm1, %%xmm1;" + "movaps %%xmm1, %0" + : "=m"(c) + : "m"(c) + : "xmm1"); #elif defined(__aarch64__) #if defined(__clang__) - __asm__( - "ld1.4s {v0}, %0\n" - "ld1.4s {v0}, %0\n" - "fmul v0.4s, v1.4s, v0.4s\n" - "st1.4s {v0}, %0\n" - : "=m" (c) - : "m" (c) - : "v0", "v1" - ); + __asm__("ld1.4s {v0}, %0\n" + "ld1.4s {v0}, %0\n" + "fmul v0.4s, v1.4s, v0.4s\n" + "st1.4s {v0}, %0\n" + : "=m"(c) + : "m"(c) + : "v0", "v1"); #else - __asm__( - "ldr q0, %0\n" - "ldr q1, %0\n" - "fmul v0.4s, v1.4s, v0.4s\n" - "str q0, %0\n" - : "=m" (c) - : "m" (c) - : "q0", "q1", "v0" - ); + __asm__("ldr q0, %0\n" + "ldr q1, %0\n" + "fmul v0.4s, v1.4s, v0.4s\n" + "str q0, %0\n" + : "=m"(c) + : "m"(c) + : "q0", "q1", "v0"); #endif #elif defined(__powerpc64__) -#define DOMUL(VAR) \ - __asm__( \ - "lfs %%f0, %0\n" \ - "fmuls %%f0, %%f0, %%f0\n" \ - "stfs %%f0, %0\n" \ - : "=m" (VAR) \ - : "m" (VAR) \ - : "memory" \ - ) +#define DOMUL(VAR) \ + __asm__("lfs %%f0, %0\n" \ + "fmuls %%f0, %%f0, %%f0\n" \ + "stfs %%f0, %0\n" \ + : "=m"(VAR) \ + : "m"(VAR) \ + : "memory") DOMUL(c[0]); DOMUL(c[1]); DOMUL(c[2]); diff --git a/tests/test_mft_maxdevices/test_mft_maxdevices.c b/tests/test_mft_maxdevices/test_mft_maxdevices.c index d2950f9f2..411df4030 100644 --- a/tests/test_mft_maxdevices/test_mft_maxdevices.c +++ b/tests/test_mft_maxdevices/test_mft_maxdevices.c @@ -31,7 +31,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) puts("\n**** Solo5 standalone test_mft_maxdevices ****\n\n"); solo5_handle_t storage0, storage62; - struct solo5_block_info bi; + struct solo5_block_info bi; if (solo5_block_acquire("storage0", &storage0, &bi) != SOLO5_R_OK) { puts("FAILURE\n"); diff --git a/tests/test_net/test_net.c b/tests/test_net/test_net.c index a69d1148d..0b3d7b189 100644 --- a/tests/test_net/test_net.c +++ b/tests/test_net/test_net.c @@ -37,8 +37,8 @@ static void xputs(int ifindex, const char *s) #define ETHERTYPE_IP 0x0800 #define ETHERTYPE_ARP 0x0806 -#define HLEN_ETHER 6 -#define PLEN_IPV4 4 +#define HLEN_ETHER 6 +#define PLEN_IPV4 4 struct ether { uint8_t target[HLEN_ETHER]; @@ -98,15 +98,15 @@ static uint16_t checksum(uint16_t *addr, size_t count) * beginning at location "addr".*/ register long sum = 0; - while (count > 1) { + while (count > 1) { /* This is the inner loop */ - sum += * (unsigned short *) addr++; + sum += *(unsigned short *)addr++; count -= 2; } /* Add left-over byte, if any */ if (count > 0) - sum += * (unsigned char *) addr; + sum += *(unsigned char *)addr; /* Fold 32-bit sum to 16 bits */ while (sum >> 16) @@ -141,19 +141,19 @@ struct netif { struct netif ni[] = { { - .ipaddr = { 0x0a, 0x00, 0x00, 0x02 }, /* 10.0.0.2 */ - .ipaddr_brdnet = { 0x0a, 0x00, 0x00, 0xff } /* 10.0.0.255 */ + .ipaddr = {0x0a, 0x00, 0x00, 0x02}, /* 10.0.0.2 */ + .ipaddr_brdnet = {0x0a, 0x00, 0x00, 0xff} /* 10.0.0.255 */ }, #ifdef TWO_INTERFACES { - .ipaddr = { 0x0a, 0x01, 0x00, 0x02 }, /* 10.1.0.2 */ - .ipaddr_brdnet = { 0x0a, 0x01, 0x00, 0xff } /* 10.1.0.255 */ + .ipaddr = {0x0a, 0x01, 0x00, 0x02}, /* 10.1.0.2 */ + .ipaddr_brdnet = {0x0a, 0x01, 0x00, 0xff} /* 10.1.0.255 */ } #endif }; -uint8_t ipaddr_brdall[4] = { 0xff, 0xff, 0xff, 0xff }; /* 255.255.255.255 */ -uint8_t macaddr_brd[HLEN_ETHER] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +uint8_t ipaddr_brdall[4] = {0xff, 0xff, 0xff, 0xff}; /* 255.255.255.255 */ +uint8_t macaddr_brd[HLEN_ETHER] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; static unsigned long n_pings_received = 0; static bool opt_verbose = false; @@ -233,14 +233,14 @@ static bool handle_ip(int ifindex, uint8_t *buf) /* recalculate ip checksum for return pkt */ p->ip.checksum = 0; - p->ip.checksum = checksum((uint16_t *) &p->ip, sizeof(struct ip)); + p->ip.checksum = checksum((uint16_t *)&p->ip, sizeof(struct ip)); p->ping.type = 0x0; /* change into reply */ /* recalculate ICMP checksum */ p->ping.checksum = 0; - p->ping.checksum = checksum((uint16_t *) &p->ping, - htons(p->ip.length) - sizeof(struct ip)); + p->ping.checksum = + checksum((uint16_t *)&p->ping, htons(p->ip.length) - sizeof(struct ip)); n_pings_received++; return true; @@ -249,7 +249,7 @@ static bool handle_ip(int ifindex, uint8_t *buf) static void send_garp(int ifindex) { struct arppkt p; - uint8_t zero[HLEN_ETHER] = { 0 }; + uint8_t zero[HLEN_ETHER] = {0}; /* * Send a gratuitous ARP packet announcing our MAC address. @@ -292,22 +292,22 @@ static bool handle_packet(int ifindex) return true; /* not ether addressed to us */ switch (htons(p->type)) { - case ETHERTYPE_ARP: - if (handle_arp(ifindex, buf)) { - handled = true; - if (opt_verbose) - xputs(ifindex, "Received arp request, sending reply\n"); - } - break; - case ETHERTYPE_IP: - if (handle_ip(ifindex, buf)) { - if (opt_verbose) - xputs(ifindex, "Received ping, sending reply\n"); - handled = true; - } - break; - default: - break; + case ETHERTYPE_ARP: + if (handle_arp(ifindex, buf)) { + handled = true; + if (opt_verbose) + xputs(ifindex, "Received arp request, sending reply\n"); + } + break; + case ETHERTYPE_IP: + if (handle_ip(ifindex, buf)) { + if (opt_verbose) + xputs(ifindex, "Received ping, sending reply\n"); + handled = true; + } + break; + default: + break; } if (handled) { @@ -315,8 +315,7 @@ static bool handle_packet(int ifindex) xputs(ifindex, "Write error\n"); return false; } - } - else { + } else { xputs(ifindex, "Unknown or unsupported packet, dropped\n"); } @@ -396,8 +395,7 @@ int solo5_app_main(const struct solo5_start_info *si) if (ping_serve()) { puts("SUCCESS\n"); return SOLO5_EXIT_SUCCESS; - } - else { + } else { puts("FAILURE\n"); return SOLO5_EXIT_FAILURE; } diff --git a/tests/test_net_mtu/test_net_mtu.c b/tests/test_net_mtu/test_net_mtu.c index 51af065a0..9c94eab6a 100644 --- a/tests/test_net_mtu/test_net_mtu.c +++ b/tests/test_net_mtu/test_net_mtu.c @@ -30,8 +30,7 @@ static void puts(const char *s) solo5_console_write(s, strlen(s)); } -static void printf(const char *fmt, ...) - __attribute__ ((format (printf, 1, 2))); +static void printf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); static void printf(const char *fmt, ...) { @@ -47,13 +46,12 @@ static void printf(const char *fmt, ...) const char trunc[] = "(truncated)\n"; solo5_console_write(buffer, sizeof buffer - 1); solo5_console_write(trunc, sizeof trunc - 1); - } - else { + } else { solo5_console_write(buffer, size); } } -#define HLEN_ETHER 6 +#define HLEN_ETHER 6 static void tohexs(char *dst, uint8_t *src, size_t size) { @@ -110,8 +108,7 @@ int solo5_app_main(const struct solo5_start_info *si) if (print_mtu()) { puts("SUCCESS\n"); return SOLO5_EXIT_SUCCESS; - } - else { + } else { puts("FAILURE\n"); return SOLO5_EXIT_FAILURE; } diff --git a/tests/test_notls/test_notls.c b/tests/test_notls/test_notls.c index 1105f176f..bfa1528aa 100644 --- a/tests/test_notls/test_notls.c +++ b/tests/test_notls/test_notls.c @@ -36,7 +36,9 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) __asm__ __volatile("mrs x0, tpidr_el0; " "add x0, x0, #0x10; " "ldr w1, [x0]" - : : : "x0", "w1"); + : + : + : "x0", "w1"); #elif defined(__powerpc64__) __asm__ __volatile("ld 3,-28672(13)" : : : "r3", "r13"); #else diff --git a/tests/test_output/test_output.c b/tests/test_output/test_output.c index 92ac0423f..cba5c914d 100644 --- a/tests/test_output/test_output.c +++ b/tests/test_output/test_output.c @@ -28,80 +28,79 @@ static void puts(const char *s) int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) { - const char* str = - "**** Solo5 standalone test_output **** (55 characters)\n" - "**** Solo5 standalone test_output **** (111 characters)\n" - "**** Solo5 standalone test_output **** (167 characters)\n" - "**** Solo5 standalone test_output **** (223 characters)\n" - "**** Solo5 standalone test_output **** (279 characters)\n" - "**** Solo5 standalone test_output **** (335 characters)\n" - "**** Solo5 standalone test_output **** (391 characters)\n" - "**** Solo5 standalone test_output **** (447 characters)\n" - "**** Solo5 standalone test_output **** (503 characters)\n" - "**** Solo5 standalone test_output **** (559 characters)\n" - "**** Solo5 standalone test_output **** (615 characters)\n" - "**** Solo5 standalone test_output **** (671 characters)\n" - "**** Solo5 standalone test_output **** (727 characters)\n" - "**** Solo5 standalone test_output **** (783 characters)\n" - "**** Solo5 standalone test_output **** (839 characters)\n" - "**** Solo5 standalone test_output **** (895 characters)\n" - "**** Solo5 standalone test_output **** (951 characters)\n" - "**** Solo5 standalone test_output **** (1008 characters)\n" - "**** Solo5 standalone test_output **** (1065 characters)\n" - "**** Solo5 standalone test_output **** (1122 characters)\n" - "**** Solo5 standalone test_output **** (1179 characters)\n" - "**** Solo5 standalone test_output **** (1236 characters)\n" - "**** Solo5 standalone test_output **** (1293 characters)\n" - "**** Solo5 standalone test_output **** (1350 characters)\n" - "**** Solo5 standalone test_output **** (1407 characters)\n" - "**** Solo5 standalone test_output **** (1464 characters)\n" - "**** Solo5 standalone test_output **** (1521 characters)\n" - "**** Solo5 standalone test_output **** (1635 characters)\n" - "**** Solo5 standalone test_output **** (1692 characters)\n" - "**** Solo5 standalone test_output **** (1749 characters)\n" - "**** Solo5 standalone test_output **** (1806 characters)\n" - "**** Solo5 standalone test_output **** (1863 characters)\n" - "**** Solo5 standalone test_output **** (1920 characters)\n" - "**** Solo5 standalone test_output **** (1977 characters)\n" - "**** Solo5 standalone test_output **** (2034 characters)\n" - "**** Solo5 standalone test_output **** (2091 characters)\n" - "**** Solo5 standalone test_output **** (2148 characters)\n" - "**** Solo5 standalone test_output **** (2205 characters)\n" - "**** Solo5 standalone test_output **** (2262 characters)\n" - "**** Solo5 standalone test_output **** (2319 characters)\n" - "**** Solo5 standalone test_output **** (2376 characters)\n" - "**** Solo5 standalone test_output **** (2433 characters)\n" - "**** Solo5 standalone test_output **** (2490 characters)\n" - "**** Solo5 standalone test_output **** (2547 characters)\n" - "**** Solo5 standalone test_output **** (2604 characters)\n" - "**** Solo5 standalone test_output **** (2661 characters)\n" - "**** Solo5 standalone test_output **** (2718 characters)\n" - "**** Solo5 standalone test_output **** (2775 characters)\n" - "**** Solo5 standalone test_output **** (2832 characters)\n" - "**** Solo5 standalone test_output **** (2889 characters)\n" - "**** Solo5 standalone test_output **** (2946 characters)\n" - "**** Solo5 standalone test_output **** (3003 characters)\n" - "**** Solo5 standalone test_output **** (3060 characters)\n" - "**** Solo5 standalone test_output **** (3117 characters)\n" - "**** Solo5 standalone test_output **** (3174 characters)\n" - "**** Solo5 standalone test_output **** (3231 characters)\n" - "**** Solo5 standalone test_output **** (3288 characters)\n" - "**** Solo5 standalone test_output **** (3345 characters)\n" - "**** Solo5 standalone test_output **** (3402 characters)\n" - "**** Solo5 standalone test_output **** (3459 characters)\n" - "**** Solo5 standalone test_output **** (3516 characters)\n" - "**** Solo5 standalone test_output **** (3573 characters)\n" - "**** Solo5 standalone test_output **** (3630 characters)\n" - "**** Solo5 standalone test_output **** (3687 characters)\n" - "**** Solo5 standalone test_output **** (3744 characters)\n" - "**** Solo5 standalone test_output **** (3801 characters)\n" - "**** Solo5 standalone test_output **** (3858 characters)\n" - "**** Solo5 standalone test_output **** (3915 characters)\n" - "**** Solo5 standalone test_output **** (3972 characters)\n" - "**** Solo5 standalone test_output **** (4029 characters)\n" - "**** Solo5 standalone test_output **** (4086 characters)\n" - "**** Solo5 standalone test_output **** (4143 characters)\n" - ; + const char *str = + "**** Solo5 standalone test_output **** (55 characters)\n" + "**** Solo5 standalone test_output **** (111 characters)\n" + "**** Solo5 standalone test_output **** (167 characters)\n" + "**** Solo5 standalone test_output **** (223 characters)\n" + "**** Solo5 standalone test_output **** (279 characters)\n" + "**** Solo5 standalone test_output **** (335 characters)\n" + "**** Solo5 standalone test_output **** (391 characters)\n" + "**** Solo5 standalone test_output **** (447 characters)\n" + "**** Solo5 standalone test_output **** (503 characters)\n" + "**** Solo5 standalone test_output **** (559 characters)\n" + "**** Solo5 standalone test_output **** (615 characters)\n" + "**** Solo5 standalone test_output **** (671 characters)\n" + "**** Solo5 standalone test_output **** (727 characters)\n" + "**** Solo5 standalone test_output **** (783 characters)\n" + "**** Solo5 standalone test_output **** (839 characters)\n" + "**** Solo5 standalone test_output **** (895 characters)\n" + "**** Solo5 standalone test_output **** (951 characters)\n" + "**** Solo5 standalone test_output **** (1008 characters)\n" + "**** Solo5 standalone test_output **** (1065 characters)\n" + "**** Solo5 standalone test_output **** (1122 characters)\n" + "**** Solo5 standalone test_output **** (1179 characters)\n" + "**** Solo5 standalone test_output **** (1236 characters)\n" + "**** Solo5 standalone test_output **** (1293 characters)\n" + "**** Solo5 standalone test_output **** (1350 characters)\n" + "**** Solo5 standalone test_output **** (1407 characters)\n" + "**** Solo5 standalone test_output **** (1464 characters)\n" + "**** Solo5 standalone test_output **** (1521 characters)\n" + "**** Solo5 standalone test_output **** (1635 characters)\n" + "**** Solo5 standalone test_output **** (1692 characters)\n" + "**** Solo5 standalone test_output **** (1749 characters)\n" + "**** Solo5 standalone test_output **** (1806 characters)\n" + "**** Solo5 standalone test_output **** (1863 characters)\n" + "**** Solo5 standalone test_output **** (1920 characters)\n" + "**** Solo5 standalone test_output **** (1977 characters)\n" + "**** Solo5 standalone test_output **** (2034 characters)\n" + "**** Solo5 standalone test_output **** (2091 characters)\n" + "**** Solo5 standalone test_output **** (2148 characters)\n" + "**** Solo5 standalone test_output **** (2205 characters)\n" + "**** Solo5 standalone test_output **** (2262 characters)\n" + "**** Solo5 standalone test_output **** (2319 characters)\n" + "**** Solo5 standalone test_output **** (2376 characters)\n" + "**** Solo5 standalone test_output **** (2433 characters)\n" + "**** Solo5 standalone test_output **** (2490 characters)\n" + "**** Solo5 standalone test_output **** (2547 characters)\n" + "**** Solo5 standalone test_output **** (2604 characters)\n" + "**** Solo5 standalone test_output **** (2661 characters)\n" + "**** Solo5 standalone test_output **** (2718 characters)\n" + "**** Solo5 standalone test_output **** (2775 characters)\n" + "**** Solo5 standalone test_output **** (2832 characters)\n" + "**** Solo5 standalone test_output **** (2889 characters)\n" + "**** Solo5 standalone test_output **** (2946 characters)\n" + "**** Solo5 standalone test_output **** (3003 characters)\n" + "**** Solo5 standalone test_output **** (3060 characters)\n" + "**** Solo5 standalone test_output **** (3117 characters)\n" + "**** Solo5 standalone test_output **** (3174 characters)\n" + "**** Solo5 standalone test_output **** (3231 characters)\n" + "**** Solo5 standalone test_output **** (3288 characters)\n" + "**** Solo5 standalone test_output **** (3345 characters)\n" + "**** Solo5 standalone test_output **** (3402 characters)\n" + "**** Solo5 standalone test_output **** (3459 characters)\n" + "**** Solo5 standalone test_output **** (3516 characters)\n" + "**** Solo5 standalone test_output **** (3573 characters)\n" + "**** Solo5 standalone test_output **** (3630 characters)\n" + "**** Solo5 standalone test_output **** (3687 characters)\n" + "**** Solo5 standalone test_output **** (3744 characters)\n" + "**** Solo5 standalone test_output **** (3801 characters)\n" + "**** Solo5 standalone test_output **** (3858 characters)\n" + "**** Solo5 standalone test_output **** (3915 characters)\n" + "**** Solo5 standalone test_output **** (3972 characters)\n" + "**** Solo5 standalone test_output **** (4029 characters)\n" + "**** Solo5 standalone test_output **** (4086 characters)\n" + "**** Solo5 standalone test_output **** (4143 characters)\n"; puts(str); return SOLO5_EXIT_SUCCESS; } diff --git a/tests/test_rnow/test_rnow.c b/tests/test_rnow/test_rnow.c index a95e9a674..c9fd0e76d 100644 --- a/tests/test_rnow/test_rnow.c +++ b/tests/test_rnow/test_rnow.c @@ -26,7 +26,7 @@ static void puts(const char *s) solo5_console_write(s, strlen(s)); } -__attribute__((section (".rodata"), noinline)) void nothing(void) +__attribute__((section(".rodata"), noinline)) void nothing(void) { __asm__(""); } diff --git a/tests/test_rnox/test_rnox.c b/tests/test_rnox/test_rnox.c index 64fc4c64f..381f7a449 100644 --- a/tests/test_rnox/test_rnox.c +++ b/tests/test_rnox/test_rnox.c @@ -26,7 +26,7 @@ static void puts(const char *s) solo5_console_write(s, strlen(s)); } -__attribute__((section (".rodata"), noinline)) void nothing(void) +__attribute__((section(".rodata"), noinline)) void nothing(void) { __asm__(""); } diff --git a/tests/test_seccomp/test_seccomp.c b/tests/test_seccomp/test_seccomp.c index 8b64c477d..e3457f770 100644 --- a/tests/test_seccomp/test_seccomp.c +++ b/tests/test_seccomp/test_seccomp.c @@ -36,29 +36,24 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) #if defined(__x86_64__) int ret; - __asm__ __volatile__ ( - "syscall" - : "=a" (ret) : "a" (32), "D" (1) : "rcx", "r11", "memory" - ); + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(32), "D"(1) + : "rcx", "r11", "memory"); #elif defined(__aarch64__) register long x8 __asm__("x8") = 23; register long x0 __asm__("x0"); register long x1 __asm__("x1") = 1; - __asm__ __volatile__ ( - "svc 0" - : "=r" (x0) : "r" (x8), "r" (x1) : "cc", "memory" - ); + __asm__ __volatile__("svc 0" + : "=r"(x0) + : "r"(x8), "r"(x1) + : "cc", "memory"); #elif defined(__powerpc__) register long r0 __asm__("r0") = 41; register long r3 __asm__("r3") = 0; - __asm__ __volatile__ ( - "sc" - : "=r" (r3) - : "r" (r0), "r" (r3) - : "cc", "memory" - ); + __asm__ __volatile__("sc" : "=r"(r3) : "r"(r0), "r"(r3) : "cc", "memory"); #else #error Unsupported architecture #endif diff --git a/tests/test_ssp/test_ssp.c b/tests/test_ssp/test_ssp.c index 00e6c6089..679fe8dff 100644 --- a/tests/test_ssp/test_ssp.c +++ b/tests/test_ssp/test_ssp.c @@ -43,7 +43,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) * an ABORT via __stack_chk_fail(). */ char buffer[16]; - strcpy (buffer, "1234567890123456789012345678901234567890\n"); + strcpy(buffer, "1234567890123456789012345678901234567890\n"); puts(buffer); return SOLO5_EXIT_FAILURE; diff --git a/tests/test_time/test_time.c b/tests/test_time/test_time.c index f1ddc051b..39daac095 100644 --- a/tests/test_time/test_time.c +++ b/tests/test_time/test_time.c @@ -25,8 +25,7 @@ #include "../../bindings/lib.c" #include "../../bindings/printf.c" -static void printf(const char *fmt, ...) - __attribute__ ((format (printf, 1, 2))); +static void printf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); static void printf(const char *fmt, ...) { @@ -42,8 +41,7 @@ static void printf(const char *fmt, ...) const char trunc[] = "(truncated)\n"; solo5_console_write(buffer, sizeof buffer - 1); solo5_console_write(trunc, sizeof trunc - 1); - } - else { + } else { solo5_console_write(buffer, size); } } @@ -85,7 +83,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) solo5_yield(ta, NULL); tb = solo5_clock_monotonic(); printf("Overhead of solo5_yield(): %llu ns\n", - (unsigned long long)(tb - ta)); + (unsigned long long)(tb - ta)); /* * Always run the following test 5 times, to get more information in CI/ @@ -113,7 +111,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) const solo5_time_t slack = 200000000ULL; if (delta < NSEC_PER_SEC - slack) { printf("[%d] ERROR: slept too little (expected at least %llu ns)\n", - iters, (unsigned long long)NSEC_PER_SEC); + iters, (unsigned long long)NSEC_PER_SEC); failed = true; continue; } @@ -123,7 +121,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) */ if (delta > (NSEC_PER_SEC + slack)) { printf("[%d] ERROR: slept too much (expected at most %llu ns)\n", - iters, (unsigned long long)slack); + iters, (unsigned long long)slack); failed = true; continue; } @@ -137,7 +135,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) ta = solo5_clock_wall(); if (ta < (1483228800ULL * NSEC_PER_SEC)) { printf("ERROR: wall time is not 2017 or later (got %llu ns)\n", - (unsigned long long)ta); + (unsigned long long)ta); return SOLO5_EXIT_FAILURE; } diff --git a/tests/test_tls/test_tls.c b/tests/test_tls/test_tls.c index 4bad40c77..73121a79e 100644 --- a/tests/test_tls/test_tls.c +++ b/tests/test_tls/test_tls.c @@ -36,30 +36,29 @@ static void puts(const char *s) static uint8_t heap[heap_size]; static uintptr_t heap_top = (uintptr_t)&heap; -static void* malloc_stub(size_t size) +static void *malloc_stub(size_t size) { - if (heap_top + size <= (uintptr_t)&heap + heap_size) - { + if (heap_top + size <= (uintptr_t)&heap + heap_size) { heap_top += size; - return (void*)(heap_top - size); + return (void *)(heap_top - size); } return NULL; } __thread volatile uint64_t _data; -uint64_t __attribute__ ((noinline)) get_data() +uint64_t __attribute__((noinline)) get_data() { return _data; } -void __attribute__ ((noinline)) set_data(uint64_t data) +void __attribute__((noinline)) set_data(uint64_t data) { _data = data; } __thread volatile uint64_t _data_not_bss = 0x0000000000C0FFEE; -uint64_t __attribute__ ((noinline)) get_data_not_bss() +uint64_t __attribute__((noinline)) get_data_not_bss() { return _data_not_bss; } @@ -71,11 +70,11 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) tcb1 = (uintptr_t)malloc_stub(solo5_tls_size()); if (solo5_tls_init(tcb1) != SOLO5_R_OK) return 10; - + tcb2 = (uintptr_t)malloc_stub(solo5_tls_size()); if (solo5_tls_init(tcb2) != SOLO5_R_OK) return 11; - + if (solo5_set_tls_base(solo5_tls_tp_offset(tcb1)) != SOLO5_R_OK) return 1; set_data(1); diff --git a/tests/test_wnox/test_wnox.c b/tests/test_wnox/test_wnox.c index d2b7f2837..76efd963c 100644 --- a/tests/test_wnox/test_wnox.c +++ b/tests/test_wnox/test_wnox.c @@ -26,7 +26,7 @@ static void puts(const char *s) solo5_console_write(s, strlen(s)); } -__attribute__((section (".data"), noinline)) void nothing(void) +__attribute__((section(".data"), noinline)) void nothing(void) { __asm__(""); } diff --git a/tests/test_xnor/test_xnor.c b/tests/test_xnor/test_xnor.c index 66c29854a..0a723936f 100644 --- a/tests/test_xnor/test_xnor.c +++ b/tests/test_xnor/test_xnor.c @@ -37,7 +37,7 @@ int solo5_app_main(const struct solo5_start_info *si __attribute__((unused))) /* Verify that executable code (in section .text) is not readable. */ uint64_t *addr_invalid = (uint64_t *)nothing; - if((void *)*addr_invalid != NULL) + if ((void *)*addr_invalid != NULL) puts("executable address read\n"); puts("FAILURE\n"); diff --git a/tests/test_zeropage/test_zeropage.c b/tests/test_zeropage/test_zeropage.c index 9c91914d9..3a1bc5a45 100644 --- a/tests/test_zeropage/test_zeropage.c +++ b/tests/test_zeropage/test_zeropage.c @@ -21,7 +21,7 @@ #include "solo5.h" #include "../../bindings/lib.c" -/* +/* * Silence GCC's array bounds warning when accessing memory at address "8". * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578 */ From 69dbcbc23cb9c34af86b702ef5a5edc08d5d4da1 Mon Sep 17 00:00:00 2001 From: Calascibetta Romain Date: Sun, 29 Mar 2026 17:31:15 +0200 Subject: [PATCH 4/4] Add our commit which formats our code to .git-blame-ignore-revs --- .git-blame-ignore-revs | 1 + 1 file changed, 1 insertion(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index e69de29bb..e7d91153f 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -0,0 +1 @@ +95165c5566cb37c7c3b9a9deb345ec2e8922c4fa