diff --git a/plat/Makefile.uk b/plat/Makefile.uk index cf384507f9168af5a48a8a356c4c5b6c6a553d22..d0d24608cb5527b6c942fed81ed93bee303bd1ee 100644 --- a/plat/Makefile.uk +++ b/plat/Makefile.uk @@ -2,9 +2,7 @@ UK_PLAT_BASE := $(CONFIG_UK_BASE)/plat UK_PLAT_COMMON_BASE := $(UK_PLAT_BASE)/common UK_PLAT_DRIVERS_BASE:= $(UK_PLAT_BASE)/drivers -$(eval $(call import_lib,$(UK_PLAT_BASE)/xen)) $(eval $(call import_lib,$(UK_PLAT_BASE)/kvm)) -$(eval $(call import_lib,$(UK_PLAT_BASE)/linuxu)) ifeq ($(CONFIG_PLAT_RASPI),y) $(eval $(call import_lib,$(UK_PLAT_BASE)/raspi)) endif diff --git a/plat/linuxu/Config.uk b/plat/linuxu/Config.uk deleted file mode 100644 index c396e614fe277e47bb1cdbedc5746689f41cb4f3..0000000000000000000000000000000000000000 --- a/plat/linuxu/Config.uk +++ /dev/null @@ -1,44 +0,0 @@ -menuconfig PLAT_LINUXU - bool "Linux user space" - default n - depends on !HAVE_SYSCALL && !HAVE_SMP && (!ARCH_ARM_32 || !HAVE_SCHED) - depends on !HAVE_PAGING - depends on !OPTIMIZE_PIE - select LIBUKDEBUG - select LIBUKALLOC - select LIBNOLIBC if !HAVE_LIBC - help - Create a Unikraft image that runs as a Linux user space program - -if (PLAT_LINUXU) - config LINUXU_DEFAULT_HEAPMB - int "Default heap size (MB)" - default 4 - help - Default size of heap memory to be allocated. The heap size may also be - changed by using linuxu.heap_size as a command line argument. For more - information refer to "Command line arguments in Unikraft" sections in - the developers guide - - config TAP_NET - bool "Tap driver" - default y if LIBUKNETDEV - depends on LIBUKNETDEV - select LIBUKBUS - imply LIBUKLIBPARAM - help - Enable drivers to support tap device on the linuxu platform. The - driver implements the uknetdev interface and provides an interface - for the network stack to send/receive network packets. - - config TAP_DEV_DEBUG - bool "Tap Device Debug" - default n - depends on TAP_NET - help - Enable debug messages from the tap device. - - config LINUXU_MAX_IRQ_HANDLER_ENTRIES - int "Maximum number of handlers per IRQ" - default 8 -endif diff --git a/plat/linuxu/Linker.uk b/plat/linuxu/Linker.uk deleted file mode 100644 index d5543ac3ec4da26f438eb64b11b1c3b65fd64a30..0000000000000000000000000000000000000000 --- a/plat/linuxu/Linker.uk +++ /dev/null @@ -1,47 +0,0 @@ -LINUXU_LDFLAGS-y += -Wl,-e,_liblinuxuplat_start - -## -## Link image -## -ifneq ($(UK_IMAGE_NAME_OVERWRITE),) -LINUXU_IMAGE := $(BUILD_DIR)/$(UK_IMAGE_NAME_OVERWRITE) -else -LINUXU_IMAGE := $(BUILD_DIR)/$(CONFIG_UK_NAME)_linuxu-$(CONFIG_UK_ARCH) -endif -LINUXU_DEBUG_IMAGE := $(LINUXU_IMAGE).dbg -LINUXU_LD_SCRIPT_FLAGS := $(addprefix -Wl$(comma)-T$(comma),\ - $(LINUXU_LD_SCRIPT-y) $(EXTRA_LD_SCRIPT-y)) - -$(LINUXU_DEBUG_IMAGE): $(LINUXU_ALIBS) $(LINUXU_ALIBS-y) \ - $(LINUXU_OLIBS) $(LINUXU_OLIBS-y) \ - $(UK_ALIBS) $(UK_ALIBS-y) $(UK_OLIBS) $(UK_OLIBS-y) \ - $(LINUXU_LD_SCRIPT-y) $(EXTRA_LD_SCRIPT-y) $(UK_LDEPS) - $(call build_cmd,LD,,$@,\ - $(LD) $(LDFLAGS) $(LDFLAGS-y) \ - $(LINUXU_LDFLAGS) $(LINUXU_LDFLAGS-y) \ - $(LINUXU_OLIBS) $(LINUXU_OLIBS-y) \ - $(UK_OLIBS) $(UK_OLIBS-y) \ - -Wl$(comma)--start-group \ - $(LINUXU_ALIBS) $(LINUXU_ALIBS-y) \ - $(UK_ALIBS) $(UK_ALIBS-y) \ - -Wl$(comma)--end-group \ - $(LINUXU_LD_SCRIPT_FLAGS) \ - -o $@) - -$(LINUXU_IMAGE): $(LINUXU_IMAGE).dbg - $(call build_cmd,SCSTRIP,,$@,\ - $(STRIP) -s \ - $(SECT_STRIP_FLAGS) $(SECT_STRIP_FLAGS-y) \ - $< -o $@ 2>&1 | \ - { $(GREP) -v "Empty loadable segment detected" || true; }) - $(call build_bootinfo,$@) - -$(LINUXU_IMAGE).sym: $(LINUXU_DEBUG_IMAGE) - $(call build_cmd,NM,,$@, $(NM) -n $< > $@) - -# register image to the build -ifeq ($(CONFIG_PLAT_LINUXU),y) -UK_DEBUG_IMAGES-y += $(LINUXU_DEBUG_IMAGE) -UK_IMAGES-y += $(LINUXU_IMAGE) -UK_IMAGES-$(CONFIG_OPTIMIZE_SYMFILE) += $(LINUXU_IMAGE).sym -endif diff --git a/plat/linuxu/Makefile.uk b/plat/linuxu/Makefile.uk deleted file mode 100644 index 1ca8ddc71a18ed0309dafcf8181141342b9819b6..0000000000000000000000000000000000000000 --- a/plat/linuxu/Makefile.uk +++ /dev/null @@ -1,66 +0,0 @@ -## -## Linux user platform registration -## -$(eval $(call addplat_s,linuxu,$(CONFIG_PLAT_LINUXU))) - -## -## Linux user platform library registration -## -$(eval $(call addplatlib,linuxu,liblinuxuplat)) -$(eval $(call addplatlib_s,linuxu,liblinuxutapnet,$(CONFIG_TAP_NET))) - -## Adding libparam for the linuxu platform -$(eval $(call addlib_paramprefix,liblinuxuplat,linuxu)) -$(eval $(call addlib_paramprefix,liblinuxutapnet,tap)) - -## -## Platform library definitions -## -LIBLINUXUPLAT_ASINCLUDES-y += -I$(LIBLINUXUPLAT_BASE)/include -LIBLINUXUPLAT_ASINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include -LIBLINUXUPLAT_CINCLUDES-y += -I$(LIBLINUXUPLAT_BASE)/include -LIBLINUXUPLAT_CINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include - -LIBLINUXUPLAT_ASFLAGS += -DLINUXUPLAT -LIBLINUXUPLAT_CFLAGS += -DLINUXUPLAT -LIBLINUXUPLAT_CXXFLAGS += -DLINUXUPLAT - -LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_X86_32) += $(LIBLINUXUPLAT_BASE)/x86/entry32.S -LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBLINUXUPLAT_BASE)/x86/entry64.S -LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(LIBLINUXUPLAT_BASE)/arm/entry32.S -LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBLINUXUPLAT_BASE)/arm64/entry64.S -LIBLINUXUPLAT_SRCS-$(CONFIG_FPSIMD) += $(UK_PLAT_COMMON_BASE)/arm/fp_arm64.c|isr -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/setup.c -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/console.c -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/shutdown.c -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/memory.c -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/lcpu.c -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/irq.c -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/time.c -LIBLINUXUPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/lcpu.c|common -LIBLINUXUPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/memory.c|common -LIBLINUXUPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/tls.c|common - -LIBLINUXUPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/bootinfo.c|common -LIBLINUXUPLAT_SRCS-$(CONFIG_LIBFDT) += $(UK_PLAT_COMMON_BASE)/bootinfo_fdt.c|common -LIBLINUXUPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/bootinfo.lds.S|common - -LIBLINUXUPLAT_SRCS-y += $(LIBLINUXUPLAT_BASE)/io.c -LIBLINUXUPLAT_SRCS-$(CONFIG_TAP_NET) += $(LIBLINUXUPLAT_BASE)/tap_io.c -LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_X86_64) += \ - $(LIBLINUXUPLAT_BASE)/x86/link64.lds.S -LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += \ - $(LIBLINUXUPLAT_BASE)/arm/link.lds.S -LIBLINUXUPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += \ - $(LIBLINUXUPLAT_BASE)/arm64/link.lds.S - -## -## LINUXUTAPNET Source -LIBLINUXUTAPNET_ASINCLUED-y += -I$(LIBLINUXUPLAT_BASE)/include -LIBLINUXUTAPNET_ASINCLUDES-y += -I$(UK_PLAT_DRIVERS_BASE)/include -LIBLINUXUTAPNET_CINCLUDES-y += -I$(LIBLINUXUPLAT_BASE)/include -LIBLINUXUTAPNET_CINCLUDES-y += -I$(UK_PLAT_DRIVERS_BASE)/include - -LIBLINUXUTAPNET_CFLAGS-$(CONFIG_TAP_DEV_DEBUG) += -DUK_DEBUG - -LIBLINUXUTAPNET_SRCS-y += $(UK_PLAT_DRIVERS_BASE)/tap/tap.c diff --git a/plat/linuxu/arm/entry32.S b/plat/linuxu/arm/entry32.S deleted file mode 100644 index 9e0e8a94a76059f230b204f38c31f2f413b7983b..0000000000000000000000000000000000000000 --- a/plat/linuxu/arm/entry32.S +++ /dev/null @@ -1,44 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ - -.section .text - -.global _liblinuxuplat_start -_liblinuxuplat_start: - ldr r0, [sp] // argc to r0 - add r1, sp, #4 // argv to r1 - bl _liblinuxuplat_entry - - // Protection -_liblinuxuplat_err: - b _liblinuxuplat_err diff --git a/plat/linuxu/arm/link.lds.S b/plat/linuxu/arm/link.lds.S deleted file mode 100644 index c416f84fecbbac199ff8bf129f359e196f9bbe1e..0000000000000000000000000000000000000000 --- a/plat/linuxu/arm/link.lds.S +++ /dev/null @@ -1,19 +0,0 @@ -#include - -SECTIONS -{ - EXCEPTION_SECTIONS - - CTORTAB_SECTION - - INITTAB_SECTION - - EVENTTAB_SECTION -} -INSERT BEFORE .rodata - -SECTIONS -{ - TLS_SECTIONS -} -INSERT BEFORE .data diff --git a/plat/linuxu/arm64/entry64.S b/plat/linuxu/arm64/entry64.S deleted file mode 100644 index abafc42422fc673eff8cb34dbfab918fe77ea50a..0000000000000000000000000000000000000000 --- a/plat/linuxu/arm64/entry64.S +++ /dev/null @@ -1,64 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer , - * Florin Postolache - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation, - * 2022, Florin Postolache, - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ - -/* - * We do not want to unmap anything. - */ -.section .bss -.align 4 -.globl bpt_unmap_mrd -bpt_unmap_mrd: -.space 64 - -.section .text - -/* For now, although inaccurate, set the - * _base_addr symbol to _liblinuxuplat_start, since that is where most images - * happen to begin anyway. We do not use it in linuxu anyway, so we do not care. - * We only do this so that references to this symbol do not generate build - * errors, although it is not used. - */ -.globl _base_addr -.set _base_addr, _liblinuxuplat_start - -.global _liblinuxuplat_start -_liblinuxuplat_start: - ldr x0, [sp] // argc to r0 - add x1, sp, #8 // argv to r1 - bl _liblinuxuplat_entry - - // Protection -_liblinuxuplat_err: - b _liblinuxuplat_err diff --git a/plat/linuxu/arm64/link.lds.S b/plat/linuxu/arm64/link.lds.S deleted file mode 100644 index c416f84fecbbac199ff8bf129f359e196f9bbe1e..0000000000000000000000000000000000000000 --- a/plat/linuxu/arm64/link.lds.S +++ /dev/null @@ -1,19 +0,0 @@ -#include - -SECTIONS -{ - EXCEPTION_SECTIONS - - CTORTAB_SECTION - - INITTAB_SECTION - - EVENTTAB_SECTION -} -INSERT BEFORE .rodata - -SECTIONS -{ - TLS_SECTIONS -} -INSERT BEFORE .data diff --git a/plat/linuxu/console.c b/plat/linuxu/console.c deleted file mode 100644 index 5d2885678154378cc878184483bf386aeae5c431..0000000000000000000000000000000000000000 --- a/plat/linuxu/console.c +++ /dev/null @@ -1,124 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include - -#include - -#define STDIN 0 -#define STDOUT 1 -#define STDDEBUG 2 - -static struct termios t_orig; -static int cons_initialized; - -void _liblinuxuplat_init_console(void) -{ - int ret; - struct termios t; - - /* TODO: Detect that STDIN/STDOUT is a tty */ - - /* - * Save current TTY settings - */ - ret = tcgetattr(STDIN, &t_orig); - if (ret < 0) - goto err; - - /* - * New terminal setting with RAW mode - * but keep signals and newline translations - */ - t = t_orig; - termiossetraw(&t); - - /* newline translation on input */ - t.c_iflag |= ICRNL; - - /* newline translation on output (why TABDLY?) */ - t.c_oflag |= OPOST | TABDLY; - - /* enable signals from terminal (why ECHOKE?) */ - t.c_lflag |= ISIG | ECHOKE; - - /* control chars: min 1 time 0 */ - t.c_cc[VMIN] = 1; - t.c_cc[VTIME] = 0; - - ret = tcsetattr(STDIN, TCSAFLUSH, &t); - if (ret < 0) - goto err; - - cons_initialized = 1; - return; - -err: - UK_CRASH("Failed to initialize terminal console\n"); -} - -void _liblinuxuplat_fini_console(void) -{ - /* restore console */ - if (cons_initialized) - tcsetattr(STDIN, TCSAFLUSH, &t_orig); -} - -int ukplat_coutd(const char *str, unsigned int len) -{ - ssize_t ret = 0; - - ret = sys_write(STDDEBUG, str, len); - return (int) ret; -} - -int ukplat_coutk(const char *str, unsigned int len) -{ - ssize_t ret = 0; - - ret = sys_write(STDOUT, str, len); - return (int) ret; -} - -int ukplat_cink(char *str, unsigned int maxlen) -{ - ssize_t ret = 0; - - ret = sys_read(STDIN, str, maxlen); - return (int) ret; -} diff --git a/plat/linuxu/include/linuxu/console.h b/plat/linuxu/include/linuxu/console.h deleted file mode 100644 index 4b88d9a73ba160936735bc958f1b8b0fc975364e..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/console.h +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __CONSOLE_H__ -#define __CONSOLE_H__ - -void _liblinuxuplat_init_console(void); -void _liblinuxuplat_fini_console(void); - -#endif /* __CONSOLE_H__ */ diff --git a/plat/linuxu/include/linuxu/ioctl.h b/plat/linuxu/include/linuxu/ioctl.h deleted file mode 100644 index ada62ea879cf079b1286e7f9542d89cb579f013a..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/ioctl.h +++ /dev/null @@ -1,55 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __IOCTL_H__ -#define __IOCTL_H__ - -#include -#include - -static inline int sys_ioctl(int fd, unsigned long req, ...) -{ - void *argp; - va_list va; - - va_start(va, req); - argp = va_arg(va, void *); - va_end(va); - - return (int) syscall3(__SC_IOCTL, - (long) fd, - (long) req, - (long) argp); -} - -#endif /* __IOCTL_H__ */ diff --git a/plat/linuxu/include/linuxu/irq.h b/plat/linuxu/include/linuxu/irq.h deleted file mode 100644 index ac53adf70af5c1ad5573b8dc2d2781d6c6360ed7..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/irq.h +++ /dev/null @@ -1,39 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright (c) 2023, Unikraft GmbH and The Unikraft Authors. - * Licensed under the BSD-3-Clause License (the "License"). - * You may not use this file except in compliance with the License. - */ - -#ifndef __UK_PLAT_LINUXU_IRQ_H__ -#define __UK_PLAT_LINUXU_IRQ_H__ - -#include -#include -#include - -#define __MAX_IRQ 16 - -typedef int (*irq_handler_func_t)(void *); - -struct ukplat_event_irq_data { - struct __regs *regs; - unsigned int irq; -}; - -/* IRQ handlers declarations */ -struct irq_handler { - /* func() special values: - * NULL: free, - * HANDLER_RESERVED: reserved - */ - irq_handler_func_t func; - void *arg; - - struct uk_sigaction oldaction; -}; - -int ukplat_irq_register(unsigned long irq, irq_handler_func_t func, void *arg); - -int ukplat_irq_init(void); - -#endif /* __UK_PLAT_LINUXU_IRQ_H__ */ diff --git a/plat/linuxu/include/linuxu/mode.h b/plat/linuxu/include/linuxu/mode.h deleted file mode 100644 index 3eed2d5a1118cc91e0ffd80191e8e355e8688f9e..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/mode.h +++ /dev/null @@ -1,39 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Alexander Jung - * - * Copyright (c) 2021, Lancaster University. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __LINUXU_MODE_H__ -#define __LINUXU_MODE_H__ - -typedef unsigned int k_mode_t; - -#define K_O_RDONLY 0x0000 - -#endif /* __LINUXU_MODE_H__ */ diff --git a/plat/linuxu/include/linuxu/signal.h b/plat/linuxu/include/linuxu/signal.h deleted file mode 100644 index 5d1582da537dfa44ebfd967073922c3d4bf112a3..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/signal.h +++ /dev/null @@ -1,161 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 file contains definitions for interfacing with the Linux kernel. To - * do so, it needs to use ABI-compatible definitions of types such as sigset_t - * which are not exactly defined by the POSIX standard and hence can vary - * between libc implementations. This is why we provide this file for use - * in the plat/linuxu code instead of including a libc-provided signal.h. - */ - -#ifndef __SIGNAL_H__ -#define __SIGNAL_H__ - -/* Signal numbers */ -#define SIGALRM 14 - -/* type definitions */ -typedef unsigned long k_sigset_t; -typedef struct { - unsigned long fds_bits[128 / sizeof(long)]; -} k_fd_set; - -/* sigaction */ -typedef void (*uk_sighandler_t)(int); -typedef void (*uk_sigrestore_t)(void); - -struct uk_sigaction { - uk_sighandler_t k_sa_handler; - int k_sa_flags; - uk_sigrestore_t k_sa_restorer; - k_sigset_t k_sa_mask; -}; - -/* sigaction flags */ -#define SA_SIGINFO 0x00000004 -#define SA_RESTORER 0x04000000 - - -/* Signal enabling/disabling definitions (sigprocmask) */ -#ifndef SIG_BLOCK -#define SIG_BLOCK 0 -#endif -#ifndef SIG_UNBLOCK -#define SIG_UNBLOCK 1 -#endif -#ifndef SIG_SETMASK -#define SIG_SETMASK 2 -#endif - -/* sigset utils */ -#define SIGSET_WORDS_NUM (sizeof(k_sigset_t) / sizeof(unsigned long)) - -#define k_sigemptyset(set) \ - ({ \ - unsigned int __count = 0; \ - unsigned long *__set = (set); \ - while (__count++ < SIGSET_WORDS_NUM) \ - *__set++ = 0; \ - 0; \ - }) - -#define k_sigfillset(set) \ - ({ \ - unsigned int __count = 0; \ - unsigned long *__set = (set); \ - while (__count++ < SIGSET_WORDS_NUM) \ - *__set++ = ~0UL; \ - 0; \ - }) - -#define k_sigisemptyset(set) \ - ({ \ - unsigned int __count = 0; \ - const unsigned long *__set = (set); \ - int __ret = __set[__count++]; \ - while (!__ret && __count < SIGSET_WORDS_NUM) \ - __ret = __set[__count++]; \ - __ret == 0; \ - }) - - -#define sig_word_idx(sig) \ - (((sig) - 1) / (8 * sizeof(unsigned long))) - -#define sig_word_mask(sig) \ - (1UL << (((sig) - 1) % (8 * sizeof(unsigned long)))) - - -#define k_sigaddset(set, sig) \ - ({ \ - unsigned long __word = sig_word_idx(sig); \ - unsigned long __mask = sig_word_mask(sig); \ - unsigned long *__set = (set); \ - __set[__word] |= __mask; \ - 0; \ - }) - -#define k_sigdelset(set, sig) \ - ({ \ - unsigned long __word = sig_word_idx(sig); \ - unsigned long __mask = sig_word_mask(sig); \ - unsigned long *__set = (set); \ - __set[__word] &= ~__mask; \ - 0; \ - }) - -#define k_sigismember(set, sig) \ - ({ \ - unsigned long __word = sig_word_idx(sig); \ - unsigned long __mask = sig_word_mask(sig); \ - unsigned long *__set = (set); \ - __set[__word] & __mask ? 1 : 0; \ - }) - - -/* Signal event definitions */ -typedef union uk_sigval { - int sival_int; - void *sival_ptr; -} uk_sigval_t; - -typedef struct uk_sigevent { - uk_sigval_t sigev_value; - int sigev_signo; - int sigev_notify; - - /* We aren't interested now in what follows here */ - int pad[64]; - -} uk_sigevent_t; - -#endif /* __SIGNAL_H__ */ diff --git a/plat/linuxu/include/linuxu/stat.h b/plat/linuxu/include/linuxu/stat.h deleted file mode 100644 index 2a1c37ace4df5de98f0fd4706a4cbf8c1eb2daca..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/stat.h +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Alexander Jung - * - * Copyright (c) 2021, Lancaster University. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __LINUXU_STAT_H__ -#define __LINUXU_STAT_H__ - -#include -#include - -typedef __u64 k_dev_t; -typedef __u64 k_ino_t; -typedef __u32 k_nlink_t; -typedef unsigned int k_uid_t; -typedef unsigned int k_gid_t; -typedef unsigned int k_id_t; -typedef __off k_off_t; -typedef long k_blksize_t; -typedef __s64 k_blkcnt_t; - - -struct k_stat { - k_dev_t st_dev; - k_ino_t st_ino; - k_nlink_t st_nlink; - k_mode_t st_mode; - k_uid_t st_uit; - k_gid_t st_gid; - - unsigned int __pad0; - - k_dev_t st_rdev; - k_off_t st_size; - k_blksize_t st_blksize; - k_blkcnt_t st_blocks; - - struct k_timespec st_atim; - struct k_timespec st_mtim; - struct k_timespec st_ctim; -}; - -#endif /* __LINUXU_STAT_H__ */ diff --git a/plat/linuxu/include/linuxu/syscall-arm_32.h b/plat/linuxu/include/linuxu/syscall-arm_32.h deleted file mode 100644 index 78e218f80d0a2713708e0cd455f3eb5494cee074..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/syscall-arm_32.h +++ /dev/null @@ -1,250 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __SYSCALL_ARM_32_H__ -#define __SYSCALL_ARM_32_H__ - -#include - -#define __SC_EXIT 1 -#define __SC_READ 3 -#define __SC_WRITE 4 -#define __SC_CLOSE 6 -#define __SC_IOCTL 54 -#define __SC_FCNTL 55 -#define __SC_MUNMAP 91 -#define __SC_FSTAT 108 -#define __SC_RT_SIGPROCMASK 126 -#define __SC_ARCH_PRCTL 172 -#define __SC_RT_SIGACTION 174 -#define __SC_MMAP 192 /* use mmap2() since mmap() is obsolete */ -#define __SC_TIMER_CREATE 257 -#define __SC_TIMER_SETTIME 258 -#define __SC_TIMER_GETTIME 259 -#define __SC_TIMER_GETOVERRUN 260 -#define __SC_TIMER_DELETE 261 -#define __SC_CLOCK_GETTIME 263 -#define __SC_SOCKET 281 -#define __SC_OPENAT 322 -#define __SC_PSELECT6 335 - -#ifndef O_TMPFILE -#define O_TMPFILE 020040000 -#endif - -/* NOTE: from `man syscall`: - * - * ARM/EABI - * - * instruction syscall # retval - * ------------------------------ - * swi 0x0 r7 r0 - * - * arg1 arg2 arg3 arg4 arg5 arg6 arg7 - * ---------------------------------------- - * r0 r1 r2 r3 r4 r5 r6 - * - */ - -#define syscall0(num) \ -({ \ - register long _num asm("r7") = (num); \ - register long _ret asm("r0"); \ - \ - asm volatile ("swi #0"% \ - : /* output */ \ - "=r" (_ret) \ - : /* input */ \ - "r" (_num) \ - : /* clobbers */ \ - "memory"); \ - _ret; \ -}) - -#define syscall1(num, arg0) \ -({ \ - register long _num asm("r7") = (num); \ - register long _a0ret asm("r0") = (arg0); \ - \ - asm volatile ("swi #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall2(num, arg0, arg1) \ -({ \ - register long _num asm("r7") = (num); \ - register long _a0ret asm("r0") = (arg0); \ - register long _arg1 asm("r1") = (arg1); \ - \ - asm volatile ("swi #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall3(num, arg0, arg1, arg2) \ -({ \ - register long _num asm("r7") = (num); \ - register long _a0ret asm("r0") = (arg0); \ - register long _arg1 asm("r1") = (arg1); \ - register long _arg2 asm("r2") = (arg2); \ - \ - asm volatile ("swi #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall4(num, arg0, arg1, arg2, arg3) \ -({ \ - register long _num asm("r7") = (num); \ - register long _a0ret asm("r0") = (arg0); \ - register long _arg1 asm("r1") = (arg1); \ - register long _arg2 asm("r2") = (arg2); \ - register long _arg3 asm("r3") = (arg3); \ - \ - asm volatile ("swi #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall5(num, arg0, arg1, arg2, arg3, arg4) \ -({ \ - register long _num asm("r7") = (num); \ - register long _a0ret asm("r0") = (arg0); \ - register long _arg1 asm("r1") = (arg1); \ - register long _arg2 asm("r2") = (arg2); \ - register long _arg3 asm("r3") = (arg3); \ - register long _arg4 asm("r4") = (arg4); \ - \ - asm volatile ("swi #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3), \ - "r" (_arg4) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall6(num, arg0, arg1, arg2, arg3, arg4, \ - arg5) \ -({ \ - register long _num asm("r7") = (num); \ - register long _a0ret asm("r0") = (arg0); \ - register long _arg1 asm("r1") = (arg1); \ - register long _arg2 asm("r2") = (arg2); \ - register long _arg3 asm("r3") = (arg3); \ - register long _arg4 asm("r4") = (arg4); \ - register long _arg5 asm("r5") = (arg5); \ - \ - asm volatile ("swi #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3), \ - "r" (_arg4), \ - "r" (_arg5) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall7(num, arg0, arg1, arg2, arg3, arg4, \ - arg5, arg6) \ -({ \ - register long _num asm("r7") = (num); \ - register long _a0ret asm("r0") = (arg0); \ - register long _arg1 asm("r1") = (arg1); \ - register long _arg2 asm("r2") = (arg2); \ - register long _arg3 asm("r3") = (arg3); \ - register long _arg4 asm("r4") = (arg4); \ - register long _arg5 asm("r5") = (arg5); \ - register long _arg6 asm("r6") = (arg6); \ - \ - asm volatile ("swi #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3), \ - "r" (_arg4), \ - "r" (_arg5), \ - "r" (_arg6) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#endif /* __SYSCALL_ARM_32_H__ */ diff --git a/plat/linuxu/include/linuxu/syscall-arm_64.h b/plat/linuxu/include/linuxu/syscall-arm_64.h deleted file mode 100644 index fa529761a21979c20290e008c89e62dc8aa85b92..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/syscall-arm_64.h +++ /dev/null @@ -1,226 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer , - * Florin Postolache - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation, - * 2022, Florin Postolache, - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __SYSCALL_ARM_64_H__ -#define __SYSCALL_ARM_64_H__ - -#include - -#define __SC_FCNTL 25 -#define __SC_IOCTL 29 -#define __SC_OPENAT 56 /* use openat because open is not on arm64 */ -#define __SC_CLOSE 57 -#define __SC_READ 63 -#define __SC_WRITE 64 -#define __SC_PSELECT6 72 -#define __SC_FSTAT 80 -#define __SC_EXIT 93 -#define __SC_TIMER_CREATE 107 -#define __SC_TIMER_GETTIME 108 -#define __SC_TIMER_GETOVERRUN 109 -#define __SC_TIMER_SETTIME 110 -#define __SC_TIMER_DELETE 111 -#define __SC_CLOCK_GETTIME 113 -#define __SC_RT_SIGACTION 134 -#define __SC_RT_SIGPROCMASK 135 -#define __SC_ARCH_PRCTL 167 -#define __SC_SOCKET 198 -#define __SC_MUNMAP 215 -#define __SC_MMAP 222 /* use mmap2() since mmap() is obsolete */ - - - -#ifndef O_TMPFILE -#define O_TMPFILE 020040000 -#endif - -/* NOTE: from `man syscall`: - * - * ARM64 - * - * instruction syscall # retval - * ------------------------------ - * svc #0 x8 x0 - * - * arg1 arg2 arg3 arg4 arg5 arg6 arg7 - * ---------------------------------------- - * x0 x1 x2 x3 x4 x5 - * - */ - -#define syscall0(num) \ -({ \ - register long _num asm("x8") = (num); \ - register long _ret asm("x0"); \ - \ - asm volatile ("svc #0"% \ - : /* output */ \ - "=r" (_ret) \ - : /* input */ \ - "r" (_num) \ - : /* clobbers */ \ - "memory"); \ - _ret; \ -}) - -#define syscall1(num, arg0) \ -({ \ - register long _num asm("x8") = (num); \ - register long _a0ret asm("x0") = (arg0); \ - \ - asm volatile ("svc #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall2(num, arg0, arg1) \ -({ \ - register long _num asm("x8") = (num); \ - register long _a0ret asm("x0") = (arg0); \ - register long _arg1 asm("x1") = (arg1); \ - \ - asm volatile ("svc #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall3(num, arg0, arg1, arg2) \ -({ \ - register long _num asm("x8") = (num); \ - register long _a0ret asm("x0") = (arg0); \ - register long _arg1 asm("x1") = (arg1); \ - register long _arg2 asm("x2") = (arg2); \ - \ - asm volatile ("svc #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall4(num, arg0, arg1, arg2, arg3) \ -({ \ - register long _num asm("x8") = (num); \ - register long _a0ret asm("x0") = (arg0); \ - register long _arg1 asm("x1") = (arg1); \ - register long _arg2 asm("x2") = (arg2); \ - register long _arg3 asm("x3") = (arg3); \ - \ - asm volatile ("svc #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall5(num, arg0, arg1, arg2, arg3, arg4) \ -({ \ - register long _num asm("x8") = (num); \ - register long _a0ret asm("x0") = (arg0); \ - register long _arg1 asm("x1") = (arg1); \ - register long _arg2 asm("x2") = (arg2); \ - register long _arg3 asm("x3") = (arg3); \ - register long _arg4 asm("x4") = (arg4); \ - \ - asm volatile ("svc #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3), \ - "r" (_arg4) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - -#define syscall6(num, arg0, arg1, arg2, arg3, arg4, \ - arg5) \ -({ \ - register long _num asm("x8") = (num); \ - register long _a0ret asm("x0") = (arg0); \ - register long _arg1 asm("x1") = (arg1); \ - register long _arg2 asm("x2") = (arg2); \ - register long _arg3 asm("x3") = (arg3); \ - register long _arg4 asm("x4") = (arg4); \ - register long _arg5 asm("x5") = (arg5); \ - \ - asm volatile ("svc #0" \ - : /* output */ \ - "=r" (_a0ret) \ - : /* input */ \ - "r" (_num), \ - "r" (_a0ret), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3), \ - "r" (_arg4), \ - "r" (_arg5) \ - : /* clobbers */ \ - "memory"); \ - _a0ret; \ -}) - - -#endif /* __SYSCALL_ARM_64_H__ */ diff --git a/plat/linuxu/include/linuxu/syscall-x86_64.h b/plat/linuxu/include/linuxu/syscall-x86_64.h deleted file mode 100644 index e77a59f72fc4c47dda37d91281882283f77ba2ab..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/syscall-x86_64.h +++ /dev/null @@ -1,228 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __SYSCALL_X86_64_H__ -#define __SYSCALL_X86_64_H__ - -#include - -#define __SC_READ 0 -#define __SC_WRITE 1 -#define __SC_CLOSE 3 -#define __SC_FSTAT 5 -#define __SC_MMAP 9 -#define __SC_MUNMAP 11 -#define __SC_RT_SIGACTION 13 -#define __SC_RT_SIGPROCMASK 14 -#define __SC_IOCTL 16 -#define __SC_SOCKET 41 -#define __SC_EXIT 60 -#define __SC_FCNTL 72 -#define __SC_ARCH_PRCTL 158 -#define __SC_TIMER_CREATE 222 -#define __SC_TIMER_SETTIME 223 -#define __SC_TIMER_GETTIME 224 -#define __SC_TIMER_GETOVERRUN 225 -#define __SC_TIMER_DELETE 226 -#define __SC_CLOCK_GETTIME 228 -#define __SC_OPENAT 257 -#define __SC_PSELECT6 270 - - -#ifndef O_TMPFILE -#define O_TMPFILE 020200000 -#endif - -/* NOTE: from linux-4.6.3 (arch/x86/entry/entry_64.S): - * - * 64-bit SYSCALL saves rip to rcx, clears rflags.RF, then saves rflags to r11, - * then loads new ss, cs, and rip from previously programmed MSRs. - * rflags gets masked by a value from another MSR (so CLD and CLAC - * are not needed). SYSCALL does not save anything on the stack - * and does not change rsp. - * - * Registers on entry: - * rax system call number - * rcx return address - * r11 saved rflags (note: r11 is callee-clobbered register in C ABI) - * rdi arg0 - * rsi arg1 - * rdx arg2 - * r10 arg3 (needs to be moved to rcx to conform to C ABI) - * r8 arg4 - * r9 arg5 - * (note: r12-r15, rbp, rbx are callee-preserved in C ABI) - */ - -#define syscall0(num) \ -({ \ - register long _nret asm("rax") = (num); \ - \ - asm volatile ("syscall" \ - : /* output */ \ - "=r" (_nret) \ - : /* input */ \ - "r" (_nret) \ - : /* clobbers */ \ - "r10", "r11", "rcx", "memory"); \ - _nret; \ -}) - -#define syscall1(num, arg0) \ -({ \ - register long _nret asm("rax") = (num); \ - register long _arg0 asm("rdi") = (arg0); \ - \ - asm volatile ("syscall" \ - : /* output */ \ - "=r" (_nret) \ - : /* input */ \ - "r" (_nret), \ - "r" (_arg0) \ - : /* clobbers */ \ - "r10", "r11", "rcx", "memory"); \ - _nret; \ -}) - -#define syscall2(num, arg0, arg1) \ -({ \ - register long _nret asm("rax") = (num); \ - register long _arg0 asm("rdi") = (arg0); \ - register long _arg1 asm("rsi") = (arg1); \ - \ - asm volatile ("syscall" \ - : /* output */ \ - "=r" (_nret) \ - : /* input */ \ - "r" (_nret), \ - "r" (_arg0), \ - "r" (_arg1) \ - : /* clobbers */ \ - "r10", "r11", "rcx", "memory"); \ - _nret; \ -}) - -#define syscall3(num, arg0, arg1, arg2) \ -({ \ - register long _nret asm("rax") = (num); \ - register long _arg0 asm("rdi") = (arg0); \ - register long _arg1 asm("rsi") = (arg1); \ - register long _arg2 asm("rdx") = (arg2); \ - \ - asm volatile ("syscall" \ - : /* output */ \ - "=r" (_nret) \ - : /* input */ \ - "r" (_nret), \ - "r" (_arg0), \ - "r" (_arg1), \ - "r" (_arg2) \ - : /* clobbers */ \ - "r10", "r11", "rcx", "memory"); \ - _nret; \ -}) - -#define syscall4(num, arg0, arg1, arg2, arg3) \ -({ \ - register long _nret asm("rax") = (num); \ - register long _arg0 asm("rdi") = (arg0); \ - register long _arg1 asm("rsi") = (arg1); \ - register long _arg2 asm("rdx") = (arg2); \ - register long _arg3 asm("r10") = (arg3); \ - \ - asm volatile ("syscall" \ - : /* output */ \ - "=r" (_nret) \ - : /* input */ \ - "r" (_nret), \ - "r" (_arg0), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3) \ - : /* clobbers */ \ - "r11", "rcx", "memory"); \ - _nret; \ -}) - -#define syscall5(num, arg0, arg1, arg2, arg3, arg4) \ -({ \ - register long _nret asm("rax") = (num); \ - register long _arg0 asm("rdi") = (arg0); \ - register long _arg1 asm("rsi") = (arg1); \ - register long _arg2 asm("rdx") = (arg2); \ - register long _arg3 asm("r10") = (arg3); \ - register long _arg4 asm("r8") = (arg4); \ - \ - asm volatile ("syscall" \ - : /* output */ \ - "=r" (_nret) \ - : /* input */ \ - "r" (_nret), \ - "r" (_arg0), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3), \ - "r" (_arg4) \ - : /* clobbers */ \ - "r11", "rcx", "memory"); \ - _nret; \ -}) - -#define syscall6(num, arg0, arg1, arg2, arg3, arg4, \ - arg5) \ -({ \ - register long _nret asm("rax") = (num); \ - register long _arg0 asm("rdi") = (arg0); \ - register long _arg1 asm("rsi") = (arg1); \ - register long _arg2 asm("rdx") = (arg2); \ - register long _arg3 asm("r10") = (arg3); \ - register long _arg4 asm("r8") = (arg4); \ - register long _arg5 asm("r9") = (arg5); \ - \ - asm volatile ("syscall" \ - : /* output */ \ - "=r" (_nret) \ - : /* input */ \ - "r" (_nret), \ - "r" (_arg0), \ - "r" (_arg1), \ - "r" (_arg2), \ - "r" (_arg3), \ - "r" (_arg4), \ - "r" (_arg5) \ - : /* clobbers */ \ - "r11", "rcx", "memory"); \ - _nret; \ -}) - -#endif /* __SYSCALL_X86_64_H__ */ diff --git a/plat/linuxu/include/linuxu/syscall.h b/plat/linuxu/include/linuxu/syscall.h deleted file mode 100644 index 62cb3582d105f8d861a960baa26f57b1e6ad6229..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/syscall.h +++ /dev/null @@ -1,276 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __SYSCALL_H__ -#define __SYSCALL_H__ - -#include -#include -#include -#include -#include -#include - -#if defined __X86_64__ -#include -#elif defined __ARM_32__ -#include -#elif defined __ARM_64__ -#include -#else -#error "Unsupported architecture" -#endif - -static inline int sys_close(int fd) -{ - return (int)syscall1(__SC_CLOSE, - (long) (fd)); -} - -static inline ssize_t sys_read(int fd, const char *buf, size_t len) -{ - return (ssize_t) syscall3(__SC_READ, - (long) (fd), - (long) (buf), - (long) (len)); -} - -static inline ssize_t sys_write(int fd, const char *buf, size_t len) -{ - return (ssize_t) syscall3(__SC_WRITE, - (long) (fd), - (long) (buf), - (long) (len)); -} - -struct stat; -static inline int sys_fstat(int fd, struct k_stat *statbuf) -{ - return (int)syscall2(__SC_FSTAT, - (long)(fd), - (long)(statbuf)); -} -#ifndef O_RDONLY -#define O_RDONLY 00000000 -#endif /* O_RDONLY */ - -#ifndef O_WRONLY -#define O_WRONLY 00000001 -#endif /* O_WRONLY */ -#ifndef O_RDWR -#define O_RDWR 00000002 -#endif /* O_RDWR */ - -#ifndef O_NONBLOCK -#define O_NONBLOCK 04000 -#endif /* O_NONBLOCK */ - -#ifndef O_CREAT -#define O_CREAT 0100 -#endif - - -#ifndef O_CLOEXEC -#define O_CLOEXEC 02000000 -#endif /* O_CLOEXEC */ - - -#ifndef FD_CLOEXEC -#define FD_CLOEXEC 1 -#endif - -#ifndef F_SETFD -#define F_SETFD 2 -#endif - -#ifndef AT_FDCWD -#define AT_FDCWD (-100) -#endif - -static inline int sys_open(const char *pathname, int flags, ...) -{ - mode_t mode = 0; - int fd; - - if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) { - va_list ap; - - va_start(ap, flags); - mode = va_arg(ap, mode_t); - va_end(ap); - } - fd = syscall4(__SC_OPENAT, AT_FDCWD, (long)pathname, (long)flags, - (long)mode); - if ((fd >= 0) && (flags & O_CLOEXEC)) - syscall3(__SC_FCNTL, (long) fd, (long)F_SETFD, - (long)FD_CLOEXEC); - - return fd; -} - -#ifndef SOCK_STREAM -#define SOCK_STREAM 1 -#endif /* SOCK_STREAM */ -#ifndef SOCK_DGRAM -#define SOCK_DGRAM 2 -#endif /* SOCK_DGRAM */ - -#ifndef SOCK_RAW -#define SOCK_RAW 3 -#endif /* SOCK_RAW */ - -#ifndef AF_LOCAL -#define AF_LOCAL 1 -#endif /* AF_LOCAL */ -#ifndef AF_INET -#define AF_INET 2 -#endif /* AF_INET */ -static inline int sys_socket(int domain, int type, int protocol) -{ - return (ssize_t) syscall3(__SC_SOCKET, - (long) domain, - (long) type, - (long) protocol); -} - -static inline int sys_exit(int status) -{ - return (int) syscall1(__SC_EXIT, - (long) (status)); -} - -static inline int sys_clock_gettime(k_clockid_t clk_id, struct k_timespec *tp) -{ - return (int) syscall2(__SC_CLOCK_GETTIME, - (long) clk_id, - (long) tp); -} - -/* - * Please note that on failure sys_mmap() is returning -errno - */ -#define MAP_SHARED (0x01) -#define MAP_PRIVATE (0x02) -#define MAP_ANONYMOUS (0x20) -#define PROT_NONE (0x0) -#define PROT_READ (0x1) -#define PROT_WRITE (0x2) -#define PROT_EXEC (0x4) -static inline void *sys_mmap(void *addr, size_t len, int prot, int flags, - int fd, off_t offset) -{ - return (void *) syscall6(__SC_MMAP, - (long) (addr), - (long) (len), - (long) (prot), - (long) (flags), - (long) (fd), - (long) (offset)); -} - -#define sys_mapmem(addr, len) \ - sys_mmap((addr), (len), (PROT_READ | PROT_WRITE), \ - (MAP_SHARED | MAP_ANONYMOUS), -1, 0) - - -static inline int sys_sigaction(int signum, const struct uk_sigaction *action, - struct uk_sigaction *oldaction) -{ - return (int) syscall4(__SC_RT_SIGACTION, - (long) signum, - (long) action, - (long) oldaction, - sizeof(k_sigset_t)); -} - -static inline int sys_sigprocmask(int how, - const k_sigset_t *set, k_sigset_t *oldset) -{ - return (int) syscall4(__SC_RT_SIGPROCMASK, - (long) how, - (long) set, - (long) oldset, - sizeof(k_sigset_t)); -} - -#define ARCH_SET_FS 0x1002 -#define ARCH_GET_FS 0x1003 -static inline int sys_arch_prctl(int code, unsigned long addr) -{ - return (int) syscall2(__SC_ARCH_PRCTL, - (long) code, - (long) addr); -} - -static inline int sys_pselect6(int nfds, - k_fd_set *readfds, k_fd_set *writefds, k_fd_set *exceptfds, - const struct k_timespec *timeout, const void *sigmask) -{ - return (int) syscall6(__SC_PSELECT6, - (long) nfds, - (long) readfds, - (long) writefds, - (long) exceptfds, - (long) timeout, - (long) sigmask); -} - -static inline int sys_timer_create(k_clockid_t which_clock, - struct uk_sigevent *timer_event_spec, - k_timer_t *created_timer_id) -{ - return (int) syscall3(__SC_TIMER_CREATE, - (long) which_clock, - (long) timer_event_spec, - (long) created_timer_id); - -} - -static inline int sys_timer_settime(k_timer_t timerid, int flags, - const struct k_itimerspec *value, struct k_itimerspec *oldvalue) -{ - return (int) syscall4(__SC_TIMER_SETTIME, - (long) timerid, - (long) flags, - (long) value, - (long) oldvalue); - -} - -static inline int sys_timer_delete(k_timer_t timerid) -{ - return (int) syscall1(__SC_TIMER_DELETE, - (long) timerid); -} - -#endif /* __SYSCALL_H__ */ diff --git a/plat/linuxu/include/linuxu/tap.h b/plat/linuxu/include/linuxu/tap.h deleted file mode 100644 index ca48841bf87fc60b304e53e9ffece83bf85ea741..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/tap.h +++ /dev/null @@ -1,152 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Sharan Santhanam - * - * Copyright (c) 2020, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __PLAT_LINUXU_TAP_H__ -#define __PLAT_LINUXU_TAP_H__ - -#include -#include -#include - -/** - * TAP Device Path - */ -#define TAPDEV_PATH "/dev/net/tun" -/** - * Using the musl as reference for the data structure definition - * Commit-id: 39ef612aa193 - */ -#define IFNAMSIZ 16 - - - -typedef __u16 uk_in_port_t; -typedef __u32 uk_in_addr_t; -typedef __u16 uk_sa_family_t; - -struct uk_in_addr { - uk_in_addr_t s_addr; -}; - -struct uk_sockaddr_in { - uk_sa_family_t sin_family; - uk_in_port_t sin_port; - struct uk_in_addr sin_addr; - __u8 sin_zero[8]; -}; - -struct uk_sockaddr { - uk_sa_family_t sa_family; - char sa_data[14]; -}; - -struct uk_ifmap { - unsigned long int mem_start; - unsigned long int mem_end; - unsigned short int base_addr; - unsigned char irq; - unsigned char dma; - unsigned char port; -}; - -struct uk_ifreq { - union { - char ifrn_name[IFNAMSIZ]; - } uk_ifr_ifrn; - - union { - struct uk_sockaddr ifru_addr; - struct uk_sockaddr ifru_dstaddr; - struct uk_sockaddr ifru_broadaddr; - struct uk_sockaddr ifru_netmask; - struct uk_sockaddr ifru_hwaddr; - short int ifru_flags; - int ifru_ivalue; - int ifru_mtu; - struct uk_ifmap ifru_map; - char ifru_slave[IFNAMSIZ]; - char ifru_newname[IFNAMSIZ]; - char *ifru_data; - } uk_ifr_ifru; -}; - -#define ifr_name uk_ifr_ifrn.ifrn_name -#define ifr_hwaddr uk_ifr_ifru.ifru_hwaddr -#define ifr_addr uk_ifr_ifru.ifru_addr -#define ifr_dstaddr uk_ifr_ifru.ifru_dstaddr -#define ifr_broadaddr uk_ifr_ifru.ifru_broadaddr -#define ifr_netmask uk_ifr_ifru.ifru_netmask -#define ifr_flags uk_ifr_ifru.ifru_flags -#define ifr_metric uk_ifr_ifru.ifru_ivalue -#define ifr_mtu uk_ifr_ifru.ifru_mtu -#define ifr_map uk_ifr_ifru.ifru_map -#define ifr_slave uk_ifr_ifru.ifru_slave -#define ifr_data uk_ifr_ifru.ifru_data -#define ifr_ifindex uk_ifr_ifru.ifru_ivalue -#define ifr_bandwidth uk_ifr_ifru.ifru_ivalue -#define ifr_qlen uk_ifr_ifru.ifru_ivalue -#define ifr_newname uk_ifr_ifru.ifru_newname - -#define UK_TUNSETIFF (0x400454ca) -#define UK_SIOCGIFNAME (0x8910) -#define UK_SIOCGIFFLAGS (0x8913) -#define UK_SIOCSIFFLAGS (0x8914) -#define UK_SIOCGIFADDR (0x8915) -#define UK_SIOCSIFADDR (0x8916) -#define UK_SIOCGIFMTU (0x8921) -#define UK_SIOCSIFMTU (0x8922) -#define UK_SIOCSIFHWADDR (0x8924) -#define UK_SIOCGIFHWADDR (0x8927) -#define UK_SIOCGIFTXQLEN (0x8942) -#define UK_SIOCSIFTXQLEN (0x8943) -#define UK_SIOCGIFINDEX (0x8933) -/* TUNSETIFF ifr flags */ -#define UK_IFF_TUN (0x0001) -#define UK_IFF_TAP (0x0002) -#define UK_IFF_NO_PI (0x1000) -/* This flag has no real effect */ -#define UK_IFF_ONE_QUEUE (0x2000) -#define UK_IFF_VNET_HDR (0x4000) -#define UK_IFF_TUN_EXCL (0x8000) -#define UK_IFF_MULTI_QUEUE (0x0100) -#define UK_IFF_ATTACH_QUEUE (0x0200) -#define UK_IFF_DETACH_QUEUE (0x0400) -/* read-only flag */ -#define UK_IFF_PERSIST (0x0800) -#define UK_IFF_NOFILTER (0x1000) -#define UK_IFF_UP (0x1) -#define UK_IFF_PROMISC (0x100) - -/* Adding the bridge interface */ -#define UK_SIOCBRADDIF (0x89a2) - -#endif /* __PLAT_LINUXU_TAP_H */ diff --git a/plat/linuxu/include/linuxu/termios.h b/plat/linuxu/include/linuxu/termios.h deleted file mode 100644 index 4b1ac38cada1733f1be8692035a57a2ba2e23e92..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/termios.h +++ /dev/null @@ -1,356 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* This file contains code from FreeBSD: sys/sys/_termios.h: */ -/* - * Copyright (c) 1988, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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. - * - * @(#)termios.h 8.3 (Berkeley) 3/28/94 - * $FreeBSD$ - */ -/* This file contains code from FreeBSD: include/termios.h: */ -/* - * Copyright (c) 1988, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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. - * - * @(#)termios.h 8.3 (Berkeley) 3/28/94 - * $FreeBSD$ - */ -/* This file contains code from FreeBSD: lib/libc/gen/termios.c: */ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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 file contains code from FreeBSD: sys/sys/ttycom.h: */ -/* - * Copyright (c) 1982, 1986, 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * 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. - * 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. - * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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. - * - * @(#)ttycom.h 8.1 (Berkeley) 3/28/94 - * $FreeBSD$ - */ - -#ifndef __TERMIOS_H__ -#define __TERMIOS_H__ - -#include - -/* - * Special Control Characters - * - * Index into c_cc[] character array. - * - * Name Subscript Enabled by - */ -#define VEOF 0 /* ICANON */ -#define VEOL 1 /* ICANON */ -#define VEOL2 2 /* ICANON together with IEXTEN */ -#define VERASE 3 /* ICANON */ -#define VWERASE 4 /* ICANON together with IEXTEN */ -#define VKILL 5 /* ICANON */ -#define VREPRINT 6 /* ICANON together with IEXTEN */ -#define VERASE2 7 /* ICANON */ -/* 7 ex-spare 1 */ -#define VINTR 8 /* ISIG */ -#define VQUIT 9 /* ISIG */ -#define VSUSP 10 /* ISIG */ -#define VDSUSP 11 /* ISIG together with IEXTEN */ -#define VSTART 12 /* IXON, IXOFF */ -#define VSTOP 13 /* IXON, IXOFF */ -#define VLNEXT 14 /* IEXTEN */ -#define VDISCARD 15 /* IEXTEN */ -#define VMIN 16 /* !ICANON */ -#define VTIME 17 /* !ICANON */ -#define VSTATUS 18 /* ICANON together with IEXTEN */ -/* 19 spare 2 */ -#define NCCS 20 - -#define _POSIX_VDISABLE 0xff - -/* - * Input flags (c_iflags) - */ -#define IGNBRK 0x00000001 /* ignore BREAK condition */ -#define BRKINT 0x00000002 /* map BREAK to SIGINTR */ -#define IGNPAR 0x00000004 /* ignore (discard) parity errors */ -#define PARMRK 0x00000008 /* mark parity and framing errors */ -#define INPCK 0x00000010 /* enable checking of parity errors */ -#define ISTRIP 0x00000020 /* strip 8th bit off chars */ -#define INLCR 0x00000040 /* map NL into CR */ -#define IGNCR 0x00000080 /* ignore CR */ -#define ICRNL 0x00000100 /* map CR to NL (ala CRMOD) */ -#define IXON 0x00000200 /* enable output flow control */ -#define IXOFF 0x00000400 /* enable input flow control */ -#define IXANY 0x00000800 /* any char will restart after stop */ -#define IMAXBEL 0x00002000 /* ring bell on input queue full */ - -/* - * Output flags (c_oflag) - */ -#define OPOST 0x00000001 /* enable following output processing */ -#define ONLCR 0x00000002 /* map NL to CR-NL (ala CRMOD) */ -#define TABDLY 0x00000004 /* tab delay mask */ -#define TAB0 0x00000000 /* no tab delay and expansion */ -#define TAB3 0x00000004 /* expand tabs to spaces */ -#define ONOEOT 0x00000008 /* discard EOT's (^D) on output) */ -#define OCRNL 0x00000010 /* map CR to NL on output */ -#define ONOCR 0x00000020 /* no CR output at column 0 */ -#define ONLRET 0x00000040 /* NL performs CR function */ - -/* - * Control flags (c_cflag) - hardware control of terminal - */ -#define CIGNORE 0x00000001 /* ignore control flags */ -#define CSIZE 0x00000300 /* character size mask */ -#define CS5 0x00000000 /* 5 bits (pseudo) */ -#define CS6 0x00000100 /* 6 bits */ -#define CS7 0x00000200 /* 7 bits */ -#define CS8 0x00000300 /* 8 bits */ -#define CSTOPB 0x00000400 /* send 2 stop bits */ -#define CREAD 0x00000800 /* enable receiver */ -#define PARENB 0x00001000 /* parity enable */ -#define PARODD 0x00002000 /* odd parity, else even */ -#define HUPCL 0x00004000 /* hang up on last close */ -#define CLOCAL 0x00008000 /* ignore modem status lines */ -#define CCTS_OFLOW 0x00010000 /* CTS flow control of output */ -#define CRTSCTS (CCTS_OFLOW | CRTS_IFLOW) -#define CRTS_IFLOW 0x00020000 /* RTS flow control of input */ -#define CDTR_IFLOW 0x00040000 /* DTR flow control of input */ -#define CDSR_OFLOW 0x00080000 /* DSR flow control of output */ -#define CCAR_OFLOW 0x00100000 /* DCD flow control of output */ - -/* - * "Local" flags (c_lflag) - dumping ground for other state - * - * Warning: some flags in this structure begin with - * the letter "I" and look like they belong in the - * input flag. - */ -#define ECHOKE 0x00000001 /* visual erase for line kill */ -#define ECHOE 0x00000002 /* visually erase chars */ -#define ECHOK 0x00000004 /* echo NL after line kill */ -#define ECHO 0x00000008 /* enable echoing */ -#define ECHONL 0x00000010 /* echo NL even if ECHO is off */ -#define ECHOPRT 0x00000020 /* visual erase mode for hardcopy */ -#define ECHOCTL 0x00000040 /* echo control chars as ^(Char) */ -#define ISIG 0x00000080 /* enable signals INTR, QUIT, [D]SUSP */ -#define ICANON 0x00000100 /* canonicalize input lines */ -#define ALTWERASE 0x00000200 /* use alternate WERASE algorithm */ -#define IEXTEN 0x00000400 /* enable DISCARD and LNEXT */ -#define EXTPROC 0x00000800 /* external processing */ -#define TOSTOP 0x00400000 /* stop background jobs from output */ -#define FLUSHO 0x00800000 /* output being flushed (state) */ -#define NOKERNINFO 0x02000000 /* no kernel output from VSTATUS */ -#define PENDIN 0x20000000 /* XXX retype pending input (state) */ -#define NOFLSH 0x80000000 /* don't flush after interrupt */ - - -/* - * Standard speeds - */ -#define B0 0 -#define B50 50 -#define B75 75 -#define B110 110 -#define B134 134 -#define B150 150 -#define B200 200 -#define B300 300 -#define B600 600 -#define B1200 1200 -#define B1800 1800 -#define B2400 2400 -#define B4800 4800 -#define B9600 9600 -#define B19200 19200 -#define B38400 38400 -#define B7200 7200 -#define B14400 14400 -#define B28800 28800 -#define B57600 57600 -#define B76800 76800 -#define B115200 115200 -#define B230400 230400 -#define B460800 460800 -#define B921600 921600 -#define EXTA 19200 -#define EXTB 38400 - -typedef unsigned int tcflag_t; -typedef unsigned char cc_t; -typedef unsigned int speed_t; - -struct termios { - tcflag_t c_iflag; /* input flags */ - tcflag_t c_oflag; /* output flags */ - tcflag_t c_cflag; /* control flags */ - tcflag_t c_lflag; /* local flags */ - cc_t c_cc[NCCS]; /* control chars */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ -}; - -#define TIOCGETA (0x5401) /* get termios struct */ -#define TIOCSETA (0x5402) /* set termios struct */ -#define TIOCSETAW (0x5403) /* drain output, set */ -#define TIOCSETAF (0x5404) /* drn out, fls in, set */ - -static inline int tcgetattr(int fd, struct termios *t) -{ - return sys_ioctl(fd, TIOCGETA, t); -} - -#define TCSANOW 0 /* make change immediate */ -#define TCSADRAIN 1 /* drain output, then change */ -#define TCSAFLUSH 2 /* drain output, flush input */ -#define TCSASOFT 0x10 /* flag - don't alter h.w. state */ - -static inline int tcsetattr(int fd, int opt, const struct termios *t) -{ - struct termios localterm; - - if (opt & TCSASOFT) { - localterm = *t; - localterm.c_cflag |= CIGNORE; - t = &localterm; - } - switch (opt & ~TCSASOFT) { - case TCSANOW: - return sys_ioctl(fd, TIOCSETA, t); - case TCSADRAIN: - return sys_ioctl(fd, TIOCSETAW, t); - case TCSAFLUSH: - return sys_ioctl(fd, TIOCSETAF, t); - default: - return -1; - } -} - -#define termiossetraw(t) \ - do { \ - (t)->c_iflag &= ~(IGNBRK | BRKINT \ - | IGNPAR | PARMRK \ - | INPCK | ISTRIP \ - | INLCR | IGNCR \ - | ICRNL | IXON \ - | IXOFF | IXANY \ - | IMAXBEL); \ - \ - (t)->c_oflag &= ~(OPOST | ONLCR \ - | TABDLY | ONOEOT \ - | OCRNL | ONLRET); \ - \ - (t)->c_cflag &= ~(CSIZE | PARENB); \ - (t)->c_cflag |= CS8; \ - \ - (t)->c_lflag &= ~(ICANON | ISIG \ - | ECHO | ECHONL \ - | IEXTEN | ECHOE \ - | ECHOKE | ECHOK \ - | ECHONL | ECHOPRT \ - | ECHOCTL); \ - (t)->c_cc[VMIN] = 1; \ - (t)->c_cc[VTIME] = 0; \ - } while (0) - -#endif /* __TERMIOS_H__ */ diff --git a/plat/linuxu/include/linuxu/time.h b/plat/linuxu/include/linuxu/time.h deleted file mode 100644 index d2c5da370dbc059ff1308e0680aa9d03bb2b9e3d..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/time.h +++ /dev/null @@ -1,62 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * Florian Schmidt - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __LINUXU_TIME_H__ -#define __LINUXU_TIME_H__ - -#include -#include - -#define TIMER_INTVAL_NSEC UKPLAT_TIME_TICK_NSEC -#define TIMER_SIGNUM SIGALRM - - -/* POSIX definitions */ - -#define K_CLOCK_REALTIME 0 -#define K_CLOCK_MONOTONIC 1 - -typedef int k_clockid_t; - -typedef int k_timer_t; - -struct k_timespec { - long tv_sec; - long tv_nsec; -}; - -struct k_itimerspec { - struct k_timespec it_interval; - struct k_timespec it_value; -}; - -#endif /* __LINUXU_TIME_H__ */ diff --git a/plat/linuxu/include/linuxu/x86/tls.h b/plat/linuxu/include/linuxu/x86/tls.h deleted file mode 100644 index bb8326f0822d00b7a01d4d3c1ae46b2b092eb6c4..0000000000000000000000000000000000000000 --- a/plat/linuxu/include/linuxu/x86/tls.h +++ /dev/null @@ -1,55 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Copyright (c) 2019, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __PLAT_LINUXU_TLS_H__ -#define __PLAT_LINUXU_TLS_H__ - -#include - -static inline void set_tls_pointer(__uptr arg) -{ - sys_arch_prctl(ARCH_SET_FS, arg); -} - -static inline __uptr get_tls_pointer(void) -{ - __uptr addr; - int ret; - - /* TODO: Read from FS register directly instead - * of issue'ing a system Call - */ - ret = sys_arch_prctl(ARCH_GET_FS, (long) &addr); - if (ret < 0) - UK_CRASH("Failed to retrieve TLSP\n"); - - return addr; -} - -#endif /* __PLAT_LINUXU_TLS_H__ */ diff --git a/plat/linuxu/io.c b/plat/linuxu/io.c deleted file mode 100644 index 371095907255c442fd6d4b6b5f2977a407b9e80b..0000000000000000000000000000000000000000 --- a/plat/linuxu/io.c +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Sharan Santhanam - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -/** - * TODO: - * Replace the stub with an implementation for the linuxu platform. - */ -__paddr_t ukplat_virt_to_phys(const volatile void *address) -{ - return (__paddr_t)address; -} diff --git a/plat/linuxu/irq.c b/plat/linuxu/irq.c deleted file mode 100644 index c3f1a41a7d6f857d7a1bfab62fd2a5184623ed65..0000000000000000000000000000000000000000 --- a/plat/linuxu/irq.c +++ /dev/null @@ -1,237 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(__X86_32__) || defined(__x86_64__) -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#else -#error "Unsupported architecture" -#endif - -#define HANDLER_RESERVED ((void *) 0x1) - -UK_EVENT(UKPLAT_EVENT_IRQ); - - -static struct irq_handler irq_handlers[__MAX_IRQ] - [CONFIG_LINUXU_MAX_IRQ_HANDLER_ENTRIES]; - -static k_sigset_t handled_signals_set; -static unsigned long irq_enabled; - -static inline struct irq_handler *allocate_handler(unsigned long irq) -{ - UK_ASSERT(irq < __MAX_IRQ); - for (int i = 0; i < CONFIG_LINUXU_MAX_IRQ_HANDLER_ENTRIES; i++) - if (irq_handlers[irq][i].func == NULL) - return &irq_handlers[irq][i]; - return NULL; -} - -void ukplat_lcpu_enable_irq(void) -{ - int rc; - - rc = sys_sigprocmask(SIG_UNBLOCK, &handled_signals_set, NULL); - if (unlikely(rc != 0)) - UK_CRASH("Failed to unblock signals (%d)\n", rc); - - irq_enabled = 1; -} - -void ukplat_lcpu_disable_irq(void) -{ - int rc; - - rc = sys_sigprocmask(SIG_BLOCK, &handled_signals_set, NULL); - if (unlikely(rc != 0)) - UK_CRASH("Failed to block signals (%d)\n", rc); - - irq_enabled = 0; -} - -void ukplat_lcpu_halt_irq(void) -{ - UK_ASSERT(ukplat_lcpu_irqs_disabled()); - - ukplat_lcpu_enable_irq(); - halt(); - ukplat_lcpu_disable_irq(); -} - -int ukplat_lcpu_irqs_disabled(void) -{ - return (irq_enabled == 0); -} - -unsigned long ukplat_lcpu_save_irqf(void) -{ - unsigned long flags = irq_enabled; - - if (irq_enabled) - ukplat_lcpu_disable_irq(); - - return flags; -} - -void ukplat_lcpu_restore_irqf(unsigned long flags) -{ - if (flags) { - if (!irq_enabled) - ukplat_lcpu_enable_irq(); - - } else if (irq_enabled) - ukplat_lcpu_disable_irq(); -} - -void ukplat_lcpu_irqs_handle_pending(void) -{ - /* TO BE DONE */ -} - -void __restorer(void); -#if defined __X86_64__ -asm("__restorer:mov $15,%rax\nsyscall"); -#elif defined __ARM_32__ -asm("__restorer:mov r7, #0x77\nsvc 0x0"); -#elif defined __ARM_64__ -asm("__restorer:mov x8, #0x8b\nsvc #0"); -#else -#error "Unsupported architecture" -#endif - -static void _irq_handle(int irq) -{ - struct irq_handler *h; - int i; - int rc; - struct ukplat_event_irq_data ctx; - - UK_ASSERT(irq >= 0 && irq < __MAX_IRQ); - - ctx.regs = NULL; - ctx.irq = irq; - rc = uk_raise_event(UKPLAT_EVENT_IRQ, &ctx); - if (unlikely(rc < 0)) - UK_CRASH("IRQ event handler returned error: %d\n", rc); - if (rc == UK_EVENT_HANDLED) - return; - - for (i = 0; i < CONFIG_LINUXU_MAX_IRQ_HANDLER_ENTRIES; i++) { - if (irq_handlers[irq][i].func == NULL) - break; - else if (irq_handlers[irq][i].func == HANDLER_RESERVED) - continue; /* reserved entry */ - h = &irq_handlers[irq][i]; - if (h->func(h->arg) == 1) - return; - } - /* - * Just warn about unhandled interrupts. We do this to - * (1) compensate potential spurious interrupts of - * devices, and (2) to minimize impact on drivers that share - * one interrupt line that would then stay disabled. - */ - uk_pr_crit("Unhandled irq=%d\n", irq); -} - -int ukplat_irq_register(unsigned long irq, irq_handler_func_t func, void *arg) -{ - struct irq_handler *h; - struct uk_sigaction action; - k_sigset_t set; - unsigned long flags; - int rc; - - if (irq >= __MAX_IRQ) - return -EINVAL; - - /* New handler */ - flags = ukplat_lcpu_save_irqf(); - h = allocate_handler(irq); - if (!h) { - ukplat_lcpu_restore_irqf(flags); - return -EINVAL; - } - - h->func = HANDLER_RESERVED; /* reserve */ - ukplat_lcpu_restore_irqf(flags); - - /* Register signal action */ - memset(&action, 0, sizeof(action)); - action.k_sa_handler = _irq_handle; - action.k_sa_flags = SA_RESTORER; - action.k_sa_restorer = __restorer; - - rc = sys_sigaction((int) irq, &action, &h->oldaction); - if (rc != 0) { - h->func = NULL; /* give back */ - goto err; - } - - /* Enable the handler */ - h->func = func; - h->arg = arg; - - /* Unblock the signal */ - k_sigemptyset(&set); - k_sigaddset(&set, irq); - - rc = sys_sigprocmask(SIG_UNBLOCK, &set, NULL); - if (unlikely(rc != 0)) - UK_CRASH("Failed to unblock signals: %d\n", rc); - - /* Add to our handled signals set */ - k_sigaddset(&handled_signals_set, irq); - - return 0; - -err: - return -rc; -} - -int ukplat_irq_init(void) -{ - UK_ASSERT(ukplat_lcpu_irqs_disabled()); - k_sigemptyset(&handled_signals_set); - return 0; -} diff --git a/plat/linuxu/lcpu.c b/plat/linuxu/lcpu.c deleted file mode 100644 index fbf8c5e7a87b99d7c8bbaabf47288e2c9aecc933..0000000000000000000000000000000000000000 --- a/plat/linuxu/lcpu.c +++ /dev/null @@ -1,72 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include - -static void do_pselect(struct k_timespec *timeout) -{ - int ret; - int nfds = 0; - k_fd_set *readfds = NULL; - k_fd_set *writefds = NULL; - k_fd_set *exceptfds = NULL; - - ret = sys_pselect6(nfds, readfds, writefds, exceptfds, timeout, NULL); - if (ret < 0 && ret != -EINTR) - uk_pr_warn("Failed to halt LCPU: %d\n", ret); -} - -void halt(void) -{ - do_pselect(NULL); -} - -void time_block_until(__snsec until) -{ - struct k_timespec timeout; - __nsec now = ukplat_monotonic_clock(); - - if (until < 0 || (__nsec) until < now) - return; /* timeout expired already */ - - until -= now; - timeout.tv_sec = until / ukarch_time_sec_to_nsec(1); - timeout.tv_nsec = until % ukarch_time_sec_to_nsec(1); - - do_pselect(&timeout); -} diff --git a/plat/linuxu/memory.c b/plat/linuxu/memory.c deleted file mode 100644 index 841940cc9375e6d1a45e039c7d55cfaeea4c85a1..0000000000000000000000000000000000000000 --- a/plat/linuxu/memory.c +++ /dev/null @@ -1,37 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ - -int _ukplat_mem_mappings_init(void) -{ - return 0; -} diff --git a/plat/linuxu/setup.c b/plat/linuxu/setup.c deleted file mode 100644 index 46751792eefe50485a8c2ac1a36c4359a0ffb7a1..0000000000000000000000000000000000000000 --- a/plat/linuxu/setup.c +++ /dev/null @@ -1,172 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MB2B (1024 * 1024) - -static __u32 heap_size = CONFIG_LINUXU_DEFAULT_HEAPMB; -UK_LIB_PARAM(heap_size, __u32); - -static const char *initrd; -UK_LIB_PARAM_STR(initrd); - -static void __linuxu_plat_heap_init(void) -{ - void *pret; - __u32 len; - int rc; - - len = heap_size * MB2B; - uk_pr_info("Allocate memory for heap (%u MiB)\n", heap_size); - - /** - * Allocate heap memory - */ - if (len > 0) { - pret = sys_mapmem(NULL, len); - if (PTRISERR(pret)) { - rc = PTR2ERR(pret); - uk_pr_err("Failed to allocate memory for heap: %d\n", - rc); - } else { - rc = ukplat_memregion_list_insert( - &ukplat_bootinfo_get()->mrds, - &(struct ukplat_memregion_desc){ - .vbase = (__vaddr_t)pret, - .pbase = (__paddr_t)pret, - .len = len, - .type = UKPLAT_MEMRT_FREE, - .flags = UKPLAT_MEMRF_READ | - UKPLAT_MEMRF_WRITE | - UKPLAT_MEMRF_MAP, - }); - if (unlikely(rc < 0)) - uk_pr_err("Failed to add heap memory region descriptor."); - } - } -} - -static void __linuxu_plat_initrd_init(void) -{ - void *pret; - __u32 len; - int rc; - struct k_stat file_info; - - if (!initrd) { - uk_pr_debug("No initrd present.\n"); - } else { - uk_pr_debug("Mapping in initrd file: %s\n", initrd); - int initrd_fd = sys_open(initrd, K_O_RDONLY, 0); - - if (initrd_fd < 0) - uk_pr_crit("Failed to open %s for initrd\n", initrd); - - /** - * Find initrd file size - */ - if (sys_fstat(initrd_fd, &file_info) < 0) { - uk_pr_crit("sys_fstat failed for initrd file\n"); - sys_close(initrd_fd); - } - len = file_info.st_size; - /** - * Allocate initrd memory - */ - if (len > 0) { - pret = sys_mmap(NULL, len, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE, initrd_fd, 0); - if (PTRISERR(pret)) { - rc = PTR2ERR(pret); - uk_pr_crit("Failed to memory-map initrd: %d\n", - rc); - sys_close(initrd_fd); - } - - rc = ukplat_memregion_list_insert( - &ukplat_bootinfo_get()->mrds, - &(struct ukplat_memregion_desc){ - .vbase = (__vaddr_t)pret, - .pbase = (__paddr_t)pret, - .len = len, - .type = UKPLAT_MEMRT_INITRD, - .flags = UKPLAT_MEMRF_READ | - UKPLAT_MEMRF_WRITE | - UKPLAT_MEMRF_MAP, - }); - if (unlikely(rc < 0)) - uk_pr_err("Failed to add initrd memory region descriptor."); - } else { - uk_pr_info("Ignoring empty initrd file.\n"); - sys_close(initrd_fd); - } - } -} - -void _liblinuxuplat_entry(int argc, char *argv[]) __noreturn; - -void _liblinuxuplat_entry(int argc, char *argv[]) -{ - /* - * Initialize platform console - */ - _liblinuxuplat_init_console(); - - __linuxu_plat_heap_init(); - - __linuxu_plat_initrd_init(); - - ukplat_irq_init(); - - /* - * Enter Unikraft - */ - ukplat_entry(argc, argv); -} diff --git a/plat/linuxu/shutdown.c b/plat/linuxu/shutdown.c deleted file mode 100644 index 988fcace7187b6f80a10619d7ba38b63b5dfb3cb..0000000000000000000000000000000000000000 --- a/plat/linuxu/shutdown.c +++ /dev/null @@ -1,68 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include - -#include - -__noreturn void ukplat_terminate(enum ukplat_gstate request) -{ - int ret; - - _liblinuxuplat_fini_console(); - - switch (request) { - case UKPLAT_HALT: - case UKPLAT_RESTART: - ret = sys_exit(0); - break; - default: /* UKPLAT_CRASH */ - ret = sys_exit(1); - break; - } - - uk_pr_crit("sys_exit() failed: %d\n", ret); - for (;;) - ; /* syscall failed, loop forever */ -} - -int ukplat_suspend(void) -{ - return -EBUSY; -} diff --git a/plat/linuxu/tap_io.c b/plat/linuxu/tap_io.c deleted file mode 100644 index efacf5f925a6ef122429d4e70a2772a58218ebc4..0000000000000000000000000000000000000000 --- a/plat/linuxu/tap_io.c +++ /dev/null @@ -1,160 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Sharan Santhanam - * - * Copyright (c) 2020, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include - -int tap_open(__u32 flags) -{ - int rc = 0; - - rc = sys_open(TAPDEV_PATH, flags); - if (rc < 0) - uk_pr_err("Error in opening the tap device\n"); - return rc; -} - -int tap_dev_configure(int fd, __u32 feature_flags, void *arg) -{ - int rc = 0; - struct uk_ifreq *ifreq = (struct uk_ifreq *) arg; - - /* Set the tap device configuration */ - ifreq->ifr_flags = UK_IFF_TAP | UK_IFF_NO_PI | feature_flags; - if ((rc = sys_ioctl(fd, UK_TUNSETIFF, ifreq)) < 0) - uk_pr_err("Failed(%d) to configure the tap device\n", rc); - - return rc; -} - -int tap_netif_configure(int fd, __u32 request, void *arg) -{ - int rc; - struct uk_ifreq *usr_ifr = (struct uk_ifreq *) arg; - struct uk_ifreq ifr = {0}; - - switch (request) { - case UK_SIOCSIFFLAGS: - snprintf(ifr.ifr_name, IFNAMSIZ, "%s", usr_ifr->ifr_name); - rc = sys_ioctl(fd, UK_SIOCGIFFLAGS, &ifr); - /* fetch current flags to leave other flags untouched */ - if (rc < 0) { - uk_pr_err("Failed to read flags %d\n", rc); - goto exit_error; - } - usr_ifr->ifr_flags |= ifr.ifr_flags; - break; - case UK_SIOCGIFFLAGS: - case UK_SIOCGIFINDEX: - case UK_SIOCGIFHWADDR: - case UK_SIOCSIFHWADDR: - case UK_SIOCSIFMTU: - case UK_SIOCGIFMTU: - case UK_SIOCSIFTXQLEN: - case UK_SIOCGIFTXQLEN: - case UK_SIOCBRADDIF: - break; - default: - rc = -EINVAL; - uk_pr_err("Invalid ioctl request\n"); - goto exit_error; - } - - if ((rc = sys_ioctl(fd, request, usr_ifr)) < 0) { - uk_pr_err("Failed to set device control %d\n", rc); - goto exit_error; - } - - return 0; - -exit_error: - return rc; -} - -int tap_netif_create(void) -{ - return sys_socket(AF_INET, SOCK_DGRAM, 0); -} - -ssize_t tap_read(int fd, void *buf, size_t count) -{ - ssize_t rc = -EINTR; - - while (rc == -EINTR) - rc = sys_read(fd, buf, count); - - if (rc == -11) - /* Explicitly added since linux errno has -11 for EAGAIN */ - rc = -EWOULDBLOCK; - else if (rc < 0) - uk_pr_err("Failed(%ld) to read from the tap device\n", rc); - - return rc; -} - -ssize_t tap_write(int fd, const void *buf, size_t count) -{ - ssize_t rc = -EINTR; - size_t written = 0; - - while (count > 0) { - rc = sys_write(fd, buf + written, count); - if (rc == -EINTR) - continue; - else if (rc == -11) { - /* - * Explicitly added since linux errno has -11 for - * EAGAIN. - * FIXME: EAGAIN is not the only error code affected by - * this issue (eg EDESTADDRREQ, EDQUOT). We should think - * of a more generic solution to address it. - */ - rc = -EAGAIN; - } else if (rc < 0) { - uk_pr_err("Failed(%ld) to write to the tap device\n", - rc); - return rc; - } - count -= rc; - written += rc; - } - return (ssize_t)written; -} - -int tap_close(int fd) -{ - return sys_close(fd); -} diff --git a/plat/linuxu/time.c b/plat/linuxu/time.c deleted file mode 100644 index 6160ec9439747364a6a53757012af77ab8bad7db..0000000000000000000000000000000000000000 --- a/plat/linuxu/time.c +++ /dev/null @@ -1,116 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * Costin Lupu - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include - -static k_timer_t timerid; - - -__nsec ukplat_monotonic_clock(void) -{ - struct k_timespec tp; - __nsec ret; - int rc; - - rc = sys_clock_gettime(K_CLOCK_MONOTONIC, &tp); - if (unlikely(rc != 0)) - return 0; - - ret = ukarch_time_sec_to_nsec((__nsec) tp.tv_sec); - ret += (__nsec) tp.tv_nsec; - - return ret; -} - -__nsec ukplat_wall_clock(void) -{ - struct k_timespec tp; - __nsec ret; - int rc; - - rc = sys_clock_gettime(K_CLOCK_REALTIME, &tp); - if (unlikely(rc != 0)) - return 0; - - ret = ukarch_time_sec_to_nsec((__nsec) tp.tv_sec); - ret += (__nsec) tp.tv_nsec; - - return ret; -} - -static int timer_handler(void *arg __unused) -{ - /* We only use the timer interrupt to wake up. As we end up here, the - * timer interrupt has already done its job and we can acknowledge - * receiving it. - */ - return 1; -} - -void ukplat_time_init(void) -{ - struct uk_sigevent sigev; - struct k_itimerspec its; - int rc; - - ukplat_irq_register(TIMER_SIGNUM, timer_handler, NULL); - - memset(&sigev, 0, sizeof(sigev)); - sigev.sigev_notify = 0; - sigev.sigev_signo = TIMER_SIGNUM; - sigev.sigev_value.sival_ptr = &timerid; - - rc = sys_timer_create(K_CLOCK_REALTIME, &sigev, &timerid); - if (unlikely(rc != 0)) - UK_CRASH("Failed to create timer: %d\n", rc); - - /* Initial expiration */ - its.it_value.tv_sec = TIMER_INTVAL_NSEC / ukarch_time_sec_to_nsec(1); - its.it_value.tv_nsec = TIMER_INTVAL_NSEC % ukarch_time_sec_to_nsec(1); - /* Timer interval */ - its.it_interval = its.it_value; - - rc = sys_timer_settime(timerid, 0, &its, NULL); - if (unlikely(rc != 0)) - UK_CRASH("Failed to setup timer: %d\n", rc); -} - -void ukplat_time_fini(void) -{ - sys_timer_delete(timerid); -} diff --git a/plat/linuxu/x86/entry64.S b/plat/linuxu/x86/entry64.S deleted file mode 100644 index ba0cc45c8c769d5b380a62426808da08817627f4..0000000000000000000000000000000000000000 --- a/plat/linuxu/x86/entry64.S +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* - * We do not want to unmap anything. - */ -.section .bss -.align 4 -.globl bpt_unmap_mrd -bpt_unmap_mrd: -.space 64 - -.section .text - -/* For now, although inaccurate, set the - * _base_addr symbol to _liblinuxuplat_start, since that is where most images - * happen to begin anyway. We do not use it in linuxu anyway, so we do not care. - * We only do this so that references to this symbol do not generate build - * errors, although it is not used. - */ -.globl _base_addr -.set _base_addr, _liblinuxuplat_start - -.global _liblinuxuplat_start -_liblinuxuplat_start: - xorl %ebp, %ebp # mark the outmost frame (clear the frame pointer) - - popq %rdi # argc as first argument - movq %rsp, %rsi # move argv to rsi, the second parameter in x86_64 abi - - # ignore environ for now - - andq $~15, %rsp # align stack to 16-byte boundary - - # Run _liblinuxuplat_entry(argc, argv) - callq *_liblinuxuplat_entry@GOTPCREL(%rip) - - # Protection -_liblinuxuplat_start_err: - jmp *_liblinuxuplat_start_err(%rip) diff --git a/plat/linuxu/x86/link64.lds.S b/plat/linuxu/x86/link64.lds.S deleted file mode 100644 index c416f84fecbbac199ff8bf129f359e196f9bbe1e..0000000000000000000000000000000000000000 --- a/plat/linuxu/x86/link64.lds.S +++ /dev/null @@ -1,19 +0,0 @@ -#include - -SECTIONS -{ - EXCEPTION_SECTIONS - - CTORTAB_SECTION - - INITTAB_SECTION - - EVENTTAB_SECTION -} -INSERT BEFORE .rodata - -SECTIONS -{ - TLS_SECTIONS -} -INSERT BEFORE .data diff --git a/plat/xen/Config.uk b/plat/xen/Config.uk deleted file mode 100644 index 260aa64460d90c9865e8f4c5acb3cae5c30d819b..0000000000000000000000000000000000000000 --- a/plat/xen/Config.uk +++ /dev/null @@ -1,154 +0,0 @@ -menuconfig PLAT_XEN - bool "Xen guest image" - default n - depends on ((ARCH_X86_32 && !HAVE_SMP) || (ARCH_X86_64 && !HAVE_SMP) || (ARCH_ARM_32 && !HAVE_SMP)) - depends on ((ARCH_X86_32 && !HAVE_SYSCALL) || (ARCH_X86_64 && !HAVE_SYSCALL) || (ARCH_ARM_32 && !HAVE_SYSCALL)) - depends on !HAVE_PAGING - imply XEN_PV_BUILD_P2M - select LIBUKDEBUG - select LIBNOLIBC if !HAVE_LIBC - select HAVE_FDT if ARCH_ARM32 - select LIBFDT if ARCH_ARM_32 - select XEN_DBGEMERGENCY if ARCH_ARM_32 - select LIBUKRELOC if OPTIMIZE_PIE - help - Create a Unikraft image that runs as a Xen guest - -if (PLAT_XEN) -# Invisible option to switch between PV and PVH mode -config XEN_HVMLITE - bool - default n if (ARCH_X86_64 || ARCH_X86_32) - default y - -config XEN_PV - bool - default n if XEN_HVMLITE - default y - -menu "Console Options" - -config XEN_KERNEL_HV_CONSOLE - bool "Hypervisor console for kernel prints" - default y - depends on ARCH_X86_64 - help - Send kernel messages to the hypervisor console. - -config XEN_KERNEL_EMG_CONSOLE - bool "Emergency console for kernel prints" - default y if ARCH_ARM_32 - default n - help - Send kernel messages to the emergency console. - -config XEN_DEBUG_HV_CONSOLE - bool "Hypervisor console for debug prints" - default y - depends on ARCH_X86_64 - help - Send debug messages to the hypervisor console. - -config XEN_DEBUG_EMG_CONSOLE - bool "Emergency console for debug prints" - default y if ARCH_ARM_32 - default n - help - Send debug messages to the emergency console. -endmenu - -config XEN_PV_BUILD_P2M - bool "Create p2m table" - depends on (ARCH_X86_64 && XEN_PV) - default n - help - Create and initialize physical to machine (p2m) table on a PV - xen host - -config XEN_GNTTAB - bool "Grant table support" - default y if XEN_PV - default n - depends on (ARCH_X86_64) - select LIBUKALLOC - select LIBUKLOCK - select LIBUKLOCK_SEMAPHORE - select LIBUKSCHED - help - Support grant table operations - -config XEN_XENBUS - bool "Xenbus/XenStore driver" - default y if XEN_PV - default n - depends on XEN_GNTTAB - select LIBUKALLOC - select LIBUKSCHED - select LIBUKBUS - help - Registers Xenbus as bus driver to libukbus and provides a - XenStore communication API for Xen drivers - -menu "Xenbus Drivers" - depends on XEN_XENBUS - -config XEN_NETFRONT - bool "Xenbus Netfront Driver" - default y if LIBUKNETDEV - default n - depends on LIBUKNETDEV - help - Driver for netfront devices - -menuconfig XEN_BLKFRONT - bool "Xenbus Blkfront Driver" - default y if LIBUKBLKDEV - default n - depends on LIBUKBLKDEV - help - Driver for block devices - -config XEN_BLKFRONT_GREFPOOL - bool "Enable grant reference pool for each queue" - default y - depends on XEN_BLKFRONT - select LIBUKSCHED - select LIBUKLOCK - select LIBUKLOCK_SEMAPHORE - help - Each read / write request needs a number of - grant references. In order to avoid the need - of allocating the grant refs at the beginning - of every operation and freeing them at the end - of it, we use the same grant references stored - in a queue. If at the moment of sending a - request, there are not enough grant refs in the - pool, we just allocate new ones, which are - freed at the moment of processing the response. - -menuconfig XEN_9PFRONT - bool "Xenbus 9pfront Driver" - default y if LIBUK9P - default n - depends on LIBUK9P - help - Driver for 9pfs devices - -config XEN_9PFRONT_NB_RINGS - int "Xen 9P ring number" - default 2 - depends on XEN_9PFRONT - help - Number of rings to allocate. - Will be clamped to the maximum value allowed by the backend. - -config XEN_9PFRONT_RING_ORDER - int "Xen 9P ring order" - default 6 - depends on XEN_9PFRONT - help - Ring order for xen 9P devices. Orders of 0, 1, 2, ..., 9 will - create rings of size 4K, 8K, 16K, ..., 2M respectively. - Will be clamped to the maximum value allowed by the backend. -endmenu -endif diff --git a/plat/xen/Linker.uk b/plat/xen/Linker.uk deleted file mode 100644 index 30daf7feb9f152bbf150a1f2394620008cc5b778..0000000000000000000000000000000000000000 --- a/plat/xen/Linker.uk +++ /dev/null @@ -1,98 +0,0 @@ -ifeq (x86_64,$(CONFIG_UK_ARCH)) -XEN_LDFLAGS-y += -Wl,-m,elf_x86_64 -endif - -## -## Link image -## -ifneq ($(UK_IMAGE_NAME_OVERWRITE),) -XEN_RAW_IMAGE := $(BUILD_DIR)/$(UK_IMAGE_NAME_OVERWRITE) -else -XEN_RAW_IMAGE := $(BUILD_DIR)/$(CONFIG_UK_NAME)_xen-$(CONFIG_UK_ARCH) -endif -ifeq (arm,$(CONFIG_UK_ARCH)) -XEN_IMAGE := $(XEN_RAW_IMAGE).elf -else -XEN_IMAGE := $(XEN_RAW_IMAGE) -endif -XEN_DEBUG_IMAGE := $(XEN_IMAGE).dbg - -XEN_LD_SCRIPT_FLAGS := $(addprefix -Wl$(comma)-dT$(comma),\ - $(UK_PLAT_XEN_DEF_LDS)) -XEN_LD_SCRIPT_FLAGS += $(addprefix -Wl$(comma)-T$(comma),\ - $(XEN_LD_SCRIPT-y) $(EXTRA_LD_SCRIPT-y)) - -$(XEN_DEBUG_IMAGE): $(XEN_ALIBS) $(XEN_ALIBS-y) $(XEN_OLIBS) $(XEN_OLIBS-y) \ - $(UK_ALIBS) $(UK_ALIBS-y) $(UK_OLIBS) $(UK_OLIBS-y) \ - $(XEN_LD_SCRIPT-y) $(EXTRA_LD_SCRIPT-y) \ - $(UK_PLAT_XEN_DEF_LDS) $(UK_LDEPS) - $(call build_cmd,LD,,$(XEN_IMAGE).ld.o,\ - $(LD) -r $(LIBLDFLAGS) $(LIBLDFLAGS-y) \ - $(XEN_LDFLAGS) $(XEN_LDFLAGS-y) \ - $(XEN_OLIBS) $(XEN_OLIBS-y) \ - $(UK_OLIBS) $(UK_OLIBS-y) \ - -Wl$(comma)--start-group \ - $(XEN_ALIBS) $(XEN_ALIBS-y) \ - $(UK_ALIBS) $(UK_ALIBS-y) \ - -Wl$(comma)--end-group \ - -o $(XEN_IMAGE).ld.o) - $(call build_cmd,OBJCOPY,,$(XEN_IMAGE).o,\ - $(OBJCOPY) -w -G xenos_* -G _libxenplat_start \ - $(XEN_IMAGE).ld.o $(XEN_IMAGE).o) - $(call build_cmd,LD,,$@,\ - $(LD) $(LDFLAGS) $(LDFLAGS-y) $(XEN_LDFLAGS) $(XEN_LDFLAGS-y) \ - $(XEN_LD_SCRIPT_FLAGS) \ - $(XEN_IMAGE).o -o $@) -ifeq ($(CONFIG_OPTIMIZE_PIE),y) - $(call build_uk_reloc,$@) -endif - -$(XEN_IMAGE): $(XEN_DEBUG_IMAGE) - $(call build_cmd,SCSTRIP,,$@,\ - $(STRIP) -s \ - $(SECT_STRIP_FLAGS) $(SECT_STRIP_FLAGS-y) \ - $< -o $@ 2>&1 | \ - { $(GREP) -Ev \ - "Empty loadable segment detected|section.*lma.*adjusted to.*" || \ - true; }) - $(call build_bootinfo,$@) - -ifeq (arm,$(CONFIG_UK_ARCH)) -$(XEN_RAW_IMAGE): $(XEN_IMAGE) - $(call build_cmd,OBJCOPY,,$@,$(OBJCOPY) -O binary $< $@) -endif - -$(XEN_IMAGE).sym: $(XEN_DEBUG_IMAGE) - $(call build_cmd,NM,,$@, $(NM) -n $< > $@) - -ifeq (arm,$(CONFIG_UK_ARCH)) -$(XEN_RAW_IMAGE).gz: $(XEN_RAW_IMAGE) - $(call build_cmd,GZ,,$@, $(GZIP) -f -9 -c $< >$@) - -else -$(XEN_IMAGE).gz: $(XEN_IMAGE) - $(call build_cmd,GZ,,$@, $(GZIP) -f -9 -c $< >$@) - -endif - -# register images to the build -ifeq ($(CONFIG_PLAT_XEN),y) -UK_DEBUG_IMAGES-y += $(XEN_DEBUG_IMAGE) -UK_IMAGES-y += $(XEN_IMAGE) -UK_IMAGES-$(CONFIG_OPTIMIZE_SYMFILE) += $(XEN_IMAGE).sym - -ifeq (arm,$(CONFIG_UK_ARCH)) -UK_IMAGES-y += $(XEN_RAW_IMAGE) -UK_IMAGES-$(CONFIG_OPTIMIZE_COMPRESS) += $(XEN_RAW_IMAGE).gz -else -UK_IMAGES-$(CONFIG_OPTIMIZE_COMPRESS) += $(XEN_IMAGE).gz -endif -endif - -# register image to the build -UK_IMAGES-$(CONFIG_PLAT_XEN) += $(XEN_IMAGE) - -# ...for cleaning: -LIBXENPLAT_CLEAN += $(call build_clean,$(XEN_IMAGE).ld.o) -LIBXENPLAT_CLEAN += $(call build_clean,$(XEN_IMAGE).o) -LIBXENPLAT_CLEAN += $(call build_clean,$(XEN_IMAGE).elf) diff --git a/plat/xen/Makefile.uk b/plat/xen/Makefile.uk deleted file mode 100644 index 63b4a62f683b46a87483f8028058d6e3ede25662..0000000000000000000000000000000000000000 --- a/plat/xen/Makefile.uk +++ /dev/null @@ -1,147 +0,0 @@ -XEN_INTERFACE_VERSION := 0x00030205 - -## -## Xen platform registration -## -$(eval $(call addplat_s,xen,$(CONFIG_PLAT_XEN))) - -## -## Xen platform library registration -## -$(eval $(call addplatlib,xen,libxenplat)) -$(eval $(call addplatlib_s,xen,libxenbus,$(CONFIG_XEN_XENBUS))) -$(eval $(call addplatlib_s,xen,libxennetfront,$(CONFIG_XEN_NETFRONT))) -$(eval $(call addplatlib_s,xen,libxenblkfront,$(CONFIG_XEN_BLKFRONT))) -$(eval $(call addplatlib_s,xen,libxen9pfront,$(CONFIG_XEN_9PFRONT))) - -## -## Xen platform compilation settings -## -LIBXENPLAT_ASFLAGS-y += -DXENPLAT -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION) -LIBXENPLAT_CFLAGS-y += -DXENPLAT -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION) -LIBXENPLAT_CXXFLAGS-y += -DXENPLAT -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION) - -LIBXENPLAT_ASFLAGS-y += -DUK_USE_SECTION_SEGMENTS -LIBXENPLAT_CFLAGS-y += -DUK_USE_SECTION_SEGMENTS -LIBXENPLAT_CXXFLAGS-y += -DUK_USE_SECTION_SEGMENTS - -## -## Default Linker script -ifeq ($(CONFIG_ARCH_X86_64),y) -UK_PLAT_XEN_DEF_LDS := $(CONFIG_UK_BASE)/plat/xen/x86/link64.lds.S -else -ifeq ($(CONFIG_ARCH_ARM_32),y) -UK_PLAT_XEN_DEF_LDS := $(CONFIG_UK_BASE)/plat/xen/arm/link32.lds.S -endif -endif - -## -## Platform library definitions -## -LIBXENPLAT_ASINCLUDES-y += -I$(LIBXENPLAT_BASE)/include -LIBXENPLAT_ASINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include -LIBXENPLAT_CINCLUDES-y += -I$(LIBXENPLAT_BASE)/include -LIBXENPLAT_CINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include - -LIBXENPLAT_SRCS-y += $(UK_PLAT_XEN_DEF_LDS) -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/hypervisor.c -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/memory.c -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/io.c -LIBXENPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/lcpu.c|common -LIBXENPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/memory.c|common -LIBXENPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/tls.c|common - -LIBXENPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/bootinfo.c|common -LIBXENPLAT_SRCS-$(CONFIG_LIBFDT) += $(UK_PLAT_COMMON_BASE)/bootinfo_fdt.c|common -LIBXENPLAT_SRCS-y += $(UK_PLAT_COMMON_BASE)/bootinfo.lds.S|common - -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(UK_PLAT_COMMON_BASE)/x86/trace.c|common -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(UK_PLAT_COMMON_BASE)/x86/traps.c|common -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/setup.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/traps.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/entry64.S -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/mm.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/arch_events.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/arch_time.c - -ifneq ($(CONFIG_XEN_HVMLITE),y) -LIBXENPLAT_ASFLAGS-y += -DCONFIG_PARAVIRT -LIBXENPLAT_CFLAGS-y += -DCONFIG_PARAVIRT -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/cpu_pv.c -else -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(UK_PLAT_COMMON_BASE)/x86/cpu_native.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(UK_PLAT_COMMON_BASE)/arm/cpu_native.c -endif - -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(LIBXENPLAT_BASE)/arm/setup.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(LIBXENPLAT_BASE)/arm/traps.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(LIBXENPLAT_BASE)/arm/entry32.S -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(LIBXENPLAT_BASE)/arm/arch_events.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(LIBXENPLAT_BASE)/arm/arch_time.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_32) += $(LIBXENPLAT_BASE)/arm/hypercalls32.S - -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBXENPLAT_BASE)/arm/setup.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBXENPLAT_BASE)/arm/traps.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBXENPLAT_BASE)/arm/entry64.S -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBXENPLAT_BASE)/arm/arch_events.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBXENPLAT_BASE)/arm/arch_time.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_ARM_64) += $(LIBXENPLAT_BASE)/arm/hypercalls64.S - -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/lcpu.c -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/console.c -ifeq ($(findstring y,$(CONFIG_XEN_KERNEL_HV_CONSOLE) $(CONFIG_XEN_DEBUG_HV_CONSOLE)),y) -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/hv_console.c -endif -ifeq ($(findstring y,$(CONFIG_XEN_KERNEL_EMG_CONSOLE) $(CONFIG_XEN_DEBUG_EMG_CONSOLE)),y) -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/emg_console.c -endif -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/shutdown.c -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/events.c - -ifeq ($(CONFIG_XEN_GNTTAB),y) -LIBXENPLAT_SRCS-y += $(LIBXENPLAT_BASE)/gnttab.c -LIBXENPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBXENPLAT_BASE)/x86/gnttab.c|x86 -endif - -ifeq ($(CONFIG_XEN_XENBUS),y) -LIBXENBUS_EXPORTS = $(LIBXENPLAT_BASE)/xenbus/exportsyms.uk -LIBXENBUS_ASFLAGS-y += $(LIBXENPLAT_ASFLAGS-y) -LIBXENBUS_ASINCLUDES-y += $(LIBXENPLAT_ASINCLUDES-y) -LIBXENBUS_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y) -LIBXENBUS_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y) -LIBXENBUS_SRCS-y += $(LIBXENPLAT_BASE)/xenbus/xenbus.c -LIBXENBUS_SRCS-y += $(LIBXENPLAT_BASE)/xenbus/client.c -LIBXENBUS_SRCS-y += $(LIBXENPLAT_BASE)/xenbus/xs_comms.c -LIBXENBUS_SRCS-y += $(LIBXENPLAT_BASE)/xenbus/xs_watch.c -LIBXENBUS_SRCS-y += $(LIBXENPLAT_BASE)/xenbus/xs.c -endif - -ifeq ($(CONFIG_XEN_NETFRONT),y) -LIBXENNETFRONT_EXPORTS = $(LIBXENPLAT_BASE)/drivers/net/exportsyms.uk -LIBXENNETFRONT_ASFLAGS-y += $(LIBXENPLAT_ASFLAGS-y) -LIBXENNETFRONT_ASINCLUDES-y += $(LIBXENPLAT_ASINCLUDES-y) -LIBXENNETFRONT_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y) -LIBXENNETFRONT_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y) -LIBXENNETFRONT_SRCS-y += $(LIBXENPLAT_BASE)/drivers/net/netfront.c -LIBXENNETFRONT_SRCS-y += $(LIBXENPLAT_BASE)/drivers/net/netfront_xs.c -endif - -ifeq ($(CONFIG_XEN_BLKFRONT),y) -LIBXENBLKFRONT_EXPORTS = $(LIBXENPLAT_BASE)/drivers/blk/exportsyms.uk -LIBXENBLKFRONT_ASFLAGS-y += $(LIBXENPLAT_ASFLAGS-y) -LIBXENBLKFRONT_ASINCLUDES-y += $(LIBXENPLAT_ASINCLUDES-y) -LIBXENBLKFRONT_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y) -LIBXENBLKFRONT_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y) -LIBXENBLKFRONT_SRCS-y += $(LIBXENPLAT_BASE)/drivers/blk/blkfront.c -LIBXENBLKFRONT_SRCS-y += $(LIBXENPLAT_BASE)/drivers/blk/blkfront_xs.c -endif - -ifeq ($(CONFIG_XEN_9PFRONT),y) -LIBXEN9PFRONT_EXPORTS = $(LIBXENPLAT_BASE)/drivers/9p/exportsyms.uk -LIBXEN9PFRONT_ASFLAGS-y += $(LIBXENPLAT_ASFLAGS-y) -LIBXEN9PFRONT_ASINCLUDES-y += $(LIBXENPLAT_ASINCLUDES-y) -LIBXEN9PFRONT_CFLAGS-y += $(LIBXENPLAT_CFLAGS-y) -LIBXEN9PFRONT_CINCLUDES-y += $(LIBXENPLAT_CINCLUDES-y) -LIBXEN9PFRONT_SRCS-y += $(LIBXENPLAT_BASE)/drivers/9p/9pfront.c -LIBXEN9PFRONT_SRCS-y += $(LIBXENPLAT_BASE)/drivers/9p/9pfront_xs.c -endif diff --git a/plat/xen/arm/arch_events.c b/plat/xen/arm/arch_events.c deleted file mode 100644 index 2037aca02cacf188bc2143776248171e066ea8d7..0000000000000000000000000000000000000000 --- a/plat/xen/arm/arch_events.c +++ /dev/null @@ -1,60 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Copyright (c) 2009 Citrix Systems, Inc. All rights reserved. - * - * 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. - * 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 AUTHOR 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 AUTHOR 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 -#include -#include -#include -#include - -static void virq_debug(evtchn_port_t port __unused, - struct __regs *regs __unused, - void *params __unused) -{ - uk_pr_debug("Received a virq_debug event\n"); -} - -static evtchn_port_t debug_port = -1; - -void arch_init_events(void) -{ - debug_port = bind_virq(VIRQ_DEBUG, (evtchn_handler_t)virq_debug, 0); - if ((int) debug_port == -1) - UK_CRASH("Failed to initialize events\n"); - unmask_evtchn(debug_port); -} - -void arch_unbind_ports(void) -{ - if ((int) debug_port != -1) { - mask_evtchn(debug_port); - unbind_evtchn(debug_port); - } -} - -void arch_fini_events(void) -{ -} diff --git a/plat/xen/arm/arch_time.c b/plat/xen/arm/arch_time.c deleted file mode 100644 index cd96e7108c3f7fe46950151de4d08ff21239ea62..0000000000000000000000000000000000000000 --- a/plat/xen/arm/arch_time.c +++ /dev/null @@ -1,160 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Copyright (c) 2009 Citrix Systems, Inc. All rights reserved. - * - * 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. - * 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 AUTHOR 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 AUTHOR 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 -#include -#include -#include -#include -#include -#include - -/************************************************************************ - * Time functions - *************************************************************************/ - -static uint64_t cntvct_at_init; -static uint32_t counter_freq; -/* - * System Time - * 64 bit value containing the nanoseconds elapsed since boot time. - * This value is adjusted by frequency drift. - * NOW() returns the current time. - * The other macros are for convenience to approximate short intervals - * of real time into system time - */ -typedef int64_t s_time_t; - -#define SECONDS(_s) (((s_time_t)(_s)) * 1000000000UL) - -/* Compute with 96 bit intermediate result: (a*b)/c */ -uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c) -{ - union { - uint64_t ll; - struct { - uint32_t low, high; - } l; - } u, res; - uint64_t rl, rh; - - u.ll = a; - rl = (uint64_t)u.l.low * (uint64_t)b; - rh = (uint64_t)u.l.high * (uint64_t)b; - rh += (rl >> 32); - res.l.high = rh / c; - res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c; - return res.ll; -} - -static inline s_time_t ticks_to_ns(uint64_t ticks) -{ - return muldiv64(ticks, SECONDS(1), counter_freq); -} - -static inline uint64_t ns_to_ticks(s_time_t ns) -{ - return muldiv64(ns, counter_freq, SECONDS(1)); -} - -static inline uint64_t read_virtual_count(void) -{ - uint32_t c_lo, c_hi; - - __asm__ __volatile__("mrrc p15, 1, %0, %1, c14":"=r"(c_lo), "=r"(c_hi)); - return (((uint64_t) c_hi) << 32) + c_lo; -} - -/* monotonic_clock(): returns # of nanoseconds passed since time_init() - * Note: This function is required to return accurate - * time even in the absence of multiple timer ticks. - */ -__nsec ukplat_monotonic_clock(void) -{ - return (__nsec) ticks_to_ns(read_virtual_count() - cntvct_at_init); -} - -/* TODO: proper implementation of wall clock time */ -__nsec ukplat_wall_clock(void) -{ - return ukplat_monotonic_clock(); -} - -/* Set the timer and mask. */ -void write_timer_ctl(uint32_t value) -{ - __asm__ __volatile__("mcr p15, 0, %0, c14, c3, 1\n" - "isb"::"r"(value)); -} - -void set_vtimer_compare(uint64_t value) -{ - uk_pr_debug("New CompareValue : %llx\n", value); - - __asm__ __volatile__("mcrr p15, 3, %0, %H0, c14" - ::"r"(value)); - - /* Enable timer and unmask the output signal */ - write_timer_ctl(1); -} - -void unset_vtimer_compare(void) -{ - /* Disable timer and mask the output signal */ - write_timer_ctl(2); -} - -void block_domain(__snsec until) -{ - uint64_t until_count = ns_to_ticks(until) + cntvct_at_init; - - UK_ASSERT(irqs_disabled()); - if (read_virtual_count() < until_count) { - set_vtimer_compare(until_count); - __asm__ __volatile__("wfi"); - unset_vtimer_compare(); - - /* Give the IRQ handler a chance to handle - * whatever woke us up. - */ - local_irq_enable(); - local_irq_disable(); - } -} - -void ukplat_time_init(void) -{ - uk_pr_info("Initialising timer interface\n"); - - __asm__ __volatile__("mrc p15, 0, %0, c14, c0, 0":"=r"(counter_freq)); - cntvct_at_init = read_virtual_count(); - uk_pr_debug("Virtual Count register is %llx, freq = %d Hz\n", - cntvct_at_init, counter_freq); -} - -void ukplat_time_fini(void) -{ -} diff --git a/plat/xen/arm/entry32.S b/plat/xen/arm/entry32.S deleted file mode 100644 index 5568da033817e222facf0dd7d27c135368072fd7..0000000000000000000000000000000000000000 --- a/plat/xen/arm/entry32.S +++ /dev/null @@ -1,341 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - * - */ -/* Taken from Mini-OS */ - -#include -#include - -#define ELFNOTE(name, type, desc) \ - .pushsection .note.name ; \ - .align 4 ; \ - .long 2f - 1f /* namesz */ ; \ - .long 4f - 3f /* descsz */ ; \ - .long type /* type */ ; \ -1:.asciz #name /* name */ ; \ -2:.align 4 ; \ -3:desc /* desc */ ; \ -4:.align 4 ; \ - .popsection - -ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "Unikraft") -ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic") -ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz "xen-3.0") - -@ Offset of the kernel within the RAM. This is a Linux/zImage convention which we -@ rely on for now. -#define ZIMAGE_KERNEL_OFFSET 0x8000 - -.section .text.zimageboot - -.globl _libxenplat_start -_libxenplat_start: - @ zImage header -.rept 8 - mov r0, r0 -.endr - b reset - .word 0x016f2818 @ Magic numbers to help the loader - .word 0 @ zImage start address (0 = relocatable) - .word _edata - _libxenplat_start @ zImage end address (excludes bss section) - @ end of zImage header - -@ Called at boot time. Sets up MMU, exception vectors and stack, and then calls C _libxenplat_armentry() function. -@ => r2 -> DTB -@ <= never returns -@ Note: this boot code needs to be within the first (1MB - ZIMAGE_KERNEL_OFFSET) of _libxenplat_start. -reset: - @ Problem: the C code wants to be at a known address (_libxenplat_start), but Xen might - @ load us anywhere. We initialise the MMU (mapping virtual to physical @ addresses) - @ so everything ends up where the code expects it to be. - @ - @ We calculate the offet between where the linker thought _libxenplat_start would be and where - @ it actually is and initialise the page tables to have that offset for every page. - @ - @ When we turn on the MMU, we're still executing at the old address. We don't want - @ the code to disappear from under us. So we have to do the mapping in stages: - @ - @ 1. set up a mapping to our current page from both its current and desired addresses - @ 2. enable the MMU - @ 3. jump to the new address - @ 4. remap all the other pages with the calculated offset - - adr r1, _libxenplat_start @ r1 = physical address of _libxenplat_start - ldr r3, =_libxenplat_start @ r3 = (desired) virtual address of _libxenplat_start - sub r9, r1, r3 @ r9 = (physical - virtual) offset - - ldr r7, =_page_dir @ r7 = (desired) virtual addr of translation table - add r1, r7, r9 @ r1 = physical addr of translation table - - @ Tell the system where our page table is located. - @ This is the 16 KB top-level translation table, in which - @ each word maps one 1MB virtual section to a physical section. - @ Note: We leave TTBCR as 0, meaning that only TTBR0 is used and - @ we use the short-descriptor format (32-bit physical addresses). - orr r0, r1, #0b0001011 @ Sharable, Inner/Outer Write-Back Write-Allocate Cacheable - mcr p15, 0, r0, c2, c0, 0 @ set TTBR0 - - @ Set access permission for domains. - @ Domains are deprecated, but we have to configure them anyway. - @ We mark every page as being domain 0 and set domain 0 to "client mode" - @ (client mode = use access flags in page table). - mov r0, #1 @ 1 = client - mcr p15, 0, r0, c3, c0, 0 @ DACR - - @ Template (flags) for a 1 MB page-table entry. - @ TEX[2:0] C B = 001 1 1 (outer and inner write-back, write-allocate) - ldr r8, =(0x2 + /* Section entry */ \ - 0xc + /* C B */ \ - (3 << 10) + /* Read/write */ \ - (1 << 12) + /* TEX */ \ - (1 << 16) + /* Sharable */ \ - (1<<19)) /* Non-secure */ - @ r8 = template page table entry - - @ Add an entry for the current physical section, at the old and new - @ addresses. It's OK if they're the same. - mov r0, pc, lsr#20 - mov r0, r0, lsl#20 @ r0 = physical address of this code's section start - orr r3, r0, r8 @ r3 = table entry for this section - ldr r4, =_libxenplat_start @ r4 = desired virtual address of this section - str r3, [r1, r4, lsr#18] @ map desired virtual section to this code - str r3, [r1, r0, lsr#18] @ map current section to this code too - - @ Invalidate TLB - dsb @ Caching is off, but must still prevent reordering - mcr p15, 0, r1, c8, c7, 0 @ TLBIALL - - @ Enable MMU / SCTLR - mrc p15, 0, r1, c1, c0, 0 @ SCTLR - orr r1, r1, #3 << 11 @ enable icache, branch prediction - orr r1, r1, #4 + 1 @ enable dcache, MMU - mcr p15, 0, r1, c1, c0, 0 @ SCTLR - isb - - ldr r1, =stage2 @ Virtual address of stage2 - bx r1 - - -.section .text -@ Called once the MMU is enabled. The boot code and the page table are mapped, -@ but nothing else is yet. -@ -@ => r2 -> dtb (physical) -@ r7 = virtual address of page table -@ r8 = section entry template (flags) -@ r9 = desired physical - virtual offset -@ pc -> somewhere in newly-mapped virtual code section -stage2: - @ Invalidate TLB - mcr p15, 0, r1, c8, c7, 0 @ TLBIALL - isb - - @ The new mapping has now taken effect: - @ r7 -> page_dir - - @ Fill in the whole top-level translation table (at page_dir). - @ Populate the whole pagedir with 1MB section descriptors. - - mov r1, r7 @ r1 -> first section entry - add r3, r1, #4*4*1024 @ limit (4 GB address space, 4 byte entries) - orr r0, r8, r9 @ r0 = entry mapping section zero to start of physical RAM -1: - str r0, [r1],#4 @ write the section entry - add r0, r0, #1 << 20 @ next physical page (wraps) - cmp r1, r3 - bne 1b - - @ Invalidate TLB - dsb - mcr p15, 0, r1, c8, c7, 0 @ TLBIALL - isb - - @ Set VBAR -> exception_vector_table - @ SCTLR.V = 0 - adr r0, exception_vector_table - mcr p15, 0, r0, c12, c0, 0 - - @ Enable hardware floating point: - @ 1. Access to CP10 and CP11 must be enabled in the Coprocessor Access - @ Control Register (CP15.CACR): - mrc p15, 0, r1, c1, c0, 2 @ CACR - orr r1, r1, #(3 << 20) + (3 << 22) @ full access for CP10 & CP11 - mcr p15, 0, r1, c1, c0, 2 - @ 2. The EN bit in the FPEXC register must be set: - vmrs r0, FPEXC - orr r0, r0, #1<<30 @ EN (enable) - vmsr FPEXC, r0 - - @ Initialise 16 KB stack - ldr sp, =_boot_stack_end - - sub r0, r2, r9 @ r0 -> device tree (virtual address) - mov r1, r9 @ r1 = _libxenplat_paddr_offset - - b _libxenplat_armentry - -.pushsection .bss -@ Note: calling _libxenplat_armentry zeroes out this region. -.align 12 -.globl shared_info -shared_info: - .fill (1024), 4, 0x0 - -.align 3 -.globl irqstack -.globl irqstack_end -irqstack: - .fill (1024), 4, 0x0 -irqstack_end: - -fault_dump: - .fill 18, 4, 0x0 @ On fault, we save the registers + CPSR + handler address - -.popsection - -fault: - cpsid aif @ Disable interrupts - - ldr r13, =fault_dump - stmia r13, {r0-r12} @ Dump the non-banked registers directly (well, unless from FIQ mode) - str r14, [r13, #15 << 2] @ Our r14 is the faulting r15 - mov r0, r13 - - @ Save the caller's CPSR (our SPSR) too. - mrs r1, SPSR - str r1, [r13, #16 << 2] - - @ Switch to the mode we came from to get r13 and r14. - @ If coming from user mode, use System mode instead so we're still - @ privileged. - and r1, r1, #0x1f @ r1 = SPSR mode - cmp r1, #0x10 @ If from User mode - moveq r1, #0x1f @ Then use System mode instead - - mrs r3, CPSR @ r3 = our CPSR - bic r2, r3, #0x1f - orr r2, r2, r1 - msr CPSR, r2 @ Change to mode r1 - - @ Save old mode's r13, r14 - str r13, [r0, #13 << 2] - str r14, [r0, #14 << 2] - - msr CPSR, r3 @ Back to fault mode - - ldr r1, [r0, #17 << 2] - sub r1, r1, #12 @ Fix to point at start of handler - str r1, [r0, #17 << 2] - - @ Call C code to format the register dump. - @ Clobbers the stack, but we're not going to return anyway. - ldr sp, =_boot_stack_end - b _libxenplat_armpanic - -@ We want to store a unique value to identify this handler, without corrupting -@ any of the registers. So, we store r15 (which will point just after the branch). -@ Later, we subtract 12 so the user gets pointed at the start of the exception -@ handler. -#define FAULT(name) \ -.globl fault_##name; \ -fault_##name: \ - ldr r13, =fault_dump; \ - str r15, [r13, #17 << 2]; \ - b fault - -FAULT(reset) -FAULT(undefined_instruction) -FAULT(svc) -FAULT(prefetch_call) -FAULT(prefetch_abort) -FAULT(data_abort) - -@ exception base address -.align 5 -.globl exception_vector_table -@ Note: remember to call CLREX if returning from an exception: -@ "The architecture enables the local monitor to treat any exclusive store as -@ matching a previous LDREX address. For this reason, use of the CLREX -@ instruction to clear an existing tag is required on context switches." -@ -- ARM Cortex-A Series Programmer’s Guide (Version: 4.0) -exception_vector_table: - b fault_reset - b fault_undefined_instruction - b fault_svc - b fault_prefetch_call - b fault_prefetch_abort - b fault_data_abort - b irq_handler @ IRQ - .word 0xe7f000f0 @ abort on FIQ - -@ Call fault_undefined_instruction in "Undefined mode" -bug: - .word 0xe7f000f0 @ und/udf - a "Permanently Undefined" instruction - -irq_handler: - ldr sp, =irqstack_end - push {r0 - r12, r14} - - ldr r0, IRQ_handler - cmp r0, #0 - beq bug - blx r0 @ call handler - - @ Return from IRQ - pop {r0 - r12, r14} - clrex - subs pc, lr, #4 - -.globl IRQ_handler -IRQ_handler: - .long 0x0 - -@ This is called if you try to divide by zero. For now, we make a supervisor call, -@ which will make us halt. -.globl raise -raise: - svc 0 - -/* -.globl __arch_switch_threads -@ => r0 = &prev->sp -@ r1 = &next->sp -@ <= returns to next thread's saved return address -__arch_switch_threads: - push {r4-r11} @ Store callee-saved registers to old thread's stack - stmia r0, {sp, lr} @ Store current sp and ip to prev's struct thread - - ldmia r1, {sp, lr} @ Load new sp, ip from next's struct thread - pop {r4-r11} @ Load callee-saved registers from new thread's stack - - bx lr - -.globl arm_start_thread -arm_start_thread: - pop {r0, r1} - @ r0 = user data - @ r1 -> thread's main function - ldr lr, =exit_thread - bx r1 -*/ diff --git a/plat/xen/arm/hypercalls32.S b/plat/xen/arm/hypercalls32.S deleted file mode 100644 index a9601a5ebb06617b73ecaac2ccb5f9327c17b732..0000000000000000000000000000000000000000 --- a/plat/xen/arm/hypercalls32.S +++ /dev/null @@ -1,65 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 or MIT */ -/****************************************************************************** - * hypercall.S - * - * Xen hypercall wrappers - * - * Stefano Stabellini , Citrix, 2012 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation; or, when distributed - * separately from the Linux kernel or incorporated into other - * software packages, subject to the following license: - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this source file (the "Software"), to deal in the Software without - * restriction, including without limitation the rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include - -#define __HVC(imm16) .long ((0xE1400070 | (((imm16) & 0xFFF0) << 4) | ((imm16) & 0x000F)) & 0xFFFFFFFF) - -#define XEN_IMM 0xEA1 - -#define HYPERCALL_SIMPLE(hypercall) \ -.globl HYPERVISOR_##hypercall; \ -.align 4,0x90; \ -HYPERVISOR_##hypercall: \ - mov r12, #__HYPERVISOR_##hypercall; \ - __HVC(XEN_IMM); \ - mov pc, lr; - -#define _hypercall0 HYPERCALL_SIMPLE -#define _hypercall1 HYPERCALL_SIMPLE -#define _hypercall2 HYPERCALL_SIMPLE -#define _hypercall3 HYPERCALL_SIMPLE -#define _hypercall4 HYPERCALL_SIMPLE - -_hypercall2(sched_op); -_hypercall2(memory_op); -_hypercall2(event_channel_op); -_hypercall2(xen_version); -_hypercall3(console_io); -_hypercall1(physdev_op); -_hypercall3(grant_table_op); -_hypercall3(vcpu_op); -_hypercall1(sysctl); -_hypercall1(domctl); -_hypercall2(hvm_op); -_hypercall1(xsm_op); diff --git a/plat/xen/arm/link32.lds.S b/plat/xen/arm/link32.lds.S deleted file mode 100644 index d5e53c9bdae2b5c250daa6b595a63d7e9ee80a47..0000000000000000000000000000000000000000 --- a/plat/xen/arm/link32.lds.S +++ /dev/null @@ -1,129 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - * - */ -/* Taken from Mini-OS */ - -#include - -OUTPUT_ARCH(arm) -ENTRY(_libxenplat_start) - -PHDRS -{ - text PT_LOAD FLAGS(PHDRS_PF_RX); - rodata PT_LOAD FLAGS(PHDRS_PF_R); - data PT_LOAD; - tls PT_TLS; - tls_load PT_LOAD; - stack PT_GNU_STACK FLAGS(PHDRS_PF_RW); -} - -SECTIONS -{ - /* Note: we currently assume that Xen will load the kernel image - * at start-of-RAM + 0x8000. We use this initial 32 KB for the stack - * and translation tables. - */ - _boot_stack = 0x400000; /* 16 KB boot stack */ - _boot_stack_end = 0x404000; - _page_dir = 0x404000; /* 16 KB translation table */ - . = 0x408000; - - _base_addr = .; /* Symbol to represent the load base address */ - - _text = .; /* Text and read-only data */ - .text : { - *(.text.zimageboot) /* zImage boot header & code - must come first */ - - *(.text) - *(.gnu.warning) - } :text = 0x9090 - - _etext = .; /* End of text section */ - - /* Read-only data */ - _rodata = .; - .rodata : - { - *(.rodata) - *(.rodata.*) - } :rodata - . = ALIGN(__PAGE_SIZE); - _erodata = .; - - EXCEPTION_SECTIONS - - CTORTAB_SECTION - - INITTAB_SECTION - - EVENTTAB_SECTION - - . = ALIGN(0x8); - _ctors = .; - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } - - . = ALIGN(0x8); - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } - . = ALIGN(__PAGE_SIZE); - _ectors = .; - - TLS_SECTIONS - - DATA_SECTIONS - - _end = .; - - /* Sections to be discarded */ - /* TODO: Revisit when we have a solution for discarded sections - /DISCARD/ : { - *(.text.exit) - *(.data.exit) - *(.exitcall.exit) - } - */ - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - - DEBUG_SYMBOLS - - DISCARDS -} diff --git a/plat/xen/arm/setup.c b/plat/xen/arm/setup.c deleted file mode 100644 index 56a28138e483e7fdc871bf9fd2174f3dd7cb701d..0000000000000000000000000000000000000000 --- a/plat/xen/arm/setup.c +++ /dev/null @@ -1,228 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - * - */ -/* Ported from Mini-OS */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Shared page for communicating with the hypervisor. - * Events flags go here, for example. - */ -shared_info_t *HYPERVISOR_shared_info; - -/* - * Device tree - */ -void *HYPERVISOR_dtb; - -/* - * Physical address offset - */ -uint32_t _libxenplat_paddr_offset; - -/* - * Memory region description - */ -#define UKPLAT_MEMRD_MAX_ENTRIES 7 -unsigned int _libxenplat_mrd_num; -struct ukplat_memregion_desc _libxenplat_mrd[UKPLAT_MEMRD_MAX_ENTRIES]; - -/* - * Command line handling - */ -#define MAX_CMDLINE_SIZE 1024 -static char cmdline[MAX_CMDLINE_SIZE]; - - -static inline void _init_dtb(void *dtb_pointer) -{ - int ret; - - if ((ret = fdt_check_header(dtb_pointer))) - UK_CRASH("Invalid DTB: %s\n", fdt_strerror(ret)); - HYPERVISOR_dtb = dtb_pointer; -} - -static inline void _dtb_get_cmdline(char *cmdline, size_t maxlen) -{ - int fdtchosen, len; - const char *fdtcmdline; - - /* TODO: Proper error handling */ - fdtchosen = fdt_path_offset(HYPERVISOR_dtb, "/chosen"); - if (!fdtchosen) - goto enocmdl; - fdtcmdline = fdt_getprop(HYPERVISOR_dtb, fdtchosen, "bootargs", &len); - if (!fdtcmdline || (len <= 0)) - goto enocmdl; - - strncpy(cmdline, fdtcmdline, MIN(maxlen, (unsigned int) len)); - /* ensure null termination */ - cmdline[((unsigned int) len - 1) <= (maxlen - 1) ? - ((unsigned int) len - 1) : (maxlen - 1)] = '\0'; - - return; - -enocmdl: - uk_pr_info("No command line found\n"); - strcpy(cmdline, CONFIG_UK_NAME); -} - -static inline void _dtb_init_mem(uint32_t physical_offset) -{ - int memory; - int prop_len = 0; - const uint64_t *regs; - uintptr_t end; - uint64_t mem_base; - uint64_t mem_size; - uint64_t heap_len; - size_t fdt_size; - void *new_dtb; - paddr_t start_pfn_p; - paddr_t max_pfn_p; - - /* init physical address offset gathered by entry32.S */ - _libxenplat_paddr_offset = physical_offset; - - /* search for assigned VM memory in DTB */ - if (fdt_num_mem_rsv(HYPERVISOR_dtb) != 0) - uk_pr_warn("Reserved memory is not supported\n"); - - memory = fdt_node_offset_by_prop_value(HYPERVISOR_dtb, -1, - "device_type", - "memory", sizeof("memory")); - if (memory < 0) { - uk_pr_warn("No memory found in DTB\n"); - return; - } - - /* Xen will always provide us at least one bank of memory. - * unikraft will use the first bank for the time-being. - */ - regs = fdt_getprop(HYPERVISOR_dtb, memory, "reg", &prop_len); - /* The property must contain at least the start address - * and size, each of which is 8-bytes. - */ - if (regs == NULL && prop_len < 16) - UK_CRASH("Bad 'reg' property: %p %d\n", regs, prop_len); - - end = (uintptr_t) __END; - mem_base = fdt64_to_cpu(regs[0]); - mem_size = fdt64_to_cpu(regs[1]); - if (to_virt(mem_base) > (void *)__TEXT) - UK_CRASH("Fatal: Image outside of RAM\n"); - - start_pfn_p = PFN_UP(to_phys(end)); - heap_len = mem_size - (PFN_PHYS(start_pfn_p) - mem_base); - max_pfn_p = start_pfn_p + PFN_DOWN(heap_len); - uk_pr_info(" heap start: %p\n", - to_virt(start_pfn_p << __PAGE_SHIFT)); - - /* The device tree is probably in memory that we're about to hand over - * to the page allocator, so move it to the end and reserve that space. - */ - fdt_size = fdt_totalsize(HYPERVISOR_dtb); - new_dtb = to_virt(((max_pfn_p << __PAGE_SHIFT) - fdt_size) - & __PAGE_MASK); - if (new_dtb != HYPERVISOR_dtb) - memmove(new_dtb, HYPERVISOR_dtb, fdt_size); - HYPERVISOR_dtb = new_dtb; - max_pfn_p = to_phys(new_dtb) >> __PAGE_SHIFT; - - /* Fill out mrd array - */ - /* heap */ - _libxenplat_mrd[0].pbase = start_pfn_p << __PAGE_SHIFT; - _libxenplat_mrd[0].vbase = (__vaddr_t)to_virt(_libxenplat_mrd[0].pbase); - _libxenplat_mrd[0].len = (max_pfn_p - start_pfn_p) << __PAGE_SHIFT; - _libxenplat_mrd[0].type = UKPLAT_MEMRT_FREE; - _libxenplat_mrd[0].flags = 0; -#if CONFIG_UKPLAT_MEMRNAME - strncpy(_libxenplat_mrd[0].name, "heap", - sizeof(_libxenplat_mrd[0].name) - 1); -#endif - /* dtb */ - _libxenplat_mrd[1].pbase = (__vaddr_t)HYPERVISOR_dtb; - _libxenplat_mrd[1].vbase = _libxenplat_mrd[1].pbase; - _libxenplat_mrd[1].len = fdt_size; - _libxenplat_mrd[1].type = UKPLAT_MEMRT_DEVICETREE; - _libxenplat_mrd[1].flags = UKPLAT_MEMRF_READ | UKPLAT_MEMRF_MAP; -#if CONFIG_UKPLAT_MEMRNAME - strncpy(_libxenplat_mrd[1].name, "dtb", - sizeof(_libxenplat_mrd[1].name) - 1); -#endif - _libxenplat_mrd_num = 2; -} - -void _libxenplat_armentry(void *dtb_pointer, - uint32_t physical_offset) __noreturn; - -void _libxenplat_armentry(void *dtb_pointer, uint32_t physical_offset) -{ - uk_pr_info("Entering from Xen (arm)...\n"); - - /* Zero'ing out the bss section */ - /* - * TODO: It probably makes sense to move this to the early - * platform entry assembly code. - */ - memset(__bss_start, 0, _end - __bss_start); - - _init_dtb(dtb_pointer); - _dtb_init_mem(physical_offset); /* relocates dtb */ - uk_pr_info(" dtb: %p\n", HYPERVISOR_dtb); - - /* Set up events. */ - //init_events(); - - /* ENABLE EVENT DELIVERY. This is disabled at start of day. */ - // TODO // - - _dtb_get_cmdline(cmdline, sizeof(cmdline)); - - ukplat_entry_argp(CONFIG_UK_NAME, cmdline, sizeof(cmdline)); -} - -void _libxenplat_armpanic(int *saved_regs) __noreturn; - -void _libxenplat_armpanic(int *saved_regs __unused) -{ - /* TODO: dump registers */ - ukplat_crash(); -} diff --git a/plat/xen/arm/traps.c b/plat/xen/arm/traps.c deleted file mode 100644 index 43953511104dac84c09c731a35907c39f08ee171..0000000000000000000000000000000000000000 --- a/plat/xen/arm/traps.c +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/****************************************************************************** - * panic.c - * - * Displays a register dump and stack trace for debugging. - * - * Copyright (c) 2014, Thomas Leonard - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include -#include -#include - -extern int irqstack[]; -extern int irqstack_end[]; - -typedef void handler(void); - -extern handler fault_reset; -extern handler fault_undefined_instruction; -extern handler fault_svc; -extern handler fault_prefetch_call; -extern handler fault_prefetch_abort; -extern handler fault_data_abort; - -void dump_registers(int *saved_registers __unused) -{ - /* TODO: Point to ukarch_dump_registers */ -} diff --git a/plat/xen/console.c b/plat/xen/console.c deleted file mode 100644 index 74ebb7941cfdbebdfcb9d79296d191a60bc6b819..0000000000000000000000000000000000000000 --- a/plat/xen/console.c +++ /dev/null @@ -1,97 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause and MIT */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include - -#define __XEN_CONSOLE_IMPL__ -#include "hv_console.h" -#include "emg_console.h" - -/* - * Return the "best case" of the two return codes ret and ret2. - */ -static inline int returncode(int ret, int ret2) -{ - if (ret < 0) - return (ret2 != -ENOTSUP) ? ret2 : ret; - return MAX((ret), (ret2)); -} - -void prepare_console(void) -{ - hv_console_prepare(); -} - -void flush_console(void) -{ - hv_console_flush(); -} - -void init_console(void) -{ - hv_console_init(); -} - -int ukplat_coutd(const char *str, unsigned int len) -{ - int ret, ret2; - - if (unlikely(len == 0)) - len = strnlen(str, len); - - ret = emg_console_output_d(str, len); - ret2 = hv_console_output_d(str, len); - return returncode(ret, ret2); -} - -int ukplat_coutk(const char *str, unsigned int len) -{ - int ret, ret2; - - if (unlikely(len == 0)) - len = strnlen(str, len); - - ret = emg_console_output_k(str, len); - ret2 = hv_console_output_k(str, len); - return returncode(ret, ret2); -} - -int ukplat_cink(char *str __maybe_unused, unsigned int maxlen __maybe_unused) -{ - return hv_console_input(str, maxlen); -} diff --git a/plat/xen/drivers/9p/9pfront.c b/plat/xen/drivers/9p/9pfront.c deleted file mode 100644 index 8f76ffb240f8f081830efeb943e2e635c633f299..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/9p/9pfront.c +++ /dev/null @@ -1,522 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Cristian Banu - * - * Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include -#include -#include -#if CONFIG_LIBUKSCHED -#include -#endif -#include -#include -#include -#include -#include -#include -#include - -#include "9pfront_xb.h" - -#define DRIVER_NAME "xen-9pfront" - -static struct uk_alloc *a; -static UK_LIST_HEAD(p9front_device_list); -static __spinlock p9front_device_list_lock; - -struct p9front_header { - uint32_t size; - uint8_t type; - uint16_t tag; -} __packed; - -static void p9front_recv(struct p9front_dev_ring *ring); - -#if CONFIG_LIBUKSCHED - -static __noreturn void p9front_bh_handler(void *arg) -{ - struct p9front_dev_ring *ring = arg; - - while (1) { - uk_waitq_wait_event(&ring->bh_wq, - UK_READ_ONCE(ring->data_avail)); - p9front_recv(ring); - } -} - -#endif - -static void p9front_recv(struct p9front_dev_ring *ring) -{ - struct p9front_dev *p9fdev = ring->dev; - evtchn_port_t evtchn = ring->evtchn; - RING_IDX cons, prod, masked_cons, masked_prod; - int ring_size, rc; - struct p9front_header hdr; - struct uk_9preq *req; - uint32_t buf_cnt, zc_buf_cnt; - - ring_size = XEN_FLEX_RING_SIZE(p9fdev->ring_order); - - while (1) { - cons = ring->intf->in_cons; - prod = ring->intf->in_prod; - xen_rmb(); - - if (xen_9pfs_queued(prod, cons, ring_size) < sizeof(hdr)) { -#if CONFIG_LIBUKSCHED - UK_WRITE_ONCE(ring->data_avail, false); -#endif - notify_remote_via_evtchn(evtchn); - return; - } - - masked_prod = xen_9pfs_mask(prod, ring_size); - masked_cons = xen_9pfs_mask(cons, ring_size); - - xen_9pfs_read_packet(&hdr, ring->data.in, sizeof(hdr), - masked_prod, &masked_cons, ring_size); - - req = uk_9pdev_req_lookup(p9fdev->p9dev, hdr.tag); - if (PTRISERR(req)) { - uk_pr_warn("Found invalid tag=%u\n", hdr.tag); - cons += hdr.size; - xen_mb(); - ring->intf->in_cons = cons; - continue; - } - - masked_cons = xen_9pfs_mask(cons, ring_size); - - /* - * Compute amount of data to read into request buffer and into - * zero-copy buffer. - */ - buf_cnt = hdr.size; - if (hdr.type != UK_9P_RERROR && req->recv.zc_buf) - buf_cnt = MIN(buf_cnt, req->recv.zc_offset); - zc_buf_cnt = hdr.size - buf_cnt; - - xen_9pfs_read_packet(req->recv.buf, ring->data.in, buf_cnt, - masked_prod, &masked_cons, ring_size); - xen_9pfs_read_packet(req->recv.zc_buf, ring->data.in, - zc_buf_cnt, masked_prod, &masked_cons, - ring_size); - cons += hdr.size; - xen_mb(); - ring->intf->in_cons = cons; - - rc = uk_9preq_receive_cb(req, hdr.size); - if (rc) - uk_pr_warn("Could not receive reply: %d\n", rc); - - /* Release reference held by uk_9pdev_req_lookup(). */ - uk_9preq_put(req); - } -} - -static void p9front_handler(evtchn_port_t evtchn, - struct __regs *regs __unused, - void *arg) -{ - struct p9front_dev_ring *ring = arg; - - UK_ASSERT(ring); - UK_ASSERT(ring->evtchn == evtchn); - - /* - * A new interrupt means that there is a response to be received, which - * means that a previously sent request has been removed from the out - * ring. Thus, the API can be notified of the possibility of retrying to - * send requests blocked on ENOSPC errors. - */ - if (ring->dev->p9dev) - uk_9pdev_xmit_notify(ring->dev->p9dev); -#if CONFIG_LIBUKSCHED - UK_WRITE_ONCE(ring->data_avail, true); - uk_waitq_wake_up(&ring->bh_wq); -#else - p9front_recv(ring); -#endif -} - -static void p9front_free_dev_ring(struct p9front_dev *p9fdev, int idx) -{ - struct p9front_dev_ring *ring = &p9fdev->rings[idx]; - int i; - - UK_ASSERT(ring->initialized); - - if (ring->bh_thread_name) - free(ring->bh_thread_name); - uk_sched_thread_terminate(ring->bh_thread); - unbind_evtchn(ring->evtchn); - for (i = 0; i < (1 << p9fdev->ring_order); i++) - gnttab_end_access(ring->intf->ref[i]); - uk_pfree(a, ring->data.in, - 1ul << (p9fdev->ring_order + XEN_PAGE_SHIFT - PAGE_SHIFT)); - gnttab_end_access(ring->ref); - uk_pfree(a, ring->intf, 1); - ring->initialized = false; -} - -static void p9front_free_dev_rings(struct p9front_dev *p9fdev) -{ - int i; - - for (i = 0; i < p9fdev->nb_rings; i++) { - if (!p9fdev->rings[i].initialized) - continue; - p9front_free_dev_ring(p9fdev, i); - } - - uk_free(a, p9fdev->rings); -} - -static int p9front_allocate_dev_ring(struct p9front_dev *p9fdev, int idx) -{ - struct xenbus_device *xendev = p9fdev->xendev; - struct p9front_dev_ring *ring; - int rc, i; - void *data_bytes; - - /* Sanity checks. */ - UK_ASSERT(idx >= 0 && idx < p9fdev->nb_rings); - - ring = &p9fdev->rings[idx]; - UK_ASSERT(!ring->initialized); - - ukarch_spin_init(&ring->spinlock); - ring->dev = p9fdev; - - /* Allocate ring intf page. */ - ring->intf = uk_palloc(a, 1); - if (!ring->intf) { - rc = -ENOMEM; - goto out; - } - memset(ring->intf, 0, PAGE_SIZE); - - /* Grant access to the allocated page to the backend. */ - ring->ref = gnttab_grant_access(xendev->otherend_id, - virt_to_mfn(ring->intf), 0); - UK_ASSERT(ring->ref != GRANT_INVALID_REF); - - /* Allocate memory for the data. */ - data_bytes = uk_palloc(a, 1ul << (p9fdev->ring_order + - XEN_PAGE_SHIFT - PAGE_SHIFT)); - if (!data_bytes) { - rc = -ENOMEM; - goto out_free_intf; - } - memset(data_bytes, 0, XEN_FLEX_RING_SIZE(p9fdev->ring_order) * 2); - - /* Grant refs to the entire data. */ - for (i = 0; i < (1 << p9fdev->ring_order); i++) { - ring->intf->ref[i] = gnttab_grant_access(xendev->otherend_id, - virt_to_mfn(data_bytes) + i, 0); - UK_ASSERT(ring->intf->ref[i] != GRANT_INVALID_REF); - } - - ring->intf->ring_order = p9fdev->ring_order; - ring->data.in = data_bytes; - ring->data.out = data_bytes + XEN_FLEX_RING_SIZE(p9fdev->ring_order); - -#if CONFIG_LIBUKSCHED - /* Allocate bottom-half thread. */ - ring->data_avail = false; - uk_waitq_init(&ring->bh_wq); - - rc = asprintf(&ring->bh_thread_name, DRIVER_NAME"-recv-%s-%u", - p9fdev->tag, idx); - ring->bh_thread = uk_sched_thread_create(uk_sched_current(), - p9front_bh_handler, ring, - ring->bh_thread_name); - if (PTRISERR(ring->bh_thread)) { - rc = PTR2ERR(ring->bh_thread); - ring->bh_thread = NULL; - goto out_free_grants; - } -#endif - - /* Allocate event channel. */ - rc = evtchn_alloc_unbound(xendev->otherend_id, p9front_handler, ring, - &ring->evtchn); - if (rc) { - uk_pr_err(DRIVER_NAME": Error creating evt channel: %d\n", rc); - goto out_free_thread; - } - - unmask_evtchn(ring->evtchn); - - /* Mark ring as initialized. */ - ring->initialized = true; - - return 0; - -out_free_thread: - if (ring->bh_thread_name) - free(ring->bh_thread_name); - uk_sched_thread_terminate(ring->bh_thread); -out_free_grants: - for (i = 0; i < (1 << p9fdev->ring_order); i++) - gnttab_end_access(ring->intf->ref[i]); - uk_pfree(a, data_bytes, - 1ul << (p9fdev->ring_order + XEN_PAGE_SHIFT - PAGE_SHIFT)); -out_free_intf: - gnttab_end_access(ring->ref); - uk_pfree(a, ring->intf, 1); -out: - return rc; -} - -static int p9front_allocate_dev_rings(struct p9front_dev *p9fdev) -{ - int rc, i; - - p9fdev->rings = uk_calloc(a, p9fdev->nb_rings, sizeof(*p9fdev->rings)); - if (!p9fdev->rings) { - rc = -ENOMEM; - goto out; - } - - for (i = 0; i < p9fdev->nb_rings; i++) { - rc = p9front_allocate_dev_ring(p9fdev, i); - if (rc) - goto out_free; - } - - return 0; - -out_free: - p9front_free_dev_rings(p9fdev); -out: - return rc; -} - -static int p9front_connect(struct uk_9pdev *p9dev, - const char *device_identifier, - const char *mount_args __unused) -{ - struct p9front_dev *p9fdev = NULL; - int rc = 0; - int found = 0; - - ukarch_spin_lock(&p9front_device_list_lock); - uk_list_for_each_entry(p9fdev, &p9front_device_list, _list) { - if (!strcmp(p9fdev->tag, device_identifier)) { - if (p9fdev->p9dev != NULL) { - rc = -EBUSY; - goto out; - } - found = 1; - break; - } - } - - if (!found) { - rc = -ENODEV; - goto out; - } - - /* The msize is given by the size of the flex ring. */ - p9dev->max_msize = XEN_FLEX_RING_SIZE(p9fdev->ring_order); - - p9fdev->p9dev = p9dev; - p9dev->priv = p9fdev; - rc = 0; - found = 1; - -out: - ukarch_spin_unlock(&p9front_device_list_lock); - return rc; -} - -static int p9front_disconnect(struct uk_9pdev *p9dev __unused) -{ - struct p9front_dev *p9fdev; - - UK_ASSERT(p9dev); - p9fdev = p9dev->priv; - - ukarch_spin_lock(&p9front_device_list_lock); - p9fdev->p9dev = NULL; - ukarch_spin_unlock(&p9front_device_list_lock); - - return 0; -} - -static int p9front_request(struct uk_9pdev *p9dev, - struct uk_9preq *req) -{ - struct p9front_dev *p9fdev; - struct p9front_dev_ring *ring; - int ring_idx, ring_size; - RING_IDX masked_prod, masked_cons, prod, cons; - - UK_ASSERT(p9dev); - UK_ASSERT(req); - UK_ASSERT(req->state == UK_9PREQ_READY); - - p9fdev = p9dev->priv; - - ring_size = XEN_FLEX_RING_SIZE(p9fdev->ring_order); - - ring_idx = req->tag % p9fdev->nb_rings; - ring = &p9fdev->rings[ring_idx]; - - /* Protect against concurrent writes to the out ring. */ - ukarch_spin_lock(&ring->spinlock); - cons = ring->intf->out_cons; - prod = ring->intf->out_prod; - xen_mb(); - - masked_prod = xen_9pfs_mask(prod, ring_size); - masked_cons = xen_9pfs_mask(cons, ring_size); - - if (ring_size - xen_9pfs_queued(prod, cons, ring_size) < - req->xmit.size + req->xmit.zc_size) { - ukarch_spin_unlock(&ring->spinlock); - return -ENOSPC; - } - - xen_9pfs_write_packet(ring->data.out, req->xmit.buf, req->xmit.size, - &masked_prod, masked_cons, ring_size); - xen_9pfs_write_packet(ring->data.out, req->xmit.zc_buf, req->xmit.zc_size, - &masked_prod, masked_cons, ring_size); - req->state = UK_9PREQ_SENT; - xen_wmb(); - prod += req->xmit.size + req->xmit.zc_size; - ring->intf->out_prod = prod; - - ukarch_spin_unlock(&ring->spinlock); - notify_remote_via_evtchn(ring->evtchn); - - return 0; -} - -static const struct uk_9pdev_trans_ops p9front_trans_ops = { - .connect = p9front_connect, - .disconnect = p9front_disconnect, - .request = p9front_request -}; - -static struct uk_9pdev_trans p9front_trans = { - .name = "xen", - .ops = &p9front_trans_ops, - .a = NULL /* Set below. */ -}; - - -static int p9front_drv_init(struct uk_alloc *drv_allocator) -{ - if (!drv_allocator) - return -EINVAL; - - a = drv_allocator; - p9front_trans.a = a; - - return uk_9pdev_trans_register(&p9front_trans); -} - -static int p9front_add_dev(struct xenbus_device *xendev) -{ - struct p9front_dev *p9fdev; - int rc; - - p9fdev = uk_calloc(a, 1, sizeof(*p9fdev)); - if (!p9fdev) { - rc = -ENOMEM; - goto out; - } - - p9fdev->xendev = xendev; - rc = p9front_xb_init(p9fdev); - if (rc) - goto out_free; - - uk_pr_info("Initialized 9pfront dev: tag=%s,maxrings=%d,maxorder=%d\n", - p9fdev->tag, p9fdev->nb_max_rings, p9fdev->max_ring_page_order); - - p9fdev->nb_rings = MIN(CONFIG_XEN_9PFRONT_NB_RINGS, - p9fdev->nb_max_rings); - p9fdev->ring_order = MIN(CONFIG_XEN_9PFRONT_RING_ORDER, - p9fdev->max_ring_page_order); - - rc = p9front_allocate_dev_rings(p9fdev); - if (rc) { - uk_pr_err(DRIVER_NAME": Could not initialize device rings: %d\n", - rc); - goto out_free; - } - - rc = p9front_xb_connect(p9fdev); - if (rc) { - uk_pr_err(DRIVER_NAME": Could not connect: %d\n", rc); - goto out_free_rings; - } - - rc = 0; - ukarch_spin_lock(&p9front_device_list_lock); - uk_list_add(&p9fdev->_list, &p9front_device_list); - ukarch_spin_unlock(&p9front_device_list_lock); - - uk_pr_info(DRIVER_NAME": Connected 9pfront dev: tag=%s,rings=%d,order=%d\n", - p9fdev->tag, p9fdev->nb_rings, p9fdev->ring_order); - - goto out; - -out_free_rings: - p9front_free_dev_rings(p9fdev); -out_free: - uk_free(a, p9fdev); -out: - return rc; -} - -static const xenbus_dev_type_t p9front_devtypes[] = { - xenbus_dev_9pfs, -}; - -static struct xenbus_driver p9front_driver = { - .device_types = p9front_devtypes, - .init = p9front_drv_init, - .add_dev = p9front_add_dev -}; - -XENBUS_REGISTER_DRIVER(&p9front_driver); diff --git a/plat/xen/drivers/9p/9pfront.h b/plat/xen/drivers/9p/9pfront.h deleted file mode 100644 index 77be134002cdd386196d714cbc033f1a105a8316..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/9p/9pfront.h +++ /dev/null @@ -1,96 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Cristian Banu - * - * Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __9PFRONT_H__ -#define __9PFRONT_H__ - -#include -#include -#include -#include -#include -#if CONFIG_LIBUKSCHED -#include -#endif -#include -#include -#include - -struct p9front_dev_ring { - /* Backpointer to the p9front device. */ - struct p9front_dev *dev; - /* The 9pfs data interface, as dedfined by the xen headers. */ - struct xen_9pfs_data_intf *intf; - /* The 9pfs data, as defined by the xen headers. */ - struct xen_9pfs_data data; - /* The event channel for this ring. */ - evtchn_port_t evtchn; - /* Grant reference for the interface. */ - grant_ref_t ref; - /* Per-ring spinlock. */ - __spinlock spinlock; - /* Tracks if this ring was initialized. */ - bool initialized; -#if CONFIG_LIBUKSCHED - /* Tracks if there is any data available on this ring. */ - bool data_avail; - /* Bottom-half thread. */ - struct uk_thread *bh_thread; - /* Bottom-half thread name. */ - char *bh_thread_name; - /* Wait-queue on which the thread waits for available data. */ - struct uk_waitq bh_wq; -#endif -}; - -struct p9front_dev { - /* Xenbus device. */ - struct xenbus_device *xendev; - /* 9P API device. */ - struct uk_9pdev *p9dev; - /* Entry within the 9pfront device list. */ - struct uk_list_head _list; - /* Number of maximum rings, read from xenstore. */ - int nb_max_rings; - /* Maximum ring page order, read from xenstore. */ - int max_ring_page_order; - /* Mount tag for this device, read from xenstore. */ - char *tag; - /* Number of rings to use. */ - int nb_rings; - /* Ring page order. */ - int ring_order; - /* Device data rings. */ - struct p9front_dev_ring *rings; -}; - -#endif /* __9PFRONT_H__ */ diff --git a/plat/xen/drivers/9p/9pfront_xb.h b/plat/xen/drivers/9p/9pfront_xb.h deleted file mode 100644 index bfa094fb840d663075880ef1ddab8099e2d0b418..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/9p/9pfront_xb.h +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Cristian Banu - * - * Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __9PFRONT_XB_H__ -#define __9PFRONT_XB_H__ - -#include "9pfront.h" - -/** - * Reads device information from the xenstore, such as the mount tag - * and details about the device rings. - * - * @param p9fdev - * 9P frontend device - * @return - * - (0): Successful. - * - (-EINVAL): Invalid data. - * - (< 0): Error while reading. - */ -int p9front_xb_init(struct p9front_dev *p9fdev); - -/** - * Connects to the backend by setting up the communication between - * frontend and backend. - * - * @param p9fdev - * 9P frontend device - * @return - * - (0): Successful. - * - (< 0): Error while committing XenStore transaction. - */ -int p9front_xb_connect(struct p9front_dev *p9fdev); - -#endif /* __9PFRONT_XB_H__ */ diff --git a/plat/xen/drivers/9p/9pfront_xs.c b/plat/xen/drivers/9p/9pfront_xs.c deleted file mode 100644 index b78e672119b60225e4b35c400c815ff59b801576..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/9p/9pfront_xs.c +++ /dev/null @@ -1,358 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Cristian Banu - * - * Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include "9pfront_xb.h" - -static int xs_read_backend_info(struct xenbus_device *xendev) -{ - int rc, val; - char path[strlen(xendev->nodename) + sizeof("/backend-id")]; - - /* Read backend id. */ - sprintf(path, "%s/backend-id", xendev->nodename); - rc = xs_read_integer(XBT_NIL, path, &val); - if (rc) - goto out; - xendev->otherend_id = (domid_t)val; - - /* Read backend path. */ - xendev->otherend = xs_read(XBT_NIL, xendev->nodename, "backend"); - if (PTRISERR(xendev->otherend)) { - rc = PTR2ERR(xendev->otherend); - xendev->otherend = NULL; - } - -out: - return rc; -} - -static int xs_read_backend_ring_info(struct xenbus_device *xendev, - int *nb_max_rings, - int *max_ring_page_order) -{ - int rc; - char *int_str; - - /* Read max-rings. */ - int_str = xs_read(XBT_NIL, xendev->otherend, "max-rings"); - if (PTRISERR(int_str)) { - rc = PTR2ERR(int_str); - uk_pr_err("Error: %d\n", rc); - goto out; - } - - *nb_max_rings = strtol(int_str, NULL, 10); - free(int_str); - - /* Read max-ring-page-order. */ - int_str = xs_read(XBT_NIL, xendev->otherend, "max-ring-page-order"); - if (PTRISERR(int_str)) { - rc = PTR2ERR(int_str); - uk_pr_err("Error: %d\n", rc); - goto out; - } - - *max_ring_page_order = strtol(int_str, NULL, 10); - free(int_str); - rc = 0; - -out: - return rc; -} - -int p9front_xb_init(struct p9front_dev *p9fdev) -{ - struct xenbus_device *xendev; - char *versions; - int rc; - - UK_ASSERT(p9fdev != NULL); - - xendev = p9fdev->xendev; - UK_ASSERT(xendev != NULL); - - /* Read backend node and backend id. */ - rc = xs_read_backend_info(xendev); - if (rc) { - uk_pr_err("Error initializing backend node and id.\n"); - goto out; - } - - /* Check versions string. */ - versions = xs_read(XBT_NIL, xendev->otherend, "versions"); - if (PTRISERR(versions)) { - uk_pr_err("Error reading backend version information.\n"); - rc = PTR2ERR(versions); - goto out; - } - - if (strcmp(versions, "1")) { - uk_pr_err("Backend does not support xen protocol version 1.\n"); - free(versions); - rc = -EINVAL; - goto out; - } - free(versions); - - /* Read ring information. */ - rc = xs_read_backend_ring_info(xendev, &p9fdev->nb_max_rings, - &p9fdev->max_ring_page_order); - if (rc) { - uk_pr_err("Error reading backend ring information.\n"); - goto out; - } - - /* Read tag. */ - p9fdev->tag = xs_read(XBT_NIL, xendev->nodename, "tag"); - if (PTRISERR(p9fdev->tag)) { - uk_pr_err("Error reading 9pfs mount tag.\n"); - rc = PTR2ERR(p9fdev->tag); - p9fdev->tag = NULL; - } - -out: - return rc; -} - -static int xs_write_ring(struct p9front_dev *p9fdev, - int i, - xenbus_transaction_t xbt) -{ - struct xenbus_device *xendev = p9fdev->xendev; - struct p9front_dev_ring *ring = &p9fdev->rings[i]; - char *path; - int rc; - - rc = asprintf(&path, "ring-ref%u", i); - if (rc < 0) - goto out; - - rc = xs_printf(xbt, xendev->nodename, path, "%u", ring->ref); - if (rc < 0) - goto out_path; - - free(path); - rc = asprintf(&path, "event-channel-%u", i); - if (rc < 0) - goto out; - - rc = xs_printf(xbt, xendev->nodename, path, "%u", ring->evtchn); - if (rc < 0) - goto out_path; - - rc = 0; - -out_path: - free(path); -out: - return rc; -} - -static void xs_delete_ring(struct p9front_dev *p9fdev, - int i, - xenbus_transaction_t xbt) -{ - struct xenbus_device *xendev = p9fdev->xendev; - int rc; - char *path; - - rc = asprintf(&path, "%s/ring-ref%u", xendev->nodename, i); - if (rc < 0) - return; - xs_rm(xbt, path); - free(path); - - rc = asprintf(&path, "%s/event-channel-%u", xendev->nodename, i); - if (rc < 0) - return; - xs_rm(xbt, path); - free(path); -} - -static int p9front_xb_front_init(struct p9front_dev *p9fdev, - xenbus_transaction_t xbt) -{ - int i, rc; - struct xenbus_device *xendev = p9fdev->xendev; - - /* - * Assert that the p9fdev ring information has been properly - * configured before attempting to connect. - */ - UK_ASSERT(p9fdev->nb_rings != 0 && p9fdev->nb_rings <= 9); - UK_ASSERT(p9fdev->ring_order != 0); - - /* - * Assert that the p9fdev rings have been initialized. - */ - UK_ASSERT(p9fdev->rings != NULL); - - /* Write version... */ - rc = xs_printf(xbt, xendev->nodename, "version", "%u", 1); - if (rc < 0) - goto out; - - /* ... and num-rings... */ - rc = xs_printf(xbt, xendev->nodename, "num-rings", "%u", - p9fdev->nb_rings); - if (rc < 0) - goto out; - - /* ... and each ring. */ - for (i = 0; i < p9fdev->nb_rings; i++) { - rc = xs_write_ring(p9fdev, i, xbt); - if (rc) - goto out; - } - -out: - return rc; -} - -static void p9front_xb_front_fini(struct p9front_dev *p9fdev, - xenbus_transaction_t xbt) -{ - int i; - - for (i = 0; i < p9fdev->nb_rings; i++) - xs_delete_ring(p9fdev, i, xbt); -} - -static int be_watch_start(struct xenbus_device *xendev, const char *path) -{ - struct xenbus_watch *watch; - - watch = xs_watch_path(XBT_NIL, path); - if (PTRISERR(watch)) - return PTR2ERR(watch); - - xendev->otherend_watch = watch; - - return 0; -} - -static int be_watch_stop(struct xenbus_device *xendev) -{ - return xs_unwatch(XBT_NIL, xendev->otherend_watch); -} - -#define WAIT_BE_STATE_CHANGE_WHILE_COND(state_cond) \ - do { \ - rc = xs_read_integer(XBT_NIL, be_state_path, \ - (int *) &be_state); \ - if (rc) \ - goto out; \ - while (!rc && (state_cond)) \ - rc = xenbus_wait_for_state_change(be_state_path, \ - &be_state, xendev->otherend_watch); \ - if (rc) \ - goto out; \ - } while (0) - -static int p9front_xb_wait_be_connect(struct p9front_dev *p9fdev) -{ - struct xenbus_device *xendev = p9fdev->xendev; - char be_state_path[strlen(xendev->otherend) + sizeof("/state")]; - XenbusState be_state; - int rc; - - sprintf(be_state_path, "%s/state", xendev->otherend); - - rc = be_watch_start(xendev, be_state_path); - if (rc) - goto out; - - WAIT_BE_STATE_CHANGE_WHILE_COND(be_state < XenbusStateConnected); - - if (be_state != XenbusStateConnected) { - uk_pr_err("Backend not available, state=%s\n", - xenbus_state_to_str(be_state)); - be_watch_stop(xendev); - goto out; - } - - rc = xenbus_switch_state(XBT_NIL, xendev, XenbusStateConnected); - if (rc) - goto out; - -out: - return rc; -} - -int p9front_xb_connect(struct p9front_dev *p9fdev) -{ - struct xenbus_device *xendev; - xenbus_transaction_t xbt; - int rc; - - UK_ASSERT(p9fdev != NULL); - - xendev = p9fdev->xendev; - UK_ASSERT(xendev != NULL); - -again: - rc = xs_transaction_start(&xbt); - if (rc) - goto abort_transaction; - - rc = p9front_xb_front_init(p9fdev, xbt); - if (rc) - goto abort_transaction; - - rc = xenbus_switch_state(xbt, xendev, XenbusStateInitialised); - if (rc) - goto abort_transaction; - - rc = xs_transaction_end(xbt, 0); - if (rc == -EAGAIN) - goto again; - - rc = p9front_xb_wait_be_connect(p9fdev); - if (rc) - p9front_xb_front_fini(p9fdev, XBT_NIL); - - return rc; - -abort_transaction: - xs_transaction_end(xbt, 1); - return rc; -} diff --git a/plat/xen/drivers/9p/exportsyms.uk b/plat/xen/drivers/9p/exportsyms.uk deleted file mode 100644 index 621e94f0ec951431443029088dba63eb586edbc8..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/9p/exportsyms.uk +++ /dev/null @@ -1 +0,0 @@ -none diff --git a/plat/xen/drivers/blk/blkfront.c b/plat/xen/drivers/blk/blkfront.c deleted file mode 100644 index 5585268388cebca29e008632098c0831416dd09b..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/blk/blkfront.c +++ /dev/null @@ -1,966 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Roxana Nicolescu - * - * Copyright (c) 2019, University Politehnica of Bucharest. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "blkfront.h" -#include "blkfront_xb.h" - -#define DRIVER_NAME "xen-blkfront" - -#define SECTOR_INDEX_IN_PAGE(a, sector_size) \ - (((a) & ~PAGE_MASK) / (sector_size)) - -/* TODO Same interrupt macros we use in virtio-blk */ -#define BLKFRONT_INTR_EN (1 << 0) -#define BLKFRONT_INTR_EN_MASK (1) -#define BLKFRONT_INTR_USR_EN (1 << 1) -#define BLKFRONT_INTR_USR_EN_MASK (2) - -/* Get blkfront_dev* which contains blkdev */ -#define to_blkfront(blkdev) \ - __containerof(blkdev, struct blkfront_dev, blkdev) - -static struct uk_alloc *drv_allocator; - -/* This function gets from pool gref_elems or allocates new ones - */ -static int blkfront_request_set_grefs(struct blkfront_request *blkfront_req) -{ - struct blkfront_gref *ref_elem; - uint16_t nb_segments; - int grefi = 0, grefj; - int err = 0; - -#if CONFIG_XEN_BLKFRONT_GREFPOOL - struct uk_blkdev_queue *queue; - struct blkfront_grefs_pool *grefs_pool; - int rc = 0; -#endif - - UK_ASSERT(blkfront_req != NULL); - nb_segments = blkfront_req->nb_segments; - -#if CONFIG_XEN_BLKFRONT_GREFPOOL - queue = blkfront_req->queue; - grefs_pool = &queue->ref_pool; - uk_semaphore_down(&grefs_pool->sem); - for (grefi = 0; grefi < nb_segments && - !UK_STAILQ_EMPTY(&grefs_pool->grefs_list); ++grefi) { - ref_elem = UK_STAILQ_FIRST(&grefs_pool->grefs_list); - UK_STAILQ_REMOVE_HEAD(&grefs_pool->grefs_list, _list); - blkfront_req->gref[grefi] = ref_elem; - } - - uk_semaphore_up(&grefs_pool->sem); -#endif - /* we allocate new ones */ - for (; grefi < nb_segments; ++grefi) { - ref_elem = uk_malloc(drv_allocator, sizeof(*ref_elem)); - if (!ref_elem) { - err = -ENOMEM; - goto err; - } - -#if CONFIG_XEN_BLKFRONT_GREFPOOL - ref_elem->reusable_gref = false; -#endif - blkfront_req->gref[grefi] = ref_elem; - } - -out: - return err; -err: - /* Free all the elements from 0 index to where the error happens */ - for (grefj = 0; grefj < grefi; ++grefj) { - ref_elem = blkfront_req->gref[grefj]; -#if CONFIG_XEN_BLKFRONT_GREFPOOL - if (ref_elem->reusable_gref) { - rc = gnttab_end_access(ref_elem->ref); - UK_ASSERT(rc); - } -#endif - uk_free(drv_allocator, ref_elem); - } - goto out; -} - -/* First gref_elems from blkfront_request were popped from the pool. - * All this elements has the reusable_gref flag set. - * We continue transferring elements from blkfront_request to the pool - * of grant_refs until we encounter an element with the reusable flag unset. - **/ -static void blkfront_request_reset_grefs(struct blkfront_request *req) -{ - uint16_t gref_id = 0; - struct blkfront_gref *gref_elem; - uint16_t nb_segments; - int rc; -#if CONFIG_XEN_BLKFRONT_GREFPOOL - struct uk_blkdev_queue *queue; - struct blkfront_grefs_pool *grefs_pool; -#endif - - UK_ASSERT(req); - nb_segments = req->nb_segments; - -#if CONFIG_XEN_BLKFRONT_GREFPOOL - queue = req->queue; - grefs_pool = &queue->ref_pool; - uk_semaphore_down(&grefs_pool->sem); - for (; gref_id < nb_segments; ++gref_id) { - gref_elem = req->gref[gref_id]; - if (!gref_elem->reusable_gref) - break; - - UK_STAILQ_INSERT_TAIL(&grefs_pool->grefs_list, - gref_elem, - _list); - } - - uk_semaphore_up(&grefs_pool->sem); -#endif - for (; gref_id < nb_segments; ++gref_id) { - gref_elem = req->gref[gref_id]; - if (gref_elem->ref != GRANT_INVALID_REF) { - rc = gnttab_end_access(gref_elem->ref); - UK_ASSERT(rc); - } - - uk_free(drv_allocator, gref_elem); - } -} - -/* This function sets the grant references from pool to point to - * data set at request. - * Otherwise, new blkfront_gref elems are allocated and new grant refs - * as well. - **/ -static void blkfront_request_map_grefs(struct blkif_request *ring_req, - domid_t otherend_id) -{ - uint16_t gref_index; - struct blkfront_request *blkfront_req; - struct uk_blkreq *req; - uint16_t nb_segments; - uintptr_t data; - uintptr_t start_sector; - struct blkfront_gref *ref_elem; -#if CONFIG_XEN_BLKFRONT_GREFPOOL - int rc; -#endif - - UK_ASSERT(ring_req); - - blkfront_req = (struct blkfront_request *)ring_req->id; - req = blkfront_req->req; - start_sector = round_pgdown((uintptr_t)req->aio_buf); - nb_segments = blkfront_req->nb_segments; - - for (gref_index = 0; gref_index < nb_segments; ++gref_index) { - data = start_sector + gref_index * PAGE_SIZE; - ref_elem = blkfront_req->gref[gref_index]; - -#if CONFIG_XEN_BLKFRONT_GREFPOOL - if (ref_elem->reusable_gref) { - rc = gnttab_update_grant(ref_elem->ref, otherend_id, - virtual_to_mfn(data), ring_req->operation); - UK_ASSERT(rc); - } else -#endif - ref_elem->ref = gnttab_grant_access(otherend_id, - virtual_to_mfn(data), ring_req->operation); - - UK_ASSERT(ref_elem->ref != GRANT_INVALID_REF); - ring_req->seg[gref_index].gref = ref_elem->ref; - } -} - -static void blkif_request_init(struct blkif_request *ring_req, - __sector sector_size) -{ - uintptr_t start_sector, end_sector; - uint16_t nb_segments; - struct blkfront_request *blkfront_req; - struct uk_blkreq *req; - uintptr_t start_data, end_data; - uint16_t seg; - - UK_ASSERT(ring_req); - blkfront_req = (struct blkfront_request *)ring_req->id; - req = blkfront_req->req; - start_data = (uintptr_t)req->aio_buf; - end_data = (uintptr_t)req->aio_buf + req->nb_sectors * sector_size; - - /* Can't io non-sector-aligned buffer */ - UK_ASSERT(!(start_data & (sector_size - 1))); - - /* - * Find number of segments (pages) - * Being sector-size aligned buffer, it may not be aligned - * to page_size. If so, it is necessary to find the start and end - * of the pages the buffer is allocated, in order to calculate the - * number of pages the request has. - **/ - start_sector = round_pgdown(start_data); - end_sector = round_pgup(end_data); - nb_segments = (end_sector - start_sector) / PAGE_SIZE; - UK_ASSERT(nb_segments <= BLKIF_MAX_SEGMENTS_PER_REQUEST); - - /* Set ring request */ - ring_req->operation = (req->operation == UK_BLKREQ_WRITE) ? - BLKIF_OP_WRITE : BLKIF_OP_READ; - ring_req->nr_segments = nb_segments; - ring_req->sector_number = req->start_sector; - - /* Set for each page the offset of sectors used for request */ - for (seg = 0; seg < nb_segments; ++seg) { - ring_req->seg[seg].first_sect = 0; - ring_req->seg[seg].last_sect = PAGE_SIZE / sector_size - 1; - } - - ring_req->seg[0].first_sect = - SECTOR_INDEX_IN_PAGE(start_data, sector_size); - ring_req->seg[nb_segments - 1].last_sect = - SECTOR_INDEX_IN_PAGE(end_data - 1, sector_size); -} - -static int blkfront_request_write(struct blkfront_request *blkfront_req, - struct blkif_request *ring_req) -{ - struct blkfront_dev *dev; - struct uk_blkreq *req; - struct uk_blkdev_cap *cap; - __sector sector_size; - int rc = 0; - - UK_ASSERT(blkfront_req); - req = blkfront_req->req; - dev = blkfront_req->queue->dev; - cap = &dev->blkdev.capabilities; - sector_size = cap->ssize; - if (req->operation == UK_BLKREQ_WRITE && cap->mode == O_RDONLY) - return -EPERM; - - if (req->aio_buf == NULL) - return -EINVAL; - - if (req->nb_sectors == 0) - return -EINVAL; - - if (req->start_sector + req->nb_sectors > cap->sectors) - return -EINVAL; - - if (req->nb_sectors > cap->max_sectors_per_req) - return -EINVAL; - - blkif_request_init(ring_req, sector_size); - blkfront_req->nb_segments = ring_req->nr_segments; - - /* Get blkfront_grefs from pool or allocate new ones */ - rc = blkfront_request_set_grefs(blkfront_req); - if (rc) - goto out; - - /* Map grant references to ring_req */ - blkfront_request_map_grefs(ring_req, dev->xendev->otherend_id); - -out: - return rc; -} - -static int blkfront_request_flush(struct blkfront_request *blkfront_req, - struct blkif_request *ring_req) -{ - struct blkfront_dev *dev; - struct uk_blkdev_queue *queue; - - UK_ASSERT(ring_req); - - queue = blkfront_req->queue; - dev = queue->dev; - if (dev->barrier) - ring_req->operation = BLKIF_OP_WRITE_BARRIER; - else if (dev->flush) - ring_req->operation = BLKIF_OP_FLUSH_DISKCACHE; - else - return -ENOTSUP; - - ring_req->nr_segments = 0; - ring_req->sector_number = 0; - - return 0; -} - -static int blkfront_queue_enqueue(struct uk_blkdev_queue *queue, - struct uk_blkreq *req) -{ - struct blkfront_request *blkfront_req; - struct blkfront_dev *dev; - RING_IDX ring_idx; - struct blkif_request *ring_req; - struct blkif_front_ring *ring; - int rc = 0; - - UK_ASSERT(queue); - UK_ASSERT(req); - - blkfront_req = uk_malloc(drv_allocator, sizeof(*blkfront_req)); - if (!blkfront_req) - return -ENOMEM; - - blkfront_req->req = req; - blkfront_req->queue = queue; - dev = queue->dev; - ring = &queue->ring; - ring_idx = ring->req_prod_pvt; - ring_req = RING_GET_REQUEST(ring, ring_idx); - ring_req->id = (uintptr_t) blkfront_req; - ring_req->handle = dev->handle; - - if (req->operation == UK_BLKREQ_READ || - req->operation == UK_BLKREQ_WRITE) - rc = blkfront_request_write(blkfront_req, ring_req); - else if (req->operation == UK_BLKREQ_FFLUSH) - rc = blkfront_request_flush(blkfront_req, ring_req); - else - rc = -EINVAL; - - if (rc) - goto err_out; - - ring->req_prod_pvt = ring_idx + 1; - - /* Memory barrier */ - wmb(); -out: - return rc; - -err_out: - uk_free(drv_allocator, blkfront_req); - goto out; -} - -static int blkfront_submit_request(struct uk_blkdev *blkdev, - struct uk_blkdev_queue *queue, - struct uk_blkreq *req) -{ - int err = 0; - int notify; - int status = 0x0; - - UK_ASSERT(blkdev != NULL); - UK_ASSERT(req != NULL); - UK_ASSERT(queue != NULL); - - if (RING_FULL(&queue->ring)) { - uk_pr_err("Queue %p is full\n", queue); - return -EBUSY; - } - - err = blkfront_queue_enqueue(queue, req); - if (err) { - uk_pr_err("Failed to set ring req for %d op: %d\n", - req->operation, err); - return err; - } - - status |= UK_BLKDEV_STATUS_SUCCESS; - RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&queue->ring, notify); - if (notify) { - err = notify_remote_via_evtchn(queue->evtchn); - if (err) - return err; - } - - status |= (!RING_FULL(&queue->ring)) ? UK_BLKDEV_STATUS_MORE : 0x0; - return status; -} - -/* Returns 1 if more responses available */ -static int blkfront_xen_ring_intr_enable(struct uk_blkdev_queue *queue) -{ - int more; - - /* Check if there are no more responses enabled */ - RING_FINAL_CHECK_FOR_RESPONSES(&queue->ring, more); - if (!more) { - /* No more responses, we can enable interrupts */ - queue->intr_enabled |= BLKFRONT_INTR_EN; - unmask_evtchn(queue->evtchn); - } - - return (more > 0); -} - -#define CHECK_STATUS(req, status, operation) \ - do { \ - if (status != BLKIF_RSP_OKAY) \ - uk_pr_err("Failed to "operation" %lu sector: %d\n", \ - req->start_sector, \ - status); \ - else \ - uk_pr_debug("Succeed to "operation " %lu sector: %d\n",\ - req->start_sector, \ - status); \ - } while (0) - -static int blkfront_queue_dequeue(struct uk_blkdev_queue *queue, - struct uk_blkreq **req) -{ - RING_IDX prod, cons; - struct blkif_response *rsp; - struct uk_blkreq *req_from_q = NULL; - struct blkfront_request *blkfront_req; - struct blkif_front_ring *ring; - uint8_t status; - int rc = 0; - - UK_ASSERT(queue); - UK_ASSERT(req); - - ring = &queue->ring; - prod = ring->sring->rsp_prod; - rmb(); /* Ensure we see queued responses up to 'rp'. */ - cons = ring->rsp_cons; - - /* No new descriptor since last dequeue operation */ - if (cons == prod) - goto out; - - rsp = RING_GET_RESPONSE(ring, cons); - blkfront_req = (struct blkfront_request *) rsp->id; - UK_ASSERT(blkfront_req); - req_from_q = blkfront_req->req; - UK_ASSERT(req_from_q); - status = rsp->status; - switch (rsp->operation) { - case BLKIF_OP_READ: - CHECK_STATUS(req_from_q, status, "read"); - blkfront_request_reset_grefs(blkfront_req); - break; - case BLKIF_OP_WRITE: - CHECK_STATUS(req_from_q, status, "write"); - blkfront_request_reset_grefs(blkfront_req); - break; - case BLKIF_OP_WRITE_BARRIER: - if (status != BLKIF_RSP_OKAY) - uk_pr_err("Write barrier error %d\n", status); - break; - case BLKIF_OP_FLUSH_DISKCACHE: - if (status != BLKIF_RSP_OKAY) - uk_pr_err("Flush_diskcache error %d\n", status); - break; - default: - uk_pr_err("Unrecognized block operation %d (rsp %d)\n", - rsp->operation, status); - break; - } - - req_from_q->result = -status; - uk_free(drv_allocator, blkfront_req); - ring->rsp_cons++; - -out: - *req = req_from_q; - return rc; -} - -static int blkfront_complete_reqs(struct uk_blkdev *blkdev, - struct uk_blkdev_queue *queue) -{ - struct uk_blkreq *req; - int rc; - int more; - - UK_ASSERT(blkdev); - UK_ASSERT(queue); - - /* Queue interrupts have to be off when calling receive */ - UK_ASSERT(!(queue->intr_enabled & BLKFRONT_INTR_EN)); -moretodo: - for (;;) { - rc = blkfront_queue_dequeue(queue, &req); - if (rc < 0) { - uk_pr_err("Failed to dequeue the request: %d\n", rc); - goto err_exit; - } - - if (!req) - break; - - uk_blkreq_finished(req); - if (req->cb) - req->cb(req, req->cb_cookie); - } - - /* Enable interrupt only when user had previously enabled it */ - if (queue->intr_enabled & BLKFRONT_INTR_USR_EN_MASK) { - /* Need to enable the interrupt on the last packet */ - rc = blkfront_xen_ring_intr_enable(queue); - if (rc == 1) - goto moretodo; - } else { - RING_FINAL_CHECK_FOR_RESPONSES(&queue->ring, more); - if (more) - goto moretodo; - } - - return 0; - -err_exit: - return rc; - -} - -static int blkfront_ring_init(struct uk_blkdev_queue *queue) -{ - struct blkif_sring *sring = NULL; - struct blkfront_dev *dev; - - UK_ASSERT(queue); - dev = queue->dev; - sring = uk_palloc(queue->a, BLK_RING_PAGES_NUM); - if (!sring) - return -ENOMEM; - - memset(sring, 0, PAGE_SIZE); - SHARED_RING_INIT(sring); - FRONT_RING_INIT(&queue->ring, sring, PAGE_SIZE); - - queue->ring_ref = gnttab_grant_access(dev->xendev->otherend_id, - virt_to_mfn(sring), 0); - UK_ASSERT(queue->ring_ref != GRANT_INVALID_REF); - - return 0; -} - -static void blkfront_ring_fini(struct uk_blkdev_queue *queue) -{ - int rc; - - if (queue->ring_ref != GRANT_INVALID_REF) { - rc = gnttab_end_access(queue->ring_ref); - UK_ASSERT(rc); - } - - if (queue->ring.sring != NULL) - uk_pfree(queue->a, queue->ring.sring, BLK_RING_PAGES_NUM); -} - -#if CONFIG_XEN_BLKFRONT_GREFPOOL -static void blkfront_queue_gref_pool_release(struct uk_blkdev_queue *queue) -{ - struct blkfront_grefs_pool *grefs_pool; - struct blkfront_gref *ref_elem; - int rc; - - UK_ASSERT(queue); - grefs_pool = &queue->ref_pool; - - while (!UK_STAILQ_EMPTY(&grefs_pool->grefs_list)) { - ref_elem = UK_STAILQ_FIRST(&grefs_pool->grefs_list); - if (ref_elem->ref != GRANT_INVALID_REF) { - rc = gnttab_end_access(ref_elem->ref); - UK_ASSERT(rc); - } - - uk_free(queue->a, ref_elem); - UK_STAILQ_REMOVE_HEAD(&grefs_pool->grefs_list, _list); - } -} - -static int blkfront_queue_gref_pool_setup(struct uk_blkdev_queue *queue) -{ - int ref_idx; - struct blkfront_gref *gref_elem; - struct blkfront_dev *dev; - int rc = 0; - - UK_ASSERT(queue); - dev = queue->dev; - uk_semaphore_init(&queue->ref_pool.sem, 1); - UK_STAILQ_INIT(&queue->ref_pool.grefs_list); - - for (ref_idx = 0; ref_idx < BLKIF_MAX_SEGMENTS_PER_REQUEST; ++ref_idx) { - gref_elem = uk_malloc(queue->a, sizeof(*gref_elem)); - if (!gref_elem) { - rc = -ENOMEM; - goto err; - } - - gref_elem->ref = gnttab_grant_access(dev->xendev->otherend_id, - 0, 1); - UK_ASSERT(gref_elem->ref != GRANT_INVALID_REF); - gref_elem->reusable_gref = true; - UK_STAILQ_INSERT_TAIL(&queue->ref_pool.grefs_list, gref_elem, - _list); - } - -out: - return rc; -err: - blkfront_queue_gref_pool_release(queue); - goto out; -} -#endif - -/* Handler for event channel notifications */ -static void blkfront_handler(evtchn_port_t port __unused, - struct __regs *regs __unused, void *arg) -{ - struct uk_blkdev_queue *queue; - - UK_ASSERT(arg); - queue = (struct uk_blkdev_queue *)arg; - - /* Disable the interrupt for the ring */ - queue->intr_enabled &= ~(BLKFRONT_INTR_EN); - mask_evtchn(queue->evtchn); - - uk_blkdev_drv_queue_event(&queue->dev->blkdev, queue->queue_id); -} - -static struct uk_blkdev_queue *blkfront_queue_setup(struct uk_blkdev *blkdev, - uint16_t queue_id, - uint16_t nb_desc __unused, - const struct uk_blkdev_queue_conf *queue_conf) -{ - struct blkfront_dev *dev; - struct uk_blkdev_queue *queue; - int err = 0; - - UK_ASSERT(blkdev != NULL); - - dev = to_blkfront(blkdev); - if (queue_id >= dev->nb_queues) { - uk_pr_err("Invalid queue identifier: %"__PRIu16"\n", queue_id); - return ERR2PTR(-EINVAL); - } - - queue = &dev->queues[queue_id]; - queue->a = queue_conf->a; - queue->queue_id = queue_id; - queue->dev = dev; - queue->intr_enabled = 0; - err = blkfront_ring_init(queue); - if (err) { - uk_pr_err("Failed to init ring: %d.\n", err); - return ERR2PTR(err); - } - - err = evtchn_alloc_unbound(dev->xendev->otherend_id, - blkfront_handler, queue, - &queue->evtchn); - if (err) { - uk_pr_err("Failed to create event-channel: %d.\n", err); - err *= -1; - goto err_out; - } - -#if CONFIG_XEN_BLKFRONT_GREFPOOL - err = blkfront_queue_gref_pool_setup(queue); - if (err) - goto err_out; -#endif - - return queue; - -err_out: - blkfront_ring_fini(queue); - return ERR2PTR(err); -} - -static int blkfront_queue_release(struct uk_blkdev *blkdev, - struct uk_blkdev_queue *queue) -{ - UK_ASSERT(blkdev != NULL); - UK_ASSERT(queue != NULL); - - mask_evtchn(queue->evtchn); - unbind_evtchn(queue->evtchn); - blkfront_ring_fini(queue); - -#if CONFIG_XEN_BLKFRONT_GREFPOOL - blkfront_queue_gref_pool_release(queue); -#endif - - return 0; -} - -static int blkfront_queue_intr_enable(struct uk_blkdev *blkdev, - struct uk_blkdev_queue *queue) -{ - int rc = 0; - - UK_ASSERT(blkdev != NULL); - UK_ASSERT(queue != NULL); - - /* If the interrupt is enabled */ - if (queue->intr_enabled & BLKFRONT_INTR_EN) - return 0; - - /** - * Enable the user configuration bit. This would cause the interrupt to - * be enabled automatically if the interrupt could not be enabled now - * due to data in the queue. - */ - queue->intr_enabled = BLKFRONT_INTR_USR_EN; - rc = blkfront_xen_ring_intr_enable(queue); - if (!rc) - queue->intr_enabled |= BLKFRONT_INTR_EN; - - return rc; -} - -static int blkfront_queue_intr_disable(struct uk_blkdev *blkdev, - struct uk_blkdev_queue *queue) -{ - UK_ASSERT(blkdev); - UK_ASSERT(queue); - - queue->intr_enabled &= ~(BLKFRONT_INTR_USR_EN | BLKFRONT_INTR_EN); - mask_evtchn(queue->evtchn); - - return 0; -} - -static int blkfront_queue_get_info(struct uk_blkdev *blkdev, - uint16_t queue_id, - struct uk_blkdev_queue_info *qinfo) -{ - struct blkfront_dev *dev; - - UK_ASSERT(blkdev); - UK_ASSERT(qinfo); - - dev = to_blkfront(blkdev); - if (queue_id >= dev->nb_queues) { - uk_pr_err("Invalid queue identifier: %"__PRIu16"\n", queue_id); - return -EINVAL; - } - - qinfo->nb_is_power_of_two = 1; - - return 0; -} - -static int blkfront_configure(struct uk_blkdev *blkdev, - const struct uk_blkdev_conf *conf) -{ - struct blkfront_dev *dev; - int err = 0; - - UK_ASSERT(blkdev != NULL); - UK_ASSERT(conf != NULL); - - dev = to_blkfront(blkdev); - dev->nb_queues = conf->nb_queues; - dev->queues = uk_calloc(drv_allocator, dev->nb_queues, - sizeof(*dev->queues)); - if (!dev->queues) - return -ENOMEM; - - err = blkfront_xb_write_nb_queues(dev); - if (err) { - uk_pr_err("Failed to write nb of queues: %d.\n", err); - goto out_err; - } - - uk_pr_info(DRIVER_NAME": %"PRIu16" configured\n", dev->uid); -out: - return err; -out_err: - uk_free(drv_allocator, dev->queues); - goto out; -} - -static int blkfront_start(struct uk_blkdev *blkdev) -{ - struct blkfront_dev *dev; - int err = 0; - - UK_ASSERT(blkdev != NULL); - dev = to_blkfront(blkdev); - err = blkfront_xb_connect(dev); - if (err) { - uk_pr_err("Failed to connect to backend: %d.\n", err); - return err; - } - - uk_pr_info(DRIVER_NAME": %"PRIu16" started\n", dev->uid); - - return err; -} - -/* If one queue has unconsumed responses it returns -EBUSY */ -static int blkfront_stop(struct uk_blkdev *blkdev) -{ - struct blkfront_dev *dev; - uint16_t q_id; - int err; - - UK_ASSERT(blkdev != NULL); - dev = to_blkfront(blkdev); - for (q_id = 0; q_id < dev->nb_queues; ++q_id) { - if (RING_HAS_UNCONSUMED_RESPONSES(&dev->queues[q_id].ring)) { - uk_pr_err("Queue:%"PRIu16" has unconsumed responses\n", - q_id); - return -EBUSY; - } - } - - err = blkfront_xb_disconnect(dev); - if (err) { - uk_pr_err( - "Failed to disconnect: %d.\n", err); - return err; - } - - uk_pr_info(DRIVER_NAME": %"PRIu16" stopped\n", dev->uid); - - return err; -} - -static int blkfront_unconfigure(struct uk_blkdev *blkdev) -{ - struct blkfront_dev *dev; - - UK_ASSERT(blkdev != NULL); - dev = to_blkfront(blkdev); - uk_free(drv_allocator, dev->queues); - - return 0; -} - -static void blkfront_get_info(struct uk_blkdev *blkdev, - struct uk_blkdev_info *dev_info) -{ - struct blkfront_dev *dev = NULL; - - UK_ASSERT(blkdev); - UK_ASSERT(dev_info); - - dev = to_blkfront(blkdev); - dev_info->max_queues = dev->nb_queues; -} - -static const struct uk_blkdev_ops blkfront_ops = { - .get_info = blkfront_get_info, - .dev_configure = blkfront_configure, - .queue_get_info = blkfront_queue_get_info, - .queue_configure = blkfront_queue_setup, - .queue_unconfigure = blkfront_queue_release, - .dev_start = blkfront_start, - .dev_stop = blkfront_stop, - .dev_unconfigure = blkfront_unconfigure, - .queue_intr_enable = blkfront_queue_intr_enable, - .queue_intr_disable = blkfront_queue_intr_disable, -}; - -/** - * Assign callbacks to uk_blkdev - */ -static int blkfront_add_dev(struct xenbus_device *dev) -{ - struct blkfront_dev *d = NULL; - int rc = 0; - - UK_ASSERT(dev != NULL); - - d = uk_calloc(drv_allocator, 1, sizeof(struct blkfront_dev)); - if (!d) - return -ENOMEM; - - d->xendev = dev; - d->blkdev.submit_one = blkfront_submit_request; - d->blkdev.finish_reqs = blkfront_complete_reqs; - d->blkdev.dev_ops = &blkfront_ops; - - /* Xenbus initialization */ - rc = blkfront_xb_init(d); - if (rc) { - uk_pr_err("Error initializing Xenbus data: %d\n", rc); - goto err_xenbus; - } - - rc = uk_blkdev_drv_register(&d->blkdev, drv_allocator, "blkdev"); - if (rc < 0) { - uk_pr_err("Failed to register blkfront with libukblkdev %d", - rc); - goto err_register; - } - - d->uid = rc; - uk_pr_info("Blkfront device registered with libukblkdev: %d\n", rc); - rc = 0; -out: - return rc; -err_register: - blkfront_xb_fini(d); -err_xenbus: - uk_free(drv_allocator, d); - goto out; -} - -static int blkfront_drv_init(struct uk_alloc *allocator) -{ - /* driver initialization */ - if (!allocator) - return -EINVAL; - - drv_allocator = allocator; - return 0; -} - -static const xenbus_dev_type_t blkfront_devtypes[] = { - xenbus_dev_vbd, -}; - -static struct xenbus_driver blkfront_driver = { - .device_types = blkfront_devtypes, - .init = blkfront_drv_init, - .add_dev = blkfront_add_dev -}; - -XENBUS_REGISTER_DRIVER(&blkfront_driver); diff --git a/plat/xen/drivers/blk/blkfront.h b/plat/xen/drivers/blk/blkfront.h deleted file mode 100644 index 97f2c68e04088d6af22aeaa3a0d5cb3b624ffdc8..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/blk/blkfront.h +++ /dev/null @@ -1,153 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Roxana Nicolescu - * - * Copyright (c) 2019, University Politehnica of Bucharest. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __BLKFRONT_H__ -#define __BLKFRONT_H__ - -/** - * Unikraft Blockfront interface. - * - * This header contains all the information needed by the block device driver - * implementation. - */ -#include -#if CONFIG_XEN_BLKFRONT_GREFPOOL -#include -#include -#include -#endif - -#include -#include -#include - -#define BLK_RING_PAGES_NUM 1 - -#if CONFIG_XEN_BLKFRONT_GREFPOOL -/** - * Structure used to describe a list of blkfront_gref elements. - */ -UK_STAILQ_HEAD(blkfront_gref_list, struct blkfront_gref); - -/* - * Structure used to describe a pool of grant refs for each queue. - * It contains max BLKIF_MAX_SEGMENTS_PER_REQUEST elems. - **/ -struct blkfront_grefs_pool { - /* List of grefs. */ - struct blkfront_gref_list grefs_list; - /* Semaphore for synchronization. */ - struct uk_semaphore sem; -}; -#endif - -/** - * Structure used to describe a grant ref element. - */ -struct blkfront_gref { - /* Grant ref number. */ - grant_ref_t ref; -#if CONFIG_XEN_BLKFRONT_GREFPOOL - /* Entry for pool. */ - UK_STAILQ_ENTRY(struct blkfront_gref) _list; - /* It is True if it was pulled from the pool. - * Otherwise this structure was allocated during the request. - **/ - bool reusable_gref; -#endif -}; - -/** - * Structure used to describe a front device request. - */ -struct blkfront_request { - /* Request from the API. */ - struct uk_blkreq *req; - /* List with maximum number of blkfront_grefs for a request. */ - struct blkfront_gref *gref[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - /* Number of segments. */ - uint16_t nb_segments; - /* Queue in which the request will be stored */ - struct uk_blkdev_queue *queue; -}; - -/* - * Structure used to describe a queue used for both requests and responses - */ -struct uk_blkdev_queue { - /* Front_ring structure */ - struct blkif_front_ring ring; - /* Grant ref pointing at the front ring. */ - grant_ref_t ring_ref; - /* Event channel for the front ring. */ - evtchn_port_t evtchn; - /* Allocator for this queue. */ - struct uk_alloc *a; - /* The libukblkdev queue identifier */ - uint16_t queue_id; - /* The flag to interrupt on the queue */ - int intr_enabled; - /* Reference to the Blkfront Device */ - struct blkfront_dev *dev; -#if CONFIG_XEN_BLKFRONT_GREFPOOL - /* Grant refs pool. */ - struct blkfront_grefs_pool ref_pool; -#endif -}; - -/** - * Structure used to describe the Blkfront device. - */ -struct blkfront_dev { - /* Xenbus Device. */ - struct xenbus_device *xendev; - /* Blkdev Device. */ - struct uk_blkdev blkdev; - /* Blkfront device number from Xenstore path. */ - blkif_vdev_t handle; - /* Value which indicates that the backend can process requests with the - * BLKIF_OP_WRITE_BARRIER request opcode. - */ - int barrier; - /* Value which indicates that the backend can process requests with the - * BLKIF_OP_WRITE_FLUSH_DISKCACHE request opcode. - */ - int flush; - /* Number of configured queues used for requests */ - uint16_t nb_queues; - /* Vector of queues used for communication with backend */ - struct uk_blkdev_queue *queues; - /* The blkdev identifier */ - __u16 uid; -}; - -#endif /* __BLKFRONT_H__ */ diff --git a/plat/xen/drivers/blk/blkfront_xb.h b/plat/xen/drivers/blk/blkfront_xb.h deleted file mode 100644 index a4b14acd68fd2d8e33c6059bee6a8bbc45ddad75..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/blk/blkfront_xb.h +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Roxana Nicolescu - * - * Copyright (c) 2019, University Politehnica of Bucharest. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __BLKFRONT_XB_H__ -#define __BLKFRONT_XB_H__ - -/** - * Blkfront interface for xenstore operations. - * - * This header contains all the functions needed by the blkfront driver - * in order to access Xenstore data. - */ - -#include "blkfront.h" - -/* - * Get initial info from the xenstore. - * Ex: backend path, handle, max-queues. - * - * Return 0 on success, a negative errno value on error. - */ -int blkfront_xb_init(struct blkfront_dev *dev); - -/* - * It deallocates the xendev structure members allocated during initialization. - */ -void blkfront_xb_fini(struct blkfront_dev *dev); - -/** - * Write nb of queues for further use to Xenstore. - * Return 0 on success, a negative errno value on error. - */ -int blkfront_xb_write_nb_queues(struct blkfront_dev *dev); - -/** - * Write ring entries to Xenstore. - * Device changes its state to Connected. - * It waits until the backend is connected. - * - * Return 0 on success, a negative errno value on error. - */ -int blkfront_xb_connect(struct blkfront_dev *dev); - -/** - * Reinitialize the connection with the backend. - * The following states are: - * Connected -> Closing -> Closed -> Initializing. - * Delete ring entries - * - * Return 0 on success, a negative errno value on error. - */ -int blkfront_xb_disconnect(struct blkfront_dev *dev); - -#endif /* __BLKFRONT_XB_H__ */ diff --git a/plat/xen/drivers/blk/blkfront_xs.c b/plat/xen/drivers/blk/blkfront_xs.c deleted file mode 100644 index 767ef2b762a7e64b347abfb297ab22c6f4dd58c2..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/blk/blkfront_xs.c +++ /dev/null @@ -1,562 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Roxana Nicolescu - * - * Copyright (c) 2019, University Politehnica of Bucharest. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -#define _GNU_SOURCE /* for asprintf() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "blkfront_xb.h" - -static int xs_read_backend_id(const char *nodename, domid_t *domid) -{ - char *path = NULL; - int value, err; - - UK_ASSERT(nodename != NULL); - - err = asprintf(&path, "%s/backend-id", nodename); - if (err <= 0) { - uk_pr_err("Failed to allocate and format path: %d.\n", err); - goto out; - } - - err = xs_read_integer(XBT_NIL, path, &value); - if (err == 0) - *domid = (domid_t) value; - -out: - free(path); - return err; -} - -static int blkfront_xb_get_nb_max_queues(struct blkfront_dev *dev) -{ - int err = 0; - struct xenbus_device *xendev; - - UK_ASSERT(dev != NULL); - xendev = dev->xendev; - - err = xs_scanf(XBT_NIL, xendev->otherend, "multi-queue-max-queues", - "%"SCNu16, - &dev->nb_queues); - if (err < 0) { - uk_pr_err("Failed to read multi-queue-max-queues: %d\n", err); - return err; - } - - return 0; -} - -int blkfront_xb_init(struct blkfront_dev *dev) -{ - struct xenbus_device *xendev; - char *nodename; - int err = 0; - - UK_ASSERT(dev != NULL); - xendev = dev->xendev; - - err = xs_read_backend_id(xendev->nodename, &xendev->otherend_id); - if (err) - goto out; - - /* Get handle */ - nodename = strrchr(xendev->nodename, '/'); - if (!nodename) { - err = -EINVAL; - goto out; - } - - dev->handle = strtoul(nodename + 1, NULL, 0); - if (!dev->handle) { - err = -EINVAL; - goto out; - } - - /* Read otherend path */ - xendev->otherend = xs_read(XBT_NIL, xendev->nodename, "backend"); - if (PTRISERR(xendev->otherend)) { - uk_pr_err("Failed to read backend path: %d.\n", err); - err = PTR2ERR(xendev->otherend); - xendev->otherend = NULL; - goto out; - } - - err = blkfront_xb_get_nb_max_queues(dev); - if (err) { - uk_pr_err("Failed to read multi-queue-max-queues: %d\n", err); - goto out; - } -out: - return err; -} - -void blkfront_xb_fini(struct blkfront_dev *dev) -{ - struct xenbus_device *xendev; - - UK_ASSERT(dev != NULL); - - xendev = dev->xendev; - if (xendev->otherend) { - free(xendev->otherend); - xendev->otherend = NULL; - } -} - -int blkfront_xb_write_nb_queues(struct blkfront_dev *dev) -{ - int err; - struct xenbus_device *xendev; - - UK_ASSERT(dev); - - xendev = dev->xendev; - err = xs_printf(XBT_NIL, xendev->nodename, - "multi-queue-num-queues", - "%u", - dev->nb_queues); - if (err < 0) { - uk_pr_err("Failed to write multi-queue-num-queue: %d\n", err); - goto out; - } - - err = 0; - -out: - return err; -} - -/* - * Get device capabilities (sector_size, etc) - * from the backend after it switched to Connected State. - */ -static int blkfront_xb_get_capabilities(struct blkfront_dev *blkdev) -{ - struct xenbus_device *xendev; - char *mode; - int err = 0; - - UK_ASSERT(blkdev != NULL); - xendev = blkdev->xendev; - err = xs_scanf(XBT_NIL, xendev->otherend, "sectors", - "%lu", &blkdev->blkdev.capabilities.sectors); - if (err < 0) { - uk_pr_err("Failed to read nb_sectors from xs: %d\n", err); - return err; - } - - err = xs_scanf(XBT_NIL, xendev->otherend, "sector-size", - "%lu", &blkdev->blkdev.capabilities.ssize); - if (err < 0) { - uk_pr_err("Failed to read ssize from xs: %d\n", err); - return err; - } - - err = xs_scanf(XBT_NIL, xendev->otherend, "feature-flush-cache", - "%d", &blkdev->flush); - if (err < 0) { - uk_pr_err("Failed to read feature-flush-cache from xs: %d\n", - err); - return err; - } - - err = xs_scanf(XBT_NIL, xendev->otherend, "feature-barrier", - "%d", &blkdev->barrier); - if (err < 0) { - uk_pr_err("Failed to read feature-barrier from xs: %d\n", err); - return err; - } - - mode = xs_read(XBT_NIL, xendev->otherend, "mode"); - if (PTRISERR(mode)) { - uk_pr_err("Failed to read mode from xs: %d.\n", err); - return PTR2ERR(mode); - } - - blkdev->blkdev.capabilities.mode = (*mode == 'r') ? O_RDONLY : O_RDWR; - blkdev->blkdev.capabilities.max_sectors_per_req = - (BLKIF_MAX_SEGMENTS_PER_REQUEST - 1) * - (PAGE_SIZE / blkdev->blkdev.capabilities.ssize) + 1; - blkdev->blkdev.capabilities.ioalign = blkdev->blkdev.capabilities.ssize; - - free(mode); - return 0; -} - -/* Write info for a specific queue in xenstore. - * If there is only one queue, the path does not - * include queue-. - **/ -static int blkfront_xb_write_ring_info(struct blkfront_dev *dev, - uint16_t queue_id, - xenbus_transaction_t xbt) -{ - struct xenbus_device *xendev; - char *node_ring_ref = NULL; - char *node_evtchn = NULL; - int err = 0; - - UK_ASSERT(dev != NULL); - xendev = dev->xendev; - - if (queue_id == 0 && dev->nb_queues == 1) { - err = asprintf(&node_ring_ref, "ring-ref"); - if (err <= 0) { - uk_pr_err("Failed to format ring_ref path: %d\n", err); - goto out; - } - - err = asprintf(&node_evtchn, "event-channel"); - if (err <= 0) { - uk_pr_err("Failed to format event-channel path: %d\n", - err); - goto out; - } - } else { - err = asprintf(&node_ring_ref, "queue-%"PRIu16"/ring-ref", - queue_id); - if (err <= 0) { - uk_pr_err("Failed to format ring_ref path: %d\n", err); - goto out; - } - - err = asprintf(&node_evtchn, "queue-%"PRIu16"/event-channel", - queue_id); - if (err <= 0) { - uk_pr_err("Failed to format event-channel path: %d\n", - err); - goto out; - } - } - - err = xs_printf(xbt, xendev->nodename, - node_evtchn, - "%u", - dev->blkdev._queue[queue_id]->evtchn); - if (err <= 0) { - uk_pr_err("Failed to write event-channel: %d\n", err); - goto out; - } - - err = xs_printf(xbt, xendev->nodename, - node_ring_ref, - "%u", - dev->blkdev._queue[queue_id]->ring_ref); - if (err <= 0) { - uk_pr_err("Failed to write ring_ref: %d\n", err); - goto out; - } - - err = 0; - -out: - free(node_evtchn); - free(node_ring_ref); - return err; -} - -/* Delete ring entry */ -static int blkfront_xb_delete_ring_info(struct blkfront_dev *dev, - uint16_t queue_id) -{ - struct xenbus_device *xendev; - char *node_ring_ref = NULL; - char *node_evtchn = NULL; - int err = 0; - - UK_ASSERT(dev); - xendev = dev->xendev; - - if (queue_id == 0 && dev->nb_queues == 1) { - err = asprintf(&node_ring_ref, "%s/ring-ref", - xendev->nodename); - if (err <= 0) { - uk_pr_err("Failed to format ring_ref_path: %d\n", err); - goto out; - } - - err = asprintf(&node_evtchn, "%s/event-channel", - xendev->nodename); - if (err <= 0) { - uk_pr_err("Failed to format event-channel path: %d\n", - err); - goto out; - } - } else { - err = asprintf(&node_ring_ref, "%s/queue-%"PRIu16"/ring-ref", - xendev->nodename, - queue_id); - if (err <= 0) { - uk_pr_err("Failed to format ring_ref_path: %d\n", err); - goto out; - } - - err = asprintf(&node_evtchn, "%s/queue-%"PRIu16"/event-channel", - xendev->nodename, - queue_id); - if (err <= 0) { - uk_pr_err("Failed to format event-channel path: %d\n", - err); - goto out; - } - } - - err = xs_rm(XBT_NIL, node_ring_ref); - if (err) - uk_pr_err("Failed to remove ring_ref from xs: %d\n", err); - - err = xs_rm(XBT_NIL, node_evtchn); - if (err) - uk_pr_err("Failed to remove event-channel from xs: %d\n", err); -out: - free(node_evtchn); - free(node_ring_ref); - return err; -} - -static int blkfront_xb_write_rings_info(struct blkfront_dev *dev) -{ - xenbus_transaction_t xbt = 0; - int err = 0; - - UK_ASSERT(dev != NULL); - -again: - err = xs_transaction_start(&xbt); - if (err) - goto abort_transaction; - - for (uint16_t queue_id = 0; queue_id < dev->nb_queues; ++queue_id) { - err = blkfront_xb_write_ring_info(dev, queue_id, xbt); - if (err) { - uk_pr_err("Failed to write queue%"PRIu16" to xs: %d\n", - queue_id, - err); - goto abort_transaction; - } - } - - err = xs_transaction_end(xbt, 0); - if (err == -EAGAIN) - goto again; - - if (err) - uk_pr_err("Failed to end transaction: %d\n", err); - - return err; - -abort_transaction: - xs_transaction_end(xbt, 1); - return err; -} - -static int blkfront_xb_delete_rings_info(struct blkfront_dev *dev) -{ - int err = 0; - - UK_ASSERT(dev != NULL); - - for (uint16_t queue_id = 0; queue_id < dev->nb_queues; ++queue_id) { - err = blkfront_xb_delete_ring_info(dev, queue_id); - if (err) { - uk_pr_err("Failed to delete ring_info for q-%" - PRIu16 ": %d\n", - queue_id, err); - return err; - } - } - - return err; -} - -#define WAIT_BE_STATE_CHANGE_WHILE_COND(state_cond) \ - do { \ - err = xs_read_integer(XBT_NIL, back_state_path,\ - (int *) &back_state); \ - if (err) \ - goto out; \ - while (!err && (state_cond)) \ - err = xenbus_wait_for_state_change(back_state_path, \ - &back_state, \ - xendev->otherend_watch); \ - if (err) \ - goto out; \ - } while (0) - - -static int blkfront_xb_wait_be_connect(struct blkfront_dev *blkdev) -{ - struct xenbus_device *xendev; - char *back_state_path = NULL; - XenbusState back_state; - int err = 0; - - UK_ASSERT(blkdev != NULL); - xendev = blkdev->xendev; - err = asprintf(&back_state_path, "%s/state", xendev->otherend); - if (err <= 0) { - uk_pr_err("Failed to format back_state_path: %d\n", err); - goto out; - } - - WAIT_BE_STATE_CHANGE_WHILE_COND(back_state < XenbusStateConnected); - if (back_state != XenbusStateConnected) { - uk_pr_err("Backend not available, state=%s\n", - xenbus_state_to_str(back_state)); - err = -1; - goto out; - } - -out: - free(back_state_path); - return err; -} - -static int blkfront_xb_wait_be_disconnect(struct blkfront_dev *blkdev) -{ - struct xenbus_device *xendev; - char *back_state_path = NULL; - XenbusState back_state; - int err = 0; - - UK_ASSERT(blkdev != NULL); - xendev = blkdev->xendev; - - err = asprintf(&back_state_path, "%s/state", xendev->otherend); - if (err <= 0) { - uk_pr_err("Failed to format back_state_path: %d\n", err); - goto out; - } - - WAIT_BE_STATE_CHANGE_WHILE_COND(back_state < XenbusStateClosing); - err = xenbus_switch_state(XBT_NIL, xendev, XenbusStateClosed); - if (err) { - uk_pr_err("Failed to switch state to Closed: %d\n", err); - goto out; - } - - WAIT_BE_STATE_CHANGE_WHILE_COND(back_state < XenbusStateClosed); - err = xenbus_switch_state(XBT_NIL, xendev, XenbusStateInitialising); - if (err) { - uk_pr_err("Failed to switch state to Initialising: %d\n", err); - goto out; - } - - WAIT_BE_STATE_CHANGE_WHILE_COND(back_state < XenbusStateInitWait || - back_state >= XenbusStateClosed); - -out: - free(back_state_path); - return err; -} - -int blkfront_xb_connect(struct blkfront_dev *blkdev) -{ - int err; - struct xenbus_device *xendev; - - UK_ASSERT(blkdev != NULL); - xendev = blkdev->xendev; - - err = blkfront_xb_write_rings_info(blkdev); - if (err) { - uk_pr_err("Failed to write rings info to xenstore: %d\n.", - err); - return err; - } - - err = xenbus_switch_state(XBT_NIL, xendev, XenbusStateConnected); - if (err) { - uk_pr_err("Failed to switch state to XenbusStateConnected: %d.\n", - err); - goto err; - } - - - err = blkfront_xb_wait_be_connect(blkdev); - if (err) { - uk_pr_err("Backend failed to change state: %d.\n", err); - goto err; - } - - err = blkfront_xb_get_capabilities(blkdev); - if (err) { - uk_pr_err("Failed to extract info from backend: %d.\n", err); - goto err; - } - -err: - return err; -} - -int blkfront_xb_disconnect(struct blkfront_dev *blkdev) -{ - struct xenbus_device *xendev; - int err; - - UK_ASSERT(blkdev != NULL); - - xendev = blkdev->xendev; - - uk_pr_info("Disconnect blkfront: backend at %s\n", - xendev->otherend); - - err = xenbus_switch_state(XBT_NIL, xendev, XenbusStateClosing); - if (err) { - uk_pr_err("Failed to switch state to Closing: %d\n", err); - goto out; - } - - err = blkfront_xb_wait_be_disconnect(blkdev); - if (err) { - uk_pr_err("Failed to disconnect: %d\n", err); - goto out; - } - - err = blkfront_xb_delete_rings_info(blkdev); - if (err) { - uk_pr_err("Failed to delete rings info: %d\n", err); - goto out; - } - -out: - return err; -} diff --git a/plat/xen/drivers/blk/exportsyms.uk b/plat/xen/drivers/blk/exportsyms.uk deleted file mode 100644 index 621e94f0ec951431443029088dba63eb586edbc8..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/blk/exportsyms.uk +++ /dev/null @@ -1 +0,0 @@ -none diff --git a/plat/xen/drivers/net/exportsyms.uk b/plat/xen/drivers/net/exportsyms.uk deleted file mode 100644 index c86c3f3551ecf43bef6ab92d43ddc1e193a55398..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/net/exportsyms.uk +++ /dev/null @@ -1 +0,0 @@ -none \ No newline at end of file diff --git a/plat/xen/drivers/net/netfront.c b/plat/xen/drivers/net/netfront.c deleted file mode 100644 index bd4206489d51f27e5beda0b990c124adced9c036..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/net/netfront.c +++ /dev/null @@ -1,917 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * Razvan Cojocaru - * Simon Kuenzer - * - * Copyright (c) 2020, University Politehnica of Bucharest. All rights reserved. - * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include "netfront.h" -#include "netfront_xb.h" - - -#define DRIVER_NAME "xen-netfront" - -/* TODO Same interrupt macros we use in virtio-net */ -#define NETFRONT_INTR_EN (1 << 0) -#define NETFRONT_INTR_EN_MASK (1) -#define NETFRONT_INTR_USR_EN (1 << 1) -#define NETFRONT_INTR_USR_EN_MASK (2) - -#define to_netfront_dev(dev) \ - __containerof(dev, struct netfront_dev, netdev) - -static struct uk_alloc *drv_allocator; - - -static uint16_t xennet_rxidx(RING_IDX idx) -{ - return (uint16_t) (idx & (NET_RX_RING_SIZE - 1)); -} - -static void add_id_to_freelist(uint16_t id, uint16_t *freelist) -{ - freelist[id + 1] = freelist[0]; - freelist[0] = id; -} - -static uint16_t get_id_from_freelist(uint16_t *freelist) -{ - uint16_t id; - - id = freelist[0]; - freelist[0] = freelist[id + 1]; - return id; -} - -static int network_tx_buf_gc(struct uk_netdev_tx_queue *txq) -{ - RING_IDX prod, cons; - netif_tx_response_t *tx_rsp; - uint16_t id; - int count = 0; - - prod = txq->ring.sring->rsp_prod; - rmb(); /* Ensure we see responses up to 'rp'. */ - - for (cons = txq->ring.rsp_cons; cons != prod; cons++) { - tx_rsp = RING_GET_RESPONSE(&txq->ring, cons); - - if (tx_rsp->status == NETIF_RSP_NULL) - continue; - - if (tx_rsp->status == NETIF_RSP_ERROR) - uk_pr_err("netdev%u: Transmission error on txq %u\n", - txq->netfront_dev->netdev._data->id, - txq->lqueue_id); - - - id = tx_rsp->id; - UK_ASSERT(id < NET_TX_RING_SIZE); - - uk_netbuf_free_single(txq->nbuf[id]); - - add_id_to_freelist(id, txq->freelist); - - count++; - } - txq->ring.rsp_cons = prod; - - return count; -} - -static int netfront_xmit(struct uk_netdev *n, - struct uk_netdev_tx_queue *txq, - struct uk_netbuf *pkt) -{ - struct netfront_dev *nfdev; - unsigned long flags; - uint16_t id; - RING_IDX req_prod; - netif_tx_request_t *tx_req; - bool more_to_do; - int notify; - int status; - - UK_ASSERT(n != NULL); - UK_ASSERT(txq != NULL); - UK_ASSERT(pkt != NULL); - UK_ASSERT(pkt->len < PAGE_SIZE); - UK_ASSERT(!pkt->next); /* TODO: Support for netbuf chains missing */ - UK_ASSERT(((unsigned long) pkt->buf & ~PAGE_MASK) == 0); - - nfdev = to_netfront_dev(n); - - local_irq_save(flags); - if (unlikely(RING_FULL(&txq->ring))) { - /* try some cleanup */ - network_tx_buf_gc(txq); - if (unlikely(RING_FULL(&txq->ring))) { - uk_pr_debug("tx queue is full\n"); - local_irq_restore(flags); - return 0x0; - } - } - - /* get request id */ - id = get_id_from_freelist(txq->freelist); - - /* get request */ - req_prod = txq->ring.req_prod_pvt; - tx_req = RING_GET_REQUEST(&txq->ring, req_prod); - - /* setup grant for buffer data */ - if (unlikely(txq->gref[id] == GRANT_INVALID_REF)) { - /* allocating of a new grant needed */ - txq->gref[id] = gnttab_grant_access(nfdev->xendev->otherend_id, - virt_to_mfn(pkt->buf), - 0); - } else { - /* re-use grant (update it) */ - gnttab_update_grant(txq->gref[id], - nfdev->xendev->otherend_id, - virt_to_mfn(pkt->buf), - 0); - } - UK_ASSERT(txq->gref[id] != GRANT_INVALID_REF); - - /* remember netbuf reference for free'ing it later */ - txq->nbuf[id] = pkt; - tx_req->gref = txq->gref[id]; - tx_req->offset = (uint16_t) uk_netbuf_headroom(pkt); - tx_req->size = (uint16_t) pkt->len; - tx_req->flags = (pkt->flags & UK_NETBUF_F_PARTIAL_CSUM) - ? NETTXF_csum_blank : 0x0; - tx_req->flags |= (pkt->flags & UK_NETBUF_F_DATA_VALID) - ? NETTXF_data_validated : 0x0; - tx_req->id = id; - status = UK_NETDEV_STATUS_SUCCESS; - - txq->ring.req_prod_pvt = req_prod + 1; - wmb(); /* Ensure backend sees requests */ - - RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&txq->ring, notify); - if (notify) - notify_remote_via_evtchn(txq->evtchn); - - - /* some cleanup */ - do { - network_tx_buf_gc(txq); - RING_FINAL_CHECK_FOR_RESPONSES(&txq->ring, more_to_do); - } while (more_to_do); - - status |= (RING_FULL(&txq->ring)) ? 0x0 : UK_NETDEV_STATUS_MORE; - local_irq_restore(flags); - - return status; -} - -static int netfront_rxq_enqueue(struct uk_netdev_rx_queue *rxq, - struct uk_netbuf *netbuf) -{ - RING_IDX req_prod; - uint16_t id; - netif_rx_request_t *rx_req; - struct netfront_dev *nfdev; - int notify; - - /* buffer must be page aligned */ - UK_ASSERT(((unsigned long) netbuf->buf & ~PAGE_MASK) == 0); - - if (RING_FULL(&rxq->ring)) { - uk_pr_debug("rx queue is full\n"); - return -ENOSPC; - } - - /* get request */ - req_prod = rxq->ring.req_prod_pvt; - id = xennet_rxidx(req_prod); - rx_req = RING_GET_REQUEST(&rxq->ring, req_prod); - rx_req->id = id; - - /* save buffer */ - rxq->netbuf[id] = netbuf; - /* setup grant for buffer data */ - nfdev = rxq->netfront_dev; - if (unlikely(rxq->gref[id] == GRANT_INVALID_REF)) { - /* allocating of a new grant needed */ - rxq->gref[id] = gnttab_grant_access(nfdev->xendev->otherend_id, - virt_to_mfn(netbuf->buf), - 0); - } else { - /* re-use grant (update it) */ - gnttab_update_grant(rxq->gref[id], - nfdev->xendev->otherend_id, - virt_to_mfn(netbuf->buf), - 0); - } - UK_ASSERT(rxq->gref[id] != GRANT_INVALID_REF); - - rx_req->gref = rxq->gref[id]; - wmb(); /* Ensure backend sees requests */ - rxq->ring.req_prod_pvt = req_prod + 1; - - RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&rxq->ring, notify); - if (notify) - notify_remote_via_evtchn(rxq->evtchn); - - return 0; -} - -static int netfront_rxq_dequeue(struct uk_netdev_rx_queue *rxq, - struct uk_netbuf **netbuf) -{ - RING_IDX prod, cons; - netif_rx_response_t *rx_rsp; - uint16_t len, id; - struct uk_netbuf *buf = NULL; - int count = 0; - - UK_ASSERT(rxq != NULL); - UK_ASSERT(netbuf != NULL); - - prod = rxq->ring.sring->rsp_prod; - rmb(); /* Ensure we see queued responses up to 'rp'. */ - cons = rxq->ring.rsp_cons; - /* No new descriptor since last dequeue operation */ - if (cons == prod) { - *netbuf = NULL; - goto out; - } - - /* get response */ - rx_rsp = RING_GET_RESPONSE(&rxq->ring, cons); - UK_ASSERT(rx_rsp->status > NETIF_RSP_NULL); - id = rx_rsp->id; - UK_ASSERT(id < NET_RX_RING_SIZE); - - /* NOTE: we keep the last grant for re-use */ - - buf = rxq->netbuf[id]; - if (unlikely(rx_rsp->status < 0)) { - uk_pr_err("rxq %p: Receive error %d!\n", rxq, rx_rsp->status); - buf->len = 0; - } else { - len = (uint16_t) rx_rsp->status; - if (len > UK_ETH_FRAME_MAXLEN) - len = UK_ETH_FRAME_MAXLEN; - - buf->data = (void *)((__uptr) buf->buf + rx_rsp->offset); - buf->len = len; - UK_ASSERT(IN_RANGE(buf->data, buf->buf, buf->buflen)); - - buf->flags |= (rx_rsp->flags & NETTXF_csum_blank) - ? UK_NETBUF_F_PARTIAL_CSUM : 0x0; - buf->flags |= (rx_rsp->flags & NETTXF_data_validated) - ? UK_NETBUF_F_DATA_VALID : 0x0; - - /* netfront does not tell us where the checksum is located */ - buf->csum_start = 0; - buf->csum_offset = 0; - } - - *netbuf = buf; - - rxq->ring.rsp_cons++; - count = 1; - -out: - return count; -} - -static int netfront_rx_fillup(struct uk_netdev_rx_queue *rxq, uint16_t nb_desc) -{ - struct uk_netbuf *netbuf[nb_desc]; - int rc, status = 0; - uint16_t cnt; - - cnt = rxq->alloc_rxpkts(rxq->alloc_rxpkts_argp, netbuf, nb_desc); - - for (uint16_t i = 0; i < cnt; i++) { - rc = netfront_rxq_enqueue(rxq, netbuf[i]); - if (unlikely(rc < 0)) { - uk_pr_err("Failed to add a buffer to rx queue %p: %d\n", - rxq, rc); - - /* - * Release netbufs that we are not going - * to use anymore - */ - for (uint16_t j = i; j < cnt; j++) - uk_netbuf_free(netbuf[j]); - - status |= UK_NETDEV_STATUS_UNDERRUN; - - goto out; - } - } - - if (unlikely(cnt < nb_desc)) - status |= UK_NETDEV_STATUS_UNDERRUN; - -out: - return status; -} - -/* Returns 1 if more packets available */ -static int netfront_rxq_intr_enable(struct uk_netdev_rx_queue *rxq) -{ - int more; - - /* Check if there are no more packets enabled */ - RING_FINAL_CHECK_FOR_RESPONSES(&rxq->ring, more); - if (!more) { - /* No more packets, we can enable interrupts */ - rxq->intr_enabled |= NETFRONT_INTR_EN; - unmask_evtchn(rxq->evtchn); - } - - return (more > 0); -} - -static int netfront_recv(struct uk_netdev *n __unused, - struct uk_netdev_rx_queue *rxq, - struct uk_netbuf **pkt) -{ - int rc, status = 0; - int more; - - UK_ASSERT(n != NULL); - UK_ASSERT(rxq != NULL); - UK_ASSERT(pkt != NULL); - - /* Queue interrupts have to be off when calling receive */ - UK_ASSERT(!(rxq->intr_enabled & NETFRONT_INTR_EN)); - - rc = netfront_rxq_dequeue(rxq, pkt); - UK_ASSERT(rc >= 0); - - status |= (*pkt) ? UK_NETDEV_STATUS_SUCCESS : 0x0; - status |= netfront_rx_fillup(rxq, rc); - - /* Enable interrupt only when user had previously enabled it */ - if (rxq->intr_enabled & NETFRONT_INTR_USR_EN_MASK) { - /* Need to enable the interrupt on the last packet */ - rc = netfront_rxq_intr_enable(rxq); - if (rc == 1 && !(*pkt)) { - /** - * Packet arrive after reading the queue and before - * enabling the interrupt - */ - rc = netfront_rxq_dequeue(rxq, pkt); - UK_ASSERT(rc >= 0); - status |= UK_NETDEV_STATUS_SUCCESS; - - /* - * Since we received something, we need to fillup - * and notify - */ - status |= netfront_rx_fillup(rxq, rc); - - /* Need to enable the interrupt on the last packet */ - rc = netfront_rxq_intr_enable(rxq); - status |= (rc == 1) ? UK_NETDEV_STATUS_MORE : 0x0; - } else if (*pkt) { - /* When we originally got a packet and there is more */ - status |= (rc == 1) ? UK_NETDEV_STATUS_MORE : 0x0; - } - } else if (*pkt) { - /** - * For polling case, we report always there are further - * packets unless the queue is empty. - */ - RING_FINAL_CHECK_FOR_RESPONSES(&rxq->ring, more); - status |= (more) ? UK_NETDEV_STATUS_MORE : 0x0; - } - - return status; -} - -static struct uk_netdev_tx_queue *netfront_txq_setup(struct uk_netdev *n, - uint16_t queue_id, - uint16_t nb_desc __unused, - struct uk_netdev_txqueue_conf *conf) -{ - int rc; - struct netfront_dev *nfdev; - struct uk_netdev_tx_queue *txq; - netif_tx_sring_t *sring; - - UK_ASSERT(n != NULL); - - nfdev = to_netfront_dev(n); - if (queue_id >= nfdev->max_queue_pairs) { - uk_pr_err("Invalid queue identifier: %"__PRIu16"\n", queue_id); - return ERR2PTR(-EINVAL); - } - - txq = &nfdev->txqs[queue_id]; - UK_ASSERT(!txq->initialized); - txq->netfront_dev = nfdev; - txq->lqueue_id = queue_id; - - /* Setup shared ring */ - sring = uk_palloc(conf->a, 1); - if (!sring) - return ERR2PTR(-ENOMEM); - memset(sring, 0, PAGE_SIZE); - SHARED_RING_INIT(sring); - FRONT_RING_INIT(&txq->ring, sring, PAGE_SIZE); - txq->ring_size = NET_TX_RING_SIZE; - txq->ring_ref = gnttab_grant_access(nfdev->xendev->otherend_id, - virt_to_mfn(sring), 0); - UK_ASSERT(txq->ring_ref != GRANT_INVALID_REF); - - /* Setup event channel */ - if (nfdev->split_evtchn || !nfdev->rxqs[queue_id].initialized) { - rc = evtchn_alloc_unbound(nfdev->xendev->otherend_id, - NULL, NULL, - &txq->evtchn); - if (rc) { - uk_pr_err("Error creating event channel: %d\n", rc); - gnttab_end_access(txq->ring_ref); - uk_pfree(conf->a, sring, 1); - return ERR2PTR(rc); - } - } else - txq->evtchn = nfdev->rxqs[queue_id].evtchn; - - /* Events are always disabled for tx queue */ - mask_evtchn(txq->evtchn); - - /* Initialize list of request ids */ - for (uint16_t i = 0; i < NET_TX_RING_SIZE; i++) { - add_id_to_freelist(i, txq->freelist); - txq->gref[i] = GRANT_INVALID_REF; - txq->netbuf[i] = NULL; - } - - txq->initialized = true; - nfdev->txqs_num++; - - return txq; -} - -static void netfront_rxq_handler(evtchn_port_t port __unused, - struct __regs *regs __unused, void *arg) -{ - struct uk_netdev_rx_queue *rxq = arg; - - /* Disable the interrupt for the ring */ - rxq->intr_enabled &= ~(NETFRONT_INTR_EN); - mask_evtchn(rxq->evtchn); - - /* Indicate to the network stack about an event */ - uk_netdev_drv_rx_event(&rxq->netfront_dev->netdev, rxq->lqueue_id); -} - -static struct uk_netdev_rx_queue *netfront_rxq_setup(struct uk_netdev *n, - uint16_t queue_id, - uint16_t nb_desc __unused, - struct uk_netdev_rxqueue_conf *conf) -{ - int rc; - struct netfront_dev *nfdev; - struct uk_netdev_rx_queue *rxq; - netif_rx_sring_t *sring; - - UK_ASSERT(n != NULL); - UK_ASSERT(conf != NULL); - - nfdev = to_netfront_dev(n); - if (queue_id >= nfdev->max_queue_pairs) { - uk_pr_err("Invalid queue identifier: %"__PRIu16"\n", queue_id); - return ERR2PTR(-EINVAL); - } - - rxq = &nfdev->rxqs[queue_id]; - UK_ASSERT(!rxq->initialized); - rxq->netfront_dev = nfdev; - rxq->lqueue_id = queue_id; - - /* Setup shared ring */ - sring = uk_palloc(conf->a, 1); - if (!sring) - return ERR2PTR(-ENOMEM); - memset(sring, 0, PAGE_SIZE); - SHARED_RING_INIT(sring); - FRONT_RING_INIT(&rxq->ring, sring, PAGE_SIZE); - rxq->ring_size = NET_RX_RING_SIZE; - rxq->ring_ref = gnttab_grant_access(nfdev->xendev->otherend_id, - virt_to_mfn(sring), 0); - UK_ASSERT(rxq->ring_ref != GRANT_INVALID_REF); - - /* Setup event channel */ - if (nfdev->split_evtchn || !nfdev->txqs[queue_id].initialized) { - rc = evtchn_alloc_unbound(nfdev->xendev->otherend_id, - netfront_rxq_handler, rxq, - &rxq->evtchn); - if (rc) { - uk_pr_err("Error creating event channel: %d\n", rc); - gnttab_end_access(rxq->ring_ref); - uk_pfree(conf->a, sring, 1); - return ERR2PTR(rc); - } - } else { - rxq->evtchn = nfdev->txqs[queue_id].evtchn; - /* overwriting event handler */ - bind_evtchn(rxq->evtchn, netfront_rxq_handler, rxq); - } - /* - * By default, events are disabled and it is up to the user or - * network stack to explicitly enable them. - */ - mask_evtchn(rxq->evtchn); - rxq->intr_enabled = 0; - - rxq->alloc_rxpkts = conf->alloc_rxpkts; - rxq->alloc_rxpkts_argp = conf->alloc_rxpkts_argp; - - for (uint16_t i = 0; i < NET_RX_RING_SIZE; i++) - rxq->gref[i] = GRANT_INVALID_REF; - - /* Allocate receive buffers for this queue */ - netfront_rx_fillup(rxq, rxq->ring_size); - - rxq->initialized = true; - nfdev->rxqs_num++; - - return rxq; -} - -static int netfront_rxtx_alloc(struct netfront_dev *nfdev, - const struct uk_netdev_conf *conf) -{ - int rc = 0, i; - - if (conf->nb_tx_queues != conf->nb_rx_queues) { - uk_pr_err("Different number of queues not supported\n"); - rc = -ENOTSUP; - goto err_free_txrx; - } - - nfdev->max_queue_pairs = - MIN(nfdev->max_queue_pairs, conf->nb_tx_queues); - - nfdev->txqs = uk_calloc(drv_allocator, - nfdev->max_queue_pairs, sizeof(*nfdev->txqs)); - if (unlikely(!nfdev->txqs)) { - uk_pr_err("Failed to allocate memory for tx queues\n"); - rc = -ENOMEM; - goto err_free_txrx; - } - for (i = 0; i < nfdev->max_queue_pairs; i++) - nfdev->txqs[i].ring_size = NET_TX_RING_SIZE; - - nfdev->rxqs = uk_calloc(drv_allocator, - nfdev->max_queue_pairs, sizeof(*nfdev->rxqs)); - if (unlikely(!nfdev->rxqs)) { - uk_pr_err("Failed to allocate memory for rx queues\n"); - rc = -ENOMEM; - goto err_free_txrx; - } - for (i = 0; i < nfdev->max_queue_pairs; i++) - nfdev->rxqs[i].ring_size = NET_RX_RING_SIZE; - - return rc; - -err_free_txrx: - if (!nfdev->rxqs) - uk_free(drv_allocator, nfdev->rxqs); - if (!nfdev->txqs) - uk_free(drv_allocator, nfdev->txqs); - - return rc; -} - -static int netfront_rx_intr_enable(struct uk_netdev *n __unused, - struct uk_netdev_rx_queue *rxq) -{ - int rc; - - UK_ASSERT(n != NULL); - UK_ASSERT(rxq != NULL); - UK_ASSERT(&rxq->netfront_dev->netdev == n); - - /* If the interrupt is enabled */ - if (rxq->intr_enabled & NETFRONT_INTR_EN) - return 0; - - /** - * Enable the user configuration bit. This would cause the interrupt to - * be enabled automatically if the interrupt could not be enabled now - * due to data in the queue. - */ - rxq->intr_enabled = NETFRONT_INTR_USR_EN; - rc = netfront_rxq_intr_enable(rxq); - if (!rc) - rxq->intr_enabled |= NETFRONT_INTR_EN; - - return rc; -} - -static int netfront_rx_intr_disable(struct uk_netdev *n __unused, - struct uk_netdev_rx_queue *rxq) -{ - UK_ASSERT(n != NULL); - UK_ASSERT(rxq != NULL); - UK_ASSERT(&rxq->netfront_dev->netdev == n); - - rxq->intr_enabled &= ~(NETFRONT_INTR_USR_EN | NETFRONT_INTR_EN); - mask_evtchn(rxq->evtchn); - - return 0; -} - -static int netfront_txq_info_get(struct uk_netdev *n, - uint16_t queue_id, - struct uk_netdev_queue_info *qinfo) -{ - struct netfront_dev *nfdev; - struct uk_netdev_tx_queue *txq; - int rc = 0; - - UK_ASSERT(n != NULL); - UK_ASSERT(qinfo != NULL); - - nfdev = to_netfront_dev(n); - if (unlikely(queue_id >= nfdev->max_queue_pairs)) { - uk_pr_err("Invalid queue_id %"__PRIu16"\n", queue_id); - rc = -EINVAL; - goto exit; - } - txq = &nfdev->txqs[queue_id]; - qinfo->nb_min = txq->ring_size; - qinfo->nb_max = txq->ring_size; - qinfo->nb_align = 1; - qinfo->nb_is_power_of_two = 1; - -exit: - return rc; -} - -static int netfront_rxq_info_get(struct uk_netdev *n, - uint16_t queue_id, - struct uk_netdev_queue_info *qinfo) -{ - struct netfront_dev *nfdev; - struct uk_netdev_rx_queue *rxq; - int rc = 0; - - UK_ASSERT(n != NULL); - UK_ASSERT(qinfo != NULL); - - nfdev = to_netfront_dev(n); - if (unlikely(queue_id >= nfdev->max_queue_pairs)) { - uk_pr_err("Invalid queue id: %"__PRIu16"\n", queue_id); - rc = -EINVAL; - goto exit; - } - rxq = &nfdev->rxqs[queue_id]; - qinfo->nb_min = rxq->ring_size; - qinfo->nb_max = rxq->ring_size; - qinfo->nb_align = 1; - qinfo->nb_is_power_of_two = 1; - -exit: - return rc; -} - -static int netfront_configure(struct uk_netdev *n, - const struct uk_netdev_conf *conf) -{ - int rc; - struct netfront_dev *nfdev; - - UK_ASSERT(n != NULL); - UK_ASSERT(conf != NULL); - - nfdev = to_netfront_dev(n); - - rc = netfront_rxtx_alloc(nfdev, conf); - if (rc != 0) { - uk_pr_err("Failed to allocate rx and tx rings %d\n", rc); - goto out; - } - -out: - return rc; -} - -static int netfront_start(struct uk_netdev *n) -{ - struct netfront_dev *nfdev; - int rc; - - UK_ASSERT(n != NULL); - nfdev = to_netfront_dev(n); - - rc = netfront_xb_connect(nfdev); - if (rc) { - uk_pr_err("Error connecting to backend: %d\n", rc); - return rc; - } - - return rc; -} - -static void netfront_info_get(struct uk_netdev *n, - struct uk_netdev_info *dev_info) -{ - struct netfront_dev *nfdev; - - UK_ASSERT(n != NULL); - UK_ASSERT(dev_info != NULL); - - nfdev = to_netfront_dev(n); - dev_info->max_rx_queues = nfdev->max_queue_pairs; - dev_info->max_tx_queues = nfdev->max_queue_pairs; - dev_info->max_mtu = nfdev->mtu; - dev_info->nb_encap_tx = 0; - dev_info->nb_encap_rx = 0; - dev_info->ioalign = PAGE_SIZE; - dev_info->features = UK_NETDEV_F_RXQ_INTR | UK_NETDEV_F_PARTIAL_CSUM; -} - -static const void *netfront_einfo_get(struct uk_netdev *n, - enum uk_netdev_einfo_type einfo_type) -{ - struct netfront_dev *nfdev; - - UK_ASSERT(n != NULL); - - nfdev = to_netfront_dev(n); - switch (einfo_type) { - case UK_NETDEV_IPV4_ADDR_STR: - return nfdev->econf.ipv4addr; - case UK_NETDEV_IPV4_MASK_STR: - return nfdev->econf.ipv4mask; - case UK_NETDEV_IPV4_GW_STR: - return nfdev->econf.ipv4gw; - default: - break; - } - - /* type not supported */ - return NULL; -} - -static const struct uk_hwaddr *netfront_mac_get(struct uk_netdev *n) -{ - struct netfront_dev *nfdev; - - UK_ASSERT(n != NULL); - nfdev = to_netfront_dev(n); - return &nfdev->hw_addr; -} - -static uint16_t netfront_mtu_get(struct uk_netdev *n) -{ - struct netfront_dev *nfdev; - - UK_ASSERT(n != NULL); - nfdev = to_netfront_dev(n); - return nfdev->mtu; -} - -static unsigned int netfront_promisc_get(struct uk_netdev *n) -{ - struct netfront_dev *nfdev; - - UK_ASSERT(n != NULL); - nfdev = to_netfront_dev(n); - return nfdev->promisc; -} - -static int netfront_probe(struct uk_netdev *n) -{ - struct netfront_dev *nfdev; - int rc; - - UK_ASSERT(n != NULL); - - nfdev = to_netfront_dev(n); - - /* Xenbus initialization */ - rc = netfront_xb_init(nfdev, drv_allocator); - if (rc) { - uk_pr_err("Error initializing Xenbus data: %d\n", rc); - goto out; - } - -out: - return rc; -} - -static const struct uk_netdev_ops netfront_ops = { - .probe = netfront_probe, - .configure = netfront_configure, - .start = netfront_start, - .txq_configure = netfront_txq_setup, - .rxq_configure = netfront_rxq_setup, - .rxq_intr_enable = netfront_rx_intr_enable, - .rxq_intr_disable = netfront_rx_intr_disable, - .txq_info_get = netfront_txq_info_get, - .rxq_info_get = netfront_rxq_info_get, - .info_get = netfront_info_get, - .einfo_get = netfront_einfo_get, - .hwaddr_get = netfront_mac_get, - .mtu_get = netfront_mtu_get, - .promiscuous_get = netfront_promisc_get, -}; - -static int netfront_add_dev(struct xenbus_device *xendev) -{ - struct netfront_dev *nfdev; - int rc = 0; - - UK_ASSERT(xendev != NULL); - - nfdev = uk_calloc(drv_allocator, 1, sizeof(*nfdev)); - if (!nfdev) { - rc = -ENOMEM; - goto err_out; - } - - nfdev->xendev = xendev; - nfdev->mtu = UK_ETH_PAYLOAD_MAXLEN; - nfdev->max_queue_pairs = 1; - nfdev->netdev.tx_one = netfront_xmit; - nfdev->netdev.rx_one = netfront_recv; - nfdev->netdev.ops = &netfront_ops; - rc = uk_netdev_drv_register(&nfdev->netdev, drv_allocator, DRIVER_NAME); - if (rc < 0) { - uk_pr_err("Failed to register %s device with libuknetdev\n", - DRIVER_NAME); - goto err_register; - } - nfdev->uid = rc; - rc = 0; - -out: - return rc; -err_register: - uk_free(drv_allocator, nfdev); -err_out: - goto out; -} - -static int netfront_drv_init(struct uk_alloc *allocator) -{ - /* driver initialization */ - if (!allocator) - return -EINVAL; - - drv_allocator = allocator; - return 0; -} - -static const xenbus_dev_type_t netfront_devtypes[] = { - xenbus_dev_vif, - xenbus_dev_none -}; - -static struct xenbus_driver netfront_driver = { - .device_types = netfront_devtypes, - .init = netfront_drv_init, - .add_dev = netfront_add_dev -}; -XENBUS_REGISTER_DRIVER(&netfront_driver); diff --git a/plat/xen/drivers/net/netfront.h b/plat/xen/drivers/net/netfront.h deleted file mode 100644 index 0086b27be7eeb1d819d2c78b5437115d9f4ccf56..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/net/netfront.h +++ /dev/null @@ -1,146 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * Razvan Cojocaru - * - * Copyright (c) 2020, University Politehnica of Bucharest. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __NETFRONT_H__ -#define __NETFRONT_H__ - -#include -#include -#include -#include -#include -#include - - -#define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGE_SIZE) -#define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGE_SIZE) - -/** - * internal structure to represent the transmit queue. - */ -struct uk_netdev_tx_queue { - /* The netfront device */ - struct netfront_dev *netfront_dev; - /* The libuknet queue identifier */ - uint16_t lqueue_id; - /* True if initialized */ - bool initialized; - - /* Shared ring size */ - uint16_t ring_size; - /* Shared ring */ - netif_tx_front_ring_t ring; - /* Shared ring grant ref */ - grant_ref_t ring_ref; - /* Queue event channel */ - evtchn_port_t evtchn; - - /* Free list of transmitting request IDs */ - uint16_t freelist[NET_TX_RING_SIZE + 1]; - /* Ring of inflight netbufs */ - struct uk_netbuf *nbuf[NET_TX_RING_SIZE]; - /* Grants for transmit buffers */ - grant_ref_t gref[NET_TX_RING_SIZE]; - /* Transmit packets addresses */ - struct uk_netbuf *netbuf[NET_TX_RING_SIZE]; -}; - -/** - * internal structure to represent the receive queue. - */ -struct uk_netdev_rx_queue { - /* The netfront device */ - struct netfront_dev *netfront_dev; - /* The libuknet queue identifier */ - uint16_t lqueue_id; - /* True if initialized */ - bool initialized; - - /* Shared ring size */ - uint16_t ring_size; - /* Shared ring */ - netif_rx_front_ring_t ring; - /* Shared ring grant ref */ - grant_ref_t ring_ref; - /* Queue event channel */ - evtchn_port_t evtchn; - - /* The flag to interrupt on the transmit queue */ - uint8_t intr_enabled; - - /* User-provided receive buffer allocation function */ - uk_netdev_alloc_rxpkts alloc_rxpkts; - void *alloc_rxpkts_argp; - - /* Receive buffers for incoming packets */ - struct uk_netbuf *netbuf[NET_RX_RING_SIZE]; - /* Grants for receive buffers */ - grant_ref_t gref[NET_RX_RING_SIZE]; -}; - -struct xs_econf { - char *ipv4addr; - char *ipv4mask; - char *ipv4gw; -}; - -struct netfront_dev { - /* Xenbus device */ - struct xenbus_device *xendev; - /* Network device */ - struct uk_netdev netdev; - - /* List of the Rx/Tx queues */ - uint16_t txqs_num; - uint16_t rxqs_num; - struct uk_netdev_tx_queue *txqs; - struct uk_netdev_rx_queue *rxqs; - /* Maximum number of queue pairs */ - uint16_t max_queue_pairs; - /* True if using split event channels */ - bool split_evtchn; - - /* Configuration parameters */ - struct xs_econf econf; - - /* The netdevice identifier */ - uint16_t uid; - /* The mtu */ - uint16_t mtu; - /* The hw address of the netdevice */ - struct uk_hwaddr hw_addr; - /* RX promiscuous mode. */ - uint8_t promisc : 1; -}; - -#endif /* __NETFRONT_H__ */ diff --git a/plat/xen/drivers/net/netfront_xb.h b/plat/xen/drivers/net/netfront_xb.h deleted file mode 100644 index 01d41e313dd51aa279585367772d4cb51d744ece..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/net/netfront_xb.h +++ /dev/null @@ -1,44 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2020, University Politehnica of Bucharest. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __NETFRONT_XB_H__ -#define __NETFRONT_XB_H__ - -#include "netfront.h" - -int netfront_xb_init(struct netfront_dev *netdev, struct uk_alloc *a); -void netfront_xb_fini(struct netfront_dev *netdev, struct uk_alloc *a); - -int netfront_xb_connect(struct netfront_dev *netdev); -int netfront_xb_disconnect(struct netfront_dev *netdev); - -#endif /* __NETFRONT_XB_H__ */ diff --git a/plat/xen/drivers/net/netfront_xs.c b/plat/xen/drivers/net/netfront_xs.c deleted file mode 100644 index e65a2a8b817a38d4870d885503377db4455c89db..0000000000000000000000000000000000000000 --- a/plat/xen/drivers/net/netfront_xs.c +++ /dev/null @@ -1,526 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2020, University Politehnica of Bucharest. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "netfront_xb.h" - - -static int netfront_xb_wait_be_connect(struct netfront_dev *nfdev); -static int netfront_xb_wait_be_disconnect(struct netfront_dev *nfdev); - - -static int xs_read_backend_id(const char *nodename, domid_t *domid) -{ - char path[strlen(nodename) + sizeof("/backend-id")]; - int value, rc; - - snprintf(path, sizeof(path), "%s/backend-id", nodename); - - rc = xs_read_integer(XBT_NIL, path, &value); - if (!rc) - *domid = (domid_t) value; - - return rc; -} - -static void xs_econf_fini(struct xs_econf *econf, - struct uk_alloc *a) -{ - if (econf->ipv4addr) { - uk_free(a, econf->ipv4addr); - econf->ipv4addr = NULL; - } - if (econf->ipv4mask) { - uk_free(a, econf->ipv4mask); - econf->ipv4mask = NULL; - } - if (econf->ipv4gw) { - uk_free(a, econf->ipv4gw); - econf->ipv4gw = NULL; - } -} - -static int xs_econf_init(struct xs_econf *econf, char *ip_str, - struct uk_alloc *a) -{ - int rc = -1; - char *ip_addr = NULL, *ip_gw_str = NULL, *ip_mask_str = NULL; - - /* IP */ - ip_addr = strtok(ip_str, " "); - if (ip_addr == NULL) - goto out_err; - econf->ipv4addr = uk_malloc(a, strlen(ip_addr) + 1); - if (!econf->ipv4addr) { - uk_pr_err("Error allocating ip config.\n"); - goto out_err; - } - memcpy(econf->ipv4addr, ip_addr, strlen(ip_addr) + 1); - - /* Mask */ - ip_mask_str = strtok(NULL, " "); - if (ip_mask_str == NULL) - goto out_err; - econf->ipv4mask = uk_malloc(a, strlen(ip_mask_str) + 1); - if (!econf->ipv4mask) { - uk_pr_err("Error allocating ip mask config.\n"); - goto out_err; - } - memcpy(econf->ipv4mask, ip_mask_str, strlen(ip_mask_str) + 1); - - /* Gateway */ - ip_gw_str = strtok(NULL, " "); - if (ip_gw_str == NULL) - goto out_err; - econf->ipv4gw = uk_malloc(a, strlen(ip_gw_str) + 1); - if (!econf->ipv4gw) { - uk_pr_err("Error allocating ip gateway config.\n"); - goto out_err; - } - memcpy(econf->ipv4gw, ip_gw_str, strlen(ip_gw_str) + 1); - - rc = 0; -out: - return rc; -out_err: - xs_econf_fini(econf, a); - goto out; -} - -int netfront_xb_init(struct netfront_dev *nfdev, struct uk_alloc *a) -{ - struct xenbus_device *xendev; - char *mac_str, *p, *ip_str, *int_str; - int rc; - - UK_ASSERT(nfdev != NULL); - - xendev = nfdev->xendev; - UK_ASSERT(xendev != NULL); - UK_ASSERT(xendev->nodename != NULL); - - rc = xs_read_backend_id(xendev->nodename, &xendev->otherend_id); - if (rc) - goto out; - - /* read backend path */ - xendev->otherend = xs_read(XBT_NIL, xendev->nodename, "backend"); - if (PTRISERR(xendev->otherend)) { - uk_pr_err("Error reading backend path.\n"); - rc = PTR2ERR(xendev->otherend); - xendev->otherend = NULL; - goto out; - } - - /* read MAC address */ - mac_str = xs_read(XBT_NIL, xendev->nodename, "mac"); - if (PTRISERR(mac_str)) { - uk_pr_err("Error reading MAC address.\n"); - rc = PTR2ERR(mac_str); - goto no_conf; - } - uk_pr_debug("\tMAC via XenStore: %s\n", mac_str); - - p = mac_str; - for (int i = 0; i < UK_NETDEV_HWADDR_LEN; i++) { - nfdev->hw_addr.addr_bytes[i] = (uint8_t) strtoul(p, &p, 16); - p++; - } - free(mac_str); - - /* read IP address */ - ip_str = xs_read(XBT_NIL, xendev->otherend, "ip"); - if (PTRISERR(ip_str)) { - uk_pr_debug("No IP address information found on XenStore\n"); - memset(&nfdev->econf, 0, sizeof(struct xs_econf)); - } else { - uk_pr_debug("\tIP via XenStore: %s\n", ip_str); - rc = xs_econf_init(&nfdev->econf, ip_str, a); - free(ip_str); - if (rc) - goto no_conf; - } - - /* maximum queues number */ - int_str = xs_read(XBT_NIL, xendev->otherend, - "multi-queue-max-queues"); - if (!PTRISERR(int_str)) { - nfdev->max_queue_pairs = (uint16_t) strtoul(int_str, NULL, 10); - free(int_str); - } - - /* spit event channels */ - int_str = xs_read(XBT_NIL, xendev->otherend, - "feature-split-event-channels"); - if (!PTRISERR(int_str)) { - nfdev->split_evtchn = (bool) strtoul(int_str, NULL, 10); - free(int_str); - } - - /* TODO netmap */ - -out: - return rc; -no_conf: - if (xendev->otherend) { - free(xendev->otherend); - xendev->otherend = NULL; - } - goto out; -} - -void netfront_xb_fini(struct netfront_dev *nfdev, struct uk_alloc *a) -{ - struct xenbus_device *xendev; - - UK_ASSERT(nfdev != NULL); - - xendev = nfdev->xendev; - UK_ASSERT(xendev != NULL); - - xs_econf_fini(&nfdev->econf, a); - - if (xendev->otherend) { - free(xendev->otherend); - xendev->otherend = NULL; - } -} - -static int xs_write_queue(struct netfront_dev *nfdev, uint16_t queue_id, - xenbus_transaction_t xbt, int write_hierarchical) -{ - struct xenbus_device *xendev = nfdev->xendev; - struct uk_netdev_tx_queue *txq = &nfdev->txqs[queue_id]; - struct uk_netdev_rx_queue *rxq = &nfdev->rxqs[queue_id]; - char *path; - int rc; - - if (write_hierarchical) { - rc = asprintf(&path, "%s/queue-%u", xendev->nodename, queue_id); - if (rc < 0) - goto out; - } else - path = xendev->nodename; - - rc = xs_printf(xbt, path, "tx-ring-ref", "%u", txq->ring_ref); - if (rc < 0) - goto out_path; - - rc = xs_printf(xbt, path, "rx-ring-ref", "%u", rxq->ring_ref); - if (rc < 0) - goto out_path; - - if (nfdev->split_evtchn) { - /* split event channels */ - rc = xs_printf(xbt, path, "event-channel-tx", "%u", - txq->evtchn); - if (rc < 0) - goto out_path; - - rc = xs_printf(xbt, path, "event-channel-rx", "%u", - rxq->evtchn); - if (rc < 0) - goto out_path; - } else { - /* shared event channel */ - rc = xs_printf(xbt, path, "event-channel", "%u", - txq->evtchn); - if (rc < 0) - goto out_path; - } - - rc = 0; - -out_path: - if (write_hierarchical) - free(path); -out: - return rc; -} - -static void xs_delete_queue(struct netfront_dev *nfdev, uint16_t queue_id, - xenbus_transaction_t xbt, int write_hierarchical) -{ - struct xenbus_device *xendev = nfdev->xendev; - char *dir, *path; - int rc; - - if (write_hierarchical) { - rc = asprintf(&dir, "%s/queue-%u", xendev->nodename, queue_id); - if (rc < 0) - return; - } else - dir = xendev->nodename; - - rc = asprintf(&path, "%s/tx-ring-ref", dir); - if (rc < 0) - goto out; - xs_rm(xbt, path); - free(path); - - rc = asprintf(&path, "%s/rx-ring-ref", dir); - if (rc < 0) - goto out; - xs_rm(xbt, path); - free(path); - - if (nfdev->split_evtchn) { - /* split event channels */ - rc = asprintf(&path, "%s/event-channel-tx", dir); - if (rc < 0) - goto out; - xs_rm(xbt, path); - free(path); - rc = asprintf(&path, "%s/event-channel-rx", dir); - if (rc < 0) - goto out; - xs_rm(xbt, path); - free(path); - } else { - /* shared event channel */ - rc = asprintf(&path, "%s/event-channel", dir); - if (rc < 0) - goto out; - xs_rm(xbt, path); - free(path); - } - -out: - if (write_hierarchical) - free(dir); -} - -static int netfront_xb_front_init(struct netfront_dev *nfdev, - xenbus_transaction_t xbt) -{ - struct xenbus_device *xendev = nfdev->xendev; - int rc, i; - - rc = xs_printf(xbt, xendev->nodename, "multi-queue-num-queues", - "%u", nfdev->rxqs_num); - if (rc < 0) - goto out; - - if (nfdev->rxqs_num == 1) { - rc = xs_write_queue(nfdev, 0, xbt, 0); - if (rc) - goto out; - } else { - for (i = 0; i < nfdev->rxqs_num; i++) { - rc = xs_write_queue(nfdev, i, xbt, 1); - if (rc) - goto out; - } - } - - rc = xs_printf(xbt, xendev->nodename, "request-rx-copy", "%u", 1); - if (rc < 0) - goto out; - - rc = 0; - -out: - return rc; -} - -static void netfront_xb_front_fini(struct netfront_dev *nfdev, - xenbus_transaction_t xbt) -{ - int i; - - if (nfdev->rxqs_num == 1) - xs_delete_queue(nfdev, 0, xbt, 0); - else { - for (i = 0; i < nfdev->rxqs_num; i++) - xs_delete_queue(nfdev, i, xbt, 1); - } -} - -int netfront_xb_connect(struct netfront_dev *nfdev) -{ - struct xenbus_device *xendev; - xenbus_transaction_t xbt; - int rc; - - UK_ASSERT(nfdev != NULL); - - xendev = nfdev->xendev; - UK_ASSERT(xendev != NULL); - -again: - rc = xs_transaction_start(&xbt); - if (rc) - goto abort_transaction; - - rc = netfront_xb_front_init(nfdev, xbt); - if (rc) - goto abort_transaction; - - rc = xenbus_switch_state(xbt, xendev, XenbusStateConnected); - if (rc) - goto abort_transaction; - - rc = xs_transaction_end(xbt, 0); - if (rc == -EAGAIN) - goto again; - - rc = netfront_xb_wait_be_connect(nfdev); - if (rc) - netfront_xb_front_fini(nfdev, xbt); - - return rc; - -abort_transaction: - xs_transaction_end(xbt, 1); - - return rc; -} - -int netfront_xb_disconnect(struct netfront_dev *nfdev) -{ - struct xenbus_device *xendev; - int rc; - - UK_ASSERT(nfdev != NULL); - - xendev = nfdev->xendev; - UK_ASSERT(xendev != NULL); - - uk_pr_debug("Close network: backend at %s\n", xendev->otherend); - - rc = xenbus_switch_state(XBT_NIL, xendev, XenbusStateClosing); - if (rc) - goto out; - - rc = netfront_xb_wait_be_disconnect(nfdev); - if (rc) - goto out; - - netfront_xb_front_fini(nfdev, XBT_NIL); - -out: - return rc; -} - -static int be_watch_start(struct xenbus_device *xendev, const char *path) -{ - struct xenbus_watch *watch; - - watch = xs_watch_path(XBT_NIL, path); - if (PTRISERR(watch)) - return PTR2ERR(watch); - - xendev->otherend_watch = watch; - - return 0; -} - -static int be_watch_stop(struct xenbus_device *xendev) -{ - return xs_unwatch(XBT_NIL, xendev->otherend_watch); -} - -#define WAIT_BE_STATE_CHANGE_WHILE_COND(state_cond) \ - do { \ - rc = xs_read_integer(XBT_NIL, be_state_path, \ - (int *) &be_state); \ - if (rc) \ - goto out; \ - while (!rc && (state_cond)) \ - rc = xenbus_wait_for_state_change(be_state_path, \ - &be_state, xendev->otherend_watch); \ - if (rc) \ - goto out; \ - } while (0) - -static int netfront_xb_wait_be_connect(struct netfront_dev *nfdev) -{ - struct xenbus_device *xendev = nfdev->xendev; - char be_state_path[strlen(xendev->otherend) + sizeof("/state")]; - XenbusState be_state; - int rc; - - sprintf(be_state_path, "%s/state", xendev->otherend); - - rc = be_watch_start(xendev, be_state_path); - if (rc) - goto out; - - WAIT_BE_STATE_CHANGE_WHILE_COND(be_state < XenbusStateConnected); - - if (be_state != XenbusStateConnected) { - uk_pr_err("Backend not available, state=%s\n", - xenbus_state_to_str(be_state)); - be_watch_stop(xendev); - } - -out: - return rc; -} - -static int netfront_xb_wait_be_disconnect(struct netfront_dev *nfdev) -{ - struct xenbus_device *xendev = nfdev->xendev; - char be_state_path[strlen(xendev->otherend) + sizeof("/state")]; - XenbusState be_state; - int rc; - - sprintf(be_state_path, "%s/state", xendev->otherend); - - WAIT_BE_STATE_CHANGE_WHILE_COND(be_state < XenbusStateClosing); - - rc = xenbus_switch_state(XBT_NIL, xendev, XenbusStateClosed); - if (rc) - goto out; - - WAIT_BE_STATE_CHANGE_WHILE_COND(be_state < XenbusStateClosed); - - rc = xenbus_switch_state(XBT_NIL, xendev, XenbusStateInitialising); - if (rc) - goto out; - - WAIT_BE_STATE_CHANGE_WHILE_COND(be_state < XenbusStateInitWait || - be_state >= XenbusStateClosed); - - be_watch_stop(xendev); - -out: - return rc; -} diff --git a/plat/xen/emg_console.c b/plat/xen/emg_console.c deleted file mode 100644 index d5868a120daa4d2d0dc3cb76dbdd66ae7dc9097d..0000000000000000000000000000000000000000 --- a/plat/xen/emg_console.c +++ /dev/null @@ -1,88 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause and MIT */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ - -/* - * Some of this code was ported from Mini-OS: - * console/xencons_ring.c and console/console.c - */ -/* - **************************************************************************** - * (C) 2006 - Grzegorz Milos - Cambridge University - **************************************************************************** - * - * File: console.h - * Author: Grzegorz Milos - * Changes: - * - * Date: Mar 2006 - * - * Environment: Xen Minimal OS - * Description: Console interface. - * - * Handles console I/O. Defines printk. - * - **************************************************************************** - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include -#include - -#define __XEN_CONSOLE_IMPL__ -#include "emg_console.h" - -int emg_console_output(const char *str, unsigned int len) -{ - int rc; - - rc = HYPERVISOR_console_io(CONSOLEIO_write, len, DECONST(char *, str)); - if (unlikely(rc < 0)) - return rc; - return len; -} diff --git a/plat/xen/emg_console.h b/plat/xen/emg_console.h deleted file mode 100644 index 0a6e395cee641f0874386b7b476f320146590f41..0000000000000000000000000000000000000000 --- a/plat/xen/emg_console.h +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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_EMG_CONSOLE_H__ -#define __XEN_EMG_CONSOLE_H__ - -#include - -#ifndef __XEN_CONSOLE_IMPL__ -#error Do not include this header directly, use instead. -#endif /* !__XEN_CONSOLE_IMPL__*/ - -#if (CONFIG_XEN_KERNEL_EMG_CONSOLE || CONFIG_XEN_DEBUG_EMG_CONSOLE) -int emg_console_output(const char *str, unsigned int len); -#endif /* (CONFIG_XEN_KERNEL_EMG_CONSOLE || CONFIG_XEN_DEBUG_EMG_CONSOLE) */ - -#if CONFIG_XEN_KERNEL_EMG_CONSOLE -#define emg_console_output_k(str, len) \ - emg_console_output((str), (len)) -#else -#define emg_console_output_k(str, len) \ - (-ENOTSUP) -#endif /* CONFIG_XEN_KERNEL_EMG_CONSOLE */ - -#if CONFIG_XEN_DEBUG_EMG_CONSOLE -#define emg_console_output_d(str, len) \ - emg_console_output((str), (len)) -#else -#define emg_console_output_d(str, len) \ - (-ENOTSUP) -#endif /* CONFIG_XEN_DEBUG_EMG_CONSOLE */ - -#endif /* __XEN_EMG_CONSOLE_H__ */ diff --git a/plat/xen/events.c b/plat/xen/events.c deleted file mode 100644 index 79de96fe324fe911a7f60171daf7ebfa5bd24e36..0000000000000000000000000000000000000000 --- a/plat/xen/events.c +++ /dev/null @@ -1,358 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Authors: Rolf Neugebauer - * Grzegorz Milos - * Costin Lupu - * - * Copyright (c) 2003-2005, Intel Research Cambridge - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. - * - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* - * Deals with events received on event channels - * Ported from Mini-OS - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NR_EVS 1024 - -UK_EVENT(UKPLAT_EVENT_IRQ); - -/* this represents a event handler. Chaining or sharing is not allowed */ -typedef struct _ev_action_t { - evtchn_handler_t handler; - void *data; - uint32_t count; -} ev_action_t; - -struct uk_event_irq_data { - struct __regs *regs; - unsigned long irq; -}; - -static ev_action_t ev_actions[NR_EVS]; -static void default_handler(evtchn_port_t port, struct __regs *regs, - void *data); - -static unsigned long bound_ports[NR_EVS/(8*sizeof(unsigned long))]; - -void unbind_all_ports(void) -{ - uint32_t i; - int cpu = 0; - shared_info_t *s = HYPERVISOR_shared_info; - vcpu_info_t *vcpu_info = &s->vcpu_info[cpu]; - - for (i = 0; i < NR_EVS; i++) { -#if 0 /* TODO revisit after enabling console and xenbus */ - if (i == start_info.console.domU.evtchn || - i == start_info.store_evtchn) - continue; -#endif - - if (__uk_test_and_clear_bit(i, bound_ports)) { - uk_pr_warn("Port %d still bound!\n", i); - unbind_evtchn(i); - } - } - vcpu_info->evtchn_upcall_pending = 0; - vcpu_info->evtchn_pending_sel = 0; -} - -/* - * Demux events to different handlers. - */ -int do_event(evtchn_port_t port, struct __regs *regs) -{ - ev_action_t *action; - int rc; - struct uk_event_irq_data ctx; - - clear_evtchn(port); - - if (port >= NR_EVS) { - uk_pr_err("%s: Port number too large: %d\n", __func__, port); - return 1; - } - - ctx.regs = regs; - ctx.irq = port; - rc = uk_raise_event(UKPLAT_EVENT_IRQ, &ctx); - if (unlikely(rc < 0)) - UK_CRASH("IRQ event handler returned error: %d\n", rc); - if (rc == UK_EVENT_HANDLED) - return 1; - - action = &ev_actions[port]; - action->count++; - - /* call the handler */ - action->handler(port, regs, action->data); - - return 1; - -} - -evtchn_port_t bind_evtchn(evtchn_port_t port, evtchn_handler_t handler, - void *data) -{ - if (ev_actions[port].handler != default_handler) - uk_pr_warn("Handler for port %d already registered, replacing\n", - port); - - ev_actions[port].data = data; - wmb(); - ev_actions[port].handler = handler; - __uk_set_bit(port, bound_ports); - - return port; -} - -void unbind_evtchn(evtchn_port_t port) -{ - struct evtchn_close close; - int rc; - - if (ev_actions[port].handler == default_handler) - uk_pr_warn("No handler for port %d when unbinding\n", port); - mask_evtchn(port); - clear_evtchn(port); - - ev_actions[port].handler = default_handler; - wmb(); - ev_actions[port].data = NULL; - __uk_clear_bit(port, bound_ports); - - close.port = port; - rc = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close); - if (rc) - uk_pr_warn("close_port %u failed rc=%d. ignored\n", port, rc); - -} - -evtchn_port_t bind_virq(uint32_t virq, evtchn_handler_t handler, void *data) -{ - evtchn_bind_virq_t op; - int rc; - - /* Try to bind the virq to a port */ - op.virq = virq; - op.vcpu = smp_processor_id(); - - rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, &op); - if (rc != 0) { - uk_pr_err("Failed to bind virtual IRQ %d with rc=%d\n", - virq, rc); - return -1; - } - bind_evtchn(op.port, handler, data); - return op.port; -} - -evtchn_port_t bind_pirq(uint32_t pirq, int will_share, - evtchn_handler_t handler, void *data) -{ - evtchn_bind_pirq_t op; - int rc; - - /* Try to bind the pirq to a port */ - op.pirq = pirq; - op.flags = will_share ? BIND_PIRQ__WILL_SHARE : 0; - - rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &op); - if (rc != 0) { - uk_pr_err("Failed to bind physical IRQ %d with rc=%d\n", - pirq, rc); - return -1; - } - bind_evtchn(op.port, handler, data); - return op.port; -} - -/* - * Initially all events are without a handler and disabled - */ -void init_events(void) -{ - int i; - - /* initialize event handler */ - for (i = 0; i < NR_EVS; i++) { - ev_actions[i].handler = default_handler; - mask_evtchn(i); - } - - arch_init_events(); -} - -void fini_events(void) -{ - /* Dealloc all events */ - arch_unbind_ports(); - unbind_all_ports(); - arch_fini_events(); -} - -#ifdef CONFIG_MIGRATION /* TODO */ -void suspend_events(void) -{ - unbind_all_ports(); -} -#endif - -static void default_handler(evtchn_port_t port, struct __regs *regs __unused, - void *ignore __unused) -{ - uk_pr_info("[Port %d] - event received\n", port); -} - -/* Create a port available to the pal for exchanging notifications. - * Returns the result of the hypervisor call. - */ - -/* Unfortunate confusion of terminology: the port is unbound as far - * as Xen is concerned, but we automatically bind a handler to it - * from inside mini-os. - */ - -int evtchn_alloc_unbound(domid_t pal, evtchn_handler_t handler, - void *data, evtchn_port_t *port) -{ - int rc; - evtchn_alloc_unbound_t op; - - op.dom = DOMID_SELF; - op.remote_dom = pal; - rc = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op); - if (rc) { - uk_pr_err("alloc_unbound failed with rc=%d\n", rc); - return rc; - } - - *port = bind_evtchn(op.port, handler, data); - - return rc; -} - -/* Connect to a port so as to allow the exchange of notifications with - * the pal. Returns the result of the hypervisor call. - */ -int evtchn_bind_interdomain(domid_t pal, evtchn_port_t remote_port, - evtchn_handler_t handler, void *data, - evtchn_port_t *local_port) -{ - int rc; - evtchn_port_t port; - evtchn_bind_interdomain_t op; - - op.remote_dom = pal; - op.remote_port = remote_port; - rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op); - if (rc) { - uk_pr_err("bind_interdomain failed with rc=%d\n", rc); - return rc; - } - - port = op.local_port; - *local_port = bind_evtchn(port, handler, data); - - return rc; -} - -int evtchn_get_peercontext(evtchn_port_t local_port, char *ctx, int size) -{ - int rc; - uint32_t sid; - struct xen_flask_op op; - - op.cmd = FLASK_GET_PEER_SID; - op.interface_version = XEN_FLASK_INTERFACE_VERSION; - op.u.peersid.evtchn = local_port; - rc = HYPERVISOR_xsm_op(&op); - if (rc) - return rc; - - sid = op.u.peersid.sid; - op.cmd = FLASK_SID_TO_CONTEXT; - op.u.sid_context.sid = sid; - op.u.sid_context.size = size; - set_xen_guest_handle(op.u.sid_context.context, ctx); - rc = HYPERVISOR_xsm_op(&op); - - return rc; -} - -inline void mask_evtchn(evtchn_port_t port) -{ - shared_info_t *s = HYPERVISOR_shared_info; - - uk_set_bit(port, &s->evtchn_mask[0]); -} - -inline void unmask_evtchn(evtchn_port_t port) -{ - shared_info_t *s = HYPERVISOR_shared_info; - vcpu_info_t *vcpu_info = &s->vcpu_info[smp_processor_id()]; - - uk_clear_bit(port, &s->evtchn_mask[0]); - - /* - * The following is basically the equivalent of 'hw_resend_irq'. - * Just like a real IO-APIC we 'lose the interrupt edge' if the - * channel is masked. - */ - if (uk_test_bit(port, &s->evtchn_pending[0]) && - !uk_test_and_set_bit(port / (sizeof(unsigned long) * 8), - &vcpu_info->evtchn_pending_sel)) { - vcpu_info->evtchn_upcall_pending = 1; -#ifdef XEN_HAVE_PV_UPCALL_MASK - if (!vcpu_info->evtchn_upcall_mask) -#endif - ukplat_lcpu_irqs_handle_pending(); - } -} - -inline void clear_evtchn(evtchn_port_t port) -{ - shared_info_t *s = HYPERVISOR_shared_info; - - uk_clear_bit(port, &s->evtchn_pending[0]); -} - -struct uk_alloc; - -int ukplat_irq_init(struct uk_alloc *a __unused) -{ - UK_ASSERT(ukplat_lcpu_irqs_disabled()); - - /* Nothing for now */ - return 0; -} diff --git a/plat/xen/gnttab.c b/plat/xen/gnttab.c deleted file mode 100644 index 23c0a532505a542797eb3d67e98e3c0eed55bdb5..0000000000000000000000000000000000000000 --- a/plat/xen/gnttab.c +++ /dev/null @@ -1,284 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - **************************************************************************** - * (C) 2006 - Cambridge University - **************************************************************************** - * - * File: gnttab.c - * Author: Steven Smith (sos22@cam.ac.uk) - * Changes: Grzegorz Milos (gm281@cam.ac.uk) - * - * Date: July 2006 - * - * Environment: Xen Minimal OS - * Description: Simple grant tables implementation. About as stupid as it's - * possible to be and still work. - * - **************************************************************************** - */ -#include -#include -#ifdef DBGGNT -#include -#endif -#include -#include -#include -#include -#include -#include - -#include - -/* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */ -#define NR_GRANT_FRAMES 4 -#define NR_GRANT_ENTRIES \ - (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_v1_t)) - -static struct gnttab { - int initialized; - struct uk_semaphore sem; - grant_entry_v1_t *table; - grant_ref_t gref_list[NR_GRANT_ENTRIES]; -#ifdef DBGGNT - char inuse[NR_GRANT_ENTRIES]; -#endif -} gnttab; - - -static grant_ref_t get_free_entry(void) -{ - grant_ref_t gref; - unsigned long flags; - - uk_semaphore_down(&gnttab.sem); - - flags = ukplat_lcpu_save_irqf(); - - gref = gnttab.gref_list[0]; - UK_ASSERT(gref >= GNTTAB_NR_RESERVED_ENTRIES && - gref < NR_GRANT_ENTRIES); - gnttab.gref_list[0] = gnttab.gref_list[gref]; -#ifdef DBGGNT - UK_ASSERT(!gnttab.inuse[gref]); - gnttab.inuse[gref] = 1; -#endif - - ukplat_lcpu_restore_irqf(flags); - - return gref; -} - -static void put_free_entry(grant_ref_t gref) -{ - unsigned long flags; - - flags = ukplat_lcpu_save_irqf(); - -#ifdef DBGGNT - UK_ASSERT(gnttab.inuse[gref]); - gnttab.inuse[gref] = 0; -#endif - gnttab.gref_list[gref] = gnttab.gref_list[0]; - gnttab.gref_list[0] = gref; - - ukplat_lcpu_restore_irqf(flags); - - uk_semaphore_up(&gnttab.sem); -} - -static void gnttab_grant_init(grant_ref_t gref, domid_t domid, - unsigned long mfn) -{ - gnttab.table[gref].frame = mfn; - gnttab.table[gref].domid = domid; - - /* Memory barrier */ - wmb(); -} - -static void gnttab_grant_permit_access(grant_ref_t gref, domid_t domid, - unsigned long mfn, int readonly) -{ - gnttab_grant_init(gref, domid, mfn); - readonly *= GTF_readonly; - gnttab.table[gref].flags = GTF_permit_access | readonly; -} - -grant_ref_t gnttab_grant_access(domid_t domid, unsigned long mfn, - int readonly) -{ - grant_ref_t gref = get_free_entry(); - - gnttab_grant_permit_access(gref, domid, mfn, readonly); - - return gref; -} - -grant_ref_t gnttab_grant_transfer(domid_t domid, unsigned long mfn) -{ - grant_ref_t gref = get_free_entry(); - - gnttab_grant_init(gref, domid, mfn); - gnttab.table[gref].flags = GTF_accept_transfer; - - return gref; -} - -/* Reset flags to zero in order to stop using the grant */ -static int gnttab_reset_flags(grant_ref_t gref) -{ - __u16 flags, nflags; - __u16 *pflags; - - pflags = &gnttab.table[gref].flags; - nflags = *pflags; - - do { - if ((flags = nflags) & (GTF_reading | GTF_writing)) { - uk_pr_warn("gref=%u still in use! (0x%x)\n", - gref, flags); - return 0; - } - } while ((nflags = uk_compare_exchange_sync(pflags, flags, 0)) - != flags); - - return 1; -} - -int gnttab_update_grant(grant_ref_t gref, - domid_t domid, unsigned long mfn, - int readonly) -{ - int rc; - - UK_ASSERT(gref >= GNTTAB_NR_RESERVED_ENTRIES && - gref < NR_GRANT_ENTRIES); - - rc = gnttab_reset_flags(gref); - if (!rc) - return rc; - - gnttab_grant_permit_access(gref, domid, mfn, readonly); - - return 1; -} - -int gnttab_end_access(grant_ref_t gref) -{ - int rc; - - UK_ASSERT(gref >= GNTTAB_NR_RESERVED_ENTRIES && - gref < NR_GRANT_ENTRIES); - - rc = gnttab_reset_flags(gref); - if (!rc) - return rc; - - put_free_entry(gref); - - return 1; -} - -unsigned long gnttab_end_transfer(grant_ref_t gref) -{ - unsigned long frame; - __u16 flags; - __u16 *pflags; - - UK_ASSERT(gref >= GNTTAB_NR_RESERVED_ENTRIES && - gref < NR_GRANT_ENTRIES); - - pflags = &gnttab.table[gref].flags; - while (!((flags = *pflags) & GTF_transfer_committed)) { - if (uk_compare_exchange_sync(pflags, flags, 0) == flags) { - uk_pr_info("Release unused transfer grant.\n"); - put_free_entry(gref); - return 0; - } - } - - /* If a transfer is in progress then wait until it is completed. */ - while (!(flags & GTF_transfer_completed)) - flags = *pflags; - - /* Read the frame number /after/ reading completion status. */ - rmb(); - frame = gnttab.table[gref].frame; - - put_free_entry(gref); - - return frame; -} - -grant_ref_t gnttab_alloc_and_grant(void **map, struct uk_alloc *a) -{ - void *page; - unsigned long mfn; - grant_ref_t gref; - - UK_ASSERT(map != NULL); - UK_ASSERT(a != NULL); - - page = uk_palloc(a, 1); - if (page == NULL) - return GRANT_INVALID_REF; - - mfn = virt_to_mfn(page); - gref = gnttab_grant_access(0, mfn, 0); - - *map = page; - - return gref; -} - -static const char * const gnttabop_error_msgs[] = GNTTABOP_error_msgs; - -const char *gnttabop_error(__s16 status) -{ - status = -status; - if (status < 0 || (__u16) status >= ARRAY_SIZE(gnttabop_error_msgs)) - return "bad status"; - else - return gnttabop_error_msgs[status]; -} - -void gnttab_init(void) -{ - grant_ref_t gref; - - UK_ASSERT(gnttab.initialized == 0); - - uk_semaphore_init(&gnttab.sem, 0); - -#ifdef DBGGNT - memset(gnttab.inuse, 1, sizeof(gnttab.inuse)); -#endif - for (gref = GNTTAB_NR_RESERVED_ENTRIES; gref < NR_GRANT_ENTRIES; gref++) - put_free_entry(gref); - - gnttab.table = gnttab_arch_init(NR_GRANT_FRAMES); - if (gnttab.table == NULL) - UK_CRASH("Failed to initialize grant table\n"); - - uk_pr_info("Grant table mapped at %p.\n", gnttab.table); - - gnttab.initialized = 1; -} - -void gnttab_fini(void) -{ - struct gnttab_setup_table setup; - int rc; - - setup.dom = DOMID_SELF; - setup.nr_frames = 0; - - rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1); - if (rc) { - uk_pr_err("Hypercall error: %d\n", rc); - return; - } - - gnttab.initialized = 0; -} diff --git a/plat/xen/hv_console.c b/plat/xen/hv_console.c deleted file mode 100644 index f2698d513c06d00b34b9db8d684affa04382b699..0000000000000000000000000000000000000000 --- a/plat/xen/hv_console.c +++ /dev/null @@ -1,244 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause and MIT */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ - -/* - * Some of this code was ported from Mini-OS: - * console/xencons_ring.c and console/console.c - */ -/* - **************************************************************************** - * (C) 2006 - Grzegorz Milos - Cambridge University - **************************************************************************** - * - * File: console.h - * Author: Grzegorz Milos - * Changes: - * - * Date: Mar 2006 - * - * Environment: Xen Minimal OS - * Description: Console interface. - * - * Handles console I/O. Defines printk. - * - **************************************************************************** - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include -#include -#include -#include -#include -#include -#include - -#define __XEN_CONSOLE_IMPL__ -#include "hv_console.h" - -#include -#include -#include - -#if (defined __X86_32__) || (defined __X86_64__) -#include -#include -#if defined __X86_32__ -#include -#elif defined __X86_64__ -#include -#endif -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#include -#endif -#include -#include -#include - -static struct xencons_interface *console_ring; -static uint32_t console_evtchn; -static int console_ready; - -#ifdef CONFIG_PARAVIRT -void hv_console_prepare(void) -{ - console_ring = mfn_to_virt(HYPERVISOR_start_info->console.domU.mfn); - console_evtchn = HYPERVISOR_start_info->console.domU.evtchn; -} -#endif - -/* - * hv_console_output operates in two modes: buffered and initialized. - * The buffered mode is automatically activated after - * _libxenplat_prepare_console() was called and we know where the console ring - * is. The output string is put to the console ring until the ring is full. Any - * further characters are discarded. Since the event channel is not initialized - * yet, the backend is not notified. This mode is introduced to support early - * printing, even before events are not initialized. - * _libxenplat_init_console() finalizes the initialization and enables - * the event channel. From now on, the console backend is notified whenever - * we put characters on the console ring. Whenever this ring is full and there - * are still characters that should be printed, we are entering a busy loop and - * wait for the backend to make us space again. Of course this is slow: do not - * print so much! ;-) - */ -int hv_console_output(const char *str, unsigned int len) -{ - unsigned int sent = 0; - XENCONS_RING_IDX cons, prod; - - if (unlikely(!console_ring)) - return sent; - -retry: - cons = console_ring->out_cons; - prod = console_ring->out_prod; - - mb(); /* make sure we have cons & prod before touching the ring */ - UK_BUGON((prod - cons) > sizeof(console_ring->out)); - - while ((sent < len) && ((prod - cons) < sizeof(console_ring->out))) { - if (str[sent] == '\n') { - /* prepend '\r' for converting '\n' to '\r''\n' */ - if ((prod + 1 - cons) >= sizeof(console_ring->out)) - break; /* not enough space for '\r' and '\n'! */ - - console_ring->out[MASK_XENCONS_IDX(prod++, - console_ring->out)] = - '\r'; - } - - console_ring->out[MASK_XENCONS_IDX(prod++, console_ring->out)] = - str[sent]; - sent++; - } - wmb(); /* ensure characters are written before increasing out_prod */ - console_ring->out_prod = prod; - - /* Is the console fully initialized? - * Are we able to notify the backend? - */ - if (likely(console_ready && console_evtchn)) { - notify_remote_via_evtchn(console_evtchn); - - /* There are still bytes left to send out? If yes, do not - * discard them, retry sending (enters busy waiting) - */ - if (sent < len) - goto retry; - } - return sent; -} - -void hv_console_flush(void) -{ - struct xencons_interface *intf; - - if (!console_ready) - return; - - intf = console_ring; - if (unlikely(!intf)) - return; - - while (intf->out_cons < intf->out_prod) - barrier(); -} - -int hv_console_input(char *str, unsigned int maxlen) -{ - int read = 0; - XENCONS_RING_IDX cons, prod; - - cons = console_ring->in_cons; - prod = console_ring->in_prod; - rmb(); /* make sure in_cons, in_prod are read before enqueuing */ - UK_BUGON((prod - cons) > sizeof(console_ring->in)); - - while (cons != prod && maxlen > 0) { - *(str + read) = *(console_ring->in+ - MASK_XENCONS_IDX(cons, console_ring->in)); - read++; - cons++; - maxlen--; - } - - wmb(); /* ensure finished operation before updating in_cons */ - console_ring->in_cons = cons; - - return read; -} - -static void hv_console_event(evtchn_port_t port __unused, - struct __regs *regs __unused, - void *data __unused) -{ - /* NOT IMPLEMENTED YET */ -} - -void hv_console_init(void) -{ - int err; - - UK_ASSERT(console_ring != NULL); - - uk_pr_debug("hv_console @ %p (evtchn: %"PRIu32")\n", - console_ring, console_evtchn); - - err = bind_evtchn(console_evtchn, hv_console_event, NULL); - if (err <= 0) - UK_CRASH("Failed to bind event channel for hv_console: %i\n", - err); - unmask_evtchn(console_evtchn); - - console_ready = 1; /* enable notification of backend */ - /* flush queued output */ - notify_remote_via_evtchn(console_evtchn); -} diff --git a/plat/xen/hv_console.h b/plat/xen/hv_console.h deleted file mode 100644 index 83686659156b6e1cc115d5be6f6168365d49962a..0000000000000000000000000000000000000000 --- a/plat/xen/hv_console.h +++ /dev/null @@ -1,76 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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_HV_CONSOLE_H__ -#define __XEN_HV_CONSOLE_H__ - -#include - -#ifndef __XEN_CONSOLE_IMPL__ -#error Do not include this header directly, use instead -#endif /* !__XEN_CONSOLE_IMPL__*/ - -#if (CONFIG_XEN_KERNEL_HV_CONSOLE || CONFIG_XEN_DEBUG_HV_CONSOLE) -void hv_console_prepare(void); -void hv_console_init(void); -int hv_console_output(const char *str, unsigned int len); -void hv_console_flush(void); -int hv_console_input(char *str, unsigned int maxlen); -#else /* (CONFIG_XEN_KERNEL_HV_CONSOLE || CONFIG_XEN_DEBUG_HV_CONSOLE) */ -#define hv_console_prepare() \ - do {} while (0) -#define hv_console_init() \ - do {} while (0) -#define hv_console_flush() \ - do {} while (0) -#define hv_console_input(str, maxlen) \ - (-ENOTSUP) -#endif /* (CONFIG_XEN_KERNEL_HV_CONSOLE || CONFIG_XEN_DEBUG_HV_CONSOLE) */ - -#if CONFIG_XEN_KERNEL_HV_CONSOLE -#define hv_console_output_k(str, len) \ - hv_console_output((str), (len)) -#else -#define hv_console_output_k(str, len) \ - (-ENOTSUP) -#endif /* CONFIG_XEN_KERNEL_HV_CONSOLE */ - -#if CONFIG_XEN_DEBUG_HV_CONSOLE -#define hv_console_output_d(str, len) \ - hv_console_output((str), (len)) -#else -#define hv_console_output_d(str, len) \ - (-ENOTSUP) -#endif /* CONFIG_XEN_DEBUG_HV_CONSOLE */ - -#endif /* __XEN_HV_CONSOLE_H__ */ diff --git a/plat/xen/hypervisor.c b/plat/xen/hypervisor.c deleted file mode 100644 index 998d2c52ab50a8031db35c74d58c90bc765fec8b..0000000000000000000000000000000000000000 --- a/plat/xen/hypervisor.c +++ /dev/null @@ -1,108 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/****************************************************************************** - * hypervisor.c - * - * Communication to/from hypervisor. - * - * Copyright (c) 2002-2003, K A Fraser - * Copyright (c) 2005, Grzegorz Milos, gm281@cam.ac.uk,Intel Research Cambridge - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include -#include - -#include -#include -#if (defined __X86_32__) || (defined __X86_64__) -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#endif - -#include -#include -#include -#include -#include - -#define active_evtchns(sh, idx) \ - ((sh)->evtchn_pending[idx] & ~(sh)->evtchn_mask[idx]) - -int in_callback; - -void do_hypervisor_callback(struct __regs *regs) -{ - unsigned long l1, l2, l1i, l2i; - unsigned int port; - int cpu = 0; - shared_info_t *s = HYPERVISOR_shared_info; - vcpu_info_t *vcpu_info = &s->vcpu_info[cpu]; - - in_callback = 1; - - vcpu_info->evtchn_upcall_pending = 0; -/* NB x86. No need for a barrier here -- XCHG is a barrier on x86. */ -#if !(defined __X86_32__ || defined __X86_64__) - /* Clear master flag /before/ clearing selector flag. */ - wmb(); -#endif - l1 = uk_exchange_n(&vcpu_info->evtchn_pending_sel, 0); - while (l1 != 0) { - l1i = uk_ffsl(l1); - l1 &= ~(1UL << l1i); - - while ((l2 = active_evtchns(s, l1i)) != 0) { - l2i = uk_ffsl(l2); - l2 &= ~(1UL << l2i); - - port = (l1i * (sizeof(unsigned long) * 8)) + l2i; - do_event(port, regs); - } - } - - in_callback = 0; -} - -void ukplat_lcpu_irqs_handle_pending(void) -{ -#ifdef XEN_HAVE_PV_UPCALL_MASK - int save; -#endif - vcpu_info_t *vcpu; - - vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; -#ifdef XEN_HAVE_PV_UPCALL_MASK - save = vcpu->evtchn_upcall_mask; -#endif - - while (vcpu->evtchn_upcall_pending) { -#ifdef XEN_HAVE_PV_UPCALL_MASK - vcpu->evtchn_upcall_mask = 1; -#endif - barrier(); - do_hypervisor_callback(NULL); - barrier(); -#ifdef XEN_HAVE_PV_UPCALL_MASK - vcpu->evtchn_upcall_mask = save; - barrier(); -#endif - }; -} diff --git a/plat/xen/include/common/console.h b/plat/xen/include/common/console.h deleted file mode 100644 index add6a63d7460c695b8b009d0918a01557696cbcb..0000000000000000000000000000000000000000 --- a/plat/xen/include/common/console.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation. - * All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __CONSOLE_H__ -#define __CONSOLE_H__ - -/* keeps buffering console message - * (on PV: start_info need to be loaded) - */ -void prepare_console(void); - -/* initializes the console, sends out buffered messages - * (event system has to be initialized) - */ -void init_console(void); - - -void flush_console(void); - -#endif /* __CONSOLE_H__ */ diff --git a/plat/xen/include/common/events.h b/plat/xen/include/common/events.h deleted file mode 100644 index f5d866113cf3c75e650a7b1f8acb6ff6ed154e67..0000000000000000000000000000000000000000 --- a/plat/xen/include/common/events.h +++ /dev/null @@ -1,106 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Authors: Rolf Neugebauer - * Grzegorz Milos - * Costin Lupu - * - * Copyright (c) 2003-2005, Intel Research Cambridge - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. - * - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* - * Deals with events received on event channels - * Ported from Mini-OS - */ - -#ifndef _EVENTS_H_ -#define _EVENTS_H_ - -#if defined(__X86_32__) || defined(__x86_64__) -#include -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#else -#error "Unsupported architecture" -#endif -#include -#include - - -typedef void (*evtchn_handler_t)(evtchn_port_t, struct __regs *, void *); - -/* prototypes */ -void arch_init_events(void); - -/* Called by fini_events to close any ports opened by arch-specific code. */ -void arch_unbind_ports(void); - -void arch_fini_events(void); - -int do_event(evtchn_port_t port, struct __regs *regs); -evtchn_port_t bind_virq(uint32_t virq, evtchn_handler_t handler, void *data); -evtchn_port_t bind_pirq(uint32_t pirq, int will_share, - evtchn_handler_t handler, void *data); -evtchn_port_t bind_evtchn(evtchn_port_t port, evtchn_handler_t handler, - void *data); -void unbind_evtchn(evtchn_port_t port); - -/* Disable events for by setting the masking bit */ -void mask_evtchn(evtchn_port_t port); - -/* - * Enable events for by unsetting the masking bit. - * If pending events are present, call ukplat_lcpu_irqs_handle_pending - */ -void unmask_evtchn(evtchn_port_t port); - -/* - * Clear pending events from by unsetting the pending - * events bit - */ -void clear_evtchn(evtchn_port_t port); - -void init_events(void); -int evtchn_alloc_unbound(domid_t pal, evtchn_handler_t handler, - void *data, evtchn_port_t *port); -int evtchn_bind_interdomain(domid_t pal, evtchn_port_t remote_port, - evtchn_handler_t handler, void *data, - evtchn_port_t *local_port); -int evtchn_get_peercontext(evtchn_port_t local_port, char *ctx, int size); -void unbind_all_ports(void); - -static inline int notify_remote_via_evtchn(evtchn_port_t port) -{ - evtchn_send_t op; - - op.port = port; - return HYPERVISOR_event_channel_op(EVTCHNOP_send, &op); -} - -void fini_events(void); -#ifdef CONFIG_MIGRATION /* TODO wip */ -void suspend_events(void); -#endif - -#endif /* _EVENTS_H_ */ diff --git a/plat/xen/include/common/gnttab.h b/plat/xen/include/common/gnttab.h deleted file mode 100644 index 5a830ed6181978a64768dd1698933e030868a6a7..0000000000000000000000000000000000000000 --- a/plat/xen/include/common/gnttab.h +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* Taken from Mini-OS */ - -#ifndef __GNTTAB_H__ -#define __GNTTAB_H__ - -#include - -#ifdef CONFIG_XEN_GNTTAB - -#include -#include - -#define GRANT_INVALID_REF 0 - -void gnttab_init(void); -void gnttab_fini(void); - -grant_ref_t gnttab_alloc_and_grant(void **map, struct uk_alloc *a); -grant_ref_t gnttab_grant_access(domid_t domid, unsigned long pfn, - int readonly); -grant_ref_t gnttab_grant_transfer(domid_t domid, unsigned long pfn); -int gnttab_update_grant(grant_ref_t gref, - domid_t domid, unsigned long pfn, - int readonly); -unsigned long gnttab_end_transfer(grant_ref_t gref); -int gnttab_end_access(grant_ref_t gref); - -const char *gnttabop_error(__s16 status); - -grant_entry_v1_t *gnttab_arch_init(int nr_grant_frames); - -#endif /* CONFIG_XEN_GNTTAB */ - -#endif /* !__GNTTAB_H__ */ diff --git a/plat/xen/include/common/hypervisor.h b/plat/xen/include/common/hypervisor.h deleted file mode 100644 index d131d6f307b8fb8c465d44146f20e019ae231675..0000000000000000000000000000000000000000 --- a/plat/xen/include/common/hypervisor.h +++ /dev/null @@ -1,60 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Authors: K A Fraser - * Grzegorz Milos - * Aravindh Puthiyaparambil - * - * Copyright (c) 2002, K A Fraser - * Copyright (c) 2005, Grzegorz Milos - * - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* - * Hypervisor handling. - * Ported from Mini-OS - */ - -#ifndef _HYPERVISOR_H_ -#define _HYPERVISOR_H_ - -#include -#include -#if defined(__X86_32__) || defined(__x86_64__) -#include -#include -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#include -#else -#error "Unsupported architecture" -#endif -#include -#include - -void do_hypervisor_callback(struct __regs *regs); - -extern int in_callback; - -extern struct shared_info *HYPERVISOR_shared_info; - -#endif /* __HYPERVISOR_H__ */ diff --git a/plat/xen/include/xen-arm/hypercall.h b/plat/xen/include/xen-arm/hypercall.h deleted file mode 100644 index 176b837683707afada15c50bb6ee12bd243f0c20..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-arm/hypercall.h +++ /dev/null @@ -1,75 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/****************************************************************************** - * hypercall-arm.h - * - * Copied from XenLinux. - * - * Copyright (c) 2002-2004, K A Fraser - * - * 64-bit updates: - * Benjamin Liu - * Jun Nakajima - * - * This file may be distributed separately from the Linux kernel, or - * incorporated into other software packages, subject to the following license: - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this source file (the "Software"), to deal in the Software without - * restriction, including without limitation the rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __HYPERCALL_ARM_H__ -#define __HYPERCALL_ARM_H__ - -#include -#include -#include -#include -#include - -int HYPERVISOR_sched_op(int cmd, void *arg); - -static inline int HYPERVISOR_shutdown(unsigned int reason) -{ - struct sched_shutdown shutdown = {.reason = reason}; - - return (int)HYPERVISOR_sched_op(SCHEDOP_shutdown, &shutdown); -} - -int HYPERVISOR_memory_op(unsigned int cmd, void *arg); - -int HYPERVISOR_event_channel_op(int cmd, void *op); - -int HYPERVISOR_xen_version(int cmd, void *arg); - -int HYPERVISOR_console_io(int cmd, int count, char *str); - -int HYPERVISOR_physdev_op(void *physdev_op); - -int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count); - -int HYPERVISOR_vcpu_op(int cmd, int vcpuid, void *extra_args); - -int HYPERVISOR_sysctl(unsigned long op); - -int HYPERVISOR_domctl(unsigned long op); - -int HYPERVISOR_hvm_op(unsigned long op, void *arg); - -int HYPERVISOR_xsm_op(struct xen_flask_op *); - -#endif /* __HYPERCALL_ARM_H__ */ diff --git a/plat/xen/include/xen-arm/mm.h b/plat/xen/include/xen-arm/mm.h deleted file mode 100644 index 659de84333261acdb374b430fc71402c283c0c11..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-arm/mm.h +++ /dev/null @@ -1,61 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - * - */ -/* Taken from Mini-OS */ - -#ifndef _ARCH_MM_H_ -#define _ARCH_MM_H_ - -#include -#include -#include - -typedef uint64_t paddr_t; -extern int _boot_stack[]; -extern int _boot_stack_end[]; -/* Add this to a virtual address to get the physical address (wraps at 4GB) */ -extern uint32_t _libxenplat_paddr_offset; - -#define L1_PAGETABLE_SHIFT 12 - -#define L1_PROT 0 - -#define to_phys(x) (((uintptr_t)(x)+_libxenplat_paddr_offset) & 0xffffffff) -#define to_virt(x) ((void *)(((uintptr_t)(x)-_libxenplat_paddr_offset) & 0xffffffff)) - -#define PFN_UP(x) (unsigned long)(((x) + __PAGE_SIZE-1) >> L1_PAGETABLE_SHIFT) -#define PFN_DOWN(x) (unsigned long)((x) >> L1_PAGETABLE_SHIFT) -#define PFN_PHYS(x) ((uint64_t)(x) << L1_PAGETABLE_SHIFT) -#define PHYS_PFN(x) (unsigned long)((x) >> L1_PAGETABLE_SHIFT) - -#define virt_to_pfn(_virt) (PFN_DOWN(to_phys(_virt))) -#define virt_to_mfn(_virt) (PFN_DOWN(to_phys(_virt))) -#define mfn_to_virt(_mfn) (to_virt(PFN_PHYS(_mfn))) -#define pfn_to_virt(_pfn) (to_virt(PFN_PHYS(_pfn))) - -#define virtual_to_mfn(_virt) virt_to_mfn(_virt) - -#define arch_mm_init(a) - -#endif diff --git a/plat/xen/include/xen-arm/os.h b/plat/xen/include/xen-arm/os.h deleted file mode 100644 index f5ecb7a97c578eef4419a64f5b14feea93d76c40..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-arm/os.h +++ /dev/null @@ -1,113 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - * - */ -/* Taken from Mini-OS */ - -#ifndef _OS_H_ -#define _OS_H_ - -#include -#include -#include -#include -#include -#include - -#ifndef __ASSEMBLY__ - -typedef struct __pte pte_t; -#define __pte(x) npte(x) - -typedef __s64 quad_t; -typedef __u64 u_quad_t; -typedef __u64 uintmax_t; -typedef __s64 intmax_t; - -typedef __sptr intptr_t; -typedef __uptr uintptr_t; -typedef __sptr ptrdiff_t; - -typedef unsigned char u_char; -typedef unsigned int u_int; -typedef unsigned long u_long; - -#include -#include -#include - -#define PAGE_SHIFT __PAGE_SHIFT -#define PAGE_MASK __PAGE_MASK -#define PAGE_SIZE __PAGE_SIZE - -#define STACK_SIZE_PAGE_ORDER __STACK_SIZE_PAGE_ORDER -#define STACK_SIZE __STACK_SIZE - -void arch_fini(void); -void timer_handler(evtchn_port_t port, struct pt_regs *regs, void *ign); - -#define smp_processor_id() 0 - -extern void *HYPERVISOR_dtb; -extern shared_info_t *HYPERVISOR_shared_info; - -// disable interrupts -static inline void local_irq_disable(void) -{ - __asm__ __volatile__("cpsid i" ::: "memory"); -} - -// enable interrupts -static inline void local_irq_enable(void) -{ - __asm__ __volatile__("cpsie i" ::: "memory"); -} - -#define local_irq_save(x) \ - { \ - __asm__ __volatile__("mrs %0, cpsr;cpsid i" \ - : "=r"(x)::"memory"); \ - } - -#define local_irq_restore(x) \ - { \ - __asm__ __volatile__("msr cpsr_c, %0" ::"r"(x) : "memory"); \ - } - -#define local_save_flags(x) \ - { \ - __asm__ __volatile__("mrs %0, cpsr" : "=r"(x)::"memory"); \ - } - -static inline int irqs_disabled(void) -{ - int x; - - local_save_flags(x); - return x & 0x80; -} - -void block_domain(__snsec until); - -#endif -#endif diff --git a/plat/xen/include/xen-arm/setup.h b/plat/xen/include/xen-arm/setup.h deleted file mode 100644 index eb6154cd2746e56de0bdf205dd955cdbe787369a..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-arm/setup.h +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __SETUP_H__ -#define __SETUP_H__ - -#include - -extern const unsigned int _libxenplat_mrd_num; -extern struct ukplat_memregion_desc _libxenplat_mrd[]; - -#endif /* __SETUP_H__ */ diff --git a/plat/xen/include/xen-arm/smp.h b/plat/xen/include/xen-arm/smp.h deleted file mode 100644 index 5f15c8a44f8e123f2764e6fac5f5712083b60d08..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-arm/smp.h +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 PLAT_XEN_INCLUDE_XEN_ARM_SMP_H_ -#define PLAT_XEN_INCLUDE_XEN_ARM_SMP_H_ - -#define smp_processor_id() 0 - -#endif /* PLAT_XEN_INCLUDE_XEN_ARM_SMP_H_ */ diff --git a/plat/xen/include/xen-arm/traps.h b/plat/xen/include/xen-arm/traps.h deleted file mode 100644 index 993664e27dba65b9e16c5eddd59128dcbbc45c4d..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-arm/traps.h +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 _TRAPS_H_ -#define _TRAPS_H_ - -#include - -#define pt_regs __regs - -#endif diff --git a/plat/xen/include/xen-x86/hypercall.h b/plat/xen/include/xen-x86/hypercall.h deleted file mode 100644 index 541b23b35b999510fd60d8befc93ed11d8164800..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/hypercall.h +++ /dev/null @@ -1,51 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/****************************************************************************** - * hypercall.h - * - * architecture-independent hypercall related macros and definitions - * copied from os.h - */ - -#ifndef __HYPERCALL_H__ -#define __HYPERCALL_H__ - -#ifdef __X86_32__ -#include -#endif -#ifdef __X86_64__ -#include -#endif -#include - -/* - * TODO There are more common hypercalls in both 32 and 64 headers. - */ - -static inline int HYPERVISOR_xsm_op(struct xen_flask_op *op) -{ - return _hypercall1(int, xsm_op, op); -} - -#endif /* __HYPERCALL_H__ */ diff --git a/plat/xen/include/xen-x86/hypercall32.h b/plat/xen/include/xen-x86/hypercall32.h deleted file mode 100644 index 662ebb228cff00e9435c42d1e5d7fbca2528522b..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/hypercall32.h +++ /dev/null @@ -1,354 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/****************************************************************************** - * hypercall-x86_32.h - * - * Copied from XenLinux. - * - * Copyright (c) 2002-2004, K A Fraser - * - * This file may be distributed separately from the Linux kernel, or - * incorporated into other software packages, subject to the following license: - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this source file (the "Software"), to deal in the Software without - * restriction, including without limitation the rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __HYPERCALL_X86_32_H__ -#define __HYPERCALL_X86_32_H__ - -#include -#include -#include -#include -#include - -#define PAGE_SHIFT __PAGE_SHIFT -#define PAGE_MASK __PAGE_MASK -#define PAGE_SIZE __PAGE_SIZE - -#define STACK_SIZE_PAGE_ORDER __STACK_SIZE_PAGE_ORDER -#define STACK_SIZE __STACK_SIZE - -#ifndef STR -#define __STR(x) #x -#define STR(x) __STR(x) -#endif - -typedef struct __pte pte_t; -#define __pte(x) npte(x) - -extern char hypercall_page[__PAGE_SIZE]; - -#define _hypercall0(type, name) \ -({ \ - long __res; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res) \ - : \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall1(type, name, a1) \ -({ \ - long __res, __ign1; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=b" (__ign1) \ - : "1" ((long)(a1)) \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall2(type, name, a1, a2) \ -({ \ - long __res, __ign1, __ign2; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2) \ - : "1" ((long)(a1)), "2" ((long)(a2)) \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall3(type, name, a1, a2, a3) \ -({ \ - long __res, __ign1, __ign2, __ign3; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)) \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall4(type, name, a1, a2, a3, a4) \ -({ \ - long __res, __ign1, __ign2, __ign3, __ign4; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3), "=S" (__ign4) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "4" ((long)(a4)) \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall5(type, name, a1, a2, a3, a4, a5) \ -({ \ - long __res, __ign1, __ign2, __ign3, __ign4, __ign5; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3), "=S" (__ign4), "=D" (__ign5) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "4" ((long)(a4)), \ - "5" ((long)(a5)) \ - : "memory"); \ - (type)__res; \ -}) - -static inline int -HYPERVISOR_set_trap_table( - trap_info_t *table) -{ - return _hypercall1(int, set_trap_table, table); -} - -static inline int -HYPERVISOR_mmu_update( - mmu_update_t *req, int count, int *success_count, domid_t domid) -{ - return _hypercall4(int, mmu_update, req, count, success_count, domid); -} - -static inline int -HYPERVISOR_mmuext_op( - struct mmuext_op *op, int count, int *success_count, domid_t domid) -{ - return _hypercall4(int, mmuext_op, op, count, success_count, domid); -} - -static inline int -HYPERVISOR_set_gdt( - unsigned long *frame_list, int entries) -{ - return _hypercall2(int, set_gdt, frame_list, entries); -} - -static inline int -HYPERVISOR_stack_switch( - unsigned long ss, unsigned long esp) -{ - return _hypercall2(int, stack_switch, ss, esp); -} - -static inline int -HYPERVISOR_set_callbacks( - unsigned long event_selector, unsigned long event_address, - unsigned long failsafe_selector, unsigned long failsafe_address) -{ - return _hypercall4(int, set_callbacks, - event_selector, event_address, - failsafe_selector, failsafe_address); -} - -static inline int -HYPERVISOR_fpu_taskswitch( - int set) -{ - return _hypercall1(int, fpu_taskswitch, set); -} - -static inline int -HYPERVISOR_sched_op( - int cmd, void *arg) -{ - return _hypercall2(int, sched_op, cmd, arg); -} - -static inline int -HYPERVISOR_shutdown( - unsigned int reason) -{ - struct sched_shutdown shutdown = { .reason = reason }; - - return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown); -} - -static inline long -HYPERVISOR_set_timer_op( - uint64_t timeout) -{ - unsigned long timeout_hi = (unsigned long)(timeout>>32); - unsigned long timeout_lo = (unsigned long)timeout; - - return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi); -} - -static inline int -HYPERVISOR_set_debugreg( - int reg, unsigned long value) -{ - return _hypercall2(int, set_debugreg, reg, value); -} - -static inline unsigned long -HYPERVISOR_get_debugreg( - int reg) -{ - return _hypercall1(unsigned long, get_debugreg, reg); -} - -static inline int -HYPERVISOR_update_descriptor( - uint64_t ma, uint64_t desc) -{ - return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32); -} - -static inline int -HYPERVISOR_memory_op( - unsigned int cmd, void *arg) -{ - return _hypercall2(int, memory_op, cmd, arg); -} - -static inline int -HYPERVISOR_multicall( - void *call_list, int nr_calls) -{ - return _hypercall2(int, multicall, call_list, nr_calls); -} - -static inline int -HYPERVISOR_update_va_mapping( - unsigned long va, pte_t new_val, unsigned long flags) -{ - return _hypercall4(int, update_va_mapping, va, - new_val.pte_low, new_val.pte_high, flags); -} - -static inline int -HYPERVISOR_event_channel_op( - int cmd, void *op) -{ - return _hypercall2(int, event_channel_op, cmd, op); -} - -static inline int -HYPERVISOR_xen_version( - int cmd, void *arg) -{ - return _hypercall2(int, xen_version, cmd, arg); -} - -static inline int -HYPERVISOR_console_io( - int cmd, int count, char *str) -{ - return _hypercall3(int, console_io, cmd, count, str); -} - -static inline int -HYPERVISOR_physdev_op( - int cmd, void *physdev_op) -{ - return _hypercall2(int, physdev_op, cmd, physdev_op); -} - -static inline int -HYPERVISOR_grant_table_op( - unsigned int cmd, void *uop, unsigned int count) -{ - return _hypercall3(int, grant_table_op, cmd, uop, count); -} - -static inline int -HYPERVISOR_update_va_mapping_otherdomain( - unsigned long va, pte_t new_val, unsigned long flags, domid_t domid) -{ - return _hypercall5(int, update_va_mapping_otherdomain, va, - new_val.pte_low, new_val.pte_high, flags, domid); -} - -static inline int -HYPERVISOR_vm_assist( - unsigned int cmd, unsigned int type) -{ - return _hypercall2(int, vm_assist, cmd, type); -} - -static inline int -HYPERVISOR_vcpu_op( - int cmd, int vcpuid, void *extra_args) -{ - return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args); -} - -static inline int -HYPERVISOR_suspend( - unsigned long srec) -{ - struct sched_shutdown shutdown = { .reason = SHUTDOWN_suspend }; - return _hypercall3(int, sched_op, SCHEDOP_shutdown, &shutdown, srec); -} - -static inline int -HYPERVISOR_nmi_op( - unsigned long op, - unsigned long arg) -{ - return _hypercall2(int, nmi_op, op, arg); -} - -static inline int -HYPERVISOR_sysctl( - unsigned long op) -{ - return _hypercall1(int, sysctl, op); -} - -static inline int -HYPERVISOR_domctl( - unsigned long op) -{ - return _hypercall1(int, domctl, op); -} - -static inline unsigned long -HYPERVISOR_hvm_op(int op, void *arg) -{ - return _hypercall2(unsigned long, hvm_op, op, arg); -} - -#endif /* __HYPERCALL_X86_32_H__ */ - -/* - * Local variables: - * c-file-style: "linux" - * indent-tabs-mode: t - * c-indent-level: 8 - * c-basic-offset: 8 - * tab-width: 8 - * End: - */ diff --git a/plat/xen/include/xen-x86/hypercall64.h b/plat/xen/include/xen-x86/hypercall64.h deleted file mode 100644 index 467d8fae89f2c9cb2d54b7362661cbacca25dd8a..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/hypercall64.h +++ /dev/null @@ -1,361 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/****************************************************************************** - * hypercall-x86_64.h - * - * Copied from XenLinux. - * - * Copyright (c) 2002-2004, K A Fraser - * - * 64-bit updates: - * Benjamin Liu - * Jun Nakajima - * - * This file may be distributed separately from the Linux kernel, or - * incorporated into other software packages, subject to the following license: - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this source file (the "Software"), to deal in the Software without - * restriction, including without limitation the rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __HYPERCALL_X86_64_H__ -#define __HYPERCALL_X86_64_H__ - -#include -#include -#include -#include - -#define PAGE_SHIFT __PAGE_SHIFT -#define PAGE_MASK __PAGE_MASK -#define PAGE_SIZE __PAGE_SIZE - -#define STACK_SIZE_PAGE_ORDER __STACK_SIZE_PAGE_ORDER -#define STACK_SIZE __STACK_SIZE - -#ifndef STR -#define __STR(x) #x -#define STR(x) __STR(x) -#endif - -typedef struct __pte pte_t; -#define __pte(x) npte(x) - -extern char hypercall_page[__PAGE_SIZE]; - -#define _hypercall0(type, name) \ -({ \ - long __res; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res) \ - : \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall1(type, name, a1) \ -({ \ - long __res, __ign1; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=D" (__ign1) \ - : "1" ((long)(a1)) \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall2(type, name, a1, a2) \ -({ \ - long __res, __ign1, __ign2; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=D" (__ign1), "=S" (__ign2) \ - : "1" ((long)(a1)), "2" ((long)(a2)) \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall3(type, name, a1, a2, a3) \ -({ \ - long __res, __ign1, __ign2, __ign3; \ - asm volatile ( \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=D" (__ign1), "=S" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)) \ - : "memory"); \ - (type)__res; \ -}) - -#define _hypercall4(type, name, a1, a2, a3, a4) \ -({ \ - long __res, __ign1, __ign2, __ign3; \ - asm volatile ( \ - "movq %7,%%r10; " \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=D" (__ign1), "=S" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "g" ((long)(a4)) \ - : "memory", "r10"); \ - (type)__res; \ -}) - -#define _hypercall5(type, name, a1, a2, a3, a4, a5) \ -({ \ - long __res, __ign1, __ign2, __ign3; \ - asm volatile ( \ - "movq %7,%%r10; movq %8,%%r8; " \ - "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"\ - : "=a" (__res), "=D" (__ign1), "=S" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "g" ((long)(a4)), \ - "g" ((long)(a5)) \ - : "memory", "r10", "r8"); \ - (type)__res; \ -}) - -static inline int -HYPERVISOR_set_trap_table( - trap_info_t *table) -{ - return _hypercall1(int, set_trap_table, table); -} - -static inline int -HYPERVISOR_mmu_update( - mmu_update_t *req, int count, int *success_count, domid_t domid) -{ - return _hypercall4(int, mmu_update, req, count, success_count, domid); -} - -static inline int -HYPERVISOR_mmuext_op( - struct mmuext_op *op, int count, int *success_count, domid_t domid) -{ - return _hypercall4(int, mmuext_op, op, count, success_count, domid); -} - -static inline int -HYPERVISOR_set_gdt( - unsigned long *frame_list, int entries) -{ - return _hypercall2(int, set_gdt, frame_list, entries); -} - -static inline int -HYPERVISOR_stack_switch( - unsigned long ss, unsigned long esp) -{ - return _hypercall2(int, stack_switch, ss, esp); -} - -static inline int -HYPERVISOR_set_callbacks( - unsigned long event_address, unsigned long failsafe_address, - unsigned long syscall_address) -{ - return _hypercall3(int, set_callbacks, - event_address, failsafe_address, syscall_address); -} - -static inline int -HYPERVISOR_fpu_taskswitch( - int set) -{ - return _hypercall1(int, fpu_taskswitch, set); -} - -static inline int -HYPERVISOR_sched_op( - int cmd, void *arg) -{ - return _hypercall2(int, sched_op, cmd, arg); -} - -static inline int -HYPERVISOR_shutdown( - unsigned int reason) -{ - struct sched_shutdown shutdown = { .reason = reason }; - - return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown); -} - -static inline long -HYPERVISOR_set_timer_op( - uint64_t timeout) -{ - return _hypercall1(long, set_timer_op, timeout); -} - -static inline int -HYPERVISOR_set_debugreg( - int reg, unsigned long value) -{ - return _hypercall2(int, set_debugreg, reg, value); -} - -static inline unsigned long -HYPERVISOR_get_debugreg( - int reg) -{ - return _hypercall1(unsigned long, get_debugreg, reg); -} - -static inline int -HYPERVISOR_update_descriptor( - unsigned long ma, unsigned long word) -{ - return _hypercall2(int, update_descriptor, ma, word); -} - -static inline int -HYPERVISOR_memory_op( - unsigned int cmd, void *arg) -{ - return _hypercall2(int, memory_op, cmd, arg); -} - -static inline int -HYPERVISOR_multicall( - void *call_list, int nr_calls) -{ - return _hypercall2(int, multicall, call_list, nr_calls); -} - -static inline int -HYPERVISOR_update_va_mapping( - unsigned long va, pte_t new_val, unsigned long flags) -{ - return _hypercall3(int, update_va_mapping, va, new_val.pte, flags); -} - -static inline int -HYPERVISOR_event_channel_op( - int cmd, void *op) -{ - return _hypercall2(int, event_channel_op, cmd, op); -} - -static inline int -HYPERVISOR_xen_version( - int cmd, void *arg) -{ - return _hypercall2(int, xen_version, cmd, arg); -} - -static inline int -HYPERVISOR_console_io( - int cmd, int count, char *str) -{ - return _hypercall3(int, console_io, cmd, count, str); -} - -static inline int -HYPERVISOR_physdev_op( - int cmd, void *physdev_op) -{ - return _hypercall2(int, physdev_op, cmd, physdev_op); -} - -static inline int -HYPERVISOR_grant_table_op( - unsigned int cmd, void *uop, unsigned int count) -{ - return _hypercall3(int, grant_table_op, cmd, uop, count); -} - -static inline int -HYPERVISOR_update_va_mapping_otherdomain( - unsigned long va, pte_t new_val, unsigned long flags, domid_t domid) -{ - return _hypercall4(int, update_va_mapping_otherdomain, va, - new_val.pte, flags, domid); -} - -static inline int -HYPERVISOR_vm_assist( - unsigned int cmd, unsigned int type) -{ - return _hypercall2(int, vm_assist, cmd, type); -} - -static inline int -HYPERVISOR_vcpu_op( - int cmd, int vcpuid, void *extra_args) -{ - return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args); -} - -static inline int -HYPERVISOR_set_segment_base( - int reg, unsigned long value) -{ - return _hypercall2(int, set_segment_base, reg, value); -} - -static inline int -HYPERVISOR_suspend( - unsigned long srec) -{ - struct sched_shutdown shutdown = { .reason = SHUTDOWN_suspend }; - return _hypercall3(int, sched_op, SCHEDOP_shutdown, &shutdown, srec); -} - -static inline int -HYPERVISOR_nmi_op( - unsigned long op, - unsigned long arg) -{ - return _hypercall2(int, nmi_op, op, arg); -} - -static inline int -HYPERVISOR_sysctl( - unsigned long op) -{ - return _hypercall1(int, sysctl, op); -} - -static inline int -HYPERVISOR_domctl( - unsigned long op) -{ - return _hypercall1(int, domctl, op); -} - -static inline unsigned long -HYPERVISOR_hvm_op(int op, void *arg) -{ - return _hypercall2(unsigned long, hvm_op, op, arg); -} - -#endif /* __HYPERCALL_X86_64_H__ */ - -/* - * Local variables: - * c-file-style: "linux" - * indent-tabs-mode: t - * c-indent-level: 8 - * c-basic-offset: 8 - * tab-width: 8 - * End: - */ diff --git a/plat/xen/include/xen-x86/irq.h b/plat/xen/include/xen-x86/irq.h deleted file mode 100644 index 4b81d47883b9d02b59959b896b535c5ba003cbe8..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/irq.h +++ /dev/null @@ -1,111 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/****************************************************************************** - * irq.h - * - * IRQ related macros and definitions copied from os.h - */ - -#ifndef PLAT_XEN_INCLUDE_XEN_X86_IRQ_H_ -#define PLAT_XEN_INCLUDE_XEN_X86_IRQ_H_ - -#ifdef CONFIG_PARAVIRT - -#include -#include - -/* - * The use of 'barrier' in the following reflects their use as local-lock - * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following - * critical operations are executed. All critical operations must complete - * /before/ reentrancy is permitted (e.g., __sti()). Alpha architecture also - * includes these barriers, for example. - */ - -#define __cli() \ - do { \ - vcpu_info_t *_vcpu; \ - _vcpu = \ - &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - _vcpu->evtchn_upcall_mask = 1; \ - barrier(); \ - } while (0) - -#define __sti() \ - do { \ - vcpu_info_t *_vcpu; \ - barrier(); \ - _vcpu = \ - &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - _vcpu->evtchn_upcall_mask = 0; \ - barrier(); /* unmask then check (avoid races) */ \ - if (unlikely(_vcpu->evtchn_upcall_pending)) \ - ukplat_lcpu_irqs_handle_pending(); \ - } while (0) - -#define __save_flags(x) \ - do { \ - vcpu_info_t *_vcpu; \ - _vcpu = \ - &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - (x) = _vcpu->evtchn_upcall_mask; \ - } while (0) - -#define __restore_flags(x) \ - do { \ - vcpu_info_t *_vcpu; \ - barrier(); \ - _vcpu = \ - &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - if ((_vcpu->evtchn_upcall_mask = (x)) == 0) { \ - barrier(); /* unmask then check (avoid races) */ \ - if (unlikely(_vcpu->evtchn_upcall_pending)) \ - ukplat_lcpu_irqs_handle_pending(); \ - } \ - } while (0) - -#define safe_halt() ((void)0) - -#define __save_and_cli(x) \ - do { \ - vcpu_info_t *_vcpu; \ - _vcpu = \ - &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - (x) = _vcpu->evtchn_upcall_mask; \ - _vcpu->evtchn_upcall_mask = 1; \ - barrier(); \ - } while (0) - -#define irqs_disabled() \ - HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].evtchn_upcall_mask - -#define local_irq_save(x) __save_and_cli(x) -#define local_irq_restore(x) __restore_flags(x) -#define local_save_flags(x) __save_flags(x) -#define local_irq_disable() __cli() -#define local_irq_enable() __sti() - -#endif - -#endif /* PLAT_XEN_INCLUDE_XEN_X86_IRQ_H_ */ diff --git a/plat/xen/include/xen-x86/mm.h b/plat/xen/include/xen-x86/mm.h deleted file mode 100644 index 96ca7c4397e116c49d01177fe57361864c49d43a..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/mm.h +++ /dev/null @@ -1,256 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge - * Copyright (c) 2005, Keir A Fraser - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 _ARCH_MM_H_ -#define _ARCH_MM_H_ - -#include -#ifndef __ASSEMBLY__ -#include -#if defined(__x86_64__) -#include -#define __CONST(x) x ## UL -#else -#error "Unsupported architecture" -#endif -#define CONST(x) __CONST(x) -#else -#define CONST(x) x -#endif - -#ifdef CONFIG_PARAVIRT -#include -#endif - -/* - * Physical address space usage: - * - * 0..._edata: kernel text/data - * *stack : kernel stack (thread 0) - * hypervisor allocated data: p2m_list, start_info page, xenstore page, - * console page, initial page tables - * bitmap of allocated pages - * pages controlled by the page allocator - * - * - * Virtual address space usage: - * - * area x86-64 x86-32 - * ------------------------------------------------------------ - * mapped physical memory 00000000 00000000 - * kernel virtual mappings 8000000000 3f000000 - * demand mappings 100000000000 40000000 - * heap (with libc only) 200000000000 b0000000 - * - */ - -#define L1_FRAME 1 -#define L2_FRAME 2 -#define L3_FRAME 3 - -#define L1_PAGETABLE_SHIFT 12 - -#if defined(__x86_64__) - -#define L2_PAGETABLE_SHIFT 21 -#define L3_PAGETABLE_SHIFT 30 -#define L4_PAGETABLE_SHIFT 39 - -#define L1_PAGETABLE_ENTRIES 512 -#define L2_PAGETABLE_ENTRIES 512 -#define L3_PAGETABLE_ENTRIES 512 -#define L4_PAGETABLE_ENTRIES 512 - -#define PAGETABLE_LEVELS 4 - -/* These are page-table limitations. Current CPUs support only 40-bit phys. */ -#define PADDR_BITS 52 -#define VADDR_BITS 48 -#define PADDR_MASK ((1UL << PADDR_BITS)-1) -#define VADDR_MASK ((1UL << VADDR_BITS)-1) - -#define L2_MASK ((1UL << L3_PAGETABLE_SHIFT) - 1) -#define L3_MASK ((1UL << L4_PAGETABLE_SHIFT) - 1) - -#define PRIpte "016lx" -#ifndef __ASSEMBLY__ -typedef unsigned long pgentry_t; -#else -#define PTE(val) .quad val -#endif - -#define MAX_MEM_SIZE (CONST(512) << 30) -#define VIRT_KERNEL_AREA CONST(0x0000008000000000) -#define VIRT_DEMAND_AREA CONST(0x0000100000000000) -#define VIRT_HEAP_AREA CONST(0x0000200000000000) - -#define DEMAND_MAP_PAGES CONST(0x8000000) -#define HEAP_PAGES_MAX CONST(0x8000000) - -#endif - -#ifndef CONFIG_HAVE_LIBC -#define HEAP_PAGES 0 -#else -#define HEAP_PAGES HEAP_PAGES_MAX -#endif - -#define L1_MASK ((1UL << L2_PAGETABLE_SHIFT) - 1) - -/* Given a virtual address, get an entry offset into a page table. */ -#define l1_table_offset(_a) \ - (((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1)) -#define l2_table_offset(_a) \ - (((_a) >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES - 1)) -#define l3_table_offset(_a) \ - (((_a) >> L3_PAGETABLE_SHIFT) & (L3_PAGETABLE_ENTRIES - 1)) -#if defined(__x86_64__) -#define l4_table_offset(_a) \ - (((_a) >> L4_PAGETABLE_SHIFT) & (L4_PAGETABLE_ENTRIES - 1)) -#endif - -#define _PAGE_PRESENT CONST(0x001) -#define _PAGE_RW CONST(0x002) -#define _PAGE_USER CONST(0x004) -#define _PAGE_PWT CONST(0x008) -#define _PAGE_PCD CONST(0x010) -#define _PAGE_ACCESSED CONST(0x020) -#define _PAGE_DIRTY CONST(0x040) -#define _PAGE_PAT CONST(0x080) -#define _PAGE_PSE CONST(0x080) -#define _PAGE_GLOBAL CONST(0x100) - -#if defined(__x86_64__) -#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER) -#define L1_PROT_RO (_PAGE_PRESENT|_PAGE_ACCESSED|_PAGE_USER) -#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) -#define L3_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) -#define L4_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) -#endif /* __x86_64__ */ - -/* flags for ioremap */ -#define IO_PROT (L1_PROT) -#define IO_PROT_NOCACHE (L1_PROT | _PAGE_PCD) - -#include -#define PAGE_SIZE __PAGE_SIZE -#define PAGE_SHIFT __PAGE_SHIFT -#define PAGE_MASK __PAGE_MASK - -#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> L1_PAGETABLE_SHIFT) -#define PFN_DOWN(x) ((x) >> L1_PAGETABLE_SHIFT) -#define PFN_PHYS(x) ((uint64_t)(x) << L1_PAGETABLE_SHIFT) -#define PHYS_PFN(x) ((x) >> L1_PAGETABLE_SHIFT) - -/* to align the pointer to the (next) page boundary */ -#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) - -#ifndef __ASSEMBLY__ -/* Definitions for machine and pseudophysical addresses. */ -typedef unsigned long paddr_t; -typedef unsigned long maddr_t; - -extern pgentry_t *pt_base; -#ifdef CONFIG_PARAVIRT -extern unsigned long *phys_to_machine_mapping; -#endif - -extern unsigned long mfn_zero; -static __inline__ maddr_t phys_to_machine(paddr_t phys) -{ - maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT); - machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK); - return machine; -} - -static __inline__ paddr_t machine_to_phys(maddr_t machine) -{ - paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT); - phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK); - return phys; -} - -#define VIRT_START ((unsigned long)(__TEXT)) - -#define to_phys(x) ((unsigned long)(x)-VIRT_START) -#define to_virt(x) ((void *)((unsigned long)(x)+VIRT_START)) - -#define virt_to_pfn(_virt) (PFN_DOWN(to_phys(_virt))) -#define virt_to_mfn(_virt) (pfn_to_mfn(virt_to_pfn(_virt))) -#define mach_to_virt(_mach) (to_virt(machine_to_phys(_mach))) -#define virt_to_mach(_virt) (phys_to_machine(to_phys(_virt))) -#define mfn_to_virt(_mfn) (to_virt(mfn_to_pfn(_mfn) << PAGE_SHIFT)) -#define pfn_to_virt(_pfn) (to_virt((_pfn) << PAGE_SHIFT)) - -/* Pagetable walking. */ -#define pte_to_mfn(_pte) (((_pte) & (PADDR_MASK&PAGE_MASK)) >> L1_PAGETABLE_SHIFT) -#define pte_to_virt(_pte) to_virt(mfn_to_pfn(pte_to_mfn(_pte)) << PAGE_SHIFT) - -#ifdef __x86_64__ -#define virtual_to_l3(_virt) ((pgentry_t *)pte_to_virt(pt_base[l4_table_offset(_virt)])) -#else -#define virtual_to_l3(_virt) pt_base -#endif - -#define virtual_to_l2(_virt) ({ \ - unsigned long __virt2 = (_virt); \ - (pgentry_t *) pte_to_virt(virtual_to_l3(__virt2)[l3_table_offset(__virt2)]); \ -}) - -#define virtual_to_l1(_virt) ({ \ - unsigned long __virt1 = (_virt); \ - (pgentry_t *) pte_to_virt(virtual_to_l2(__virt1)[l2_table_offset(__virt1)]); \ -}) - -#define virtual_to_pte(_virt) ({ \ - unsigned long __virt0 = (unsigned long) (_virt); \ - virtual_to_l1(__virt0)[l1_table_offset(__virt0)]; \ -}) -#define virtual_to_mfn(_virt) pte_to_mfn(virtual_to_pte(_virt)) - -void *map_frames_ex(const unsigned long *mfns, unsigned long n, - unsigned long stride, unsigned long incr, - unsigned long alignment, - domid_t id, int *err, unsigned long prot, - struct uk_alloc *a); -#define map_frames(f, n, a) \ - map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, NULL, L1_PROT, a) -#define map_zero(n, a) \ - map_frames_ex(&mfn_zero, n, 0, 0, a, DOMID_SELF, NULL, L1_PROT_RO, a) -#define do_map_zero(start, n, a) \ - do_map_frames(start, &mfn_zero, n, 0, 0, DOMID_SELF, NULL, L1_PROT_RO, a) - -void arch_mm_preinit(void *p); -unsigned long alloc_virt_kernel(unsigned n_pages); - -#endif - -void _init_mem_prepare(unsigned long *start_pfn, unsigned long *max_pfn); -void _init_mem_build_pagetable(unsigned long *start_pfn, - unsigned long *max_pfn); -void _init_mem_set_readonly(void *text, void *etext); -void _init_mem_clear_bootstrap(void); -void _init_mem_demand_area(unsigned long start, unsigned long page_num); - -#endif /* _ARCH_MM_H_ */ diff --git a/plat/xen/include/xen-x86/mm_pv.h b/plat/xen/include/xen-x86/mm_pv.h deleted file mode 100644 index dc2a02eb1d8409e34be9deb24ad1d4fe35efe973..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/mm_pv.h +++ /dev/null @@ -1,66 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - * (C) 2016 - Juergen Gross, SUSE Linux GmbH - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 _MM_PV_H -#define _MM_PV_H - -#include - -#ifdef __x86_64__ -#define mfn_to_pfn(_mfn) (((unsigned long *)HYPERVISOR_VIRT_START)[(_mfn)]) -#else -#define mfn_to_pfn(_mfn) (((unsigned long *)MACH2PHYS_VIRT_START)[(_mfn)]) -#endif -#define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)]) - -/* for P2M */ -#ifdef CONFIG_XEN_PV_BUILD_P2M -#ifdef __x86_64__ -#define P2M_SHIFT 9 -#else -#define P2M_SHIFT 10 -#endif -#define P2M_ENTRIES (1UL << P2M_SHIFT) -#define P2M_MASK (P2M_ENTRIES - 1) -#define L1_P2M_SHIFT P2M_SHIFT -#define L2_P2M_SHIFT (2 * P2M_SHIFT) -#define L3_P2M_SHIFT (3 * P2M_SHIFT) -#define L1_P2M_IDX(pfn) ((pfn) & P2M_MASK) -#define L2_P2M_IDX(pfn) (((pfn) >> L1_P2M_SHIFT) & P2M_MASK) -#define L3_P2M_IDX(pfn) (((pfn) >> L2_P2M_SHIFT) & P2M_MASK) -#define INVALID_P2M_ENTRY (~0UL) - -static inline unsigned long p2m_pages(unsigned long pages) -{ - return (pages + P2M_ENTRIES - 1) >> L1_P2M_SHIFT; -} - -void arch_mm_init(struct uk_alloc *a); - -#ifdef CONFIG_MIGRATION -void arch_mm_pre_suspend(void); -void arch_mm_post_suspend(int canceled); -#endif /* CONFIG_MIGRATION */ -#endif /* CONFIG_XEN_PV_BUILD_P2M */ - -#endif /* _MM_PV_H */ diff --git a/plat/xen/include/xen-x86/setup.h b/plat/xen/include/xen-x86/setup.h deleted file mode 100644 index b7bb0c683bb57c5066d310214a53d133ec1e645c..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/setup.h +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __SETUP_H__ -#define __SETUP_H__ - -#include -#include -#include -#include -#include - -extern char _libxenplat_bootstack[]; - -extern start_info_t *HYPERVISOR_start_info; - -#endif /* __SETUP_H__ */ diff --git a/plat/xen/include/xen-x86/smp.h b/plat/xen/include/xen-x86/smp.h deleted file mode 100644 index 19a1e354b7b81c273094150326915b15a5dc58ee..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/smp.h +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/****************************************************************************** - * smp.h - * - * SMP related macros and definitions copied from os.h - */ - -#ifndef PLAT_XEN_INCLUDE_XEN_X86_SMP_H_ -#define PLAT_XEN_INCLUDE_XEN_X86_SMP_H_ - -#define smp_processor_id() 0 - -#endif /* PLAT_XEN_INCLUDE_XEN_X86_SMP_H_ */ diff --git a/plat/xen/include/xen-x86/traps.h b/plat/xen/include/xen-x86/traps.h deleted file mode 100644 index c585a6edd82b7e4e7f4574b69c914cde8124bca2..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen-x86/traps.h +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - **************************************************************************** - * (C) 2005 - Grzegorz Milos - Intel Reseach Cambridge - **************************************************************************** - * - * File: traps.h - * Author: Grzegorz Milos (gm281@cam.ac.uk) - * - * Date: Jun 2005 - * - * Environment: Xen Minimal OS - * Description: Deals with traps - * - **************************************************************************** - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 _TRAPS_H_ -#define _TRAPS_H_ - -#include -#include - -#include - -#define TRAP_coproc_seg_overrun 9 -#define TRAP_spurious_int 15 -#define TRAP_xen_callback 32 - -/* Assembler stubs */ -DECLARE_ASM_TRAP(coproc_seg_overrun); -DECLARE_ASM_TRAP(spurious_int); -DECLARE_ASM_TRAP(hypervisor_callback); -void asm_failsafe_callback(void); - -#define __KERNEL_CS FLAT_KERNEL_CS -#define __KERNEL_DS FLAT_KERNEL_DS -#define __KERNEL_SS FLAT_KERNEL_SS - -#endif /* _TRAPS_H_ */ diff --git a/plat/xen/include/xen/COPYING b/plat/xen/include/xen/COPYING deleted file mode 100644 index ffc6d6166ffc5d201a203494b24731ccfde07a52..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/COPYING +++ /dev/null @@ -1,38 +0,0 @@ -XEN NOTICE -========== - -This copyright applies to all files within this subdirectory and its -subdirectories: - include/public/*.h - include/public/hvm/*.h - include/public/io/*.h - -The intention is that these files can be freely copied into the source -tree of an operating system when porting that OS to run on Xen. Doing -so does *not* cause the OS to become subject to the terms of the GPL. - -All other files in the Xen source distribution are covered by version -2 of the GNU General Public License except where explicitly stated -otherwise within individual source files. - - -- Keir Fraser (on behalf of the Xen team) - -===================================================================== - -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 without limitation the -rights 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 -AUTHORS OR COPYRIGHT HOLDERS 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. diff --git a/plat/xen/include/xen/arch-arm.h b/plat/xen/include/xen/arch-arm.h deleted file mode 100644 index 5708cd261de7e7bf11592c7868383c22ee97eb39..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-arm.h +++ /dev/null @@ -1,476 +0,0 @@ -/****************************************************************************** - * arch-arm.h - * - * Guest OS interface to ARM Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright 2011 (C) Citrix Systems - */ - -#ifndef __XEN_PUBLIC_ARCH_ARM_H__ -#define __XEN_PUBLIC_ARCH_ARM_H__ - -/* - * `incontents 50 arm_abi Hypercall Calling Convention - * - * A hypercall is issued using the ARM HVC instruction. - * - * A hypercall can take up to 5 arguments. These are passed in - * registers, the first argument in x0/r0 (for arm64/arm32 guests - * respectively irrespective of whether the underlying hypervisor is - * 32- or 64-bit), the second argument in x1/r1, the third in x2/r2, - * the forth in x3/r3 and the fifth in x4/r4. - * - * The hypercall number is passed in r12 (arm) or x16 (arm64). In both - * cases the relevant ARM procedure calling convention specifies this - * is an inter-procedure-call scratch register (e.g. for use in linker - * stubs). This use does not conflict with use during a hypercall. - * - * The HVC ISS must contain a Xen specific TAG: XEN_HYPERCALL_TAG. - * - * The return value is in x0/r0. - * - * The hypercall will clobber x16/r12 and the argument registers used - * by that hypercall (except r0 which is the return value) i.e. in - * addition to x16/r12 a 2 argument hypercall will clobber x1/r1 and a - * 4 argument hypercall will clobber x1/r1, x2/r2 and x3/r3. - * - * Parameter structs passed to hypercalls are laid out according to - * the Procedure Call Standard for the ARM Architecture (AAPCS, AKA - * EABI) and Procedure Call Standard for the ARM 64-bit Architecture - * (AAPCS64). Where there is a conflict the 64-bit standard should be - * used regardless of guest type. Structures which are passed as - * hypercall arguments are always little endian. - * - * All memory which is shared with other entities in the system - * (including the hypervisor and other guests) must reside in memory - * which is mapped as Normal Inner Write-Back Outer Write-Back Inner-Shareable. - * This applies to: - * - hypercall arguments passed via a pointer to guest memory. - * - memory shared via the grant table mechanism (including PV I/O - * rings etc). - * - memory shared with the hypervisor (struct shared_info, struct - * vcpu_info, the grant table, etc). - * - * Any cache allocation hints are acceptable. - */ - -/* - * `incontents 55 arm_hcall Supported Hypercalls - * - * Xen on ARM makes extensive use of hardware facilities and therefore - * only a subset of the potential hypercalls are required. - * - * Since ARM uses second stage paging any machine/physical addresses - * passed to hypercalls are Guest Physical Addresses (Intermediate - * Physical Addresses) unless otherwise noted. - * - * The following hypercalls (and sub operations) are supported on the - * ARM platform. Other hypercalls should be considered - * unavailable/unsupported. - * - * HYPERVISOR_memory_op - * All generic sub-operations - * - * HYPERVISOR_domctl - * All generic sub-operations, with the exception of: - * * XEN_DOMCTL_irq_permission (not yet implemented) - * - * HYPERVISOR_sched_op - * All generic sub-operations, with the exception of: - * * SCHEDOP_block -- prefer wfi hardware instruction - * - * HYPERVISOR_console_io - * All generic sub-operations - * - * HYPERVISOR_xen_version - * All generic sub-operations - * - * HYPERVISOR_event_channel_op - * All generic sub-operations - * - * HYPERVISOR_physdev_op - * No sub-operations are currenty supported - * - * HYPERVISOR_sysctl - * All generic sub-operations, with the exception of: - * * XEN_SYSCTL_page_offline_op - * * XEN_SYSCTL_get_pmstat - * * XEN_SYSCTL_pm_op - * - * HYPERVISOR_hvm_op - * Exactly these sub-operations are supported: - * * HVMOP_set_param - * * HVMOP_get_param - * - * HYPERVISOR_grant_table_op - * All generic sub-operations - * - * HYPERVISOR_vcpu_op - * Exactly these sub-operations are supported: - * * VCPUOP_register_vcpu_info - * * VCPUOP_register_runstate_memory_area - * - * - * Other notes on the ARM ABI: - * - * - struct start_info is not exported to ARM guests. - * - * - struct shared_info is mapped by ARM guests using the - * HYPERVISOR_memory_op sub-op XENMEM_add_to_physmap, passing - * XENMAPSPACE_shared_info as space parameter. - * - * - All the per-cpu struct vcpu_info are mapped by ARM guests using the - * HYPERVISOR_vcpu_op sub-op VCPUOP_register_vcpu_info, including cpu0 - * struct vcpu_info. - * - * - The grant table is mapped using the HYPERVISOR_memory_op sub-op - * XENMEM_add_to_physmap, passing XENMAPSPACE_grant_table as space - * parameter. The memory range specified under the Xen compatible - * hypervisor node on device tree can be used as target gpfn for the - * mapping. - * - * - Xenstore is initialized by using the two hvm_params - * HVM_PARAM_STORE_PFN and HVM_PARAM_STORE_EVTCHN. They can be read - * with the HYPERVISOR_hvm_op sub-op HVMOP_get_param. - * - * - The paravirtualized console is initialized by using the two - * hvm_params HVM_PARAM_CONSOLE_PFN and HVM_PARAM_CONSOLE_EVTCHN. They - * can be read with the HYPERVISOR_hvm_op sub-op HVMOP_get_param. - * - * - Event channel notifications are delivered using the percpu GIC - * interrupt specified under the Xen compatible hypervisor node on - * device tree. - * - * - The device tree Xen compatible node is fully described under Linux - * at Documentation/devicetree/bindings/arm/xen.txt. - */ - -#define XEN_HYPERCALL_TAG 0XEA1 - -#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 - -/* - * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field - * in a struct in memory. On ARM is always 8 bytes sizes and 8 bytes - * aligned. - * 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_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 set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) - -#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; \ - } -#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 -{ - /* 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); - - /* Return address and mode */ - __DECL_REG(pc64, pc32); /* ELR_EL2 */ - uint32_t cpsr; /* SPSR_EL2 */ - - union { - uint32_t spsr_el1; /* AArch64 */ - uint32_t spsr_svc; /* AArch32 */ - }; - - /* AArch32 guests only */ - uint32_t spsr_fiq, spsr_irq, spsr_und, spsr_abt; - - /* AArch64 guests only */ - uint64_t sp_el0; - uint64_t sp_el1, elr_el1; -}; -typedef struct vcpu_guest_core_regs vcpu_guest_core_regs_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_guest_core_regs_t); - -#undef __DECL_REG - -typedef uint64_t xen_pfn_t; -#define PRI_xen_pfn PRIx64 - -/* Maximum number of virtual CPUs in legacy multi-processor guests. */ -/* Only one. All other VCPUS must use VCPUOP_register_vcpu_info */ -#define XEN_LEGACY_MAX_VCPUS 1 - -typedef uint64_t xen_ulong_t; -#define PRI_xen_ulong PRIx64 - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -struct vcpu_guest_context { -#define _VGCF_online 0 -#define VGCF_online (1<<_VGCF_online) - uint32_t flags; /* VGCF_* */ - - struct vcpu_guest_core_regs user_regs; /* Core CPU registers */ - - uint32_t sctlr; - uint64_t ttbcr, ttbr0, ttbr1; -}; -typedef struct vcpu_guest_context vcpu_guest_context_t; -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 -struct xen_arch_domainconfig { - /* IN/OUT */ - uint8_t gic_version; - /* IN */ - uint32_t nr_spis; - /* - * OUT - * Based on the property clock-frequency in the DT timer node. - * The property may be present when the bootloader/firmware doesn't - * set correctly CNTFRQ which hold the timer frequency. - * - * As it's not possible to trap this register, we have to replicate - * the value in the guest DT. - * - * = 0 => property not present - * > 0 => Value of the property - * - */ - uint32_t clock_frequency; -}; -#endif /* __XEN__ || __XEN_TOOLS__ */ - -struct arch_vcpu_info { -}; -typedef struct arch_vcpu_info arch_vcpu_info_t; - -struct arch_shared_info { -}; -typedef struct arch_shared_info arch_shared_info_t; -typedef uint64_t xen_callback_t; - -#endif - -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -/* 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 */ - -/* 32 bit modes */ -#define PSR_MODE_USR 0x10 -#define PSR_MODE_FIQ 0x11 -#define PSR_MODE_IRQ 0x12 -#define PSR_MODE_SVC 0x13 -#define PSR_MODE_MON 0x16 -#define PSR_MODE_ABT 0x17 -#define PSR_MODE_HYP 0x1a -#define PSR_MODE_UND 0x1b -#define PSR_MODE_SYS 0x1f - -/* 64 bit modes */ -#define PSR_MODE_BIT 0x10 /* Set iff AArch32 */ -#define PSR_MODE_EL3h 0x0d -#define PSR_MODE_EL3t 0x0c -#define PSR_MODE_EL2h 0x09 -#define PSR_MODE_EL2t 0x08 -#define PSR_MODE_EL1h 0x05 -#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 SCTLR_GUEST_INIT 0x00c50078 - -/* - * Virtual machine platform (memory layout, interrupts) - * - * These are defined for consistency between the tools and the - * hypervisor. Guests must not rely on these hardcoded values but - * should instead use the FDT. - */ - -/* Physical Address Space */ - -/* - * vGIC mappings: Only one set of mapping is used by the guest. - * Therefore they can overlap. - */ - -/* 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) - -/* vGIC v3 mappings */ -#define GUEST_GICV3_GICD_BASE xen_mk_ullong(0x03001000) -#define GUEST_GICV3_GICD_SIZE xen_mk_ullong(0x00010000) - -#define GUEST_GICV3_RDIST_STRIDE xen_mk_ullong(0x00020000) -#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) - -/* ACPI tables physical address */ -#define GUEST_ACPI_BASE 0x20000000ULL -#define GUEST_ACPI_SIZE 0x02000000ULL - -/* PL011 mappings */ -#define GUEST_PL011_BASE 0x22000000ULL -#define GUEST_PL011_SIZE 0x00001000ULL - -/* - * 16MB == 4096 pages reserved for guest to use as a region to map its - * grant table in. - */ -#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_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_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 */ -/* Largest amount of actual RAM, not including holes */ -#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 } - -/* Current supported guest VCPUs */ -#define GUEST_MAX_VCPUS 128 - -/* Interrupts */ -#define GUEST_TIMER_VIRT_PPI 27 -#define GUEST_TIMER_PHYS_S_PPI 29 -#define GUEST_TIMER_PHYS_NS_PPI 30 -#define GUEST_EVTCHN_PPI 31 - -#define GUEST_VPL011_SPI 32 - -/* PSCI functions */ -#define PSCI_cpu_suspend 0 -#define PSCI_cpu_off 1 -#define PSCI_cpu_on 2 -#define PSCI_migrate 3 - -#endif - -#ifndef __ASSEMBLY__ -/* Stub definition of PMU structure */ -typedef struct xen_pmu_arch { uint8_t dummy; } xen_pmu_arch_t; -#endif - -#endif /* __XEN_PUBLIC_ARCH_ARM_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/arch-arm/hvm/save.h b/plat/xen/include/xen/arch-arm/hvm/save.h deleted file mode 100644 index 75b8e65bcb80d17fc1ad34c60dd9f71801a6f2fe..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-arm/hvm/save.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Structure definitions for HVM state that is held by Xen and must - * be saved along with the domain's memory and device-model state. - * - * Copyright (c) 2012 Citrix Systems Ltd. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __XEN_PUBLIC_HVM_SAVE_ARM_H__ -#define __XEN_PUBLIC_HVM_SAVE_ARM_H__ - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/arch-arm/smccc.h b/plat/xen/include/xen/arch-arm/smccc.h deleted file mode 100644 index 17dc6d8829e6ef19b9c8a06bce7a1b2e3cba603b..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-arm/smccc.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * smccc.h - * - * SMC/HVC interface in accordance with SMC Calling Convention. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright 2017 (C) EPAM Systems - */ - -#ifndef __XEN_PUBLIC_ARCH_ARM_SMCCC_H__ -#define __XEN_PUBLIC_ARCH_ARM_SMCCC_H__ - -#include "public/xen.h" - -/* - * Hypervisor Service version. - * - * We can't use XEN version here, because of SMCCC requirements: - * Major revision should change every time SMC/HVC function is removed. - * Minor revision should change every time SMC/HVC function is added. - * So, it is SMCCC protocol revision code, not XEN version. - * - * Those values are subjected to change, when interface will be extended. - */ -#define XEN_SMCCC_MAJOR_REVISION 0 -#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) - -/* 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) - -#endif /* __XEN_PUBLIC_ARCH_ARM_SMCCC_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End:b - */ diff --git a/plat/xen/include/xen/arch-x86/cpufeatureset.h b/plat/xen/include/xen/arch-x86/cpufeatureset.h deleted file mode 100644 index 0ee3ea350fc99cd499460bbcbcad4d05575a5612..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/cpufeatureset.h +++ /dev/null @@ -1,263 +0,0 @@ -/* - * arch-x86/cpufeatureset.h - * - * CPU featureset definitions - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2015, 2016 Citrix Systems, Inc. - */ - -/* - * There are two expected ways of including this header. - * - * 1) The "default" case (expected from tools etc). - * - * Simply #include - * - * In this circumstance, normal header guards apply and the includer shall get - * an enumeration in the XEN_X86_FEATURE_xxx namespace. - * - * 2) The special case where the includer provides XEN_CPUFEATURE() in scope. - * - * In this case, no inclusion guards apply and the caller is responsible for - * their XEN_CPUFEATURE() being appropriate in the included context. - */ - -#ifndef XEN_CPUFEATURE - -/* - * Includer has not provided a custom XEN_CPUFEATURE(). Arrange for normal - * header guards, an enum and constants in the XEN_X86_FEATURE_xxx namespace. - */ -#ifndef __XEN_PUBLIC_ARCH_X86_CPUFEATURESET_H__ -#define __XEN_PUBLIC_ARCH_X86_CPUFEATURESET_H__ - -#define XEN_CPUFEATURESET_DEFAULT_INCLUDE - -#define XEN_CPUFEATURE(name, value) XEN_X86_FEATURE_##name = value, -enum { - -#endif /* __XEN_PUBLIC_ARCH_X86_CPUFEATURESET_H__ */ -#endif /* !XEN_CPUFEATURE */ - - -#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. - */ - -/* - * 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.ecx, word 1 */ -XEN_CPUFEATURE(SSE3, 1*32+ 0) /*A Streaming SIMD Extensions-3 */ -XEN_CPUFEATURE(PCLMULQDQ, 1*32+ 1) /*A Carry-less mulitplication */ -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) /*S 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) /*S 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 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(AVX512IFMA, 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(AVX512VBMI, 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_VPOPCNTDQ, 6*32+14) /*A POPCNT for vectors of DW/QW */ -XEN_CPUFEATURE(RDPID, 6*32+22) /*A RDPID 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 0x80000008.ebx, word 8 */ -XEN_CPUFEATURE(CLZERO, 8*32+ 0) /*A CLZERO instruction */ - -/* 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 */ - -#endif /* XEN_CPUFEATURE */ - -/* Clean up from a default include. Close the enum (for C). */ -#ifdef XEN_CPUFEATURESET_DEFAULT_INCLUDE -#undef XEN_CPUFEATURESET_DEFAULT_INCLUDE -#undef XEN_CPUFEATURE -}; - -#endif /* XEN_CPUFEATURESET_DEFAULT_INCLUDE */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/arch-x86/cpuid.h b/plat/xen/include/xen/arch-x86/cpuid.h deleted file mode 100644 index eb76875d0e3897ea96bf190d8274252e61d5abd4..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/cpuid.h +++ /dev/null @@ -1,116 +0,0 @@ -/****************************************************************************** - * arch-x86/cpuid.h - * - * CPUID interface to Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2007 Citrix Systems, Inc. - * - * Authors: - * Keir Fraser - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_CPUID_H__ -#define __XEN_PUBLIC_ARCH_X86_CPUID_H__ - -/* - * For compatibility with other hypervisor interfaces, the Xen cpuid leaves - * can be found at the first otherwise unused 0x100 aligned boundary starting - * from 0x40000000. - * - * e.g If viridian extensions are enabled for an HVM domain, the Xen cpuid - * leaves will start at 0x40000100 - */ - -#define XEN_CPUID_FIRST_LEAF 0x40000000 -#define XEN_CPUID_LEAF(i) (XEN_CPUID_FIRST_LEAF + (i)) - -/* - * Leaf 1 (0x40000x00) - * EAX: Largest Xen-information leaf. All leaves up to an including @EAX - * are supported by the Xen host. - * EBX-EDX: "XenVMMXenVMM" signature, allowing positive identification - * of a Xen host. - */ -#define XEN_CPUID_SIGNATURE_EBX 0x566e6558 /* "XenV" */ -#define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */ -#define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */ - -/* - * Leaf 2 (0x40000x01) - * EAX[31:16]: Xen major version. - * EAX[15: 0]: Xen minor version. - * EBX-EDX: Reserved (currently all zeroes). - */ - -/* - * Leaf 3 (0x40000x02) - * EAX: Number of hypercall transfer pages. This register is always guaranteed - * to specify one hypercall page. - * EBX: Base address of Xen-specific MSRs. - * ECX: Features 1. Unused bits are set to zero. - * EDX: Features 2. Unused bits are set to zero. - */ - -/* 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) - -/* - * Leaf 4 (0x40000x03) - * Sub-leaf 0: EAX: bit 0: emulated tsc - * bit 1: host tsc is known to be reliable - * bit 2: RDTSCP instruction available - * EBX: tsc_mode: 0=default (emulate if necessary), 1=emulate, - * 2=no emulation, 3=no emulation + TSC_AUX support - * ECX: guest tsc frequency in kHz - * EDX: guest tsc incarnation (migration count) - * Sub-leaf 1: EAX: tsc offset low part - * EBX: tsc offset high part - * ECX: multiplicator for tsc->ns conversion - * EDX: shift amount for tsc->ns conversion - * Sub-leaf 2: EAX: host tsc frequency in kHz - */ - -/* - * Leaf 5 (0x40000x04) - * HVM-specific features - * Sub-leaf 0: EAX: Features - * Sub-leaf 0: EBX: vcpu id (iff EAX has XEN_HVM_CPUID_VCPU_ID_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 */ -/* 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 */ - -/* - * Leaf 6 (0x40000x05) - * PV-specific parameters - * Sub-leaf 0: EAX: max available sub-leaf - * Sub-leaf 0: EBX: bits 0-7: max machine address width - */ - -/* Max. address width in bits taking memory hotplug into account. */ -#define XEN_CPUID_MACHINE_ADDRESS_WIDTH_MASK (0xffu << 0) - -#define XEN_CPUID_MAX_NUM_LEAVES 5 - -#endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */ diff --git a/plat/xen/include/xen/arch-x86/hvm/save.h b/plat/xen/include/xen/arch-x86/hvm/save.h deleted file mode 100644 index fd7bf3fb38973cc23b2f413cae83371d08fbfb9e..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/hvm/save.h +++ /dev/null @@ -1,657 +0,0 @@ -/* - * Structure definitions for HVM state that is held by Xen and must - * be saved along with the domain's memory and device-model state. - * - * Copyright (c) 2007 XenSource Ltd. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __XEN_PUBLIC_HVM_SAVE_X86_H__ -#define __XEN_PUBLIC_HVM_SAVE_X86_H__ - -/* - * Save/restore header: general info about the save file. - */ - -#define HVM_FILE_MAGIC 0x54381286 -#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 */ -}; - -DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header); - - -/* - * Processor - * - * Compat: - * - Pre-3.4 didn't have msr_tsc_aux - * - Pre-4.7 didn't have fpu_initialised - */ - -struct hvm_hw_cpu { - uint8_t fpu_regs[512]; - - uint64_t rax; - uint64_t rbx; - uint64_t rcx; - uint64_t rdx; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t rsp; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - - uint64_t rip; - uint64_t rflags; - - uint64_t cr0; - uint64_t cr2; - uint64_t cr3; - uint64_t cr4; - - uint64_t dr0; - uint64_t dr1; - uint64_t dr2; - uint64_t dr3; - uint64_t dr6; - uint64_t dr7; - - uint32_t cs_sel; - uint32_t ds_sel; - uint32_t es_sel; - uint32_t fs_sel; - uint32_t gs_sel; - uint32_t ss_sel; - uint32_t tr_sel; - uint32_t ldtr_sel; - - uint32_t cs_limit; - uint32_t ds_limit; - uint32_t es_limit; - uint32_t fs_limit; - uint32_t gs_limit; - uint32_t ss_limit; - uint32_t tr_limit; - uint32_t ldtr_limit; - uint32_t idtr_limit; - uint32_t gdtr_limit; - - uint64_t cs_base; - uint64_t ds_base; - uint64_t es_base; - uint64_t fs_base; - uint64_t gs_base; - uint64_t ss_base; - uint64_t tr_base; - uint64_t ldtr_base; - uint64_t idtr_base; - uint64_t gdtr_base; - - uint32_t cs_arbytes; - uint32_t ds_arbytes; - uint32_t es_arbytes; - uint32_t fs_arbytes; - uint32_t gs_arbytes; - uint32_t ss_arbytes; - uint32_t tr_arbytes; - uint32_t ldtr_arbytes; - - uint64_t sysenter_cs; - uint64_t sysenter_esp; - uint64_t sysenter_eip; - - /* msr for em64t */ - uint64_t shadow_gs; - - /* msr content saved/restored. */ - uint64_t msr_flags; /* Obsolete, ignored. */ - uint64_t msr_lstar; - uint64_t msr_star; - uint64_t msr_cstar; - uint64_t msr_syscall_mask; - uint64_t msr_efer; - uint64_t msr_tsc_aux; - - /* guest's idea of what rdtsc() would return */ - uint64_t tsc; - - /* pending event, if any */ - 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; - }; - }; - /* 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) - uint32_t flags; - uint32_t pad0; -}; - -struct hvm_hw_cpu_compat { - uint8_t fpu_regs[512]; - - uint64_t rax; - uint64_t rbx; - uint64_t rcx; - uint64_t rdx; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t rsp; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - - uint64_t rip; - uint64_t rflags; - - uint64_t cr0; - uint64_t cr2; - uint64_t cr3; - uint64_t cr4; - - uint64_t dr0; - uint64_t dr1; - uint64_t dr2; - uint64_t dr3; - uint64_t dr6; - uint64_t dr7; - - uint32_t cs_sel; - uint32_t ds_sel; - uint32_t es_sel; - uint32_t fs_sel; - uint32_t gs_sel; - uint32_t ss_sel; - uint32_t tr_sel; - uint32_t ldtr_sel; - - uint32_t cs_limit; - uint32_t ds_limit; - uint32_t es_limit; - uint32_t fs_limit; - uint32_t gs_limit; - uint32_t ss_limit; - uint32_t tr_limit; - uint32_t ldtr_limit; - uint32_t idtr_limit; - uint32_t gdtr_limit; - - uint64_t cs_base; - uint64_t ds_base; - uint64_t es_base; - uint64_t fs_base; - uint64_t gs_base; - uint64_t ss_base; - uint64_t tr_base; - uint64_t ldtr_base; - uint64_t idtr_base; - uint64_t gdtr_base; - - uint32_t cs_arbytes; - uint32_t ds_arbytes; - uint32_t es_arbytes; - uint32_t fs_arbytes; - uint32_t gs_arbytes; - uint32_t ss_arbytes; - uint32_t tr_arbytes; - uint32_t ldtr_arbytes; - - uint64_t sysenter_cs; - uint64_t sysenter_esp; - uint64_t sysenter_eip; - - /* msr for em64t */ - uint64_t shadow_gs; - - /* msr content saved/restored. */ - uint64_t msr_flags; /* Obsolete, ignored. */ - uint64_t msr_lstar; - uint64_t msr_star; - uint64_t msr_cstar; - uint64_t msr_syscall_mask; - uint64_t msr_efer; - /*uint64_t msr_tsc_aux; COMPAT */ - - /* guest's idea of what rdtsc() would return */ - uint64_t tsc; - - /* pending event, if any */ - 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; - }; - }; - /* error code for pending event */ - uint32_t error_code; -}; - -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 we copy from the end backwards, we should - * be able to do the modification in-place. - */ - ucpu->nat.error_code = ucpu->cmp.error_code; - ucpu->nat.pending_event = ucpu->cmp.pending_event; - ucpu->nat.tsc = ucpu->cmp.tsc; - ucpu->nat.msr_tsc_aux = 0; - } - /* Mimic the old behaviour by unconditionally setting fpu_initialised. */ - ucpu->nat.flags = XEN_X86_FPU_INITIALISED; - - return 0; -} - -DECLARE_HVM_SAVE_TYPE_COMPAT(CPU, 2, struct hvm_hw_cpu, \ - struct hvm_hw_cpu_compat, _hvm_hw_fix_cpu); - -/* - * PIC - */ - -struct hvm_hw_vpic { - /* IR line bitmasks. */ - uint8_t irr; - uint8_t imr; - uint8_t isr; - - /* Line IRx maps to IRQ irq_base+x */ - uint8_t irq_base; - - /* - * Where are we in ICW2-4 initialisation (0 means no init in progress)? - * Bits 0-1 (=x): Next write at A=1 sets ICW(x+1). - * 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; - - /* IR line with highest priority. */ - uint8_t priority_add:4; - - /* Reads from A=0 obtain ISR or IRR? */ - uint8_t readsel_isr:1; - - /* Reads perform a polling read? */ - uint8_t poll:1; - - /* Automatically clear IRQs from the ISR during INTA? */ - uint8_t auto_eoi:1; - - /* Automatically rotate IRQ priorities during AEOI? */ - uint8_t rotate_on_auto_eoi:1; - - /* Exclude slave inputs when considering in-service IRQs? */ - uint8_t special_fully_nested_mode:1; - - /* Special mask mode excludes masked IRs from AEOI and priority checks. */ - uint8_t special_mask_mode:1; - - /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */ - uint8_t is_master:1; - - /* Edge/trigger selection. */ - uint8_t elcr; - - /* Virtual INT output. */ - uint8_t int_output; -}; - -DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic); - - -/* - * IO-APIC - */ - -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 reserved[4]; - uint8_t dest_id; - } fields; -}; - -#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]; \ - } - -XEN_HVM_VIOAPIC(hvm_hw_vioapic, VIOAPIC_NUM_PINS); - -#ifndef __XEN__ -#undef XEN_HVM_VIOAPIC -#else -#undef VIOAPIC_NUM_PINS -#endif - -DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic); - - -/* - * LAPIC - */ - -struct hvm_hw_lapic { - 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); - -struct hvm_hw_lapic_regs { - uint8_t data[1024]; -}; - -DECLARE_HVM_SAVE_TYPE(LAPIC_REGS, 6, struct hvm_hw_lapic_regs); - - -/* - * IRQs - */ - -struct hvm_hw_pci_irqs { - /* - * Virtual interrupt wires for a single PCI bus. - * Indexed by: device*4 + INTx#. - */ - union { - unsigned long i[16 / sizeof (unsigned long)]; /* DECLARE_BITMAP(i, 32*4); */ - uint64_t pad[2]; - }; -}; - -DECLARE_HVM_SAVE_TYPE(PCI_IRQ, 7, struct hvm_hw_pci_irqs); - -struct hvm_hw_isa_irqs { - /* - * Virtual interrupt wires for ISA devices. - * Indexed by ISA IRQ (assumes no ISA-device IRQ sharing). - */ - union { - unsigned long i[1]; /* DECLARE_BITMAP(i, 16); */ - uint64_t pad[1]; - }; -}; - -DECLARE_HVM_SAVE_TYPE(ISA_IRQ, 8, struct hvm_hw_isa_irqs); - -struct hvm_hw_pci_link { - /* - * PCI-ISA interrupt router. - * Each PCI is 'wire-ORed' into one of four links using - * the traditional 'barber's pole' mapping ((device + INTx#) & 3). - * The router provides a programmable mapping from each link to a GSI. - */ - uint8_t route[4]; - uint8_t pad0[4]; -}; - -DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link); - -/* - * PIT - */ - -struct hvm_hw_pit { - struct hvm_hw_pit_channel { - uint32_t count; /* can be 65536 */ - uint16_t latched_count; - uint8_t count_latched; - uint8_t status_latched; - uint8_t status; - uint8_t read_state; - uint8_t write_state; - uint8_t write_latch; - uint8_t rw_mode; - uint8_t mode; - uint8_t bcd; /* not supported */ - uint8_t gate; /* timer start */ - } channels[3]; /* 3 x 16 bytes */ - uint32_t speaker_data_on; - uint32_t pad0; -}; - -DECLARE_HVM_SAVE_TYPE(PIT, 10, struct hvm_hw_pit); - - -/* - * RTC - */ - -#define RTC_CMOS_SIZE 14 -struct hvm_hw_rtc { - /* CMOS bytes */ - uint8_t cmos_data[RTC_CMOS_SIZE]; - /* Index register for 2-part operations */ - uint8_t cmos_index; - uint8_t pad0; -}; - -DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc); - - -/* - * HPET - */ - -#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 */ - } timers[HPET_TIMER_NUM]; - 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 */ -}; - -DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet); - - -/* - * PM timer - */ - -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 */ -}; - -DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer); - -/* - * MTRR MSRs - */ - -struct hvm_hw_mtrr { -#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_fixed[NUM_FIXED_MSR]; - uint64_t msr_mtrr_cap; - uint64_t msr_mtrr_def_type; -}; - -DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr); - -/* - * The save area of XSAVE/XRSTOR. - */ - -struct hvm_hw_cpu_xsave { - 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 hvm_hw_cpu_xsave_hdr { - 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 */ - } save_area; -}; - -#define CPU_XSAVE_CODE 16 - -/* - * Viridian hypervisor context. - */ - -struct hvm_viridian_domain_context { - uint64_t hypercall_gpa; - uint64_t guest_os_id; - uint64_t time_ref_count; - uint64_t reference_tsc; -}; - -DECLARE_HVM_SAVE_TYPE(VIRIDIAN_DOMAIN, 15, struct hvm_viridian_domain_context); - -struct hvm_viridian_vcpu_context { - uint64_t vp_assist_msr; - uint8_t vp_assist_vector; - uint8_t _pad[7]; -}; - -DECLARE_HVM_SAVE_TYPE(VIRIDIAN_VCPU, 17, struct hvm_viridian_vcpu_context); - -struct hvm_vmce_vcpu { - uint64_t caps; - uint64_t mci_ctl2_bank0; - uint64_t mci_ctl2_bank1; - uint64_t mcg_ext_ctl; -}; - -DECLARE_HVM_SAVE_TYPE(VMCE_VCPU, 18, struct hvm_vmce_vcpu); - -struct hvm_tsc_adjust { - uint64_t tsc_adjust; -}; - -DECLARE_HVM_SAVE_TYPE(TSC_ADJUST, 19, struct hvm_tsc_adjust); - - -struct hvm_msr { - uint32_t count; - struct hvm_one_msr { - uint32_t index; - uint32_t _rsvd; - uint64_t val; -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - } msr[]; -#elif defined(__GNUC__) - } msr[0]; -#else - } msr[1 /* variable size */]; -#endif -}; - -#define CPU_MSR_CODE 20 - -/* - * Largest type-code in use - */ -#define HVM_SAVE_CODE_MAX 20 - -#endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/arch-x86/hvm/start_info.h b/plat/xen/include/xen/arch-x86/hvm/start_info.h deleted file mode 100644 index 648415976eadfe5c94b0cc3ab6c6128484959350..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/hvm/start_info.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2016, Citrix Systems, Inc. - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ -#define __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ - -/* - * Start of day structure passed to PVH guests and to HVM guests in %ebx. - * - * NOTE: nothing will be loaded at physical address 0, so a 0 value in any - * of the address fields should be treated as not present. - * - * 0 +----------------+ - * | magic | Contains the magic value XEN_HVM_START_MAGIC_VALUE - * | | ("xEn3" with the 0x80 bit of the "E" set). - * 4 +----------------+ - * | version | Version of this structure. Current version is 0. New - * | | versions are guaranteed to be backwards-compatible. - * 8 +----------------+ - * | flags | SIF_xxx flags. - * 12 +----------------+ - * | nr_modules | Number of modules passed to the kernel. - * 16 +----------------+ - * | modlist_paddr | Physical address of an array of modules - * | | (layout of the structure below). - * 24 +----------------+ - * | cmdline_paddr | Physical address of the command line, - * | | a zero-terminated ASCII string. - * 32 +----------------+ - * | rsdp_paddr | Physical address of the RSDP ACPI data structure. - * 40 +----------------+ - * - * The layout of each entry in the module structure is the following: - * - * 0 +----------------+ - * | paddr | Physical address of the module. - * 8 +----------------+ - * | size | Size of the module in bytes. - * 16 +----------------+ - * | cmdline_paddr | Physical address of the command line, - * | | a zero-terminated ASCII string. - * 24 +----------------+ - * | reserved | - * 32 +----------------+ - * - * The address and sizes are always a 64bit little endian unsigned integer. - * - * NB: Xen on x86 will always try to place all the data below the 4GiB - * boundary. - */ -#define XEN_HVM_START_MAGIC_VALUE 0x336ec578 - -/* - * C representation of the x86/HVM start info layout. - * - * The canonical definition of this layout is above, this is just a way to - * 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. */ -}; - -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 reserved; -}; - -#endif /* __XEN_PUBLIC_ARCH_X86_HVM_START_INFO_H__ */ diff --git a/plat/xen/include/xen/arch-x86/pmu.h b/plat/xen/include/xen/arch-x86/pmu.h deleted file mode 100644 index 68ebf121d088510882fd35b82079b2799c1089c8..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/pmu.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved. - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_PMU_H__ -#define __XEN_PUBLIC_ARCH_X86_PMU_H__ - -/* x86-specific PMU definitions */ - -/* AMD PMU registers and structures */ -struct xen_pmu_amd_ctxt { - /* - * Offsets to counter and control MSRs (relative to xen_pmu_arch.c.amd). - * For PV(H) guests these fields are RO. - */ - uint32_t counters; - uint32_t ctrls; - - /* Counter MSRs */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - uint64_t regs[]; -#elif defined(__GNUC__) - uint64_t regs[0]; -#endif -}; -typedef struct xen_pmu_amd_ctxt xen_pmu_amd_ctxt_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_amd_ctxt_t); - -/* Intel PMU registers and structures */ -struct xen_pmu_cntr_pair { - uint64_t counter; - uint64_t control; -}; -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. - */ - uint32_t fixed_counters; - uint32_t arch_counters; - - /* PMU registers */ - uint64_t global_ctrl; - uint64_t global_ovf_ctrl; - uint64_t global_status; - uint64_t fixed_ctrl; - uint64_t ds_area; - uint64_t pebs_enable; - uint64_t debugctl; - - /* Fixed and architectural counter MSRs */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - uint64_t regs[]; -#elif defined(__GNUC__) - uint64_t regs[0]; -#endif -}; -typedef struct xen_pmu_intel_ctxt xen_pmu_intel_ctxt_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_intel_ctxt_t); - -/* Sampled domain's registers */ -struct xen_pmu_regs { - uint64_t ip; - uint64_t sp; - uint64_t flags; - uint16_t cs; - uint16_t ss; - uint8_t cpl; - uint8_t pad[3]; -}; -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 */ - -/* - * Architecture-specific information describing state of the processor at - * the time of PMU interrupt. - * Fields of this structure marked as RW for guest should only be written by - * the guest when PMU_CACHED bit in pmu_flags is set (which is done by the - * hypervisor during PMU interrupt). Hypervisor will read updated data in - * XENPMU_flush hypercall and clear PMU_CACHED bit. - */ -struct xen_pmu_arch { - union { - /* - * Processor's registers at the time of interrupt. - * WO for hypervisor, RO for guests. - */ - struct xen_pmu_regs regs; - /* Padding for adding new registers to xen_pmu_regs in the future */ -#define XENPMU_REGS_PAD_SZ 64 - uint8_t pad[XENPMU_REGS_PAD_SZ]; - } r; - - /* WO for hypervisor, RO for guest */ - uint64_t pmu_flags; - - /* - * APIC LVTPC register. - * RW for both hypervisor and guest. - * Only APIC_LVT_MASKED bit is loaded by the hypervisor into hardware - * during XENPMU_flush or XENPMU_lvtpc_set. - */ - union { - uint32_t lapic_lvtpc; - uint64_t pad; - } l; - - /* - * Vendor-specific PMU registers. - * RW for both hypervisor and guest (see exceptions above). - * Guest's updates to this field are verified and then loaded by the - * hypervisor into hardware during XENPMU_flush - */ - union { - struct xen_pmu_amd_ctxt amd; - struct xen_pmu_intel_ctxt intel; - - /* - * Padding for contexts (fixed parts only, does not include MSR banks - * that are specified by offsets) - */ -#define XENPMU_CTXT_PAD_SZ 128 - uint8_t pad[XENPMU_CTXT_PAD_SZ]; - } c; -}; -typedef struct xen_pmu_arch xen_pmu_arch_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_arch_t); - -#endif /* __XEN_PUBLIC_ARCH_X86_PMU_H__ */ -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ - diff --git a/plat/xen/include/xen/arch-x86/xen-mca.h b/plat/xen/include/xen/arch-x86/xen-mca.h deleted file mode 100644 index dc35267249afd1fa54b718992c6a007d9d4dad0f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/xen-mca.h +++ /dev/null @@ -1,446 +0,0 @@ -/****************************************************************************** - * arch-x86/mca.h - * - * Contributed by Advanced Micro Devices, Inc. - * Author: Christoph Egger - * - * Guest OS machine check interface to x86 Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -/* Full MCA functionality has the following Usecases from the guest side: - * - * Must have's: - * 1. Dom0 and DomU register machine check trap callback handlers - * (already done via "set_trap_table" hypercall) - * 2. Dom0 registers machine check event callback handler - * (doable via EVTCHNOP_bind_virq) - * 3. Dom0 and DomU fetches machine check data - * 4. Dom0 wants Xen to notify a DomU - * 5. Dom0 gets DomU ID from physical address - * 6. Dom0 wants Xen to kill DomU (already done for "xm destroy") - * - * Nice to have's: - * 7. Dom0 wants Xen to deactivate a physical CPU - * This is better done as separate task, physical CPU hotplugging, - * and hypercall(s) should be sysctl's - * 8. Page migration proposed from Xen NUMA work, where Dom0 can tell Xen to - * move a DomU (or Dom0 itself) away from a malicious page - * producing correctable errors. - * 9. offlining physical page: - * Xen free's and never re-uses a certain physical page. - * 10. Testfacility: Allow Dom0 to write values into machine check MSR's - * and tell Xen to trigger a machine check - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_MCA_H__ -#define __XEN_PUBLIC_ARCH_X86_MCA_H__ - -/* Hypercall */ -#define __HYPERVISOR_mca __HYPERVISOR_arch_0 - -/* - * The xen-unstable repo has interface version 0x03000001; out interface - * is incompatible with that and any future minor revisions, so we - * choose a different version number range that is numerically less - * than that used in xen-unstable. - */ -#define XEN_MCA_INTERFACE_VERSION 0x01ecc003 - -/* IN: Dom0 calls hypercall to retrieve nonurgent telemetry */ -#define XEN_MC_NONURGENT 0x0001 -/* IN: Dom0/DomU calls hypercall to retrieve urgent telemetry */ -#define XEN_MC_URGENT 0x0002 -/* IN: Dom0 acknowledges previosly-fetched telemetry */ -#define XEN_MC_ACK 0x0004 - -/* OUT: All is ok */ -#define XEN_MC_OK 0x0 -/* OUT: Domain could not fetch data. */ -#define XEN_MC_FETCHFAILED 0x1 -/* OUT: There was no machine check data to fetch. */ -#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 - -/* OUT: DomU did not register MC NMI handler. Try something else. */ -#define XEN_MC_CANNOTHANDLE 0x8 -/* OUT: Notifying DomU failed. Retry later or try something else. */ -#define XEN_MC_NOTDELIVERED 0x10 -/* Note, XEN_MC_CANNOTHANDLE and XEN_MC_NOTDELIVERED are mutually exclusive. */ - -/* Applicable to all mc_vcpuid fields below. */ -#define XEN_MC_VCPUID_INVALID 0xffff - -#ifndef __ASSEMBLY__ - -#define VIRQ_MCA VIRQ_ARCH_0 /* G. (DOM0) Machine Check Architecture */ - -/* - * Machine Check Architecure: - * structs are read-only and used to report all kinds of - * correctable and uncorrectable errors detected by the HW. - * Dom0 and DomU: register a handler to get notified. - * 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 - -struct mcinfo_common { - 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) -/* contains global x86 mc information */ -struct mcinfo_global { - struct mcinfo_common common; - - /* running domain at the time in error (most likely the impacted one) */ - uint16_t mc_domid; - uint16_t mc_vcpuid; /* virtual cpu scheduled for mc_domid */ - uint32_t mc_socketid; /* physical socket of the physical core */ - uint16_t mc_coreid; /* physical impacted core */ - uint16_t mc_core_threadid; /* core thread of physical core */ - uint32_t mc_apicid; - uint32_t mc_flags; - uint64_t mc_gstatus; /* global status */ -}; - -/* contains bank local x86 mc information */ -struct mcinfo_bank { - struct mcinfo_common common; - - uint16_t mc_bank; /* bank nr */ - 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_misc; - uint64_t mc_ctrl2; - uint64_t mc_tsc; -}; - - -struct mcinfo_msr { - uint64_t reg; /* MSR */ - uint64_t value; /* MSR value */ -}; - -/* contains mc information from other - * or additional mc MSRs */ -struct mcinfo_extended { - struct mcinfo_common common; - - /* You can fill up to five registers. - * If you need more, then use this structure - * multiple times. */ - - uint32_t mc_msrs; /* Number of msr with valid values. */ - /* - * Currently Intel extended MSR (32/64) include all gp registers - * and E(R)FLAGS, E(R)IP, E(R)MISC, up to 11/19 of them might be - * useful at present. So expand this array to 16/32 to leave room. - */ - struct mcinfo_msr mc_msr[sizeof(void *) * 4]; -}; - -/* Recovery Action flags. Giving recovery result information to DOM0 */ - -/* Xen takes successful recovery action, the error is recovered */ -#define REC_ACTION_RECOVERED (0x1 << 0) -/* No action is performed by XEN */ -#define REC_ACTION_NONE (0x1 << 1) -/* It's possible DOM0 might take action ownership in some case */ -#define REC_ACTION_NEED_RESET (0x1 << 2) - -/* Different Recovery Action types, if the action is performed successfully, - * REC_ACTION_RECOVERED flag will be returned. - */ - -/* Page Offline Action */ -#define MC_ACTION_PAGE_OFFLINE (0x1 << 0) -/* CPU offline Action */ -#define MC_ACTION_CPU_OFFLINE (0x1 << 1) -/* L3 cache disable Action */ -#define MC_ACTION_CACHE_SHRINK (0x1 << 2) - -/* Below interface used between XEN/DOM0 for passing XEN's recovery action - * information to DOM0. - * usage Senario: After offlining broken page, XEN might pass its page offline - * 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 -{ - /* Params for passing the offlined page number to DOM0 */ - uint64_t mfn; - uint64_t status; -}; - -struct cpu_offline_action -{ - /* Params for passing the identity of the offlined CPU to DOM0 */ - uint32_t mc_socketid; - uint16_t mc_coreid; - uint16_t mc_core_threadid; -}; - -#define MAX_UNION_SIZE 16 -struct mcinfo_recovery -{ - struct mcinfo_common common; - uint16_t mc_bank; /* bank nr */ - uint8_t action_flags; - uint8_t action_types; - union { - struct page_offline_action page_retire; - struct cpu_offline_action cpu_offline; - uint8_t pad[MAX_UNION_SIZE]; - } action_info; -}; - - -#define MCINFO_HYPERCALLSIZE 1024 -#define MCINFO_MAXSIZE 768 - -#define MCINFO_FLAGS_UNCOMPLETE 0x1 -struct mc_info { - /* Number of mcinfo_* entries in mi_data */ - uint32_t mi_nentries; - uint32_t flags; - uint64_t mi_data[(MCINFO_MAXSIZE - 1) / 8]; -}; -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) */ - -struct mcinfo_logical_cpu { - uint32_t mc_cpunr; - uint32_t mc_chipid; - uint16_t mc_coreid; - uint16_t mc_threadid; - uint32_t mc_apicid; - uint32_t mc_clusterid; - uint32_t mc_ncores; - uint32_t mc_ncores_active; - uint32_t mc_nthreads; - int32_t mc_cpuid_level; - uint32_t mc_family; - uint32_t mc_vendor; - uint32_t mc_model; - uint32_t mc_step; - char mc_vendorid[16]; - char mc_brandid[64]; - uint32_t mc_cpu_caps[MC_NCAPS]; - uint32_t mc_cache_size; - uint32_t mc_cache_alignment; - int32_t mc_nmsrvals; - struct mcinfo_msr mc_msrvalues[__MC_MSR_ARRAYSIZE]; -}; -typedef struct mcinfo_logical_cpu xen_mc_logical_cpu_t; -DEFINE_XEN_GUEST_HANDLE(xen_mc_logical_cpu_t); - - -/* - * OS's should use these instead of writing their own lookup function - * each with its own bugs and drawbacks. - * We use macros instead of static inline functions to allow guests - * to include this header in assembly files (*.S). - */ -/* Prototype: - * uint32_t x86_mcinfo_nentries(struct mc_info *mi); - */ -#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) -/* Prototype: - * struct mcinfo_common *x86_mcinfo_next(struct mcinfo_common *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; \ - } while (0) - - -/* Usecase 1 - * Register machine check trap callback handler - * (already done via "set_trap_table" hypercall) - */ - -/* Usecase 2 - * Dom0 registers machine check event callback handler - * done by EVTCHNOP_bind_virq - */ - -/* Usecase 3 - * Fetch machine check data from hypervisor. - * Note, this hypercall is special, because both Dom0 and DomU must use this. - */ -#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 _pad0; - uint64_t fetch_id; /* OUT: id for ack, IN: id we are ack'ing */ - - /* OUT variables. */ - XEN_GUEST_HANDLE(mc_info_t) data; -}; -typedef struct xen_mc_fetch xen_mc_fetch_t; -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 -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. */ - - /* 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 */ -}; -typedef struct xen_mc_notifydomain xen_mc_notifydomain_t; -DEFINE_XEN_GUEST_HANDLE(xen_mc_notifydomain_t); - -#define XEN_MC_physcpuinfo 3 -struct xen_mc_physcpuinfo { - /* IN/OUT */ - uint32_t ncpus; - uint32_t _pad0; - /* OUT */ - XEN_GUEST_HANDLE(xen_mc_logical_cpu_t) info; -}; - -#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 */ - 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 XEN_MC_mceinject 5 -struct xen_mc_mceinject { - 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_CPU_BROADCAST 0x8 - -struct xen_mc_inject_v2 { - uint32_t flags; - struct xenctl_bitmap cpumap; -}; -#endif - -struct xen_mc { - uint32_t cmd; - uint32_t interface_version; /* XEN_MCA_INTERFACE_VERSION */ - union { - 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; -#if defined(__XEN__) || defined(__XEN_TOOLS__) - struct xen_mc_inject_v2 mc_inject_v2; -#endif - } u; -}; -typedef struct xen_mc xen_mc_t; -DEFINE_XEN_GUEST_HANDLE(xen_mc_t); - -#endif /* __ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ARCH_X86_MCA_H__ */ diff --git a/plat/xen/include/xen/arch-x86/xen-x86_32.h b/plat/xen/include/xen/arch-x86/xen-x86_32.h deleted file mode 100644 index aa388b7f32887594480734cef49ba02b7202a85c..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/xen-x86_32.h +++ /dev/null @@ -1,194 +0,0 @@ -/****************************************************************************** - * xen-x86_32.h - * - * Guest OS interface to x86 32-bit Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004-2007, K A Fraser - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ -#define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ - -/* - * Hypercall interface: - * Input: %ebx, %ecx, %edx, %esi, %edi, %ebp (arguments 1-6) - * Output: %eax - * Access is via hypercall page (set up by guest loader or via a Xen MSR): - * call hypercall_page + hypercall-number * 32 - * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx) - */ - -/* - * These flat segments are in the Xen-private section of every GDT. Since these - * 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_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 __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 \ - 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 __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE -#define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE -#define __MACH2PHYS_VIRT_END __MACH2PHYS_VIRT_END_PAE - -#ifndef HYPERVISOR_VIRT_START -#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) -#ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START) -#endif - -/* 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 -#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) -#endif - -#ifndef __ASSEMBLY__ - -#if defined(XEN_GENERATING_COMPAT_HEADERS) -/* 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; \ -} -#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 -#endif - -struct cpu_user_regs { - __DECL_REG_LO8(b); - __DECL_REG_LO8(c); - __DECL_REG_LO8(d); - __DECL_REG_LO16(si); - __DECL_REG_LO16(di); - __DECL_REG_LO16(bp); - __DECL_REG_LO8(a); - 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; - __DECL_REG_LO16(flags); /* eflags.IF == !saved_upcall_mask */ - __DECL_REG_LO16(sp); - uint16_t ss, _pad1; - uint16_t es, _pad2; - uint16_t ds, _pad3; - uint16_t fs, _pad4; - uint16_t gs, _pad5; -}; -typedef struct cpu_user_regs cpu_user_regs_t; -DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t); - -#undef __DECL_REG_LO8 -#undef __DECL_REG_LO16 - -/* - * Page-directory addresses above 4GB do not fit into architectural %cr3. - * When accessing %cr3, or equivalent field in vcpu_guest_context, guests - * must use the following accessor macros to pack/unpack valid MFNs. - */ -#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20)) -#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20)) - -struct arch_vcpu_info { - unsigned long cr2; - unsigned long pad[5]; /* sizeof(vcpu_info_t) == 64 */ -}; -typedef struct arch_vcpu_info arch_vcpu_info_t; - -struct xen_callback { - unsigned long cs; - unsigned long eip; -}; -typedef struct xen_callback xen_callback_t; - -#endif /* !__ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/arch-x86/xen-x86_64.h b/plat/xen/include/xen/arch-x86/xen-x86_64.h deleted file mode 100644 index be52f705c9451e471c2c9f1737853cd14bfadd0b..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/xen-x86_64.h +++ /dev/null @@ -1,241 +0,0 @@ -/****************************************************************************** - * xen-x86_64.h - * - * Guest OS interface to x86 64-bit Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ -#define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ - -/* - * Hypercall interface: - * Input: %rdi, %rsi, %rdx, %r10, %r8, %r9 (arguments 1-6) - * Output: %rax - * Access is via hypercall page (set up by guest loader or via a Xen MSR): - * call hypercall_page + hypercall-number * 32 - * Clobbered: argument registers (e.g., 2-arg hypercall clobbers %rdi,%rsi) - */ - -/* - * 64-bit segment selectors - * These flat segments are in the Xen-private section of every GDT. Since these - * are also present in the initial GDT, many OSes will be able to avoid - * installing their own GDT. - */ - -#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */ -#define FLAT_RING3_CS64 0xe033 /* GDT index 261 */ -#define FLAT_RING3_DS32 0xe02b /* GDT index 262 */ -#define FLAT_RING3_DS64 0x0000 /* NULL selector */ -#define FLAT_RING3_SS32 0xe02b /* GDT index 262 */ -#define FLAT_RING3_SS64 0xe02b /* GDT index 262 */ - -#define FLAT_KERNEL_DS64 FLAT_RING3_DS64 -#define FLAT_KERNEL_DS32 FLAT_RING3_DS32 -#define FLAT_KERNEL_DS FLAT_KERNEL_DS64 -#define FLAT_KERNEL_CS64 FLAT_RING3_CS64 -#define FLAT_KERNEL_CS32 FLAT_RING3_CS32 -#define FLAT_KERNEL_CS FLAT_KERNEL_CS64 -#define FLAT_KERNEL_SS64 FLAT_RING3_SS64 -#define FLAT_KERNEL_SS32 FLAT_RING3_SS32 -#define FLAT_KERNEL_SS FLAT_KERNEL_SS64 - -#define FLAT_USER_DS64 FLAT_RING3_DS64 -#define FLAT_USER_DS32 FLAT_RING3_DS32 -#define FLAT_USER_DS FLAT_USER_DS64 -#define FLAT_USER_CS64 FLAT_RING3_CS64 -#define FLAT_USER_CS32 FLAT_RING3_CS32 -#define FLAT_USER_CS FLAT_USER_CS64 -#define FLAT_USER_SS64 FLAT_RING3_SS64 -#define FLAT_USER_SS32 FLAT_RING3_SS32 -#define FLAT_USER_SS FLAT_USER_SS64 - -#define __HYPERVISOR_VIRT_START 0xFFFF800000000000 -#define __HYPERVISOR_VIRT_END 0xFFFF880000000000 -#define __MACH2PHYS_VIRT_START 0xFFFF800000000000 -#define __MACH2PHYS_VIRT_END 0xFFFF804000000000 - -#ifndef HYPERVISOR_VIRT_START -#define HYPERVISOR_VIRT_START xen_mk_ulong(__HYPERVISOR_VIRT_START) -#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) -#ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) -#endif - -/* - * int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base) - * @which == SEGBASE_* ; @base == 64-bit base address - * Returns 0 on success. - */ -#define SEGBASE_FS 0 -#define SEGBASE_GS_USER 1 -#define SEGBASE_GS_KERNEL 2 -#define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */ - -/* - * int HYPERVISOR_iret(void) - * All arguments are on the kernel stack, in the following format. - * Never returns if successful. Current kernel context is lost. - * The saved CS is mapped as follows: - * RING0 -> RING3 kernel mode. - * RING1 -> RING3 kernel mode. - * RING2 -> RING3 kernel mode. - * RING3 -> RING3 user mode. - * However RING0 indicates that the guest kernel should return to iteself - * directly with - * orb $3,1*8(%rsp) - * iretq - * If flags contains VGCF_in_syscall: - * Restore RAX, RIP, RFLAGS, RSP. - * Discard R11, RCX, CS, SS. - * Otherwise: - * Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP. - * All other registers are saved on hypercall entry and restored to user. - */ -/* 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 VGCF_in_syscall - -#ifndef __ASSEMBLY__ - -struct iret_context { - /* Top of stack (%rsp at point of hypercall). */ - uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss; - /* Bottom of iret stack frame. */ -}; - -#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; \ -} -#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; \ -} -#else -/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */ -#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_LO8 __DECL_REG -#define __DECL_REG_LO16 __DECL_REG -#define __DECL_REG_HI(num) uint64_t r ## num -#endif - -struct cpu_user_regs { - __DECL_REG_HI(15); - __DECL_REG_HI(14); - __DECL_REG_HI(13); - __DECL_REG_HI(12); - __DECL_REG_LO8(bp); - __DECL_REG_LOHI(b); - __DECL_REG_HI(11); - __DECL_REG_HI(10); - __DECL_REG_HI(9); - __DECL_REG_HI(8); - __DECL_REG_LOHI(a); - __DECL_REG_LOHI(c); - __DECL_REG_LOHI(d); - __DECL_REG_LO8(si); - __DECL_REG_LO8(di); - 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]; - __DECL_REG_LO16(flags); /* rflags.IF == !saved_upcall_mask */ - __DECL_REG_LO8(sp); - uint16_t ss, _pad2[3]; - uint16_t es, _pad3[3]; - uint16_t ds, _pad4[3]; - uint16_t fs, _pad5[3]; /* Non-nul => takes precedence over fs_base. */ - uint16_t gs, _pad6[3]; /* Non-nul => takes precedence over gs_base_user. */ -}; -typedef struct cpu_user_regs cpu_user_regs_t; -DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t); - -#undef __DECL_REG -#undef __DECL_REG_LOHI -#undef __DECL_REG_LO8 -#undef __DECL_REG_LO16 -#undef __DECL_REG_HI - -#define xen_pfn_to_cr3(pfn) ((unsigned long)(pfn) << 12) -#define xen_cr3_to_pfn(cr3) ((unsigned long)(cr3) >> 12) - -struct arch_vcpu_info { - unsigned long cr2; - unsigned long pad; /* sizeof(vcpu_info_t) == 64 */ -}; -typedef struct arch_vcpu_info arch_vcpu_info_t; - -typedef unsigned long xen_callback_t; - -#endif /* !__ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/arch-x86/xen.h b/plat/xen/include/xen/arch-x86/xen.h deleted file mode 100644 index ff918310f688942dec43fcb691377ae0b3fd792f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86/xen.h +++ /dev/null @@ -1,355 +0,0 @@ -/****************************************************************************** - * arch-x86/xen.h - * - * Guest OS interface to x86 Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#include "../xen.h" - -#ifndef __XEN_PUBLIC_ARCH_X86_XEN_H__ -#define __XEN_PUBLIC_ARCH_X86_XEN_H__ - -/* 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 -#else -#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ - typedef type * __guest_handle_ ## name -#endif - -/* - * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field - * in a struct in memory. - * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an - * hypercall argument. - * 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_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 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 -#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 -#elif defined(__x86_64__) -#include "xen-x86_64.h" -#endif - -#ifndef __ASSEMBLY__ -typedef unsigned long xen_pfn_t; -#define PRI_xen_pfn "lx" -#endif - -#define XEN_HAVE_PV_GUEST_ENTRY 1 - -#define XEN_HAVE_PV_UPCALL_MASK 1 - -/* - * `incontents 200 segdesc Segment Descriptor Tables - */ -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_gdt(const xen_pfn_t frames[], unsigned int entries); - * ` - */ -/* - * A number of GDT entries are reserved by Xen. These are not situated at the - * start of the GDT because some stupid OSes export hard-coded selector values - * in their ABI. These hard-coded values are always near the start of the GDT, - * so Xen places itself out of the way, at the far end of the GDT. - * - * NB The LDT is set using the MMUEXT_SET_LDT op of HYPERVISOR_mmuext_op - */ -#define FIRST_RESERVED_GDT_PAGE 14 -#define FIRST_RESERVED_GDT_BYTE (FIRST_RESERVED_GDT_PAGE * 4096) -#define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8) - - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_update_descriptor(u64 pa, u64 desc); - * ` - * ` @pa The machine physical address of the descriptor to - * ` update. Must be either a descriptor page or writable. - * ` @desc The descriptor value to update, in the same format as a - * ` native descriptor table entry. - */ - -/* Maximum number of virtual CPUs in legacy multi-processor guests. */ -#define XEN_LEGACY_MAX_VCPUS 32 - -#ifndef __ASSEMBLY__ - -typedef unsigned long xen_ulong_t; -#define PRI_xen_ulong "lx" - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp); - * ` - * Sets the stack segment and pointer for the current vcpu. - */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_trap_table(const struct trap_info traps[]); - * ` - */ -/* - * Send an array of these to HYPERVISOR_set_trap_table(). - * Terminate the array with a sentinel entry, with traps[].address==0. - * The privilege level specifies which modes may enter a trap via a software - * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate - * privilege levels as follows: - * Level == 0: Noone may enter - * Level == 1: Kernel may enter - * 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)) -struct trap_info { - 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; -DEFINE_XEN_GUEST_HANDLE(trap_info_t); - -typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */ - -/* - * The following is all CPU context. Note that the fpu_ctxt block is filled - * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. - * - * Also note that when calling DOMCTL_setvcpucontext for HVM guests, not all - * information in this structure is updated, the fields read include: fpu_ctxt - * (if VGCT_I387_VALID is set), flags, user_regs and debugreg[*]. - * - * Note: VCPUOP_initialise for HVM guests is non-symetric with - * DOMCTL_setvcpucontext, and uses struct vcpu_hvm_context from hvm/hvm_vcpu.h - */ -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) -#define _VGCF_i387_valid 0 -#define VGCF_i387_valid (1<<_VGCF_i387_valid) -#define _VGCF_in_kernel 2 -#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_syscall_disables_events 4 -#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) */ - unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ - 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) */ -#ifdef __i386__ - 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_eip; -#else - unsigned long event_callback_eip; - unsigned long failsafe_callback_eip; -#ifdef __XEN__ - union { - unsigned long syscall_callback_eip; - struct { - unsigned int event_callback_cs; /* compat CS of event cb */ - unsigned int failsafe_callback_cs; /* compat CS of failsafe cb */ - }; - }; -#else - unsigned long syscall_callback_eip; -#endif -#endif - 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; -#endif -}; -typedef struct vcpu_guest_context vcpu_guest_context_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); - -struct arch_shared_info { - /* - * Number of valid entries in the p2m table(s) anchored at - * pfn_to_mfn_frame_list_list and/or p2m_vaddr. - */ - unsigned long max_pfn; - /* - * Frame containing list of mfns containing list of mfns containing p2m. - * A value of 0 indicates it has not yet been set up, ~0 indicates it has - * been set to invalid e.g. due to the p2m being too large for the 3-level - * 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; - unsigned long nmi_reason; - /* - * Following three fields are valid if p2m_cr3 contains a value different - * from 0. - * p2m_cr3 is the root of the address space where p2m_vaddr is valid. - * p2m_cr3 is in the same format as a cr3 value in the vcpu register state - * and holds the folded machine frame number (via xen_pfn_to_cr3) of a - * L3 or L4 page table. - * p2m_vaddr holds the virtual address of the linear p2m list. All entries - * in the range [0...max_pfn[ are accessible via this pointer. - * p2m_generation will be incremented by the guest before and after each - * change of the mappings of the p2m list. p2m_generation starts at 0 and - * a value with the least significant bit set indicates that a mapping - * update is in progress. This allows guest external software (e.g. in Dom0) - * to verify that read mappings are consistent and whether they have changed - * since the last check. - * 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 */ -#ifdef __i386__ - /* There's no room for this field in the generic structure. */ - uint32_t wc_sec_hi; -#endif -}; -typedef struct arch_shared_info arch_shared_info_t; - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -/* - * struct xen_arch_domainconfig's ABI is covered by - * 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_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) - 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) - -/* GPE0 bit set during CPU hotplug */ -#define XEN_ACPI_GPE0_CPUHP_BIT 2 -#endif - -#endif /* !__ASSEMBLY__ */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_fpu_taskswitch(int set); - * ` - * Sets (if set!=0) or clears (if set==0) CR0.TS. - */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_debugreg(int regno, unsigned long value); - * - * ` unsigned long - * ` HYPERVISOR_get_debugreg(int regno); - * For 0<=reg<=7, returns the debug register value. - * For other values of reg, returns ((unsigned long)-EINVAL). - * (Unfortunately, this interface is defective.) - */ - -/* - * Prefix forces emulation of some non-trapping instructions. - * Currently only CPUID. - */ -#ifdef __ASSEMBLY__ -#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 ; " -#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" -#endif - -#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/arch-x86_32.h b/plat/xen/include/xen/arch-x86_32.h deleted file mode 100644 index 45842b203442426b08299c74a8e1aaddd9e7fa55..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86_32.h +++ /dev/null @@ -1,27 +0,0 @@ -/****************************************************************************** - * arch-x86_32.h - * - * Guest OS interface to x86 32-bit Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#include "arch-x86/xen.h" diff --git a/plat/xen/include/xen/arch-x86_64.h b/plat/xen/include/xen/arch-x86_64.h deleted file mode 100644 index 409805f35f1f518633c990a019cb30c36b27a454..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/arch-x86_64.h +++ /dev/null @@ -1,43 +0,0 @@ -/****************************************************************************** - * arch-x86_64.h - * - * Guest OS interface to x86 64-bit Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004-2006, K A Fraser - */ - -#include "arch-x86/xen.h" - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_set_callbacks(unsigned long event_selector, - * ` unsigned long event_address, - * ` unsigned long failsafe_selector, - * ` unsigned long failsafe_address); - * ` - * Register for callbacks on events. When an event (from an event - * channel) occurs, event_address is used as the value of eip. - * - * A similar callback occurs if the segment selectors are invalid. - * failsafe_address is used as the value of eip. - * - * On x86_64, event_selector and failsafe_selector are ignored (???). - */ diff --git a/plat/xen/include/xen/callback.h b/plat/xen/include/xen/callback.h deleted file mode 100644 index 8f937880e20001f67fa0c410d1acbbd14c534f67..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/callback.h +++ /dev/null @@ -1,121 +0,0 @@ -/****************************************************************************** - * callback.h - * - * Register guest OS callbacks with Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2006, Ian Campbell - */ - -#ifndef __XEN_PUBLIC_CALLBACK_H__ -#define __XEN_PUBLIC_CALLBACK_H__ - -#include "xen.h" - -/* - * Prototype for this hypercall is: - * long callback_op(int cmd, void *extra_args) - * @cmd == CALLBACKOP_??? (callback operation). - * @extra_args == Operation-specific extra arguments (NULL if none). - */ - -/* x86: Callback for event delivery. */ -#define CALLBACKTYPE_event 0 - -/* x86: Failsafe callback when guest state cannot be restored by Xen. */ -#define CALLBACKTYPE_failsafe 1 - -/* x86/64 hypervisor: Syscall by 64-bit guest app ('64-on-64-on-64'). */ -#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 - -/* x86: Callback for NMI delivery. */ -#define CALLBACKTYPE_nmi 4 - -/* - * x86: sysenter is only available as follows: - * - 32-bit hypervisor: with the supervisor_mode_kernel feature enabled - * - 64-bit hypervisor: 32-bit guest applications on Intel CPUs - * ('32-on-32-on-64', '32-on-64-on-64') - * [nb. also 64-bit guest applications on Intel CPUs - * ('64-on-64-on-64'), but syscall is preferred] - */ -#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 - -/* - * 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) - -/* - * Register a callback. - */ -#define CALLBACKOP_register 0 -struct callback_register { - uint16_t type; - uint16_t flags; - xen_callback_t address; -}; -typedef struct callback_register callback_register_t; -DEFINE_XEN_GUEST_HANDLE(callback_register_t); - -/* - * Unregister a callback. - * - * Not all callbacks can be unregistered. -EINVAL will be returned if - * you attempt to unregister such a callback. - */ -#define CALLBACKOP_unregister 1 -struct callback_unregister { - uint16_t type; - uint16_t _unused; -}; -typedef struct callback_unregister callback_unregister_t; -DEFINE_XEN_GUEST_HANDLE(callback_unregister_t); - -#if __XEN_INTERFACE_VERSION__ < 0x00030207 -#undef CALLBACKTYPE_sysenter -#define CALLBACKTYPE_sysenter CALLBACKTYPE_sysenter_deprecated -#endif - -#endif /* __XEN_PUBLIC_CALLBACK_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/dom0_ops.h b/plat/xen/include/xen/dom0_ops.h deleted file mode 100644 index c8d764ed6f912f5ba3b6abb89c2534efcfff5d7b..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/dom0_ops.h +++ /dev/null @@ -1,120 +0,0 @@ -/****************************************************************************** - * dom0_ops.h - * - * Process command requests from domain-0 guest OS. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2002-2003, B Dragovic - * Copyright (c) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_DOM0_OPS_H__ -#define __XEN_PUBLIC_DOM0_OPS_H__ - -#include "xen.h" -#include "platform.h" - -#if __XEN_INTERFACE_VERSION__ >= 0x00030204 -#error "dom0_ops.h is a compatibility interface only" -#endif - -#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_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_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_PLATFORM_QUIRK XENPF_platform_quirk -#define dom0_platform_quirk xenpf_platform_quirk -#define dom0_platform_quirk_t xenpf_platform_quirk_t - -typedef uint64_t cpumap_t; - -/* Unsupported legacy operation -- defined for API compatibility. */ -#define DOM0_MSR 15 -struct dom0_msr { - /* IN variables. */ - uint32_t write; - cpumap_t cpu_mask; - uint32_t msr; - uint32_t in1; - uint32_t in2; - /* OUT variables. */ - uint32_t out1; - uint32_t out2; -}; -typedef struct dom0_msr dom0_msr_t; -DEFINE_XEN_GUEST_HANDLE(dom0_msr_t); - -/* Unsupported legacy operation -- defined for API compatibility. */ -#define DOM0_PHYSICAL_MEMORY_MAP 40 -struct dom0_memory_map_entry { - uint64_t start, end; - uint32_t flags; /* reserved */ - uint8_t is_ram; -}; -typedef struct dom0_memory_map_entry dom0_memory_map_entry_t; -DEFINE_XEN_GUEST_HANDLE(dom0_memory_map_entry_t); - -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]; - } u; -}; -typedef struct dom0_op dom0_op_t; -DEFINE_XEN_GUEST_HANDLE(dom0_op_t); - -#endif /* __XEN_PUBLIC_DOM0_OPS_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/domctl.h b/plat/xen/include/xen/domctl.h deleted file mode 100644 index 70027abc005c2ac6caa67e309433f874355d41d4..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/domctl.h +++ /dev/null @@ -1,1267 +0,0 @@ -/****************************************************************************** - * domctl.h - * - * Domain management operations. For use by node control stack. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2002-2003, B Dragovic - * Copyright (c) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_DOMCTL_H__ -#define __XEN_PUBLIC_DOMCTL_H__ - -#if !defined(__XEN__) && !defined(__XEN_TOOLS__) -#error "domctl operations are intended for use by node control tools only" -#endif - -#include "xen.h" -#include "event_channel.h" -#include "grant_table.h" -#include "hvm/save.h" -#include "memory.h" - -#define XEN_DOMCTL_INTERFACE_VERSION 0x0000000e - -/* - * NB. xen_domctl.domain is an IN/OUT parameter for this operation. - * If it is specified as zero, an id is auto-allocated and returned. - */ -/* XEN_DOMCTL_createdomain */ -struct xen_domctl_createdomain { - /* IN parameters */ - uint32_t ssidref; - xen_domain_handle_t handle; - /* Is this an HVM guest (as opposed to a PVH or PV guest)? */ -#define _XEN_DOMCTL_CDF_hvm_guest 0 -#define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest) - /* 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) - uint32_t flags; - struct xen_arch_domainconfig config; -}; - -/* 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). */ -#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) -/* domain is a xenstore domain */ -#define _XEN_DOMINF_xs_domain 7 -#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_shutdownshift 16 - uint32_t flags; /* XEN_DOMINF_* */ - uint64_aligned_t tot_pages; - uint64_aligned_t max_pages; - uint64_aligned_t outstanding_pages; - uint64_aligned_t shr_pages; - 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. */ -#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 ssidref; - xen_domain_handle_t handle; - uint32_t cpupool; -}; -typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t); - - -/* XEN_DOMCTL_getmemlist */ -struct xen_domctl_getmemlist { - /* IN variables. */ - /* Max entries to write to output buffer. */ - uint64_aligned_t max_pfns; - /* Start index in guest's page list. */ - uint64_aligned_t start_pfn; - XEN_GUEST_HANDLE_64(uint64) buffer; - /* OUT variables. */ - uint64_aligned_t num_pfns; -}; - - -/* 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) - -/* XEN_DOMCTL_getpageframeinfo3 */ -struct xen_domctl_getpageframeinfo3 { - /* IN variables. */ - uint64_aligned_t num; - /* IN/OUT variables. */ - XEN_GUEST_HANDLE_64(xen_pfn_t) array; -}; - - -/* - * Control shadow pagetables operation - */ -/* XEN_DOMCTL_shadow_op */ - -/* Disable shadow mode. */ -#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 - -/* 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 - -/* Memory allocation accessors. */ -#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: -#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. - */ -#define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2) - /* - * 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) - -/* 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) - -struct xen_domctl_shadow_op_stats { - uint32_t fault_count; - uint32_t dirty_count; -}; - -struct xen_domctl_shadow_op { - /* IN variables. */ - uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */ - - /* OP_ENABLE: XEN_DOMCTL_SHADOW_ENABLE_* */ - /* OP_PEAK / OP_CLEAN: XEN_DOMCTL_SHADOW_LOGDIRTY_* */ - uint32_t mode; - - /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */ - uint32_t mb; /* Shadow memory allocation in MB */ - - /* OP_PEEK / OP_CLEAN */ - XEN_GUEST_HANDLE_64(uint8) dirty_bitmap; - uint64_aligned_t pages; /* Size of buffer. Updated with actual size. */ - struct xen_domctl_shadow_op_stats stats; -}; - - -/* XEN_DOMCTL_max_mem */ -struct xen_domctl_max_mem { - /* IN variables. */ - uint64_aligned_t max_memkb; -}; - - -/* XEN_DOMCTL_setvcpucontext */ -/* XEN_DOMCTL_getvcpucontext */ -struct xen_domctl_vcpucontext { - uint32_t vcpu; /* IN */ - XEN_GUEST_HANDLE_64(vcpu_guest_context_t) ctxt; /* IN/OUT */ -}; - - -/* XEN_DOMCTL_getvcpuinfo */ -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 */ -}; - - -/* Get/set the NUMA node(s) with which the guest has affinity with. */ -/* XEN_DOMCTL_setnodeaffinity */ -/* XEN_DOMCTL_getnodeaffinity */ -struct xen_domctl_nodeaffinity { - struct xenctl_bitmap nodemap;/* IN */ -}; - - -/* Get/set which physical cpus a vcpu can execute on. */ -/* XEN_DOMCTL_setvcpuaffinity */ -/* 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 */ -#define _XEN_VCPUAFFINITY_FORCE 2 -#define XEN_VCPUAFFINITY_FORCE (1U<<_XEN_VCPUAFFINITY_FORCE) - uint32_t flags; - /* - * IN/OUT variables. - * - * Both are IN/OUT for XEN_DOMCTL_setvcpuaffinity, in which case they - * contain effective hard or/and soft affinity. That is, upon successful - * return, cpumap_soft, contains the intersection of the soft affinity, - * hard affinity and the cpupool's online CPUs for the domain (if - * XEN_VCPUAFFINITY_SOFT was set in flags). cpumap_hard contains the - * intersection between hard affinity and the cpupool's online CPUs (if - * XEN_VCPUAFFINITY_HARD was set in flags). - * - * Both are OUT-only for XEN_DOMCTL_getvcpuaffinity, in which case they - * contain the plain hard and/or soft affinity masks that were set during - * previous successful calls to XEN_DOMCTL_setvcpuaffinity (or the - * default values), without intersecting or altering them in any way. - */ - struct xenctl_bitmap cpumap_hard; - struct xenctl_bitmap cpumap_soft; -}; - - -/* XEN_DOMCTL_max_vcpus */ -struct xen_domctl_max_vcpus { - uint32_t max; /* maximum number of vcpus */ -}; - - -/* XEN_DOMCTL_scheduler_op */ -/* Scheduler types. */ -/* #define XEN_SCHEDULER_SEDF 4 (Removed) */ -#define XEN_SCHEDULER_CREDIT 5 -#define XEN_SCHEDULER_CREDIT2 6 -#define XEN_SCHEDULER_ARINC653 7 -#define XEN_SCHEDULER_RTDS 8 -#define XEN_SCHEDULER_NULL 9 - -struct xen_domctl_sched_credit { - uint16_t weight; - uint16_t cap; -}; - -struct xen_domctl_sched_credit2 { - uint16_t weight; - uint16_t cap; -}; - -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) - uint32_t flags; -}; - -typedef struct xen_domctl_schedparam_vcpu { - union { - struct xen_domctl_sched_credit credit; - struct xen_domctl_sched_credit2 credit2; - struct xen_domctl_sched_rtds rtds; - } u; - uint32_t vcpuid; -} xen_domctl_schedparam_vcpu_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_schedparam_vcpu_t); - -/* - * Set or get info? - * For schedulers supporting per-vcpu settings (e.g., RTDS): - * XEN_DOMCTL_SCHEDOP_putinfo sets params for all vcpus; - * XEN_DOMCTL_SCHEDOP_getinfo gets default params; - * XEN_DOMCTL_SCHEDOP_put(get)vcpuinfo sets (gets) params of vcpus; - * - * For schedulers not supporting per-vcpu settings: - * XEN_DOMCTL_SCHEDOP_putinfo sets params for all vcpus; - * 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_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_* */ - /* IN/OUT */ - union { - struct xen_domctl_sched_credit credit; - struct xen_domctl_sched_credit2 credit2; - struct xen_domctl_sched_rtds rtds; - struct { - XEN_GUEST_HANDLE_64(xen_domctl_schedparam_vcpu_t) vcpus; - /* - * IN: Number of elements in vcpus array. - * OUT: Number of processed elements of vcpus array. - */ - uint32_t nr_vcpus; - uint32_t padding; - } v; - } u; -}; - - -/* XEN_DOMCTL_setdomainhandle */ -struct xen_domctl_setdomainhandle { - xen_domain_handle_t handle; -}; - - -/* XEN_DOMCTL_setdebugging */ -struct xen_domctl_setdebugging { - uint8_t enable; -}; - - -/* XEN_DOMCTL_irq_permission */ -struct xen_domctl_irq_permission { - uint8_t pirq; - 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? */ -}; - - -/* 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? */ -}; - - -/* XEN_DOMCTL_hypercall_init */ -struct xen_domctl_hypercall_init { - uint64_aligned_t gmfn; /* GMFN to be initialised */ -}; - - -/* XEN_DOMCTL_settimeoffset */ -struct xen_domctl_settimeoffset { - int64_aligned_t time_offset_seconds; /* applied to domain wallclock time */ -}; - -/* XEN_DOMCTL_gethvmcontext */ -/* 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_DOMCTL_set_address_size */ -/* XEN_DOMCTL_get_address_size */ -struct xen_domctl_address_size { - uint32_t 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 -struct xen_domctl_sendtrigger { - uint32_t trigger; /* IN */ - uint32_t vcpu; /* IN */ -}; - - -/* Assign a device to a guest. Sets up IOMMU structures. */ -/* XEN_DOMCTL_assign_device */ -/* - * XEN_DOMCTL_test_assign_device: Pass DOMID_INVALID to find out whether the - * given device is assigned to any DomU at all. Pass a specific domain ID to - * find out whether the given device can be assigned to that domain. - */ -/* - * XEN_DOMCTL_deassign_device: The behavior of this DOMCTL differs - * between the different type of device: - * - PCI device (XEN_DOMCTL_DEV_PCI) will be reassigned to DOM0 - * - DT device (XEN_DOMCTL_DEV_DT) will left unassigned. DOM0 - * 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 -struct xen_domctl_assign_device { - /* IN */ - uint32_t dev; /* XEN_DOMCTL_DEV_* */ - uint32_t flags; -#define XEN_DOMCTL_DEV_RDM_RELAXED 1 /* assign only */ - union { - struct { - uint32_t machine_sbdf; /* machine PCI ID of assigned device */ - } pci; - struct { - uint32_t size; /* Length of the path */ - XEN_GUEST_HANDLE_64(char) path; /* path to the device tree node */ - } dt; - } u; -}; - -/* Retrieve sibling devices infomation 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 */ -}; - -/* Pass-through interrupts: bind real irq -> hvm devfn. */ -/* XEN_DOMCTL_bind_pt_irq */ -/* XEN_DOMCTL_unbind_pt_irq */ -enum pt_irq_type { - PT_IRQ_TYPE_PCI, - PT_IRQ_TYPE_ISA, - PT_IRQ_TYPE_MSI, - PT_IRQ_TYPE_MSI_TRANSLATE, - PT_IRQ_TYPE_SPI, /* ARM: valid range 32-1019 */ -}; -struct xen_domctl_bind_pt_irq { - uint32_t machine_irq; - uint32_t irq_type; /* enum pt_irq_type */ - - union { - struct { - uint8_t isa_irq; - } isa; - struct { - uint8_t bus; - uint8_t device; - uint8_t intx; - } pci; - struct { - uint8_t gvec; - uint32_t gflags; -#define XEN_DOMCTL_VMSI_X86_DEST_ID_MASK 0x0000ff -#define XEN_DOMCTL_VMSI_X86_RH_MASK 0x000100 -#define XEN_DOMCTL_VMSI_X86_DM_MASK 0x000200 -#define XEN_DOMCTL_VMSI_X86_DELIV_MASK 0x007000 -#define XEN_DOMCTL_VMSI_X86_TRIG_MASK 0x008000 -#define XEN_DOMCTL_VMSI_X86_UNMASKED 0x010000 - - uint64_aligned_t gtable; - } msi; - struct { - uint16_t spi; - } spi; - } u; -}; - - -/* Bind machine I/O address range -> HVM address range. */ -/* XEN_DOMCTL_memory_mapping */ -/* Returns - - zero success, everything done - - -E2BIG passed in nr_mfns value too large for the implementation - - positive partial success for the first page frames (with - less than nr_mfns), requiring re-invocation by the - caller after updating inputs - - negative error; other than -E2BIG -*/ -#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 */ -}; - - -/* 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 */ -}; - - -/* - * Pin caching type of RAM space for x86 HVM domU. - */ -/* 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_DELETE_MEM_CACHEATTR (~(uint32_t)0) -struct xen_domctl_pin_mem_cacheattr { - uint64_aligned_t start, end; - uint32_t type; /* XEN_DOMCTL_MEM_CACHEATTR_* */ -}; - - -/* XEN_DOMCTL_set_ext_vcpucontext */ -/* XEN_DOMCTL_get_ext_vcpucontext */ -struct xen_domctl_ext_vcpucontext { - /* IN: VCPU that this call applies to. */ - uint32_t vcpu; - /* - * SET: Size of struct (IN) - * GET: Size of struct (OUT, up to 128 bytes) - */ - 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; -#if defined(__GNUC__) - union { - uint64_aligned_t mcg_cap; - struct hvm_vmce_vcpu vmce; - }; -#else - struct hvm_vmce_vcpu vmce; -#endif -#endif -}; - -/* - * Set the target domain for a domain - */ -/* XEN_DOMCTL_set_target */ -struct xen_domctl_set_target { - domid_t target; -}; - -#if defined(__i386__) || defined(__x86_64__) -# define XEN_CPUID_INPUT_UNUSED 0xFFFFFFFF -/* XEN_DOMCTL_set_cpuid */ -struct xen_domctl_cpuid { - uint32_t input[2]; - uint32_t eax; - uint32_t ebx; - uint32_t ecx; - uint32_t edx; -}; -#endif - -/* - * Arranges that if the domain suspends (specifically, if it shuts - * down with code SHUTDOWN_suspend), this event channel will be - * notified. - * - * This is _instead of_ the usual notification to the global - * VIRQ_DOM_EXC. (In most systems that pirq is owned by xenstored.) - * - * Only one subscription per domain is possible. Last subscriber - * wins; others are silently displaced. - * - * NB that contrary to the rather general name, it only applies to - * domain shutdown with code suspend. Shutdown for other reasons - * (including crash), and domain death, are notified to VIRQ_DOM_EXC - * regardless. - */ -/* XEN_DOMCTL_subscribe */ -struct xen_domctl_subscribe { - uint32_t port; /* IN */ -}; - -/* - * Define the maximum machine address size which should be allocated - * to a guest. - */ -/* XEN_DOMCTL_set_machine_address_size */ -/* XEN_DOMCTL_get_machine_address_size */ - -/* - * Do not inject spurious page faults into this domain. - */ -/* XEN_DOMCTL_suppress_spurious_page_faults */ - -/* XEN_DOMCTL_debug_op */ -#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 vcpu; /* IN */ -}; - -/* - * Request a particular record from the HVM context - */ -/* 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 */ -}; - -/* XEN_DOMCTL_disable_migrate */ -struct xen_domctl_disable_migrate { - uint32_t disable; /* IN: 1: disable migration and restore */ -}; - - -/* XEN_DOMCTL_gettscinfo */ -/* XEN_DOMCTL_settscinfo */ -struct xen_domctl_tsc_info { - /* IN/OUT */ - uint32_t tsc_mode; - uint32_t gtsc_khz; - uint32_t incarnation; - uint32_t pad; - uint64_aligned_t elapsed_nsec; -}; - -/* 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 */ - /* OUT */ - 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 */ -}; - -/* 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? */ -}; - -/* - * VM event operations - */ - -/* XEN_DOMCTL_vm_event_op */ - -/* - * There are currently three rings available for VM events: - * sharing, monitor and paging. This hypercall allows one to - * control these rings (enable/disable), as well as to signal - * 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 - -/* - * Domain memory paging - * Page memory in and out. - * Domctl interface to set up and tear down the - * pager<->hypervisor interface. Use XENMEM_paging_op* - * to perform per-page operations. - * - * The XEN_VM_EVENT_PAGING_ENABLE domctl returns several - * non-standard error codes to indicate why paging could not be enabled: - * ENODEV - host lacks HAP support (EPT/NPT) or HAP is disabled in guest - * EMLINK - guest has iommu passthrough enabled - * EXDEV - guest has PoD enabled - * EBUSY - guest has or had paging enabled, ring buffer still active - */ -#define XEN_DOMCTL_VM_EVENT_OP_PAGING 1 - -/* - * Monitor helper. - * - * As with paging, use the domctl for teardown/setup of the - * helper<->hypervisor interface. - * - * The monitor interface can be used to register for various VM events. For - * example, there are HVM hypercalls to set the per-page access permissions - * of every page in a domain. When one of these permissions--independent, - * read, write, and execute--is violated, the VCPU is paused and a memory event - * is sent with what happened. The memory event handler can then resume the - * VCPU and redo the access with a XEN_VM_EVENT_RESUME option. - * - * See public/vm_event.h for the list of available events that can be - * subscribed to via the monitor interface. - * - * The XEN_VM_EVENT_MONITOR_* domctls returns - * non-standard error codes to indicate why access could not be enabled: - * ENODEV - host lacks HAP support (EPT/NPT) or HAP is disabled in guest - * EBUSY - guest has or had access enabled, ring buffer still active - * - */ -#define XEN_DOMCTL_VM_EVENT_OP_MONITOR 2 - -/* - * Sharing ENOMEM helper. - * - * As with paging, use the domctl for teardown/setup of the - * helper<->hypervisor interface. - * - * If setup, this ring is used to communicate failed allocations - * in the unshare path. XENMEM_sharing_op_resume is used to wake up - * vcpus that could not unshare. - * - * 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 - -/* 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 port; /* OUT: event channel for ring */ -}; - -/* - * Memory sharing operations - */ -/* XEN_DOMCTL_mem_sharing_op. - * The CONTROL sub-domctl is used for bringup/teardown. */ -#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 */ - } u; -}; - -struct xen_domctl_audit_p2m { - /* OUT error counts */ - uint64_t orphans; - uint64_t m2p_bad; - uint64_t p2m_bad; -}; - -struct xen_domctl_set_virq_handler { - uint32_t virq; /* IN */ -}; - -#if defined(__i386__) || defined(__x86_64__) -/* XEN_DOMCTL_setvcpuextstate */ -/* XEN_DOMCTL_getvcpuextstate */ -struct xen_domctl_vcpuextstate { - /* IN: VCPU that this call applies to. */ - uint32_t vcpu; - /* - * SET: Ignored. - * GET: xfeature support mask of struct (IN/OUT) - * xfeature mask is served as identifications of the saving format - * so that compatible CPUs can have a check on format to decide - * whether it can restore. - */ - uint64_aligned_t xfeature_mask; - /* - * SET: Size of struct (IN) - * GET: Size of struct (IN/OUT) - */ - uint64_aligned_t size; - XEN_GUEST_HANDLE_64(uint64) buffer; -}; -#endif - -/* XEN_DOMCTL_set_access_required: sets whether a memory event listener - * must be present to handle page access events: if false, the page - * access will revert to full permissions if no one is listening; - * */ -struct xen_domctl_set_access_required { - uint8_t access_required; -}; - -struct xen_domctl_set_broken_page_p2m { - uint64_aligned_t pfn; -}; - -/* - * XEN_DOMCTL_set_max_evtchn: sets the maximum event channel port - * number the guest may use. Use this limit the amount of resources - * (global mapping space, xenheap) a guest may use for event channels. - */ -struct xen_domctl_set_max_evtchn { - uint32_t max_port; -}; - -/* - * ARM: Clean and invalidate caches associated with given region of - * guest memory. - */ -struct xen_domctl_cacheflush { - /* IN: page range to flush. */ - xen_pfn_t start_pfn, nr_pfns; -}; - -#if defined(__i386__) || defined(__x86_64__) -struct xen_domctl_vcpu_msr { - uint32_t index; - uint32_t reserved; - uint64_aligned_t value; -}; -typedef struct xen_domctl_vcpu_msr xen_domctl_vcpu_msr_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpu_msr_t); - -/* - * XEN_DOMCTL_set_vcpu_msrs / XEN_DOMCTL_get_vcpu_msrs. - * - * Input: - * - A NULL 'msrs' guest handle is a request for the maximum 'msr_count'. - * - Otherwise, 'msr_count' is the number of entries in 'msrs'. - * - * Output for get: - * - If 'msr_count' is less than the number Xen needs to write, -ENOBUFS shall - * be returned and 'msr_count' updated to reflect the intended number. - * - On success, 'msr_count' shall indicate the number of MSRs written, which - * may be less than the maximum if some are not currently used by the vcpu. - * - * Output for set: - * - If Xen encounters an error with a specific MSR, -EINVAL shall be returned - * 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 */ - XEN_GUEST_HANDLE_64(xen_domctl_vcpu_msr_t) msrs; /* IN/OUT */ -}; -#endif - -/* XEN_DOMCTL_setvnumainfo: specifies a virtual NUMA topology for the guest */ -struct xen_domctl_vnuma { - /* IN: number of vNUMA nodes to setup. Shall be greater than 0 */ - uint32_t nr_vnodes; - /* IN: number of memory ranges to setup */ - uint32_t nr_vmemranges; - /* - * IN: number of vCPUs of the domain (used as size of the vcpu_to_vnode - * array declared below). Shall be equal to the domain's max_vcpus. - */ - uint32_t nr_vcpus; - uint32_t pad; /* must be zero */ - - /* - * IN: array for specifying the distances of the vNUMA nodes - * between each others. Shall have nr_vnodes*nr_vnodes elements. - */ - XEN_GUEST_HANDLE_64(uint) vdistance; - /* - * IN: array for specifying to what vNUMA node each vCPU belongs. - * Shall have nr_vcpus elements. - */ - XEN_GUEST_HANDLE_64(uint) vcpu_to_vnode; - /* - * IN: array for specifying on what physical NUMA node each vNUMA - * node is placed. Shall have nr_vnodes elements. - */ - XEN_GUEST_HANDLE_64(uint) vnode_to_pnode; - /* - * IN: array for specifying the memory ranges. Shall have - * nr_vmemranges elements. - */ - XEN_GUEST_HANDLE_64(xen_vmemrange_t) vmemrange; -}; - -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 - uint32_t cmd; - uint32_t data; -}; - -/* XEN_DOMCTL_MONITOR_* - * - * Enable/disable monitoring various VM events. - * This domctl configures what events will be reported to helper apps - * via the ring buffer "MONITOR". The ring has to be first enabled - * with the domctl XEN_DOMCTL_VM_EVENT_OP_MONITOR. - * - * GET_CAPABILITIES can be used to determine which of these features is - * available on a given platform. - * - * NOTICE: mem_access events are also delivered via the "MONITOR" ring buffer; - * 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 - -struct xen_domctl_monitor_op { - uint32_t op; /* XEN_DOMCTL_MONITOR_OP_* */ - - /* - * When used with ENABLE/DISABLE this has to be set to - * the requested XEN_DOMCTL_MONITOR_EVENT_* value. - * With GET_CAPABILITIES this field returns a bitmap of - * events supported by the platform, in the format - * (1 << XEN_DOMCTL_MONITOR_EVENT_*). - */ - uint32_t event; - - /* - * Further options when issuing XEN_DOMCTL_MONITOR_OP_ENABLE. - */ - union { - struct { - /* Which control register */ - uint8_t index; - /* Pause vCPU until response */ - uint8_t sync; - /* Send event only on a change of value */ - uint8_t onchangeonly; - /* Allignment padding */ - uint8_t pad1; - uint32_t pad2; - /* - * Send event only if the changed bit in the control register - * is not masked. - */ - uint64_aligned_t bitmask; - } mov_to_cr; - - struct { - uint32_t msr; - } mov_to_msr; - - struct { - /* Pause vCPU until response */ - uint8_t sync; - uint8_t allow_userspace; - } guest_request; - - struct { - /* Pause vCPU until response */ - uint8_t sync; - } debug_exception; - } u; -}; - -struct xen_domctl_psr_cat_op { -#define XEN_DOMCTL_PSR_CAT_OP_SET_L3_CBM 0 -#define XEN_DOMCTL_PSR_CAT_OP_GET_L3_CBM 1 -#define XEN_DOMCTL_PSR_CAT_OP_SET_L3_CODE 2 -#define XEN_DOMCTL_PSR_CAT_OP_SET_L3_DATA 3 -#define XEN_DOMCTL_PSR_CAT_OP_GET_L3_CODE 4 -#define XEN_DOMCTL_PSR_CAT_OP_GET_L3_DATA 5 -#define XEN_DOMCTL_PSR_CAT_OP_SET_L2_CBM 6 -#define XEN_DOMCTL_PSR_CAT_OP_GET_L2_CBM 7 - uint32_t cmd; /* IN: XEN_DOMCTL_PSR_CAT_OP_* */ - uint32_t target; /* IN */ - uint64_t data; /* IN/OUT */ -}; - -struct xen_domctl_set_gnttab_limits { - uint32_t grant_frames; /* IN */ - uint32_t maptrack_frames; /* IN */ -}; - -/* 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_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. - */ -}; - -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_getmemlist 6 -/* #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 -#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 -#define XEN_DOMCTL_get_device_group 50 -#define XEN_DOMCTL_set_machine_address_size 51 -#define XEN_DOMCTL_get_machine_address_size 52 -#define XEN_DOMCTL_suppress_spurious_page_faults 53 -#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 -#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_cat_op 78 -#define XEN_DOMCTL_soft_reset 79 -#define XEN_DOMCTL_set_gnttab_limits 80 -#define XEN_DOMCTL_vuart_op 81 -#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; - union { - struct xen_domctl_createdomain createdomain; - struct xen_domctl_getdomaininfo getdomaininfo; - struct xen_domctl_getmemlist getmemlist; - 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_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_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_pin_mem_cacheattr pin_mem_cacheattr; - 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_cpuid cpuid; - 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_set_max_evtchn set_max_evtchn; - 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_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_cat_op psr_cat_op; - struct xen_domctl_set_gnttab_limits set_gnttab_limits; - struct xen_domctl_vuart_op vuart_op; - uint8_t pad[128]; - } u; -}; -typedef struct xen_domctl xen_domctl_t; -DEFINE_XEN_GUEST_HANDLE(xen_domctl_t); - -#endif /* __XEN_PUBLIC_DOMCTL_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/elfnote.h b/plat/xen/include/xen/elfnote.h deleted file mode 100644 index 936aa658222d38804985ebf8787a3b5db3c30327..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/elfnote.h +++ /dev/null @@ -1,283 +0,0 @@ -/****************************************************************************** - * elfnote.h - * - * Definitions used for the Xen ELF notes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2006, Ian Campbell, XenSource Ltd. - */ - -#ifndef __XEN_PUBLIC_ELFNOTE_H__ -#define __XEN_PUBLIC_ELFNOTE_H__ - -/* - * `incontents 200 elfnotes ELF notes - * - * The notes should live in a PT_NOTE segment and have "Xen" in the - * name field. - * - * Numeric types are either 4 or 8 bytes depending on the content of - * the desc field. - * - * LEGACY indicated the fields in the legacy __xen_guest string which - * this a note type replaces. - * - * String values (for non-legacy) are NULL terminated ASCII, also known - * as ASCIZ type. - */ - -/* - * NAME=VALUE pair (string). - */ -#define XEN_ELFNOTE_INFO 0 - -/* - * The virtual address of the entry point (numeric). - * - * LEGACY: VIRT_ENTRY - */ -#define XEN_ELFNOTE_ENTRY 1 - -/* The virtual address of the hypercall transfer page (numeric). - * - * LEGACY: HYPERCALL_PAGE. (n.b. legacy value is a physical page - * number not a virtual address) - */ -#define XEN_ELFNOTE_HYPERCALL_PAGE 2 - -/* The virtual address where the kernel image should be mapped (numeric). - * - * Defaults to 0. - * - * LEGACY: VIRT_BASE - */ -#define XEN_ELFNOTE_VIRT_BASE 3 - -/* - * The offset of the ELF paddr field from the actual required - * pseudo-physical address (numeric). - * - * This is used to maintain backwards compatibility with older kernels - * which wrote __PAGE_OFFSET into that field. This field defaults to 0 - * if not present. - * - * LEGACY: ELF_PADDR_OFFSET. (n.b. legacy default is VIRT_BASE) - */ -#define XEN_ELFNOTE_PADDR_OFFSET 4 - -/* - * The version of Xen that we work with (string). - * - * LEGACY: XEN_VER - */ -#define XEN_ELFNOTE_XEN_VERSION 5 - -/* - * The name of the guest operating system (string). - * - * LEGACY: GUEST_OS - */ -#define XEN_ELFNOTE_GUEST_OS 6 - -/* - * The version of the guest operating system (string). - * - * LEGACY: GUEST_VER - */ -#define XEN_ELFNOTE_GUEST_VERSION 7 - -/* - * The loader type (string). - * - * LEGACY: LOADER - */ -#define XEN_ELFNOTE_LOADER 8 - -/* - * The kernel supports PAE (x86/32 only, string = "yes", "no" or - * "bimodal"). - * - * For compatibility with Xen 3.0.3 and earlier the "bimodal" setting - * may be given as "yes,bimodal" which will cause older Xen to treat - * this kernel as PAE. - * - * LEGACY: PAE (n.b. The legacy interface included a provision to - * indicate 'extended-cr3' support allowing L3 page tables to be - * placed above 4G. It is assumed that any kernel new enough to use - * 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 - -/* - * The features supported/required by this kernel (string). - * - * The string must consist of a list of feature names (as given in - * features.h, without the "XENFEAT_" prefix) separated by '|' - * characters. If a feature is required for the kernel to function - * then the feature name must be preceded by a '!' character. - * - * LEGACY: FEATURES - */ -#define XEN_ELFNOTE_FEATURES 10 - -/* - * The kernel requires the symbol table to be loaded (string = "yes" or "no") - * LEGACY: BSD_SYMTAB (n.b. The legacy treated the presence or absence - * of this string as a boolean flag rather than requiring "yes" or - * "no". - */ -#define XEN_ELFNOTE_BSD_SYMTAB 11 - -/* - * The lowest address the hypervisor hole can begin at (numeric). - * - * This must not be set higher than HYPERVISOR_VIRT_START. Its presence - * 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 - -/* - * 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 - -/* - * Whether or not the guest supports cooperative suspend cancellation. - * This is a numeric value. - * - * Default is 0 - */ -#define XEN_ELFNOTE_SUSPEND_CANCEL 14 - -/* - * The (non-default) location the initial phys-to-machine map should be - * placed at by the hypervisor (Dom0) or the tools (DomU). - * The kernel must be prepared for this mapping to be established using - * large pages, despite such otherwise not being available to guests. Note - * that these large pages may be misaligned in PFN space (they'll obviously - * be aligned in MFN and virtual address spaces). - * The kernel must also be able to handle the page table pages used for - * this mapping not being accessible through the initial mapping. - * (Only x86-64 supports this at present.) - */ -#define XEN_ELFNOTE_INIT_P2M 15 - -/* - * Whether or not the guest can deal with being passed an initrd not - * mapped through its initial page tables. - */ -#define XEN_ELFNOTE_MOD_START_PFN 16 - -/* - * The features supported by this kernel (numeric). - * - * Other than XEN_ELFNOTE_FEATURES on pre-4.2 Xen, this note allows a - * kernel to specify support for features that older hypervisors don't - * know about. The set of features 4.2 and newer hypervisors will - * consider supported by the kernel is the combination of the sets - * specified through this and the string note. - * - * LEGACY: FEATURES - */ -#define XEN_ELFNOTE_SUPPORTED_FEATURES 17 - -/* - * Physical entry point into the kernel. - * - * 32bit entry point into the kernel. When requested to launch the - * guest kernel in a HVM container, Xen will use this entry point to - * launch the guest in 32bit protected mode with paging disabled. - * Ignored otherwise. - */ -#define XEN_ELFNOTE_PHYS32_ENTRY 18 - -/* - * The number of the highest elfnote defined. - */ -#define XEN_ELFNOTE_MAX XEN_ELFNOTE_PHYS32_ENTRY - -/* - * System information exported through crash notes. - * - * The kexec / kdump code will create one XEN_ELFNOTE_CRASH_INFO - * note in case of a system crash. This note will contain various - * information about the system, see xen/include/xen/elfcore.h. - */ -#define XEN_ELFNOTE_CRASH_INFO 0x1000001 - -/* - * System registers exported through crash notes. - * - * The kexec / kdump code will create one XEN_ELFNOTE_CRASH_REGS - * note per cpu in case of a system crash. This note is architecture - * specific and will contain registers not saved in the "CORE" note. - * See xen/include/xen/elfcore.h for more information. - */ -#define XEN_ELFNOTE_CRASH_REGS 0x1000002 - - -/* - * xen dump-core none note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_NONE - * in its dump file to indicate that the file is xen dump-core - * file. This note doesn't have any other information. - * See tools/libxc/xc_core.h for more information. - */ -#define XEN_ELFNOTE_DUMPCORE_NONE 0x2000000 - -/* - * xen dump-core header note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_HEADER - * in its dump file. - * See tools/libxc/xc_core.h for more information. - */ -#define XEN_ELFNOTE_DUMPCORE_HEADER 0x2000001 - -/* - * xen dump-core xen version note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_XEN_VERSION - * in its dump file. It contains the xen version obtained via the - * XENVER hypercall. - * See tools/libxc/xc_core.h for more information. - */ -#define XEN_ELFNOTE_DUMPCORE_XEN_VERSION 0x2000002 - -/* - * xen dump-core format version note. - * xm dump-core code will create one XEN_ELFNOTE_DUMPCORE_FORMAT_VERSION - * 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 - -#endif /* __XEN_PUBLIC_ELFNOTE_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/errno.h b/plat/xen/include/xen/errno.h deleted file mode 100644 index 305c112bed74c41a5f07f9f1019b0f4e5ce73493..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/errno.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * There are two expected ways of including this header. - * - * 1) The "default" case (expected from tools etc). - * - * Simply #include - * - * In this circumstance, normal header guards apply and the includer shall get - * an enumeration in the XEN_xxx namespace, appropriate for C or assembly. - * - * 2) The special case where the includer provides a XEN_ERRNO() in scope. - * - * In this case, no inclusion guards apply and the caller is responsible for - * their XEN_ERRNO() being appropriate in the included context. The header - * will unilaterally #undef XEN_ERRNO(). - */ - -#ifndef XEN_ERRNO - -/* - * Includer has not provided a custom XEN_ERRNO(). Arrange for normal header - * guards, an automatic enum (for C code) and constants in the XEN_xxx - * namespace. - */ -#ifndef __XEN_PUBLIC_ERRNO_H__ -#define __XEN_PUBLIC_ERRNO_H__ - -#define XEN_ERRNO_DEFAULT_INCLUDE - -#ifndef __ASSEMBLY__ - -#define XEN_ERRNO(name, value) XEN_##name = value, -enum xen_errno { - -#elif __XEN_INTERFACE_VERSION__ < 0x00040700 - -#define XEN_ERRNO(name, value) .equ XEN_##name, value - -#endif /* __ASSEMBLY__ */ - -#endif /* __XEN_PUBLIC_ERRNO_H__ */ -#endif /* !XEN_ERRNO */ - -/* ` enum neg_errnoval { [ -Efoo for each Efoo in the list below ] } */ -/* ` enum errnoval { */ - -#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 */ -#ifdef __XEN__ /* Internal only, should never be exposed to the guest. */ -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 */ -#ifdef __XEN__ /* Internal only, should never be exposed to the guest. */ -XEN_ERRNO(ERESTART, 85) /* Interrupted system call should be restarted */ -#endif -XEN_ERRNO(ENOTSOCK, 88) /* Socket operation on non-socket */ -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 */ - -#undef XEN_ERRNO -#endif /* XEN_ERRNO */ -/* ` } */ - -/* Clean up from a default include. Close the enum (for C). */ -#ifdef XEN_ERRNO_DEFAULT_INCLUDE -#undef XEN_ERRNO_DEFAULT_INCLUDE -#ifndef __ASSEMBLY__ -}; -#endif - -#endif /* XEN_ERRNO_DEFAULT_INCLUDE */ diff --git a/plat/xen/include/xen/event_channel.h b/plat/xen/include/xen/event_channel.h deleted file mode 100644 index 44c549dd6b8768d809ce90a5f14cd1b16f4969ab..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/event_channel.h +++ /dev/null @@ -1,385 +0,0 @@ -/****************************************************************************** - * event_channel.h - * - * Event channels between domains. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2003-2004, K A Fraser. - */ - -#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__ -#define __XEN_PUBLIC_EVENT_CHANNEL_H__ - -#include "xen.h" - -/* - * `incontents 150 evtchn Event Channels - * - * Event channels are the basic primitive provided by Xen for event - * notifications. An event is the Xen equivalent of a hardware - * interrupt. They essentially store one bit of information, the event - * of interest is signalled by transitioning this bit from 0 to 1. - * - * Notifications are received by a guest via an upcall from Xen, - * indicating when an event arrives (setting the bit). Further - * notifications are masked until the bit is cleared again (therefore, - * guests must check the value of the bit after re-enabling event - * delivery to ensure no missed notifications). - * - * Event notifications can be masked by setting a flag; this is - * equivalent to disabling interrupts and can be used to ensure - * atomicity of certain operations in the guest kernel. - * - * Event channels are represented by the evtchn_* fields in - * struct shared_info and struct vcpu_info. - */ - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_event_channel_op(enum event_channel_op cmd, void *args) - * ` - * @cmd == EVTCHNOP_* (event-channel operation). - * @args == struct evtchn_* Operation-specific extra arguments (NULL if none). - */ - -/* ` enum event_channel_op { // EVTCHNOP_* => struct evtchn_* */ -#define EVTCHNOP_bind_interdomain 0 -#define EVTCHNOP_bind_virq 1 -#define EVTCHNOP_bind_pirq 2 -#define EVTCHNOP_close 3 -#define EVTCHNOP_send 4 -#define EVTCHNOP_status 5 -#define EVTCHNOP_alloc_unbound 6 -#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 -/* ` } */ - -typedef uint32_t evtchn_port_t; -DEFINE_XEN_GUEST_HANDLE(evtchn_port_t); - -/* - * EVTCHNOP_alloc_unbound: Allocate a port in domain and mark as - * accepting interdomain bindings from domain . A fresh port - * is allocated in and returned as . - * NOTES: - * 1. If the caller is unprivileged then must be DOMID_SELF. - * 2. may be DOMID_SELF, allowing loopback connections. - */ -struct evtchn_alloc_unbound { - /* IN parameters */ - domid_t dom, remote_dom; - /* OUT parameters */ - evtchn_port_t port; -}; -typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t; - -/* - * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between - * the calling domain and . must identify - * a port that is unbound and marked as accepting bindings from the calling - * domain. A fresh port is allocated in the calling domain and returned as - * . - * - * In case the peer domain has already tried to set our event channel - * pending, before it was bound, EVTCHNOP_bind_interdomain always sets - * the local event channel pending. - * - * The usual pattern of use, in the guest's upcall (or subsequent - * handler) is as follows: (Re-enable the event channel for subsequent - * signalling and then) check for the existence of whatever condition - * is being waited for by other means, and take whatever action is - * needed (if any). - * - * NOTES: - * 1. may be DOMID_SELF, allowing loopback connections. - */ -struct evtchn_bind_interdomain { - /* IN parameters. */ - domid_t remote_dom; - evtchn_port_t remote_port; - /* OUT parameters. */ - evtchn_port_t local_port; -}; -typedef struct evtchn_bind_interdomain evtchn_bind_interdomain_t; - -/* - * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ on specified - * vcpu. - * NOTES: - * 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list - * in xen.h for the classification of each VIRQ. - * 2. Global VIRQs must be allocated on VCPU0 but can subsequently be - * re-bound via EVTCHNOP_bind_vcpu. - * 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu. - * The allocated event channel is bound to the specified vcpu and the - * binding cannot be changed. - */ -struct evtchn_bind_virq { - /* IN parameters. */ - uint32_t virq; /* enum virq */ - uint32_t vcpu; - /* OUT parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_bind_virq evtchn_bind_virq_t; - -/* - * EVTCHNOP_bind_pirq: Bind a local event channel to a real IRQ (PIRQ ). - * NOTES: - * 1. A physical IRQ may be bound to at most one event channel per domain. - * 2. Only a sufficiently-privileged domain may bind to a physical IRQ. - */ -struct evtchn_bind_pirq { - /* IN parameters. */ - uint32_t pirq; -#define BIND_PIRQ__WILL_SHARE 1 - uint32_t flags; /* BIND_PIRQ__* */ - /* OUT parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_bind_pirq evtchn_bind_pirq_t; - -/* - * EVTCHNOP_bind_ipi: Bind a local event channel to receive events. - * NOTES: - * 1. The allocated event channel is bound to the specified vcpu. The binding - * may not be changed. - */ -struct evtchn_bind_ipi { - uint32_t vcpu; - /* OUT parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_bind_ipi evtchn_bind_ipi_t; - -/* - * EVTCHNOP_close: Close a local event channel . If the channel is - * interdomain then the remote end is placed in the unbound state - * (EVTCHNSTAT_unbound), awaiting a new connection. - */ -struct evtchn_close { - /* IN parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_close evtchn_close_t; - -/* - * EVTCHNOP_send: Send an event to the remote end of the channel whose local - * endpoint is . - */ -struct evtchn_send { - /* IN parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_send evtchn_send_t; - -/* - * EVTCHNOP_status: Get the current status of the communication channel which - * has an endpoint at . - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may obtain the status of an event - * channel for which is not DOMID_SELF. - */ -struct evtchn_status { - /* IN parameters */ - 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 */ - uint32_t status; - uint32_t vcpu; /* VCPU to which this channel is bound. */ - union { - struct { - domid_t dom; - } unbound; /* EVTCHNSTAT_unbound */ - struct { - domid_t dom; - evtchn_port_t port; - } interdomain; /* EVTCHNSTAT_interdomain */ - uint32_t pirq; /* EVTCHNSTAT_pirq */ - uint32_t virq; /* EVTCHNSTAT_virq */ - } u; -}; -typedef struct evtchn_status evtchn_status_t; - -/* - * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an - * event is pending. - * NOTES: - * 1. IPI-bound channels always notify the vcpu specified at bind time. - * This binding cannot be changed. - * 2. Per-VCPU VIRQ channels always notify the vcpu specified at bind time. - * This binding cannot be changed. - * 3. All other channels notify vcpu0 by default. This default is set when - * the channel is allocated (a port that is freed and subsequently reused - * has its binding reset to vcpu0). - */ -struct evtchn_bind_vcpu { - /* IN parameters. */ - evtchn_port_t port; - uint32_t vcpu; -}; -typedef struct evtchn_bind_vcpu evtchn_bind_vcpu_t; - -/* - * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver - * a notification to the appropriate VCPU if an event is pending. - */ -struct evtchn_unmask { - /* IN parameters. */ - evtchn_port_t port; -}; -typedef struct evtchn_unmask evtchn_unmask_t; - -/* - * EVTCHNOP_reset: Close all event channels associated with specified domain. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF. - * 3. Destroys all control blocks and event array, resets event channel - * operations to 2-level ABI if called with == DOMID_SELF and FIFO - * ABI was used. Guests should not bind events during EVTCHNOP_reset call - * as these events are likely to be lost. - */ -struct evtchn_reset { - /* IN parameters. */ - domid_t dom; -}; -typedef struct evtchn_reset evtchn_reset_t; - -/* - * EVTCHNOP_init_control: initialize the control block for the FIFO ABI. - * - * Note: any events that are currently pending will not be resent and - * will be lost. Guests should call this before binding any event to - * avoid losing any events. - */ -struct evtchn_init_control { - /* IN parameters. */ - uint64_t control_gfn; - uint32_t offset; - uint32_t vcpu; - /* OUT parameters. */ - uint8_t link_bits; - uint8_t _pad[7]; -}; -typedef struct evtchn_init_control evtchn_init_control_t; - -/* - * EVTCHNOP_expand_array: add an additional page to the event array. - */ -struct evtchn_expand_array { - /* IN parameters. */ - uint64_t array_gfn; -}; -typedef struct evtchn_expand_array evtchn_expand_array_t; - -/* - * EVTCHNOP_set_priority: set the priority for an event channel. - */ -struct evtchn_set_priority { - /* IN parameters. */ - uint32_t port; - uint32_t priority; -}; -typedef struct evtchn_set_priority evtchn_set_priority_t; - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_event_channel_op_compat(struct evtchn_op *op) - * ` - * Superceded by new event_channel_op() hypercall since 0x00030202. - */ -struct evtchn_op { - uint32_t cmd; /* enum event_channel_op */ - union { - 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; - } u; -}; -typedef struct evtchn_op evtchn_op_t; -DEFINE_XEN_GUEST_HANDLE(evtchn_op_t); - -/* - * 2-level ABI - */ - -#define EVTCHN_2L_NR_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64) - -/* - * FIFO ABI - */ - -/* Events may have priorities from 0 (highest) to 15 (lowest). */ -#define EVTCHN_FIFO_PRIORITY_MAX 0 -#define EVTCHN_FIFO_PRIORITY_DEFAULT 7 -#define EVTCHN_FIFO_PRIORITY_MIN 15 - -#define EVTCHN_FIFO_MAX_QUEUES (EVTCHN_FIFO_PRIORITY_MIN + 1) - -typedef uint32_t event_word_t; - -#define EVTCHN_FIFO_PENDING 31 -#define EVTCHN_FIFO_MASKED 30 -#define EVTCHN_FIFO_LINKED 29 -#define EVTCHN_FIFO_BUSY 28 - -#define EVTCHN_FIFO_LINK_BITS 17 -#define EVTCHN_FIFO_LINK_MASK ((1 << EVTCHN_FIFO_LINK_BITS) - 1) - -#define EVTCHN_FIFO_NR_CHANNELS (1 << EVTCHN_FIFO_LINK_BITS) - -struct evtchn_fifo_control_block { - uint32_t ready; - uint32_t _rsvd; - uint32_t head[EVTCHN_FIFO_MAX_QUEUES]; -}; -typedef struct evtchn_fifo_control_block evtchn_fifo_control_block_t; - -#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/features.h b/plat/xen/include/xen/features.h deleted file mode 100644 index 1a989b8bf979d513b6d5c9e397ccf21c0b5c3e0a..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/features.h +++ /dev/null @@ -1,120 +0,0 @@ -/****************************************************************************** - * features.h - * - * Feature flags, reported by XENVER_get_features. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2006, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_FEATURES_H__ -#define __XEN_PUBLIC_FEATURES_H__ - -/* - * `incontents 200 elfnotes_features XEN_ELFNOTE_FEATURES - * - * The list of all the features the guest supports. They are set by - * parsing the XEN_ELFNOTE_FEATURES and XEN_ELFNOTE_SUPPORTED_FEATURES - * string. The format is the feature names (as given here without the - * "XENFEAT_" prefix) separated by '|' characters. - * If a feature is required for the kernel to function then the feature name - * must be preceded by a '!' character. - * - * Note that if XEN_ELFNOTE_SUPPORTED_FEATURES is used, then in the - * XENFEAT_dom0 MUST be set if the guest is to be booted as dom0, - */ - -/* - * 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 - -/* - * If set, the guest does not need to write-protect its segment descriptor - * tables, and can update them via direct writes. - */ -#define XENFEAT_writable_descriptor_tables 1 - -/* - * If set, translation between the guest's 'pseudo-physical' address space - * and the host's machine address space are handled by the hypervisor. In this - * mode the guest does not need to perform phys-to/from-machine translations - * when performing page table operations. - */ -#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 - -/* - * 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 - -/* x86: Does this Xen host support the MMU_PT_UPDATE_PRESERVE_AD hypercall? */ -#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 - -/* - * If set, GNTTABOP_map_grant_ref honors flags to be placed into guest kernel - * available pte bits. - */ -#define XENFEAT_gnttab_map_avail_bits 7 - -/* x86: Does this Xen host support the HVM callback vector type? */ -#define XENFEAT_hvm_callback_vector 8 - -/* x86: pvclock algorithm is safe to use on HVM */ -#define XENFEAT_hvm_safe_pvclock 9 - -/* x86: pirq can be used by HVM guests */ -#define XENFEAT_hvm_pirqs 10 - -/* operation as Dom0 is supported */ -#define XENFEAT_dom0 11 - -/* Xen also maps grant references at pfn = mfn. - * This feature flag is deprecated and should not be used. -#define XENFEAT_grant_map_identity 12 - */ - -/* Guest can use XENMEMF_vnode to specify virtual node for memory op. */ -#define XENFEAT_memory_op_vnode_supported 13 - -/* arm: Hypervisor supports ARM SMC calling convention. */ -#define XENFEAT_ARM_SMCCC_supported 14 - -#define XENFEAT_NR_SUBMAPS 1 - -#endif /* __XEN_PUBLIC_FEATURES_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/grant_table.h b/plat/xen/include/xen/grant_table.h deleted file mode 100644 index 018036e825f8f2999812cdb089f7fa2195789231..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/grant_table.h +++ /dev/null @@ -1,685 +0,0 @@ -/****************************************************************************** - * grant_table.h - * - * Interface for granting foreign access to page frames, and receiving - * page-ownership transfers. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004, K A Fraser - */ - -#ifndef __XEN_PUBLIC_GRANT_TABLE_H__ -#define __XEN_PUBLIC_GRANT_TABLE_H__ - -#include "xen.h" - -/* - * `incontents 150 gnttab Grant Tables - * - * Xen's grant tables provide a generic mechanism to memory sharing - * between domains. This shared memory interface underpins the split - * device drivers for block and network IO. - * - * Each domain has its own grant table. This is a data structure that - * is shared with Xen; it allows the domain to tell Xen what kind of - * permissions other domains have on its pages. Entries in the grant - * table are identified by grant references. A grant reference is an - * integer, which indexes into the grant table. It acts as a - * capability which the grantee can use to perform operations on the - * granter's memory. - * - * This capability-based system allows shared-memory communications - * between unprivileged domains. A grant reference also encapsulates - * the details of a shared page, removing the need for a domain to - * know the real machine address of a page it is sharing. This makes - * it possible to share memory correctly with domains running in - * fully virtualised memory. - */ - -/*********************************** - * GRANT TABLE REPRESENTATION - */ - -/* Some rough guidelines on accessing and updating grant-table entries - * in a concurrency-safe manner. For more information, Linux contains a - * reference implementation for guest OSes (drivers/xen/grant_table.c, see - * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=drivers/xen/grant-table.c;hb=HEAD - * - * NB. WMB is a no-op on current-generation x86 processors. However, a - * compiler barrier will still be required. - * - * Introducing a valid entry into the grant table: - * 1. Write ent->domid. - * 2. Write ent->frame: - * GTF_permit_access: Frame to which access is permitted. - * GTF_accept_transfer: Pseudo-phys frame slot being filled by new - * frame, or zero if none. - * 3. Write memory barrier (WMB). - * 4. Write ent->flags, inc. valid type. - * - * Invalidating an unused GTF_permit_access entry: - * 1. flags = ent->flags. - * 2. Observe that !(flags & (GTF_reading|GTF_writing)). - * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). - * NB. No need for WMB as reuse of entry is control-dependent on success of - * step 3, and all architectures guarantee ordering of ctrl-dep writes. - * - * Invalidating an in-use GTF_permit_access entry: - * This cannot be done directly. Request assistance from the domain controller - * which can set a timeout on the use of a grant entry and take necessary - * action. (NB. This is not yet implemented!). - * - * Invalidating an unused GTF_accept_transfer entry: - * 1. flags = ent->flags. - * 2. Observe that !(flags & GTF_transfer_committed). [*] - * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). - * NB. No need for WMB as reuse of entry is control-dependent on success of - * step 3, and all architectures guarantee ordering of ctrl-dep writes. - * [*] If GTF_transfer_committed is set then the grant entry is 'committed'. - * The guest must /not/ modify the grant entry until the address of the - * transferred frame is written. It is safe for the guest to spin waiting - * for this to occur (detect by observing GTF_transfer_completed in - * ent->flags). - * - * Invalidating a committed GTF_accept_transfer entry: - * 1. Wait for (ent->flags & GTF_transfer_completed). - * - * Changing a GTF_permit_access from writable to read-only: - * Use SMP-safe CMPXCHG to set GTF_readonly, while checking !GTF_writing. - * - * Changing a GTF_permit_access from read-only to writable: - * Use SMP-safe bit-setting instruction. - */ - -/* - * Reference to a grant entry in a specified domain's grant table. - */ -typedef uint32_t grant_ref_t; - -/* - * A grant table comprises a packed array of grant entries in one or more - * page frames shared between Xen and a guest. - * [XEN]: This field is written by Xen and read by the sharing guest. - * [GST]: This field is written by the guest and read by Xen. - */ - -/* - * Version 1 of the grant table entry structure is maintained purely - * for backwards compatibility. New guests should use version 2. - */ -#if __XEN_INTERFACE_VERSION__ < 0x0003020a -#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; - /* - * 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] - * GTF_transfer_completed: MFN whose ownership transferred by @domid - * (non-translated guests only). [XEN] - */ - uint32_t frame; -}; -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 - -/* - * Type of grant entry. - * GTF_invalid: This grant entry grants no privileges. - * GTF_permit_access: Allow @domid to map/access @frame. - * GTF_accept_transfer: Allow @domid to transfer ownership of one page frame - * to this guest. Xen writes the page number to @frame. - * 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) - -/* - * Subflags for GTF_permit_access. - * GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST] - * GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN] - * GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN] - * GTF_PAT, GTF_PWT, GTF_PCD: (x86) cache attribute flags for the grant [GST] - * GTF_sub_page: Grant access to only a subrange of the page. @domid - * 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) - -/* - * Subflags for GTF_accept_transfer: - * GTF_transfer_committed: Xen sets this flag to indicate that it is committed - * to transferring ownership of a page frame. When a guest sees this flag - * it must /not/ modify the grant entry until GTF_transfer_completed is - * set by Xen. - * GTF_transfer_completed: It is safe for the guest to spin-wait on this flag - * after reading GTF_transfer_committed. Xen will always write the frame - * 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_completed (3) -#define GTF_transfer_completed (1U<<_GTF_transfer_completed) - -/* - * Version 2 grant table entries. These fulfil the same role as - * version 1 entries, but can represent more complicated operations. - * Any given domain will have either a version 1 or a version 2 table, - * and every entry in the table will be the same version. - * - * The interface by which domains use grant references does not depend - * on the grant table version in use by the other domain. - */ -#if __XEN_INTERFACE_VERSION__ >= 0x0003020a -/* - * Version 1 and version 2 grant entries share a common prefix. The - * fields of the prefix are documented as part of struct - * grant_entry_v1. - */ -struct grant_entry_header { - uint16_t flags; - domid_t domid; -}; -typedef struct grant_entry_header grant_entry_header_t; - -/* - * Version 2 of the grant entry structure. - */ -union grant_entry_v2 { - grant_entry_header_t hdr; - - /* - * This member is used for V1-style full page grants, where either: - * - * -- hdr.type is GTF_accept_transfer, or - * -- hdr.type is GTF_permit_access and GTF_sub_page is not set. - * - * In that case, the frame field has the same semantics as the - * field of the same name in the V1 entry structure. - */ - struct { - grant_entry_header_t hdr; - uint32_t pad0; - uint64_t frame; - } full_page; - - /* - * If the grant type is GTF_grant_access and GTF_sub_page is set, - * @domid is allowed to access bytes [@page_off,@page_off+@length) - * in frame @frame. - */ - struct { - grant_entry_header_t hdr; - uint16_t page_off; - uint16_t length; - uint64_t frame; - } sub_page; - - /* - * If the grant is GTF_transitive, @domid is allowed to use the - * grant @gref in domain @trans_domid, as if it was the local - * domain. Obviously, the transitive access must be compatible - * with the original grant. - * - * The current version of Xen does not allow transitive grants - * to be mapped. - */ - struct { - grant_entry_header_t hdr; - domid_t trans_domid; - uint16_t pad0; - grant_ref_t gref; - } transitive; - - uint32_t __spacer[4]; /* Pad to a power of two */ -}; -typedef union grant_entry_v2 grant_entry_v2_t; - -typedef uint16_t grant_status_t; - -#endif /* __XEN_INTERFACE_VERSION__ */ - -/*********************************** - * GRANT TABLE QUERIES AND USES - */ - -/* ` enum neg_errnoval - * ` HYPERVISOR_grant_table_op(enum grant_table_op cmd, - * ` void *args, - * ` unsigned int count) - * ` - * - * @args points to an array of a per-command data structure. The array - * has @count members - */ - -/* ` 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 -#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 -#endif /* __XEN_INTERFACE_VERSION__ */ -/* ` } */ - -/* - * Handle to track a mapping created via a grant reference. - */ -typedef uint32_t grant_handle_t; - -/* - * GNTTABOP_map_grant_ref: Map the grant entry (,) for access - * by devices and/or host CPUs. If successful, is a tracking number - * that must be presented later to destroy the mapping(s). On error, - * is a negative status code. - * NOTES: - * 1. If GNTMAP_device_map is specified then is the address - * via which I/O devices may access the granted frame. - * 2. If GNTMAP_host_map is specified then a mapping will be added at - * either a host virtual address in the current address space, or at - * a PTE at the specified machine address. The type of mapping to - * perform is selected through the GNTMAP_contains_pte flag, and the - * address is specified in . - * 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a - * host mapping is destroyed by other means then it is *NOT* guaranteed - * to be accounted to the correct grant reference! - */ -struct gnttab_map_grant_ref { - /* IN parameters. */ - uint64_t host_addr; - uint32_t flags; /* GNTMAP_* */ - grant_ref_t ref; - domid_t dom; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ - grant_handle_t handle; - uint64_t dev_bus_addr; -}; -typedef struct gnttab_map_grant_ref gnttab_map_grant_ref_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_map_grant_ref_t); - -/* - * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings - * tracked by . If or is zero, that - * field is ignored. If non-zero, they must refer to a device/host mapping - * that is tracked by - * NOTES: - * 1. The call may fail in an undefined manner if either mapping is not - * tracked by . - * 3. After executing a batch of unmaps, it is guaranteed that no stale - * mappings will remain in the device or host TLBs. - */ -struct gnttab_unmap_grant_ref { - /* IN parameters. */ - uint64_t host_addr; - uint64_t dev_bus_addr; - grant_handle_t handle; - /* OUT parameters. */ - 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); - -/* - * GNTTABOP_setup_table: Set up a grant table for comprising at least - * pages. The frame addresses are written to the . - * Only addresses are written, even if the table is larger. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify != DOMID_SELF. - * 3. Xen may not support more than a single grant-table page per domain. - */ -struct gnttab_setup_table { - /* IN parameters. */ - domid_t dom; - uint32_t nr_frames; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ -#if __XEN_INTERFACE_VERSION__ < 0x00040300 - XEN_GUEST_HANDLE(ulong) frame_list; -#else - XEN_GUEST_HANDLE(xen_pfn_t) frame_list; -#endif -}; -typedef struct gnttab_setup_table gnttab_setup_table_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); - -/* - * GNTTABOP_dump_table: Dump the contents of the grant table to the - * xen console. Debugging use only. - */ -struct gnttab_dump_table { - /* IN parameters. */ - domid_t dom; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ -}; -typedef struct gnttab_dump_table gnttab_dump_table_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_dump_table_t); - -/* - * GNTTABOP_transfer: Transfer to a foreign domain. The foreign domain - * has previously registered its interest in the transfer via . - * - * Note that, even if the transfer fails, the specified page no longer belongs - * to the calling domain *unless* the error is GNTST_bad_page. - * - * Note further that only PV guests can use this operation. - */ -struct gnttab_transfer { - /* IN parameters. */ - xen_pfn_t mfn; - domid_t domid; - grant_ref_t ref; - /* OUT parameters. */ - int16_t status; -}; -typedef struct gnttab_transfer gnttab_transfer_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_transfer_t); - - -/* - * GNTTABOP_copy: Hypervisor based copy - * source and destinations can be eithers MFNs or, for foreign domains, - * grant references. the foreign domain has to grant read/write access - * in its grant table. - * - * The flags specify what type source and destinations are (either MFN - * or grant reference). - * - * Note that this can also be used to copy data between two domains - * via a third party if the source and destination domains had previously - * grant appropriate access to their pages to the third party. - * - * source_offset specifies an offset in the source frame, dest_offset - * the offset in the target frame and len specifies the number of - * 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) - -struct gnttab_copy { - /* IN parameters. */ - struct gnttab_copy_ptr { - union { - grant_ref_t ref; - xen_pfn_t gmfn; - } u; - domid_t domid; - uint16_t offset; - } source, dest; - uint16_t len; - uint16_t flags; /* GNTCOPY_* */ - /* OUT parameters. */ - int16_t status; -}; -typedef struct gnttab_copy gnttab_copy_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_copy_t); - -/* - * GNTTABOP_query_size: Query the current and maximum sizes of the shared - * grant table. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify != DOMID_SELF. - */ -struct gnttab_query_size { - /* IN parameters. */ - domid_t dom; - /* OUT parameters. */ - uint32_t nr_frames; - uint32_t max_nr_frames; - int16_t status; /* => enum grant_status */ -}; -typedef struct gnttab_query_size gnttab_query_size_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_query_size_t); - -/* - * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings - * tracked by but atomically replace the page table entry with one - * pointing to the machine address under . will be - * redirected to the null entry. - * NOTES: - * 1. The call may fail in an undefined manner if either mapping is not - * tracked by . - * 2. After executing a batch of unmaps, it is guaranteed that no stale - * mappings will remain in the device or host TLBs. - */ -struct gnttab_unmap_and_replace { - /* IN parameters. */ - uint64_t host_addr; - uint64_t new_addr; - grant_handle_t handle; - /* OUT parameters. */ - 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); - -#if __XEN_INTERFACE_VERSION__ >= 0x0003020a -/* - * GNTTABOP_set_version: Request a particular version of the grant - * table shared table structure. This operation can only be performed - * once in any given domain. It must be performed before any grants - * are activated; otherwise, the domain will be stuck with version 1. - * The only defined versions are 1 and 2. - */ -struct gnttab_set_version { - /* IN/OUT parameters */ - uint32_t version; -}; -typedef struct gnttab_set_version gnttab_set_version_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_set_version_t); - - -/* - * GNTTABOP_get_status_frames: Get the list of frames used to store grant - * status for . In grant format version 2, the status is separated - * from the other shared grant fields to allow more efficient synchronization - * using barriers instead of atomic cmpexch operations. - * specify the size of vector . - * The frame addresses are returned in the . - * Only addresses are returned, even if the table is larger. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify != DOMID_SELF. - */ -struct gnttab_get_status_frames { - /* IN parameters. */ - uint32_t nr_frames; - domid_t dom; - /* OUT parameters. */ - int16_t status; /* => enum grant_status */ - XEN_GUEST_HANDLE(uint64_t) frame_list; -}; -typedef struct gnttab_get_status_frames gnttab_get_status_frames_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_get_status_frames_t); - -/* - * GNTTABOP_get_version: Get the grant table version which is in - * effect for domain . - */ -struct gnttab_get_version { - /* IN parameters */ - domid_t dom; - uint16_t pad; - /* OUT parameters */ - uint32_t version; -}; -typedef struct gnttab_get_version gnttab_get_version_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_get_version_t); - -/* - * GNTTABOP_swap_grant_ref: Swap the contents of two grant entries. - */ -struct gnttab_swap_grant_ref { - /* IN parameters */ - grant_ref_t ref_a; - grant_ref_t ref_b; - /* OUT parameters */ - 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); - -/* - * Issue one or more cache maintenance operations on a portion of a - * page granted to the calling domain by a foreign domain. - */ -struct gnttab_cache_flush { - union { - uint64_t dev_bus_addr; - grant_ref_t ref; - } a; - uint16_t offset; /* offset from start of grant */ - uint16_t length; /* size within the grant */ -#define GNTTAB_CACHE_CLEAN (1<<0) -#define GNTTAB_CACHE_INVAL (1<<1) -#define GNTTAB_CACHE_SOURCE_GREF (1<<31) - uint32_t op; -}; -typedef struct gnttab_cache_flush gnttab_cache_flush_t; -DEFINE_XEN_GUEST_HANDLE(gnttab_cache_flush_t); - -#endif /* __XEN_INTERFACE_VERSION__ */ - -/* - * 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. - */ -#define _GNTMAP_application_map (3) -#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) - -#define _GNTMAP_can_fail (5) -#define GNTMAP_can_fail (1<<_GNTMAP_can_fail) - -/* - * Bits to be placed in guest kernel available PTE bits (architecture - * dependent; only supported when XENFEAT_gnttab_map_avail_bits is set). - */ -#define _GNTMAP_guest_avail0 (16) -#define GNTMAP_guest_avail_mask ((uint32_t)~0 << _GNTMAP_guest_avail0) - -/* - * 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_bad_copy_arg (-10) /* copy arguments cross page boundary. */ -#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" \ -} - -#endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/hvm/dm_op.h b/plat/xen/include/xen/hvm/dm_op.h deleted file mode 100644 index e17308575a67fd903b4c69963b11b3d39602eb4f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/dm_op.h +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright (c) 2016, Citrix Systems Inc - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __XEN_PUBLIC_HVM_DM_OP_H__ -#define __XEN_PUBLIC_HVM_DM_OP_H__ - -#include "../xen.h" - -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#include "../event_channel.h" - -#ifndef uint64_aligned_t -#define uint64_aligned_t uint64_t -#endif - -/* - * IOREQ Servers - * - * The interface between an I/O emulator an Xen is called an IOREQ Server. - * A domain supports a single 'legacy' IOREQ Server which is instantiated if - * parameter... - * - * HVM_PARAM_IOREQ_PFN is read (to get the gfn containing the synchronous - * ioreq structures), or... - * HVM_PARAM_BUFIOREQ_PFN is read (to get the gfn containing the buffered - * ioreq ring), or... - * HVM_PARAM_BUFIOREQ_EVTCHN is read (to get the event channel that Xen uses - * to request buffered I/O emulation). - * - * The following hypercalls facilitate the creation of IOREQ Servers for - * 'secondary' emulators which are invoked to implement port I/O, memory, or - * PCI config space ranges which they explicitly register. - */ - -typedef uint16_t ioservid_t; - -/* - * XEN_DMOP_create_ioreq_server: Instantiate a new IOREQ Server for a - * secondary emulator. - * - * The handed back is unique for target domain. The valur of - * should be one of HVM_IOREQSRV_BUFIOREQ_* defined in - * hvm_op.h. If the value is HVM_IOREQSRV_BUFIOREQ_OFF then the buffered - * ioreq ring will not be allocated and hence all emulation requests to - * this server will be synchronous. - */ -#define XEN_DMOP_create_ioreq_server 1 - -struct xen_dm_op_create_ioreq_server { - /* IN - should server handle buffered ioreqs */ - uint8_t handle_bufioreq; - uint8_t pad[3]; - /* OUT - server id */ - ioservid_t id; -}; - -/* - * XEN_DMOP_get_ioreq_server_info: Get all the information necessary to - * access IOREQ Server . - * - * The emulator needs to map the synchronous ioreq structures and buffered - * ioreq ring (if it exists) that Xen uses to request emulation. These are - * hosted in the target domain's gmfns and - * respectively. In addition, if the IOREQ Server is handling buffered - * emulation requests, the emulator needs to bind to event channel - * to listen for them. (The event channels used for - * synchronous emulation requests are specified in the per-CPU ioreq - * structures in ). - * If the IOREQ Server is not handling buffered emulation requests then the - * values handed back in and will both be 0. - */ -#define XEN_DMOP_get_ioreq_server_info 2 - -struct xen_dm_op_get_ioreq_server_info { - /* IN - server id */ - ioservid_t id; - uint16_t pad; - /* OUT - buffered ioreq port */ - evtchn_port_t bufioreq_port; - /* OUT - sync ioreq gfn */ - uint64_aligned_t ioreq_gfn; - /* OUT - buffered ioreq gfn */ - uint64_aligned_t bufioreq_gfn; -}; - -/* - * XEN_DMOP_map_io_range_to_ioreq_server: Register an I/O range for - * emulation by the client of - * IOREQ Server . - * XEN_DMOP_unmap_io_range_from_ioreq_server: Deregister an I/O range - * previously registered for - * emulation by the client of - * IOREQ Server . - * - * There are three types of I/O that can be emulated: port I/O, memory - * accesses and PCI config space accesses. The field denotes which - * type of range* the and (inclusive) fields are specifying. - * PCI config space ranges are specified by segment/bus/device/function - * values which should be encoded using the DMOP_PCI_SBDF helper macro - * below. - * - * 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_unmap_io_range_from_ioreq_server 4 - -struct xen_dm_op_ioreq_server_range { - /* IN - server id */ - ioservid_t id; - 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 */ - /* 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)) - -/* - * XEN_DMOP_set_ioreq_server_state: Enable or disable the IOREQ Server - * - * The IOREQ Server will not be passed any emulation requests until it is - * in the enabled state. - * Note that the contents of the ioreq_gfn and bufioreq_gfn (see - * XEN_DMOP_get_ioreq_server_info) are not meaningful until the IOREQ Server - * is in the enabled state. - */ -#define XEN_DMOP_set_ioreq_server_state 5 - -struct xen_dm_op_set_ioreq_server_state { - /* IN - server id */ - ioservid_t id; - /* IN - enabled? */ - uint8_t enabled; - uint8_t pad; -}; - -/* - * XEN_DMOP_destroy_ioreq_server: Destroy the IOREQ Server . - * - * Any registered I/O ranges will be automatically deregistered. - */ -#define XEN_DMOP_destroy_ioreq_server 6 - -struct xen_dm_op_destroy_ioreq_server { - /* IN - server id */ - ioservid_t id; - uint16_t pad; -}; - -/* - * XEN_DMOP_track_dirty_vram: Track modifications to the specified pfn - * range. - * - * NOTE: The bitmap passed back to the caller is passed in a - * secondary buffer. - */ -#define XEN_DMOP_track_dirty_vram 7 - -struct xen_dm_op_track_dirty_vram { - /* IN - number of pages to be tracked */ - uint32_t nr; - uint32_t pad; - /* IN - first pfn to track */ - uint64_aligned_t first_pfn; -}; - -/* - * XEN_DMOP_set_pci_intx_level: Set the logical level of one of a domain's - * PCI INTx pins. - */ -#define XEN_DMOP_set_pci_intx_level 8 - -struct xen_dm_op_set_pci_intx_level { - /* IN - PCI INTx identification (domain:bus:device:intx) */ - uint16_t domain; - uint8_t bus, device, intx; - /* IN - Level: 0 -> deasserted, 1 -> asserted */ - uint8_t level; -}; - -/* - * XEN_DMOP_set_isa_irq_level: Set the logical level of a one of a domain's - * ISA IRQ lines. - */ -#define XEN_DMOP_set_isa_irq_level 9 - -struct xen_dm_op_set_isa_irq_level { - /* IN - ISA IRQ (0-15) */ - uint8_t isa_irq; - /* IN - Level: 0 -> deasserted, 1 -> asserted */ - uint8_t level; -}; - -/* - * XEN_DMOP_set_pci_link_route: Map a PCI INTx line to an IRQ line. - */ -#define XEN_DMOP_set_pci_link_route 10 - -struct xen_dm_op_set_pci_link_route { - /* PCI INTx line (0-3) */ - uint8_t link; - /* ISA IRQ (1-15) or 0 -> disable link */ - uint8_t isa_irq; -}; - -/* - * XEN_DMOP_modified_memory: Notify that a set of pages were modified by - * an emulator. - * - * DMOP buf 1 contains an array of xen_dm_op_modified_memory_extent with - * @nr_extents entries. - * - * On error, @nr_extents will contain the index+1 of the extent that - * had the error. It is not defined if or which pages may have been - * marked as dirty, in this event. - */ -#define XEN_DMOP_modified_memory 11 - -struct xen_dm_op_modified_memory { - /* - * IN - Number of extents to be processed - * OUT -returns n+1 for failing extent - */ - uint32_t nr_extents; - /* IN/OUT - Must be set to 0 */ - uint32_t opaque; -}; - -struct xen_dm_op_modified_memory_extent { - /* IN - number of contiguous pages modified */ - uint32_t nr; - uint32_t pad; - /* IN - first pfn modified */ - uint64_aligned_t first_pfn; -}; - -/* - * XEN_DMOP_set_mem_type: Notify that a region of memory is to be treated - * in a specific way. (See definition of - * hvmmem_type_t). - * - * NOTE: In the event of a continuation (return code -ERESTART), the - * @first_pfn is set to the value of the pfn of the remaining - * region and @nr reduced to the size of the remaining region. - */ -#define XEN_DMOP_set_mem_type 12 - -struct xen_dm_op_set_mem_type { - /* IN - number of contiguous pages */ - uint32_t nr; - /* IN - new hvmmem_type_t of region */ - uint16_t mem_type; - uint16_t pad; - /* IN - first pfn in region */ - uint64_aligned_t first_pfn; -}; - -/* - * XEN_DMOP_inject_event: Inject an event into a VCPU, which will - * get taken up when it is next scheduled. - * - * Note that the caller should know enough of the state of the CPU before - * injecting, to know what the effect of injecting the event will be. - */ -#define XEN_DMOP_inject_event 13 - -struct xen_dm_op_inject_event { - /* IN - index of vCPU */ - uint32_t vcpuid; - /* IN - interrupt vector */ - uint8_t vector; - /* 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) */ - /* IN - instruction length */ - uint8_t insn_len; - uint8_t pad0; - /* IN - error code (or ~0 to skip) */ - uint32_t error_code; - uint32_t pad1; - /* IN - CR2 for page faults */ - uint64_aligned_t cr2; -}; - -/* - * XEN_DMOP_inject_msi: Inject an MSI for an emulated device. - */ -#define XEN_DMOP_inject_msi 14 - -struct xen_dm_op_inject_msi { - /* IN - MSI data (lower 32 bits) */ - uint32_t data; - uint32_t pad; - /* IN - MSI address (0xfeexxxxx) */ - uint64_aligned_t addr; -}; - -/* - * XEN_DMOP_map_mem_type_to_ioreq_server : map or unmap the IOREQ Server - * to specific memory type - * for specific accesses - * - * For now, flags only accept the value of XEN_DMOP_IOREQ_MEM_ACCESS_WRITE, - * which means only write operations are to be forwarded to an ioreq server. - * Support for the emulation of read operations can be added when an ioreq - * server has such requirement in future. - */ -#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 */ - -#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 */ -}; - -/* - * XEN_DMOP_remote_shutdown : Declare a shutdown for another domain - * Identical to SCHEDOP_remote_shutdown - */ -#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) */ -}; - -struct xen_dm_op { - uint32_t op; - uint32_t pad; - union { - struct xen_dm_op_create_ioreq_server create_ioreq_server; - struct xen_dm_op_get_ioreq_server_info get_ioreq_server_info; - struct xen_dm_op_ioreq_server_range map_io_range_to_ioreq_server; - struct xen_dm_op_ioreq_server_range unmap_io_range_from_ioreq_server; - struct xen_dm_op_set_ioreq_server_state set_ioreq_server_state; - struct xen_dm_op_destroy_ioreq_server destroy_ioreq_server; - struct xen_dm_op_track_dirty_vram track_dirty_vram; - struct xen_dm_op_set_pci_intx_level set_pci_intx_level; - struct xen_dm_op_set_isa_irq_level set_isa_irq_level; - struct xen_dm_op_set_pci_link_route set_pci_link_route; - struct xen_dm_op_modified_memory modified_memory; - struct xen_dm_op_set_mem_type set_mem_type; - 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; - struct xen_dm_op_remote_shutdown remote_shutdown; - } u; -}; - -#endif /* __XEN__ || __XEN_TOOLS__ */ - -struct xen_dm_op_buf { - XEN_GUEST_HANDLE(void) h; - xen_ulong_t size; -}; -typedef struct xen_dm_op_buf xen_dm_op_buf_t; -DEFINE_XEN_GUEST_HANDLE(xen_dm_op_buf_t); - -/* ` enum neg_errnoval - * ` HYPERVISOR_dm_op(domid_t domid, - * ` unsigned int nr_bufs, - * ` xen_dm_op_buf_t bufs[]) - * ` - * - * @domid is the domain the hypercall operates on. - * @nr_bufs is the number of buffers in the @bufs array. - * @bufs points to an array of buffers where @bufs[0] contains a struct - * xen_dm_op, describing the specific device model operation and its - * parameters. - * @bufs[1..] may be referenced in the parameters for the purposes of - * passing extra information to or from the domain. - */ - -#endif /* __XEN_PUBLIC_HVM_DM_OP_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/hvm/e820.h b/plat/xen/include/xen/hvm/e820.h deleted file mode 100644 index 4c42f3341e10c0dd84addb0792f008e55352576c..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/e820.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2006, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_HVM_E820_H__ -#define __XEN_PUBLIC_HVM_E820_H__ - -#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_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/plat/xen/include/xen/hvm/hvm_info_table.h b/plat/xen/include/xen/hvm/hvm_info_table.h deleted file mode 100644 index 08c252e822ebe1d04c9c2ec5e5881cf217c39d18..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/hvm_info_table.h +++ /dev/null @@ -1,82 +0,0 @@ -/****************************************************************************** - * hvm/hvm_info_table.h - * - * HVM parameter and information table, written into guest memory map. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2006, Keir Fraser - */ - -#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) - -/* Maximum we can support with current vLAPIC ID mapping. */ -#define HVM_MAX_VCPUS 128 - -/* - * In some cases SMP HVM guests may require knowledge of Xen's idea of vCPU ids - * for their vCPUs. For example, HYPERVISOR_vcpu_op and some EVTCHNOP_* - * hypercalls take vcpu id as a parameter. It is valid for HVM guests to assume - * that Xen's vCPU id always equals to ACPI (not APIC!) id in MADT table which - * is always present for SMP guests. - */ - -struct hvm_info_table { - char signature[8]; /* "HVM INFO" */ - uint32_t length; - uint8_t checksum; - - /* Should firmware build APIC descriptors (APIC MADT / MP BIOS)? */ - uint8_t apic_mode; - - /* How many CPUs does this domain have? */ - uint32_t nr_vcpus; - - /* - * MEMORY MAP provided by HVM domain builder. - * Notes: - * 1. page_to_phys(x) = x << 12 - * 2. If a field is zero, the corresponding range does not exist. - */ - /* - * 0x0 to page_to_phys(low_mem_pgend)-1: - * RAM below 4GB (except for VGA hole 0xA0000-0xBFFFF) - */ - uint32_t low_mem_pgend; - /* - * page_to_phys(reserved_mem_pgstart) to 0xFFFFFFFF: - * Reserved for special memory mappings - */ - uint32_t reserved_mem_pgstart; - /* - * 0x100000000 to page_to_phys(high_mem_pgend)-1: - * RAM above 4GB - */ - uint32_t high_mem_pgend; - - /* Bitmap of which CPUs are online at boot time. */ - uint8_t vcpu_online[(HVM_MAX_VCPUS + 7)/8]; -}; - -#endif /* __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ */ diff --git a/plat/xen/include/xen/hvm/hvm_op.h b/plat/xen/include/xen/hvm/hvm_op.h deleted file mode 100644 index 0bdafdf59adcfdccb46688ebe0dcd77b5253e6dc..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/hvm_op.h +++ /dev/null @@ -1,296 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2007, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__ -#define __XEN_PUBLIC_HVM_HVM_OP_H__ - -#include "../xen.h" -#include "../trace.h" -#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 -struct xen_hvm_param { - 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); - -#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 -struct xen_hvm_set_pci_intx_level { - /* Domain to be updated. */ - domid_t domid; - /* PCI INTx identification in PCI topology (domain:bus:device:intx). */ - uint8_t domain, bus, device, intx; - /* Assertion level (0 = unasserted, 1 = asserted). */ - 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 -struct xen_hvm_set_isa_irq_level { - /* Domain to be updated. */ - domid_t domid; - /* ISA device identification, by ISA IRQ (0-15). */ - uint8_t isa_irq; - /* Assertion level (0 = unasserted, 1 = asserted). */ - 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 -struct xen_hvm_set_pci_link_route { - /* Domain to be updated. */ - domid_t domid; - /* PCI link identifier (0-3). */ - uint8_t link; - /* ISA IRQ (1-15), or 0 (disable link). */ - 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); - -#endif /* __XEN_INTERFACE_VERSION__ < 0x00040900 */ - -/* Flushes all VCPU TLBs: @arg must be NULL. */ -#define HVMOP_flush_tlbs 5 - -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 */ -#if __XEN_INTERFACE_VERSION__ < 0x00040700 - 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 */ -#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_type_t; - -/* Hint from PV drivers for pagetable destruction. */ -#define HVMOP_pagetable_dying 9 -struct xen_hvm_pagetable_dying { - /* Domain with a pagetable about to be destroyed. */ - 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; -}; -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 -struct xen_hvm_get_time { - 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 -struct xen_hvm_xentrace { - uint16_t event, extra_bytes; - uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)]; -}; -typedef struct xen_hvm_xentrace xen_hvm_xentrace_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t); - -/* Following tools-only interfaces may change in future. */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -/* Deprecated by XENMEM_access_op_set_access */ -#define HVMOP_set_mem_access 12 - -/* Deprecated by XENMEM_access_op_get_access */ -#define HVMOP_get_mem_access 13 - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ - -#define HVMOP_get_mem_type 15 -/* Return hvmmem_type_t for the specified pfn. */ -struct xen_hvm_get_mem_type { - /* Domain to be queried. */ - domid_t domid; - /* OUT variable. */ - uint16_t mem_type; - uint16_t pad[2]; /* align next field on 8-byte boundary */ - /* IN variable. */ - uint64_t pfn; -}; -typedef struct xen_hvm_get_mem_type xen_hvm_get_mem_type_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_type_t); - -/* Following tools-only interfaces may change in future. */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -/* - * Definitions relating to DMOP_create_ioreq_server. (Defined here for - * backwards compatibility). - */ - -#define HVM_IOREQSRV_BUFIOREQ_OFF 0 -#define HVM_IOREQSRV_BUFIOREQ_LEGACY 1 -/* - * Use this when read_pointer gets updated atomically and - * the pointer pair gets read atomically: - */ -#define HVM_IOREQSRV_BUFIOREQ_ATOMIC 2 - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ - -#if defined(__i386__) || defined(__x86_64__) - -/* - * 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). - */ -#define HVMOP_set_evtchn_upcall_vector 23 -struct xen_hvm_evtchn_upcall_vector { - uint32_t vcpu; - uint8_t vector; -}; -typedef struct xen_hvm_evtchn_upcall_vector xen_hvm_evtchn_upcall_vector_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t); - -#endif /* defined(__i386__) || defined(__x86_64__) */ - -#define HVMOP_guest_request_vm_event 24 - -/* HVMOP_altp2m: perform altp2m state operations */ -#define HVMOP_altp2m 25 - -#define HVMOP_ALTP2M_INTERFACE_VERSION 0x00000001 - -struct xen_hvm_altp2m_domain_state { - /* IN or OUT variable on/off */ - uint8_t state; -}; -typedef struct xen_hvm_altp2m_domain_state xen_hvm_altp2m_domain_state_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_domain_state_t); - -struct xen_hvm_altp2m_vcpu_enable_notify { - uint32_t vcpu_id; - uint32_t pad; - /* #VE info area gfn */ - uint64_t gfn; -}; -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_view { - /* IN/OUT variable */ - uint16_t view; - /* Create view only: default access type - * NOTE: currently ignored */ - uint16_t hvmmem_default_access; /* xenmem_access_t */ -}; -typedef struct xen_hvm_altp2m_view xen_hvm_altp2m_view_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_view_t); - -struct xen_hvm_altp2m_set_mem_access { - /* view */ - uint16_t view; - /* Memory type */ - uint16_t hvmmem_access; /* xenmem_access_t */ - uint32_t pad; - /* gfn */ - uint64_t gfn; -}; -typedef struct xen_hvm_altp2m_set_mem_access xen_hvm_altp2m_set_mem_access_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_set_mem_access_t); - -struct xen_hvm_altp2m_change_gfn { - /* view */ - uint16_t view; - uint16_t pad1; - uint32_t pad2; - /* old gfn */ - uint64_t old_gfn; - /* new gfn, INVALID_GFN (~0UL) means revert */ - uint64_t new_gfn; -}; -typedef struct xen_hvm_altp2m_change_gfn xen_hvm_altp2m_change_gfn_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_change_gfn_t); - -struct xen_hvm_altp2m_op { - 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 -/* Set the current VCPU to receive altp2m event notifications */ -#define HVMOP_altp2m_vcpu_enable_notify 3 -/* Create a new view */ -#define HVMOP_altp2m_create_p2m 4 -/* Destroy a view */ -#define HVMOP_altp2m_destroy_p2m 5 -/* Switch view for an entire domain */ -#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 -/* Change a p2m entry to have a different gfn->mfn mapping */ -#define HVMOP_altp2m_change_gfn 8 - 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_set_mem_access set_mem_access; - struct xen_hvm_altp2m_change_gfn change_gfn; - uint8_t pad[64]; - } u; -}; -typedef struct xen_hvm_altp2m_op xen_hvm_altp2m_op_t; -DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_op_t); - -#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/hvm/hvm_vcpu.h b/plat/xen/include/xen/hvm/hvm_vcpu.h deleted file mode 100644 index d21abf1885df367e0555c07a1e527ef84fb0ee1b..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/hvm_vcpu.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2015, Roger Pau Monne - */ - -#ifndef __XEN_PUBLIC_HVM_HVM_VCPU_H__ -#define __XEN_PUBLIC_HVM_HVM_VCPU_H__ - -#include "../xen.h" - -struct vcpu_hvm_x86_32 { - uint32_t eax; - uint32_t ecx; - uint32_t edx; - uint32_t ebx; - uint32_t esp; - uint32_t ebp; - uint32_t esi; - uint32_t edi; - uint32_t eip; - uint32_t eflags; - - uint32_t cr0; - uint32_t cr3; - uint32_t cr4; - - uint32_t pad1; - - /* - * EFER should only be used to set the NXE bit (if required) - * when starting a vCPU in 32bit mode with paging enabled or - * to set the LME/LMA bits in order to start the vCPU in - * compatibility mode. - */ - uint64_t efer; - - uint32_t cs_base; - uint32_t ds_base; - uint32_t ss_base; - uint32_t es_base; - uint32_t tr_base; - uint32_t cs_limit; - uint32_t ds_limit; - uint32_t ss_limit; - uint32_t es_limit; - uint32_t tr_limit; - uint16_t cs_ar; - uint16_t ds_ar; - uint16_t ss_ar; - uint16_t es_ar; - uint16_t tr_ar; - - uint16_t pad2[3]; -}; - -/* - * The layout of the _ar fields of the segment registers is the - * following: - * - * Bits [0,3]: type (bits 40-43). - * Bit 4: s (descriptor type, bit 44). - * Bit [5,6]: dpl (descriptor privilege level, bits 45-46). - * Bit 7: p (segment-present, bit 47). - * Bit 8: avl (available for system software, bit 52). - * Bit 9: l (64-bit code segment, bit 53). - * Bit 10: db (meaning depends on the segment, bit 54). - * Bit 11: g (granularity, bit 55) - * Bits [12,15]: unused, must be blank. - * - * A more complete description of the meaning of this fields can be - * obtained from the Intel SDM, Volume 3, section 3.4.5. - */ - -struct vcpu_hvm_x86_64 { - uint64_t rax; - uint64_t rcx; - uint64_t rdx; - uint64_t rbx; - uint64_t rsp; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t rip; - uint64_t rflags; - - uint64_t cr0; - uint64_t cr3; - uint64_t cr4; - uint64_t efer; - - /* - * Using VCPU_HVM_MODE_64B implies that the vCPU is launched - * directly in long mode, so the cached parts of the segment - * registers get set to match that environment. - * - * If the user wants to launch the vCPU in compatibility mode - * the 32-bit structure should be used instead. - */ -}; - -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. */ - uint32_t mode; - - uint32_t pad; - - /* CPU registers. */ - union { - struct vcpu_hvm_x86_32 x86_32; - struct vcpu_hvm_x86_64 x86_64; - } cpu_regs; -}; -typedef struct vcpu_hvm_context vcpu_hvm_context_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_hvm_context_t); - -#endif /* __XEN_PUBLIC_HVM_HVM_VCPU_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/hvm/hvm_xs_strings.h b/plat/xen/include/xen/hvm/hvm_xs_strings.h deleted file mode 100644 index fea1dd44070a7489a3d73ec03ea5cc36b268aad1..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/hvm_xs_strings.h +++ /dev/null @@ -1,83 +0,0 @@ -/****************************************************************************** - * hvm/hvm_xs_strings.h - * - * HVM xenstore strings used in HVMLOADER. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2013, Citrix Systems - */ - -#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" - -/* The following values allow additional ACPI tables to be added to the - * virtual ACPI BIOS that hvmloader constructs. The values specify the guest - * physical address and length of a block of ACPI tables to add. The format of - * 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" - -/* Any number of SMBIOS types can be passed through to an HVM guest using - * the following xenstore values. The values specify the guest physical - * address and length of a block of SMBIOS structures for hvmloader to use. - * The block is formatted in the following way: - * - * ... - * - * Each length separator is a 32b integer indicating the length of the next - * SMBIOS structure. For DMTF defined types (0 - 121), the passed in struct - * 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" - -/* Set to 1 to enable SMBIOS default portable battery (type 22) values. */ -#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. - */ -#define HVM_XS_BIOS_STRINGS "bios-strings" -#define HVM_XS_BIOS_VENDOR "bios-strings/bios-vendor" -#define HVM_XS_BIOS_VERSION "bios-strings/bios-version" -#define HVM_XS_SYSTEM_MANUFACTURER "bios-strings/system-manufacturer" -#define HVM_XS_SYSTEM_PRODUCT_NAME "bios-strings/system-product-name" -#define HVM_XS_SYSTEM_VERSION "bios-strings/system-version" -#define HVM_XS_SYSTEM_SERIAL_NUMBER "bios-strings/system-serial-number" -#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" -#define HVM_XS_BATTERY_MANUFACTURER "bios-strings/battery-manufacturer" -#define HVM_XS_BATTERY_DEVICE_NAME "bios-strings/battery-device-name" - -/* 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" - -#endif /* __XEN_PUBLIC_HVM_HVM_XS_STRINGS_H__ */ diff --git a/plat/xen/include/xen/hvm/ioreq.h b/plat/xen/include/xen/hvm/ioreq.h deleted file mode 100644 index d309d122cc40d03fc0fcd289b272bfeab587ae4f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/ioreq.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ioreq.h: I/O request definitions for device models - * Copyright (c) 2004, Intel Corporation. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 _IOREQ_H_ -#define _IOREQ_H_ - -#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 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 - * prepare this structure and notify service OS and DM by sending - * virq. - * - * For I/O type IOREQ_TYPE_PCI_CONFIG, the physical address is formatted - * as follows: - * - * 63....48|47..40|39..35|34..32|31........0 - * 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 */ - 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 */ -}; -typedef struct ioreq ioreq_t; - -struct shared_iopage { - struct ioreq vcpu_ioreq[1]; -}; -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 */ -}; -typedef struct buf_ioreq buf_ioreq_t; - -#define IOREQ_BUFFER_SLOT_NUM 511 /* 8 bytes each, plus 2 4-byte indexes */ -struct buffered_iopage { -#ifdef __XEN__ - union bufioreq_pointers { - struct { -#endif - uint32_t read_pointer; - uint32_t write_pointer; -#ifdef __XEN__ - }; - uint64_t full; - } ptrs; -#endif - buf_ioreq_t buf_ioreq[IOREQ_BUFFER_SLOT_NUM]; -}; /* NB. Size of this structure must be no greater than one page. */ -typedef struct buffered_iopage buffered_iopage_t; - -/* - * ACPI Control/Event register locations. Location is controlled by a - * version number in HVM_PARAM_ACPI_IOPORTS_LOCATION. - */ - -/* - * Version 0 (default): Traditional (obsolete) Xen locations. - * - * These are now only used for compatibility with VMs migrated - * from older Xen versions. - */ -#define ACPI_PM1A_EVT_BLK_ADDRESS_V0 0x1f40 -#define ACPI_PM1A_CNT_BLK_ADDRESS_V0 (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x04) -#define ACPI_PM_TMR_BLK_ADDRESS_V0 (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x08) -#define ACPI_GPE0_BLK_ADDRESS_V0 (ACPI_PM_TMR_BLK_ADDRESS_V0 + 0x20) -#define ACPI_GPE0_BLK_LEN_V0 0x08 - -/* Version 1: Locations preferred by modern Qemu (including Qemu-trad). */ -#define ACPI_PM1A_EVT_BLK_ADDRESS_V1 0xb000 -#define ACPI_PM1A_CNT_BLK_ADDRESS_V1 (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x04) -#define ACPI_PM_TMR_BLK_ADDRESS_V1 (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x08) -#define ACPI_GPE0_BLK_ADDRESS_V1 0xafe0 -#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 - - -#endif /* _IOREQ_H_ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/hvm/params.h b/plat/xen/include/xen/hvm/params.h deleted file mode 100644 index 2ec2e7c80ffb925fa720768c249b4ac72fb38345..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/params.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2007, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_HVM_PARAMS_H__ -#define __XEN_PUBLIC_HVM_PARAMS_H__ - -#include "hvm_op.h" - -/* - * Parameter space for HVMOP_{set,get}_param. - */ - -#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? - * - * If val == 0 then CPU0 event-channel notifications are not delivered. - * If val != 0, val[63:56] encodes the type, as follows: - */ - -#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. - */ - -#define HVM_PARAM_CALLBACK_TYPE_PCI_INTX 1 -/* - * val[55:0] is a delivery PCI INTx line: - * Domain = val[47:32], Bus = val[31:16] DevFn = val[15:8], IntX = val[1:0] - */ - -#if defined(__i386__) || defined(__x86_64__) -#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 -/* - * val[55:16] needs to be zero. - * val[15:8] is interrupt flag of the PPI used by event-channel: - * bit 8: the PPI is edge(1) or level(0) triggered - * bit 9: the PPI is active low(1) or high(0) - * val[7:0] is a PPI number used by event-channel. - * This is only used by ARM/ARM64 and masking/eoi the interrupt associated to - * the notification is handled by the interrupt controller. - */ -#define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_MASK 0xFF00 -#define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_LOW_LEVEL 2 -#endif - -/* - * These are not used by Xen. They are here for convenience of HVM-guest - * xenbus implementations. - */ -#define HVM_PARAM_STORE_PFN 1 -#define HVM_PARAM_STORE_EVTCHN 2 - -#define HVM_PARAM_PAE_ENABLED 4 - -#define HVM_PARAM_IOREQ_PFN 5 - -#define HVM_PARAM_BUFIOREQ_PFN 6 -#define HVM_PARAM_BUFIOREQ_EVTCHN 26 - -#if defined(__i386__) || defined(__x86_64__) - -/* - * Viridian enlightenments - * - * (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 - -/* Base+Freq viridian feature sets: - * - * - Hypercall MSRs (HV_X64_MSR_GUEST_OS_ID and HV_X64_MSR_HYPERCALL) - * - APIC access MSRs (HV_X64_MSR_EOI, HV_X64_MSR_ICR and HV_X64_MSR_TPR) - * - Virtual Processor index MSR (HV_X64_MSR_VP_INDEX) - * - Timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and - * HV_X64_MSR_APIC_FREQUENCY) - */ -#define _HVMPV_base_freq 0 -#define HVMPV_base_freq (1 << _HVMPV_base_freq) - -/* Feature set modifications */ - -/* Disable timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and - * HV_X64_MSR_APIC_FREQUENCY). - * This modification restores the viridian feature set to the - * original 'base' set exposed in releases prior to Xen 4.4. - */ -#define _HVMPV_no_freq 1 -#define HVMPV_no_freq (1 << _HVMPV_no_freq) - -/* Enable Partition Time Reference Counter (HV_X64_MSR_TIME_REF_COUNT) */ -#define _HVMPV_time_ref_count 2 -#define HVMPV_time_ref_count (1 << _HVMPV_time_ref_count) - -/* Enable Reference TSC Page (HV_X64_MSR_REFERENCE_TSC) */ -#define _HVMPV_reference_tsc 3 -#define HVMPV_reference_tsc (1 << _HVMPV_reference_tsc) - -/* 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) - -/* Use APIC assist */ -#define _HVMPV_apic_assist 5 -#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_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) - -#endif - -/* - * Set mode for virtual timers (currently x86 only): - * delay_for_missed_ticks (default): - * Do not advance a vcpu's time beyond the correct delivery time for - * interrupts that have been missed due to preemption. Deliver missed - * interrupts when the vcpu is rescheduled and advance the vcpu's virtual - * time stepwise for each one. - * no_delay_for_missed_ticks: - * As above, missed interrupts are delivered, but guest time always tracks - * wallclock (i.e., real) time while doing so. - * no_missed_ticks_pending: - * No missed interrupts are held pending. Instead, to ensure ticks are - * delivered at some non-zero rate, if we detect missed ticks then the - * internal tick alarm is not disabled if the VCPU is preempted during the - * next tick period. - * one_missed_tick_pending: - * 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 HVMPTM_delay_for_missed_ticks 0 -#define HVMPTM_no_delay_for_missed_ticks 1 -#define HVMPTM_no_missed_ticks_pending 2 -#define HVMPTM_one_missed_tick_pending 3 - -/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */ -#define HVM_PARAM_HPET_ENABLED 11 - -/* Identity-map page directory used by Intel EPT when CR0.PG=0. */ -#define HVM_PARAM_IDENT_PT 12 - -/* Device Model domain, defaults to 0. */ -#define HVM_PARAM_DM_DOMAIN 13 - -/* 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 - -/* Boolean: Enable aligning all periodic vpts to reduce interrupts */ -#define HVM_PARAM_VPT_ALIGN 16 - -/* Console debug shared memory ring and event channel */ -#define HVM_PARAM_CONSOLE_PFN 17 -#define HVM_PARAM_CONSOLE_EVTCHN 18 - -/* - * Select location of ACPI PM1a and TMR control blocks. Currently two locations - * are supported, specified by version 0 or 1 in this parameter: - * - 0: default, use the old addresses - * PM1A_EVT == 0x1f40; PM1A_CNT == 0x1f44; PM_TMR == 0x1f48 - * - 1: use the new default qemu addresses - * PM1A_EVT == 0xb000; PM1A_CNT == 0xb004; PM_TMR == 0xb008 - * You can find these address definitions in - */ -#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 - -/* Boolean: Enable nestedhvm (hvm only) */ -#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 - -/* 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_NR_IOREQ_SERVER_PAGES 33 - -/* Location of the VM Generation ID in guest physical address space. */ -#define HVM_PARAM_VM_GENERATION_ID_ADDR 34 - -/* - * Set mode for altp2m: - * disabled: don't activate altp2m (default) - * mixed: allow access to all altp2m ops for both in-guest and external tools - * external: allow access to external privileged tools only - * limited: guest only has limited access (ie. control VMFUNC and #VE) - */ -#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 - * save/restore. This is a workaround for a hardware limitation that - * does not allow the full FIP/FDP and FCS/FDS to be restored. - * - * Valid values are: - * - * 8: save/restore 64-bit FIP/FDP and clear FCS/FDS (default if CPU - * has FPCSDS feature). - * - * 4: save/restore 32-bit FIP/FDP, FCS/FDS, and clear upper 32-bits of - * FIP/FDP. - * - * 0: allow hypervisor to choose based on the value of FIP/FDP - * (default if CPU does not have FPCSDS). - * - * If FPCSDS (bit 13 in CPUID leaf 0x7, subleaf 0x0) is set, the CPU - * never saves FCS/FDS and this parameter should be left at the - * default of 8. - */ -#define HVM_PARAM_X87_FIP_WIDTH 36 - -/* - * TSS (and its size) used on Intel when CR0.PE=0. The address occupies - * the low 32 bits, while the size is in the high 32 ones. - */ -#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_NR_PARAMS 39 - -#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ diff --git a/plat/xen/include/xen/hvm/pvdrivers.h b/plat/xen/include/xen/hvm/pvdrivers.h deleted file mode 100644 index 01ea2aeaaee8da3f5a570e4418097686b13cff68..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/pvdrivers.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * pvdrivers.h: Register of PV drivers product numbers. - * Copyright (c) 2012, Citrix Systems Inc. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 _XEN_PUBLIC_PVDRIVERS_H_ -#define _XEN_PUBLIC_PVDRIVERS_H_ - -/* - * This is the master registry of product numbers for - * PV drivers. - * If you need a new product number allocating, please - * post to xen-devel@lists.xenproject.org. You should NOT use - * a product number without allocating one. - * If you maintain a separate versioning and distribution path - * for PV drivers you should have a separate product number so - * that your drivers can be separated from others. - * - * During development, you may use the product ID to - * 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) - -#endif /* _XEN_PUBLIC_PVDRIVERS_H_ */ diff --git a/plat/xen/include/xen/hvm/save.h b/plat/xen/include/xen/hvm/save.h deleted file mode 100644 index 0bd240d83b614247d43f5df25323648f32a599cf..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/hvm/save.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * hvm/save.h - * - * Structure definitions for HVM state that is held by Xen and must - * be saved along with the domain's memory and device-model state. - * - * Copyright (c) 2007 XenSource Ltd. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __XEN_PUBLIC_HVM_SAVE_H__ -#define __XEN_PUBLIC_HVM_SAVE_H__ - -/* - * Structures in this header *must* have the same layout in 32bit - * and 64bit environments: this means that all fields must be explicitly - * sized types and aligned to their sizes, and the structs must be - * a multiple of eight bytes long. - * - * Only the state necessary for saving and restoring (i.e. fields - * that are analogous to actual hardware state) should go in this file. - * Internal mechanisms should be kept in Xen-private headers. - */ - -#if !defined(__GNUC__) || defined(__STRICT_ANSI__) -#error "Anonymous structs/unions are a GNU extension." -#endif - -/* - * 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 */ -}; - - -/* - * Each entry has a datatype associated with it: for example, the CPU state - * is saved as a HVM_SAVE_TYPE(CPU), which has HVM_SAVE_LENGTH(CPU), - * and is identified by a descriptor with typecode HVM_SAVE_CODE(CPU). - * DECLARE_HVM_SAVE_TYPE binds these things together with some type-system - * ugliness. - */ - -#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; } -#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];} -#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)) - -#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) -#endif - -/* - * The series of save records is teminated by a zero-type, zero-length - * descriptor. - */ - -struct hvm_save_end {}; -DECLARE_HVM_SAVE_TYPE(END, 0, struct hvm_save_end); - -#if defined(__i386__) || defined(__x86_64__) -#include "../arch-x86/hvm/save.h" -#elif defined(__arm__) || defined(__aarch64__) -#include "../arch-arm/hvm/save.h" -#else -#error "unsupported architecture" -#endif - -#endif /* __XEN_PUBLIC_HVM_SAVE_H__ */ diff --git a/plat/xen/include/xen/io/9pfs.h b/plat/xen/include/xen/io/9pfs.h deleted file mode 100644 index 4bfd5d48b1ea14607e805447824f31cbdff3fd40..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/9pfs.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 9pfs.h -- Xen 9PFS transport - * - * Refer to docs/misc/9pfs.markdown for the specification - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2017 Stefano Stabellini - */ - -#ifndef __XEN_PUBLIC_IO_9PFS_H__ -#define __XEN_PUBLIC_IO_9PFS_H__ - -#include "../grant_table.h" -#include "ring.h" - -/* - * See docs/misc/9pfs.markdown in xen.git for the full specification: - * https://xenbits.xen.org/docs/unstable/misc/9pfs.html - */ -DEFINE_XEN_FLEX_RING_AND_INTF(xen_9pfs); - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/blkif.h b/plat/xen/include/xen/io/blkif.h deleted file mode 100644 index 15a71e3feab67ccc82ac0509c29df074520d02d2..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/blkif.h +++ /dev/null @@ -1,702 +0,0 @@ -/****************************************************************************** - * blkif.h - * - * Unified block-device I/O interface for Xen guest OSes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2003-2004, Keir Fraser - * Copyright (c) 2012, Spectra Logic Corporation - */ - -#ifndef __XEN_PUBLIC_IO_BLKIF_H__ -#define __XEN_PUBLIC_IO_BLKIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Front->back notifications: When enqueuing a new request, sending a - * notification can be made conditional on req_event (i.e., the generic - * hold-off mechanism provided by the ring macros). Backends must set - * req_event appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). - * - * Back->front notifications: When enqueuing a new response, sending a - * notification can be made conditional on rsp_event (i.e., the generic - * hold-off mechanism provided by the ring macros). Frontends must set - * rsp_event appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). - */ - -#ifndef blkif_vdev_t -#define blkif_vdev_t uint16_t -#endif -#define blkif_sector_t uint64_t - -/* - * Feature and Parameter Negotiation - * ================================= - * The two halves of a Xen block driver utilize nodes within the XenStore to - * communicate capabilities and to negotiate operating parameters. This - * section enumerates these nodes which reside in the respective front and - * backend portions of the XenStore, following the XenBus convention. - * - * All data in the XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - * Any specified default value is in effect if the corresponding XenBus node - * is not present in the XenStore. - * - * XenStore nodes in sections marked "PRIVATE" are solely for use by the - * driver side whose XenBus tree contains them. - * - * XenStore nodes marked "DEPRECATED" in their notes section should only be - * used to provide interoperability with legacy implementations. - * - * See the XenBus state transition diagram below for details on when XenBus - * nodes must be published and when they can be queried. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *------------------ Backend Device Identification (PRIVATE) ------------------ - * - * mode - * Values: "r" (read only), "w" (writable) - * - * The read or write access permissions to the backing store to be - * granted to the frontend. - * - * params - * Values: string - * - * A free formatted string providing sufficient information for the - * hotplug script to attach the device and provide a suitable - * handler (ie: a block device) for blkback to use. - * - * physical-device - * Values: "MAJOR:MINOR" - * Notes: 11 - * - * MAJOR and MINOR are the major number and minor number of the - * backing device respectively. - * - * physical-device-path - * Values: path string - * - * A string that contains the absolute path to the disk image. On - * NetBSD and Linux this is always a block device, while on FreeBSD - * it can be either a block device or a regular file. - * - * type - * Values: "file", "phy", "tap" - * - * The type of the backing device/object. - * - * - * direct-io-safe - * Values: 0/1 (boolean) - * Default Value: 0 - * - * The underlying storage is not affected by the direct IO memory - * lifetime bug. See: - * http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html - * - * Therefore this option gives the backend permission to use - * O_DIRECT, notwithstanding that bug. - * - * That is, if this option is enabled, use of O_DIRECT is safe, - * in circumstances where we would normally have avoided it as a - * workaround for that bug. This option is not relevant for all - * backends, and even not necessarily supported for those for - * which it is relevant. A backend which knows that it is not - * affected by the bug can ignore this option. - * - * This option doesn't require a backend to use O_DIRECT, so it - * should not be used to try to control the caching behaviour. - * - *--------------------------------- Features --------------------------------- - * - * feature-barrier - * Values: 0/1 (boolean) - * Default Value: 0 - * - * A value of "1" indicates that the backend can process requests - * containing the BLKIF_OP_WRITE_BARRIER request opcode. Requests - * of this type may still be returned at any time with the - * BLKIF_RSP_EOPNOTSUPP result code. - * - * feature-flush-cache - * Values: 0/1 (boolean) - * Default Value: 0 - * - * A value of "1" indicates that the backend can process requests - * containing the BLKIF_OP_FLUSH_DISKCACHE request opcode. Requests - * of this type may still be returned at any time with the - * BLKIF_RSP_EOPNOTSUPP result code. - * - * feature-discard - * Values: 0/1 (boolean) - * Default Value: 0 - * - * A value of "1" indicates that the backend can process requests - * containing the BLKIF_OP_DISCARD request opcode. Requests - * of this type may still be returned at any time with the - * BLKIF_RSP_EOPNOTSUPP result code. - * - * feature-persistent - * Values: 0/1 (boolean) - * Default Value: 0 - * Notes: 7 - * - * A value of "1" indicates that the backend can keep the grants used - * by the frontend driver mapped, so the same set of grants should be - * used in all transactions. The maximum number of grants the backend - * can map persistently depends on the implementation, but ideally it - * should be RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. Using this - * feature the backend doesn't need to unmap each grant, preventing - * costly TLB flushes. The backend driver should only map grants - * persistently if the frontend supports it. If a backend driver chooses - * to use the persistent protocol when the frontend doesn't support it, - * it will probably hit the maximum number of persistently mapped grants - * (due to the fact that the frontend won't be reusing the same grants), - * and fall back to non-persistent mode. Backend implementations may - * shrink or expand the number of persistently mapped grants without - * notifying the frontend depending on memory constraints (this might - * cause a performance degradation). - * - * If a backend driver wants to limit the maximum number of persistently - * mapped grants to a value less than RING_SIZE * - * BLKIF_MAX_SEGMENTS_PER_REQUEST a LRU strategy should be used to - * discard the grants that are less commonly used. Using a LRU in the - * backend driver paired with a LIFO queue in the frontend will - * allow us to have better performance in this scenario. - * - *----------------------- Request Transport Parameters ------------------------ - * - * max-ring-page-order - * Values: - * Default Value: 0 - * Notes: 1, 3 - * - * The maximum supported size of the request ring buffer in units of - * lb(machine pages). (e.g. 0 == 1 page, 1 = 2 pages, 2 == 4 pages, - * etc.). - * - * max-ring-pages - * Values: - * Default Value: 1 - * Notes: DEPRECATED, 2, 3 - * - * The maximum supported size of the request ring buffer in units of - * machine pages. The value must be a power of 2. - * - *------------------------- Backend Device Properties ------------------------- - * - * discard-enable - * Values: 0/1 (boolean) - * Default Value: 1 - * - * This optional property, set by the toolstack, instructs the backend - * to offer (or not to offer) discard to the frontend. If the property - * is missing the backend should offer discard if the backing storage - * actually supports it. - * - * discard-alignment - * Values: - * Default Value: 0 - * Notes: 4, 5 - * - * The offset, in bytes from the beginning of the virtual block device, - * to the first, addressable, discard extent on the underlying device. - * - * discard-granularity - * Values: - * Default Value: <"sector-size"> - * Notes: 4 - * - * The size, in bytes, of the individually addressable discard extents - * of the underlying device. - * - * discard-secure - * Values: 0/1 (boolean) - * Default Value: 0 - * Notes: 10 - * - * A value of "1" indicates that the backend can process BLKIF_OP_DISCARD - * requests with the BLKIF_DISCARD_SECURE flag set. - * - * info - * Values: (bitmap) - * - * A collection of bit flags describing attributes of the backing - * device. The VDISK_* macros define the meaning of each bit - * location. - * - * sector-size - * Values: - * - * The logical sector size, in bytes, of the backend device. - * - * physical-sector-size - * Values: - * - * The physical sector size, in bytes, of the backend device. - * - * sectors - * Values: - * - * The size of the backend device, expressed in units of its logical - * sector size ("sector-size"). - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * ring-ref - * Values: - * Notes: 6 - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. - * - * ring-ref%u - * Values: - * Notes: 6 - * - * For a frontend providing a multi-page ring, a "number of ring pages" - * sized list of nodes, each containing a Xen grant reference granting - * permission for the backend to map the page of the ring located - * at page index "%u". Page indexes are zero based. - * - * protocol - * Values: string (XEN_IO_PROTO_ABI_*) - * Default Value: XEN_IO_PROTO_ABI_NATIVE - * - * The machine ABI rules governing the format of all ring request and - * response structures. - * - * ring-page-order - * Values: - * Default Value: 0 - * Maximum Value: MAX(ffs(max-ring-pages) - 1, max-ring-page-order) - * Notes: 1, 3 - * - * The size of the frontend allocated request ring buffer in units - * of lb(machine pages). (e.g. 0 == 1 page, 1 = 2 pages, 2 == 4 pages, - * etc.). - * - * num-ring-pages - * Values: - * Default Value: 1 - * Maximum Value: MAX(max-ring-pages,(0x1 << max-ring-page-order)) - * Notes: DEPRECATED, 2, 3 - * - * The size of the frontend allocated request ring buffer in units of - * machine pages. The value must be a power of 2. - * - * feature-persistent - * Values: 0/1 (boolean) - * Default Value: 0 - * Notes: 7, 8, 9 - * - * A value of "1" indicates that the frontend will reuse the same grants - * for all transactions, allowing the backend to map them with write - * access (even when it should be read-only). If the frontend hits the - * maximum number of allowed persistently mapped grants, it can fallback - * to non persistent mode. This will cause a performance degradation, - * since the the backend driver will still try to map those grants - * persistently. Since the persistent grants protocol is compatible with - * the previous protocol, a frontend driver can choose to work in - * persistent mode even when the backend doesn't support it. - * - * It is recommended that the frontend driver stores the persistently - * mapped grants in a LIFO queue, so a subset of all persistently mapped - * grants gets used commonly. This is done in case the backend driver - * decides to limit the maximum number of persistently mapped grants - * to a value less than RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. - * - *------------------------- Virtual Device Properties ------------------------- - * - * device-type - * Values: "disk", "cdrom", "floppy", etc. - * - * virtual-device - * Values: - * - * A value indicating the physical device to virtualize within the - * frontend's domain. (e.g. "The first ATA disk", "The third SCSI - * disk", etc.) - * - * See docs/misc/vbd-interface.txt for details on the format of this - * value. - * - * Notes - * ----- - * (1) Multi-page ring buffer scheme first developed in the Citrix XenServer - * PV drivers. - * (2) Multi-page ring buffer scheme first used in some RedHat distributions - * including a distribution deployed on certain nodes of the Amazon - * EC2 cluster. - * (3) Support for multi-page ring buffers was implemented independently, - * in slightly different forms, by both Citrix and RedHat/Amazon. - * For full interoperability, block front and backends should publish - * identical ring parameters, adjusted for unit differences, to the - * XenStore nodes used in both schemes. - * (4) Devices that support discard functionality may internally allocate space - * (discardable extents) in units that are larger than the exported logical - * block size. If the backing device has such discardable extents the - * backend should provide both discard-granularity and discard-alignment. - * Providing just one of the two may be considered an error by the frontend. - * Backends supporting discard should include discard-granularity and - * discard-alignment even if it supports discarding individual sectors. - * Frontends should assume discard-alignment == 0 and discard-granularity - * == sector size if these keys are missing. - * (5) The discard-alignment parameter allows a physical device to be - * partitioned into virtual devices that do not necessarily begin or - * end on a discardable extent boundary. - * (6) When there is only a single page allocated to the request ring, - * 'ring-ref' is used to communicate the grant reference for this - * page to the backend. When using a multi-page ring, the 'ring-ref' - * node is not created. Instead 'ring-ref0' - 'ring-refN' are used. - * (7) When using persistent grants data has to be copied from/to the page - * where the grant is currently mapped. The overhead of doing this copy - * however doesn't suppress the speed improvement of not having to unmap - * the grants. - * (8) The frontend driver has to allow the backend driver to map all grants - * with write access, even when they should be mapped read-only, since - * further requests may reuse these grants and require write permissions. - * (9) Linux implementation doesn't have a limit on the maximum number of - * grants that can be persistently mapped in the frontend driver, but - * due to the frontent driver implementation it should never be bigger - * than RING_SIZE * BLKIF_MAX_SEGMENTS_PER_REQUEST. - *(10) The discard-secure property may be present and will be set to 1 if the - * backing device supports secure discard. - *(11) Only used by Linux and NetBSD. - */ - -/* - * Multiple hardware queues/rings: - * If supported, the backend will write the key "multi-queue-max-queues" to - * the directory for that vbd, and set its value to the maximum supported - * number of queues. - * Frontends that are aware of this feature and wish to use it can write the - * key "multi-queue-num-queues" with the number they wish to use, which must be - * greater than zero, and no more than the value reported by the backend in - * "multi-queue-max-queues". - * - * For frontends requesting just one queue, the usual event-channel and - * ring-ref keys are written as before, simplifying the backend processing - * to avoid distinguishing between a frontend that doesn't understand the - * multi-queue feature, and one that does, but requested only one queue. - * - * Frontends requesting two or more queues must not write the toplevel - * event-channel and ring-ref keys, instead writing those keys under sub-keys - * having the name "queue-N" where N is the integer ID of the queue/ring for - * which those keys belong. Queues are indexed from zero. - * For example, a frontend with two queues must write the following set of - * queue-related keys: - * - * /local/domain/1/device/vbd/0/multi-queue-num-queues = "2" - * /local/domain/1/device/vbd/0/queue-0 = "" - * /local/domain/1/device/vbd/0/queue-0/ring-ref = "" - * /local/domain/1/device/vbd/0/queue-0/event-channel = "" - * /local/domain/1/device/vbd/0/queue-1 = "" - * /local/domain/1/device/vbd/0/queue-1/ring-ref = "" - * /local/domain/1/device/vbd/0/queue-1/event-channel = "" - * - * It is also possible to use multiple queues/rings together with - * feature multi-page ring buffer. - * For example, a frontend requests two queues/rings and the size of each ring - * buffer is two pages must write the following set of related keys: - * - * /local/domain/1/device/vbd/0/multi-queue-num-queues = "2" - * /local/domain/1/device/vbd/0/ring-page-order = "1" - * /local/domain/1/device/vbd/0/queue-0 = "" - * /local/domain/1/device/vbd/0/queue-0/ring-ref0 = "" - * /local/domain/1/device/vbd/0/queue-0/ring-ref1 = "" - * /local/domain/1/device/vbd/0/queue-0/event-channel = "" - * /local/domain/1/device/vbd/0/queue-1 = "" - * /local/domain/1/device/vbd/0/queue-1/ring-ref0 = "" - * /local/domain/1/device/vbd/0/queue-1/ring-ref1 = "" - * /local/domain/1/device/vbd/0/queue-1/event-channel = "" - * - */ - -/* - * STATE DIAGRAMS - * - ***************************************************************************** - * Startup * - ***************************************************************************** - * - * Tool stack creates front and back nodes with state XenbusStateInitialising. - * - * Front Back - * ================================= ===================================== - * XenbusStateInitialising XenbusStateInitialising - * o Query virtual device o Query backend device identification - * properties. data. - * o Setup OS device instance. o Open and validate backend device. - * o Publish backend features and - * transport parameters. - * | - * | - * V - * XenbusStateInitWait - * - * o Query backend features and - * transport parameters. - * o Allocate and initialize the - * request ring. - * o Publish transport parameters - * that will be in effect during - * this connection. - * | - * | - * V - * XenbusStateInitialised - * - * o Query frontend transport parameters. - * o Connect to the request ring and - * event channel. - * o Publish backend device properties. - * | - * | - * V - * XenbusStateConnected - * - * o Query backend device properties. - * o Finalize OS virtual device - * instance. - * | - * | - * V - * XenbusStateConnected - * - * Note: Drivers that do not support any optional features, or the negotiation - * of transport parameters, can skip certain states in the state machine: - * - * o A frontend may transition to XenbusStateInitialised without - * waiting for the backend to enter XenbusStateInitWait. In this - * case, default transport parameters are in effect and any - * transport parameters published by the frontend must contain - * their default values. - * - * o A backend may transition to XenbusStateInitialised, bypassing - * XenbusStateInitWait, without waiting for the frontend to first - * enter the XenbusStateInitialised state. In this case, default - * transport parameters are in effect and any transport parameters - * published by the backend must contain their default values. - * - * Drivers that support optional features and/or transport parameter - * negotiation must tolerate these additional state transition paths. - * In general this means performing the work of any skipped state - * transition, if it has not already been performed, in addition to the - * work associated with entry into the current state. - */ - -/* - * REQUEST CODES. - */ -#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 - * execution of the barrier request. All writes issued after the barrier - * request must not execute until after the completion of the barrier request. - * - * Optional. See "feature-barrier" XenBus node documentation above. - */ -#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 -/* - * Used in SLES sources for device specific command packet - * contained within the request. Reserved for that purpose. - */ -#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 - * the BLKIF_DISCARD_SECURE flag is set on the request, all copies of the - * discarded region on the device must be rendered unrecoverable before the - * command returns. - * - * This operation is analogous to performing a trim (ATA) or unamp (SCSI), - * command on a native device. - * - * More information about trim/unmap operations can be found at: - * http://t13.org/Documents/UploadedDocuments/docs2008/ - * e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc - * http://www.seagate.com/staticfiles/support/disc/manuals/ - * Interface%20manuals/100293068c.pdf - * - * Optional. See "feature-discard", "discard-alignment", - * "discard-granularity", and "discard-secure" in the XenBus node - * documentation above. - */ -#define BLKIF_OP_DISCARD 5 - -/* - * Recognized if "feature-max-indirect-segments" in present in the backend - * xenbus info. The "feature-max-indirect-segments" node contains the maximum - * number of segments allowed by the backend per request. If the node is - * present, the frontend might use blkif_request_indirect structs in order to - * issue requests with more than BLKIF_MAX_SEGMENTS_PER_REQUEST (11). The - * maximum number of indirect segments is fixed by the backend, but the - * frontend can issue requests with any number of indirect segments as long as - * it's less than the number provided by the backend. The indirect_grefs field - * in blkif_request_indirect should be filled by the frontend with the - * grant references of the pages that are holding the indirect segments. - * These pages are filled with an array of blkif_request_segment that hold the - * information about the segments. The number of indirect pages to use is - * determined by the number of segments an indirect request contains. Every - * indirect page can contain a maximum of - * (PAGE_SIZE / sizeof(struct blkif_request_segment)) segments, so to - * calculate the number of indirect pages to use we have to do - * ceil(indirect_segments / (PAGE_SIZE / sizeof(struct blkif_request_segment))). - * - * If a backend does not recognize BLKIF_OP_INDIRECT, it should *not* - * create the "feature-max-indirect-segments" node! - */ -#define BLKIF_OP_INDIRECT 6 - -/* - * Maximum scatter/gather segments per request. - * This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE. - * NB. This could be 12 if the ring indexes weren't stored in the same page. - */ -#define BLKIF_MAX_SEGMENTS_PER_REQUEST 11 - -/* - * Maximum number of indirect pages to use per request. - */ -#define BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST 8 - -/* - * NB. first_sect and last_sect in blkif_request_segment, as well as - * sector_number in blkif_request, are always expressed in 512-byte units. - * However they must be properly aligned to the real sector size of the - * physical disk, which is reported in the "physical-sector-size" node in - * the backend xenbus info. Also the xenbus "sectors" node is expressed in - * 512-byte units. - */ -struct blkif_request_segment { - 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; -}; - -/* - * 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) */ - struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; -}; -typedef struct blkif_request blkif_request_t; - -/* - * Cast to this structure when blkif_request.operation == BLKIF_OP_DISCARD - * 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*/ -}; -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]; -#ifdef __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_??? */ -}; -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 - -/* - * 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 - -#endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/console.h b/plat/xen/include/xen/io/console.h deleted file mode 100644 index 1f79ef8504059e130e8def56e2c906a3da712fac..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/console.h +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** - * console.h - * - * Console I/O interface for Xen guest OSes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_IO_CONSOLE_H__ -#define __XEN_PUBLIC_IO_CONSOLE_H__ - -typedef uint32_t XENCONS_RING_IDX; - -#define MASK_XENCONS_IDX(idx, ring) ((idx) & (sizeof(ring)-1)) - -struct xencons_interface { - char in[1024]; - char out[2048]; - XENCONS_RING_IDX in_cons, in_prod; - XENCONS_RING_IDX out_cons, out_prod; -}; - -#ifdef XEN_WANT_FLEX_CONSOLE_RING -#include "ring.h" -DEFINE_XEN_FLEX_RING(xencons); -#endif - -#endif /* __XEN_PUBLIC_IO_CONSOLE_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/displif.h b/plat/xen/include/xen/io/displif.h deleted file mode 100644 index 8a94f1f9b9d007ca94131a272bd98b8b63c53a09..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/displif.h +++ /dev/null @@ -1,864 +0,0 @@ -/****************************************************************************** - * displif.h - * - * Unified display device I/O interface for Xen guest OSes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2016-2017 EPAM Systems Inc. - * - * Authors: Oleksandr Andrushchenko - * Oleksandr Grytsov - */ - -#ifndef __XEN_PUBLIC_IO_DISPLIF_H__ -#define __XEN_PUBLIC_IO_DISPLIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - ****************************************************************************** - * Protocol version - ****************************************************************************** - */ -#define XENDISPL_PROTOCOL_VERSION "1" - -/* - ****************************************************************************** - * Main features provided by the protocol - ****************************************************************************** - * This protocol aims to provide a unified protocol which fits more - * sophisticated use-cases than a framebuffer device can handle. At the - * moment basic functionality is supported with the intention to be extended: - * o multiple dynamically allocated/destroyed framebuffers - * o buffers of arbitrary sizes - * o buffer allocation at either back or front end - * o better configuration options including multiple display support - * - * Note: existing fbif can be used together with displif running at the - * same time, e.g. on Linux one provides framebuffer and another DRM/KMS - * - * Note: display resolution (XenStore's "resolution" property) defines - * visible area of the virtual display. At the same time resolution of - * the display and frame buffers may differ: buffers can be smaller, equal - * or bigger than the visible area. This is to enable use-cases, where backend - * may do some post-processing of the display and frame buffers supplied, - * e.g. those buffers can be just a part of the final composition. - * - ****************************************************************************** - * Direction of improvements - ****************************************************************************** - * Future extensions to the existing protocol may include: - * o display/connector cloning - * o allocation of objects other than display buffers - * o plane/overlay support - * o scaling support - * o rotation support - * - ****************************************************************************** - * Feature and Parameter Negotiation - ****************************************************************************** - * - * Front->back notifications: when enqueuing a new request, sending a - * notification can be made conditional on xendispl_req (i.e., the generic - * hold-off mechanism provided by the ring macros). Backends must set - * xendispl_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). - * - * Back->front notifications: when enqueuing a new response, sending a - * notification can be made conditional on xendispl_resp (i.e., the generic - * hold-off mechanism provided by the ring macros). Frontends must set - * xendispl_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). - * - * The two halves of a para-virtual display driver utilize nodes within - * XenStore to communicate capabilities and to negotiate operating parameters. - * This section enumerates these nodes which reside in the respective front and - * backend portions of XenStore, following the XenBus convention. - * - * All data in XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - ****************************************************************************** - * Example configuration - ****************************************************************************** - * - * Note: depending on the use-case backend can expose more display connectors - * than the underlying HW physically has by employing SW graphics compositors - * - * This is an example of backend and frontend configuration: - * - *--------------------------------- 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" - * - *--------------------------------- 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/be-alloc = "1" - * - *-------------------------- Connector 0 configuration ------------------------ - * - * /local/domain/1/device/vdispl/0/0/resolution = "1920x1080" - * /local/domain/1/device/vdispl/0/0/req-ring-ref = "2832" - * /local/domain/1/device/vdispl/0/0/req-event-channel = "15" - * /local/domain/1/device/vdispl/0/0/evt-ring-ref = "387" - * /local/domain/1/device/vdispl/0/0/evt-event-channel = "16" - * - *-------------------------- Connector 1 configuration ------------------------ - * - * /local/domain/1/device/vdispl/0/1/resolution = "800x600" - * /local/domain/1/device/vdispl/0/1/req-ring-ref = "2833" - * /local/domain/1/device/vdispl/0/1/req-event-channel = "17" - * /local/domain/1/device/vdispl/0/1/evt-ring-ref = "388" - * /local/domain/1/device/vdispl/0/1/evt-event-channel = "18" - * - ****************************************************************************** - * Backend XenBus Nodes - ****************************************************************************** - * - *----------------------------- Protocol version ------------------------------ - * - * versions - * Values: - * - * List of XENDISPL_LIST_SEPARATOR separated protocol versions supported - * by the backend. For example "1,2,3". - * - ****************************************************************************** - * Frontend XenBus Nodes - ****************************************************************************** - * - *-------------------------------- Addressing --------------------------------- - * - * dom-id - * Values: - * - * Domain identifier. - * - * dev-id - * Values: - * - * Device identifier. - * - * conn-idx - * Values: - * - * Zero based contigous index of the connector. - * /local/domain//device/vdispl///... - * - *----------------------------- Protocol version ------------------------------ - * - * version - * Values: - * - * Protocol version, chosen among the ones supported by the backend. - * - *------------------------- Backend buffer allocation ------------------------- - * - * be-alloc - * Values: "0", "1" - * - * If value is set to "1", then backend can be a buffer provider/allocator - * for this domain during XENDISPL_OP_DBUF_CREATE operation (see below - * for negotiation). - * If value is not "1" or omitted frontend must allocate buffers itself. - * - *----------------------------- Connector settings ---------------------------- - * - * resolution - * Values: x - * - * Width and height of the connector in pixels separated by - * XENDISPL_RESOLUTION_SEPARATOR. This defines visible area of the - * display. - * - *------------------ Connector Request Transport Parameters ------------------- - * - * This communication path is used to deliver requests from frontend to backend - * and get the corresponding responses from backend to frontend, - * set up per connector. - * - * req-event-channel - * Values: - * - * The identifier of the Xen connector's control event channel - * used to signal activity in the ring buffer. - * - * req-ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page of connector's control ring buffer. - * - *------------------- Connector Event Transport Parameters -------------------- - * - * This communication path is used to deliver asynchronous events from backend - * to frontend, set up per connector. - * - * evt-event-channel - * Values: - * - * The identifier of the Xen connector's event channel - * used to signal activity in the ring buffer. - * - * evt-ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page of connector's event ring buffer. - */ - -/* - ****************************************************************************** - * STATE DIAGRAMS - ****************************************************************************** - * - * Tool stack creates front and back state nodes with initial state - * XenbusStateInitialising. - * Tool stack creates and sets up frontend display configuration - * nodes per domain. - * - *-------------------------------- Normal flow -------------------------------- - * - * Front Back - * ================================= ===================================== - * XenbusStateInitialising XenbusStateInitialising - * o Query backend device identification - * data. - * o Open and validate backend device. - * | - * | - * V - * XenbusStateInitWait - * - * o Query frontend configuration - * o Allocate and initialize - * event channels per configured - * connector. - * o Publish transport parameters - * that will be in effect during - * this connection. - * | - * | - * V - * XenbusStateInitialised - * - * o Query frontend transport parameters. - * o Connect to the event channels. - * | - * | - * V - * XenbusStateConnected - * - * o Create and initialize OS - * virtual display connectors - * as per configuration. - * | - * | - * V - * XenbusStateConnected - * - * XenbusStateUnknown - * XenbusStateClosed - * XenbusStateClosing - * o Remove virtual display device - * o Remove event channels - * | - * | - * V - * XenbusStateClosed - * - *------------------------------- Recovery flow ------------------------------- - * - * In case of frontend unrecoverable errors backend handles that as - * if frontend goes into the XenbusStateClosed state. - * - * In case of backend unrecoverable errors frontend tries removing - * the virtualized device. If this is possible at the moment of error, - * then frontend goes into the XenbusStateInitialising state and is ready for - * new connection with backend. If the virtualized device is still in use and - * cannot be removed, then frontend goes into the XenbusStateReconfiguring state - * until either the virtualized device is removed or backend initiates a new - * connection. On the virtualized device removal frontend goes into the - * XenbusStateInitialising state. - * - * Note on XenbusStateReconfiguring state of the frontend: if backend has - * unrecoverable errors then frontend cannot send requests to the backend - * and thus cannot provide functionality of the virtualized device anymore. - * After backend is back to normal the virtualized device may still hold some - * state: configuration in use, allocated buffers, client application state etc. - * In most cases, this will require frontend to implement complex recovery - * reconnect logic. Instead, by going into XenbusStateReconfiguring state, - * frontend will make sure no new clients of the virtualized device are - * accepted, allow existing client(s) to exit gracefully by signaling error - * state etc. - * Once all the clients are gone frontend can reinitialize the virtualized - * device and get into XenbusStateInitialising state again signaling the - * backend that a new connection can be made. - * - * There are multiple conditions possible under which frontend will go from - * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS - * specific. For example: - * 1. The underlying OS framework may provide callbacks to signal that the last - * client of the virtualized device has gone and the device can be removed - * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) - * to periodically check if this is the right time to re-try removal of - * the virtualized device. - * 3. By any other means. - * - ****************************************************************************** - * REQUEST CODES - ****************************************************************************** - * 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 - -/* - ****************************************************************************** - * EVENT CODES - ****************************************************************************** - */ -#define XENDISPL_EVT_PG_FLIP 0x00 - -/* - ****************************************************************************** - * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS - ****************************************************************************** - */ -#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" - -/* - ****************************************************************************** - * STATUS RETURN CODES - ****************************************************************************** - * - * Status return code is zero on success and -XEN_EXX on failure. - * - ****************************************************************************** - * Assumptions - ****************************************************************************** - * o usage of grant reference 0 as invalid grant reference: - * grant reference 0 is valid, but never exposed to a PV driver, - * because of the fact it is already in use/reserved by the PV console. - * o all references in this document to page sizes must be treated - * as pages of size XEN_PAGE_SIZE unless otherwise noted. - * - ****************************************************************************** - * Description of the protocol between frontend and backend driver - ****************************************************************************** - * - * The two halves of a Para-virtual display driver communicate with - * each other using shared pages and event channels. - * Shared page contains a ring with request/response packets. - * - * All reserved fields in the structures below must be 0. - * Display buffers's cookie of value 0 is treated as invalid. - * Framebuffer's cookie of value 0 is treated as invalid. - * - * For all request/response/event packets that use cookies: - * dbuf_cookie - uint64_t, unique to guest domain value used by the backend - * to map remote display buffer to its local one - * fb_cookie - uint64_t, unique to guest domain value used by the backend - * to map remote framebuffer to its local one - * - *---------------------------------- Requests --------------------------------- - * - * All requests/responses, which are not connector specific, must be sent over - * control ring of the connector which has the index value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - * - * All request packets have the same length (64 octets) - * All request packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * id - uint16_t, private guest value, echoed in response - * operation - uint8_t, operation code, XENDISPL_OP_??? - * - * Request dbuf creation - request creation of a display buffer. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_DBUF_CREATE | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | width | 20 - * +----------------+----------------+----------------+----------------+ - * | height | 24 - * +----------------+----------------+----------------+----------------+ - * | bpp | 28 - * +----------------+----------------+----------------+----------------+ - * | buffer_sz | 32 - * +----------------+----------------+----------------+----------------+ - * | flags | 36 - * +----------------+----------------+----------------+----------------+ - * | gref_directory | 40 - * +----------------+----------------+----------------+----------------+ - * | reserved | 44 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - * All unused bits in flags field must be set to 0. - * - * An attempt to create multiple display buffers with the same dbuf_cookie is - * an error. dbuf_cookie can be re-used after destroying the corresponding - * display buffer. - * - * Width and height of the display buffers can be smaller, equal or bigger - * than the connector's resolution. Depth/pixel format of the individual - * buffers can differ as well. - * - * width - uint32_t, width in pixels - * height - uint32_t, height in pixels - * bpp - uint32_t, bits per pixel - * buffer_sz - uint32_t, buffer size to be allocated, octets - * flags - uint32_t, flags of the operation - * o XENDISPL_DBUF_FLG_REQ_ALLOC - if set, then backend is requested - * to allocate the buffer with the parameters provided in this request. - * Page directory is handled as follows: - * Frontend on request: - * o allocates pages for the directory (gref_directory, - * gref_dir_next_page(s) - * o grants permissions for the pages of the directory to the backend - * o sets gref_dir_next_page fields - * Backend on response: - * o grants permissions for the pages of the buffer allocated to - * the frontend - * o fills in page directory with grant references - * (gref[] in struct xendispl_page_directory) - * gref_directory - grant_ref_t, a reference to the first shared page - * describing shared buffer references. At least one page exists. If shared - * buffer size (buffer_sz) exceeds what can be addressed by this single page, - * then reference to the next page must be supplied (see gref_dir_next_page - * below) - */ - -#define XENDISPL_DBUF_FLG_REQ_ALLOC (1 << 0) - -struct xendispl_dbuf_create_req { - uint64_t dbuf_cookie; - uint32_t width; - uint32_t height; - uint32_t bpp; - uint32_t buffer_sz; - uint32_t flags; - grant_ref_t gref_directory; -}; - -/* - * Shared page for XENDISPL_OP_DBUF_CREATE buffer descriptor (gref_directory in - * the request) employs a list of pages, describing all pages of the shared - * data buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | gref_dir_next_page | 4 - * +----------------+----------------+----------------+----------------+ - * | gref[0] | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[i] | i*4+8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[N - 1] | N*4+8 - * +----------------+----------------+----------------+----------------+ - * - * gref_dir_next_page - grant_ref_t, reference to the next page describing - * page directory. Must be 0 if there are no more pages in the list. - * gref[i] - grant_ref_t, reference to a shared page of the buffer - * allocated at XENDISPL_OP_DBUF_CREATE - * - * Number of grant_ref_t entries in the whole page directory is not - * passed, but instead can be calculated as: - * num_grefs_total = (XENDISPL_OP_DBUF_CREATE.buffer_sz + XEN_PAGE_SIZE - 1) / - * XEN_PAGE_SIZE - */ - -struct xendispl_page_directory { - grant_ref_t gref_dir_next_page; - grant_ref_t gref[1]; /* Variable length */ -}; - -/* - * Request dbuf destruction - destroy a previously allocated display buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id |_OP_DBUF_DESTROY| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - */ - -struct xendispl_dbuf_destroy_req { - uint64_t dbuf_cookie; -}; - -/* - * Request framebuffer attachment - request attachment of a framebuffer to - * previously created display buffer. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_FB_ATTACH | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | dbuf_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 20 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 24 - * +----------------+----------------+----------------+----------------+ - * | width | 28 - * +----------------+----------------+----------------+----------------+ - * | height | 32 - * +----------------+----------------+----------------+----------------+ - * | pixel_format | 36 - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - * Width and height can be smaller, equal or bigger than the connector's - * resolution. - * - * An attempt to create multiple frame buffers with the same fb_cookie is - * an error. fb_cookie can be re-used after destroying the corresponding - * frame buffer. - * - * width - uint32_t, width in pixels - * height - uint32_t, height in pixels - * pixel_format - uint32_t, pixel format of the framebuffer, FOURCC code - */ - -struct xendispl_fb_attach_req { - uint64_t dbuf_cookie; - uint64_t fb_cookie; - uint32_t width; - uint32_t height; - uint32_t pixel_format; -}; - -/* - * Request framebuffer detach - detach a previously - * attached framebuffer from the display buffer in request: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_FB_DETACH | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Must be sent over control ring of the connector which has the index - * value of 0: - * /local/domain//device/vdispl//0/req-ring-ref - */ - -struct xendispl_fb_detach_req { - uint64_t fb_cookie; -}; - -/* - * Request configuration set/reset - request to set or reset - * the configuration/mode of the display: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_SET_CONFIG | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | x | 20 - * +----------------+----------------+----------------+----------------+ - * | y | 24 - * +----------------+----------------+----------------+----------------+ - * | width | 28 - * +----------------+----------------+----------------+----------------+ - * | height | 32 - * +----------------+----------------+----------------+----------------+ - * | bpp | 40 - * +----------------+----------------+----------------+----------------+ - * | reserved | 44 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * Pass all zeros to reset, otherwise command is treated as - * configuration set. - * Framebuffer's cookie defines which framebuffer/dbuf must be - * displayed while enabling display (applying configuration). - * x, y, width and height are bound by the connector's resolution and must not - * exceed it. - * - * x - uint32_t, starting position in pixels by X axis - * y - uint32_t, starting position in pixels by Y axis - * width - uint32_t, width in pixels - * height - uint32_t, height in pixels - * bpp - uint32_t, bits per pixel - */ - -struct xendispl_set_config_req { - uint64_t fb_cookie; - uint32_t x; - uint32_t y; - uint32_t width; - uint32_t height; - uint32_t bpp; -}; - -/* - * Request page flip - request to flip a page identified by the framebuffer - * cookie: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _OP_PG_FLIP | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - */ - -struct xendispl_page_flip_req { - uint64_t fb_cookie; -}; - -/* - *---------------------------------- Responses -------------------------------- - * - * All response packets have the same length (64 octets) - * - * All response packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, private guest value, echoed from request - * status - int32_t, response status, zero on success and -XEN_EXX on failure - * - *----------------------------------- Events ---------------------------------- - * - * Events are sent via a shared page allocated by the front and propagated by - * evt-event-channel/evt-ring-ref XenStore entries - * All event packets have the same length (64 octets) - * All event packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | type | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, event id, may be used by front - * type - uint8_t, type of the event - * - * - * Page flip complete event - event from back to front on page flip completed: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | _EVT_PG_FLIP | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie low 32-bit | 12 - * +----------------+----------------+----------------+----------------+ - * | fb_cookie high 32-bit | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 64 - * +----------------+----------------+----------------+----------------+ - */ - -struct xendispl_pg_flip_evt { - uint64_t fb_cookie; -}; - -struct xendispl_req { - uint16_t id; - uint8_t operation; - uint8_t reserved[5]; - union { - struct xendispl_dbuf_create_req dbuf_create; - struct xendispl_dbuf_destroy_req dbuf_destroy; - struct xendispl_fb_attach_req fb_attach; - struct xendispl_fb_detach_req fb_detach; - struct xendispl_set_config_req set_config; - struct xendispl_page_flip_req pg_flip; - uint8_t reserved[56]; - } op; -}; - -struct xendispl_resp { - uint16_t id; - uint8_t operation; - uint8_t reserved; - int32_t status; - uint8_t reserved1[56]; -}; - -struct xendispl_evt { - uint16_t id; - uint8_t type; - uint8_t reserved[5]; - union { - struct xendispl_pg_flip_evt pg_flip; - uint8_t reserved[56]; - } op; -}; - -DEFINE_RING_TYPES(xen_displif, struct xendispl_req, struct xendispl_resp); - -/* - ****************************************************************************** - * Back to front events delivery - ****************************************************************************** - * In order to deliver asynchronous events from back to front a shared page is - * allocated by front and its granted reference propagated to back via - * XenStore entries (evt-ring-ref/evt-event-channel). - * This page has a common header used by both front and back to synchronize - * access and control event's ring buffer, while back being a producer of the - * events and front being a consumer. The rest of the page after the header - * is used for event packets. - * - * Upon reception of an event(s) front may confirm its reception - * for either each event, group of events or none. - */ - -struct xendispl_event_page { - uint32_t in_cons; - uint32_t in_prod; - uint8_t reserved[56]; -}; - -#define XENDISPL_EVENT_PAGE_SIZE 4096 -#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]) - -#endif /* __XEN_PUBLIC_IO_DISPLIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/fbif.h b/plat/xen/include/xen/io/fbif.h deleted file mode 100644 index cc25aab32ea6f641d273d01dd1999a7337057d8f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/fbif.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * fbif.h -- Xen virtual frame buffer device - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2005 Anthony Liguori - * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster - */ - -#ifndef __XEN_PUBLIC_IO_FBIF_H__ -#define __XEN_PUBLIC_IO_FBIF_H__ - -/* Out events (frontend -> backend) */ - -/* - * Out events may be sent only when requested by backend, and receipt - * of an unknown out event is an error. - */ - -/* Event type 1 currently not used */ -/* - * Framebuffer update notification event - * Capable frontend sets feature-update in xenstore. - * Backend requests it by setting request-update in xenstore. - */ -#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 */ - int32_t height; /* rect height */ -}; - -/* - * Framebuffer resize notification event - * Capable backend sets feature-resize in xenstore. - */ -#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 */ -}; - -#define XENFB_OUT_EVENT_SIZE 40 - -union xenfb_out_event -{ - uint8_t type; - struct xenfb_update update; - struct xenfb_resize resize; - char pad[XENFB_OUT_EVENT_SIZE]; -}; - -/* In events (backend -> frontend) */ - -/* - * Frontends should ignore unknown in events. - */ - -/* - * Framebuffer refresh period advice - * Backend sends it to advise the frontend their preferred period of - * refresh. Frontends that keep the framebuffer constantly up-to-date - * just ignore it. Frontends that use the advice should immediately - * refresh the framebuffer (and send an update notification event if - * those have been requested), then use the update frequency to guide - * their periodical refreshs. - */ -#define XENFB_TYPE_REFRESH_PERIOD 1 -#define XENFB_NO_REFRESH 0 - -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 -{ - uint8_t type; - struct xenfb_refresh_period refresh_period; - char pad[XENFB_IN_EVENT_SIZE]; -}; - -/* 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_OFFS 1024 -#define XENFB_IN_RING(page) \ - ((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS)) -#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_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE) -#define XENFB_OUT_RING(page) \ - ((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS)) -#define XENFB_OUT_RING_REF(page, idx) \ - (XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN]) - -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) */ - - /* - * Framebuffer page directory - * - * Each directory page holds PAGE_SIZE / sizeof(*pd) - * framebuffer pages, and can thus map up to PAGE_SIZE * - * PAGE_SIZE / sizeof(*pd) bytes. With PAGE_SIZE == 4096 and - * sizeof(unsigned long) == 4/8, that's 4 Megs 32 bit and 2 Megs - * 64 bit. 256 directories give enough room for a 512 Meg - * framebuffer with a max resolution of 12,800x10,240. Should - * be enough for a while with room leftover for expansion. - */ - unsigned long pd[256]; -}; - -/* - * Wart: xenkbd needs to know default resolution. Put it here until a - * better solution is found, but don't leak it to the backend. - */ -#ifdef __KERNEL__ -#define XENFB_WIDTH 800 -#define XENFB_HEIGHT 600 -#define XENFB_DEPTH 32 -#endif - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/fsif.h b/plat/xen/include/xen/io/fsif.h deleted file mode 100644 index 8fc21740ea5a5cefc9bc99c191559e9203ff1f71..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/fsif.h +++ /dev/null @@ -1,192 +0,0 @@ -/****************************************************************************** - * fsif.h - * - * Interface to FS level split device drivers. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2007, Grzegorz Milos, . - */ - -#ifndef __XEN_PUBLIC_IO_FSIF_H__ -#define __XEN_PUBLIC_IO_FSIF_H__ - -#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 - -struct fsif_open_request { - grant_ref_t gref; -}; - -struct fsif_close_request { - uint32_t fd; -}; - -struct fsif_read_request { - uint32_t fd; - int32_t pad; - uint64_t len; - uint64_t offset; - grant_ref_t grefs[1]; /* Variable length */ -}; - -struct fsif_write_request { - uint32_t fd; - int32_t pad; - uint64_t len; - uint64_t offset; - grant_ref_t grefs[1]; /* Variable length */ -}; - -struct fsif_stat_request { - uint32_t fd; -}; - -/* This structure is a copy of some fields from stat structure, returned - * via the ring. */ -struct fsif_stat_response { - 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; -}; - -struct fsif_truncate_request { - uint32_t fd; - int32_t pad; - int64_t length; -}; - -struct fsif_remove_request { - grant_ref_t gref; -}; - -struct fsif_rename_request { - uint16_t old_name_offset; - uint16_t new_name_offset; - grant_ref_t gref; -}; - -struct fsif_create_request { - int8_t directory; - int8_t pad; - int16_t pad2; - int32_t mode; - grant_ref_t gref; -}; - -struct fsif_list_request { - uint32_t offset; - 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) - -struct fsif_chmod_request { - uint32_t fd; - int32_t mode; -}; - -struct fsif_space_request { - grant_ref_t gref; -}; - -struct fsif_sync_request { - uint32_t fd; -}; - - -/* FS operation request */ -struct fsif_request { - uint8_t type; /* Type of the request */ - uint8_t pad; - 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_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; - } u; -}; -typedef struct fsif_request fsif_request_t; - -/* FS operation response */ -struct fsif_response { - uint16_t id; - uint16_t pad1; - uint32_t pad2; - union { - uint64_t ret_val; - struct fsif_stat_response fstat; - } u; -}; - -typedef struct fsif_response fsif_response_t; - -#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_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" - - -#endif diff --git a/plat/xen/include/xen/io/kbdif.h b/plat/xen/include/xen/io/kbdif.h deleted file mode 100644 index 3ce54e9a44c1a391e8fa7856fae9f05b4610f00f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/kbdif.h +++ /dev/null @@ -1,550 +0,0 @@ -/* - * kbdif.h -- Xen virtual keyboard/mouse - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2005 Anthony Liguori - * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster - */ - -#ifndef __XEN_PUBLIC_IO_KBDIF_H__ -#define __XEN_PUBLIC_IO_KBDIF_H__ - -/* - ***************************************************************************** - * Feature and Parameter Negotiation - ***************************************************************************** - * - * The two halves of a para-virtual driver utilize nodes within - * XenStore to communicate capabilities and to negotiate operating parameters. - * This section enumerates these nodes which reside in the respective front and - * backend portions of XenStore, following XenBus convention. - * - * All data in XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *---------------------------- Features supported ---------------------------- - * - * Capable backend advertises supported features by publishing - * corresponding entries in XenStore and puts 1 as the value of the entry. - * If a feature is not supported then 0 must be set or feature entry omitted. - * - * feature-abs-pointer - * Values: - * - * Backends, which support reporting of absolute coordinates for pointer - * device should set this to 1. - * - * feature-multi-touch - * Values: - * - * Backends, which support reporting of multi-touch events - * should set this to 1. - * - * feature-raw-pointer - * Values: - * - * Backends, which support reporting raw (unscaled) absolute coordinates - * for pointer devices should set this to 1. Raw (unscaled) values have - * a range of [0, 0x7fff]. - * - *------------------------- Pointer Device Parameters ------------------------ - * - * width - * Values: - * - * Maximum X coordinate (width) to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - * - * height - * Values: - * - * Maximum Y coordinate (height) to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *------------------------------ Feature request ----------------------------- - * - * Capable frontend requests features from backend via setting corresponding - * entries to 1 in XenStore. Requests for features not advertised as supported - * by the backend have no effect. - * - * request-abs-pointer - * Values: - * - * Request backend to report absolute pointer coordinates - * (XENKBD_TYPE_POS) instead of relative ones (XENKBD_TYPE_MOTION). - * - * request-multi-touch - * Values: - * - * Request backend to report multi-touch events. - * - * request-raw-pointer - * Values: - * - * Request backend to report raw unscaled absolute pointer coordinates. - * This option is only valid if request-abs-pointer is also set. - * Raw unscaled coordinates have the range [0, 0x7fff] - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * page-gref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page in a single page sized event ring buffer. - * - * page-ref - * Values: - * - * OBSOLETE, not recommended for use. - * PFN of the shared page. - * - *----------------------- Multi-touch Device Parameters ----------------------- - * - * multi-touch-num-contacts - * Values: - * - * Number of simultaneous touches reported. - * - * multi-touch-width - * Values: - * - * Width of the touch area to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - * - * multi-touch-height - * Values: - * - * Height of the touch area to be used by the frontend - * while reporting input events, pixels, [0; UINT32_MAX]. - */ - -/* - * 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 - -/* 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 - -/* - * CONSTANTS, XENSTORE FIELD AND PATH NAME STRINGS, HELPERS. - */ - -#define XENKBD_DRIVER_NAME "vkbd" - -#define XENKBD_FIELD_FEAT_ABS_POINTER "feature-abs-pointer" -#define XENKBD_FIELD_FEAT_MTOUCH "feature-multi-touch" -#define XENKBD_FIELD_REQ_ABS_POINTER "request-abs-pointer" -#define XENKBD_FIELD_REQ_MTOUCH "request-multi-touch" -#define XENKBD_FIELD_RING_GREF "page-gref" -#define XENKBD_FIELD_EVT_CHANNEL "event-channel" -#define XENKBD_FIELD_WIDTH "width" -#define XENKBD_FIELD_HEIGHT "height" -#define XENKBD_FIELD_MT_WIDTH "multi-touch-width" -#define XENKBD_FIELD_MT_HEIGHT "multi-touch-height" -#define XENKBD_FIELD_MT_NUM_CONTACTS "multi-touch-num-contacts" - -/* OBSOLETE, not recommended for use */ -#define XENKBD_FIELD_RING_REF "page-ref" - -/* - ***************************************************************************** - * Description of the protocol between frontend and backend driver. - ***************************************************************************** - * - * The two halves of a Para-virtual driver communicate with - * each other using a shared page and an event channel. - * Shared page contains a ring with event structures. - * - * All reserved fields in the structures below must be 0. - * - ***************************************************************************** - * Backend to frontend events - ***************************************************************************** - * - * Frontends should ignore unknown in events. - * All event packets have the same length (40 octets) - * All event packets have common header: - * - * 0 octet - * +-----------------+ - * | type | - * +-----------------+ - * type - uint8_t, event code, XENKBD_TYPE_??? - * - * - * Pointer relative movement event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MOTION | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | rel_x | 8 - * +----------------+----------------+----------------+----------------+ - * | rel_y | 12 - * +----------------+----------------+----------------+----------------+ - * | rel_z | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * rel_x - int32_t, relative X motion - * rel_y - int32_t, relative Y motion - * rel_z - int32_t, relative Z motion (wheel) - */ - -struct xenkbd_motion -{ - uint8_t type; - int32_t rel_x; - int32_t rel_y; - int32_t rel_z; -}; - -/* - * Key event (includes pointer buttons) - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_KEY | pressed | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | keycode | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * pressed - uint8_t, 1 if pressed; 0 otherwise - * keycode - uint32_t, KEY_* from linux/input.h - */ - -struct xenkbd_key -{ - uint8_t type; - uint8_t pressed; - uint32_t keycode; -}; - -/* - * Pointer absolute position event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_POS | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | abs_x | 8 - * +----------------+----------------+----------------+----------------+ - * | abs_y | 12 - * +----------------+----------------+----------------+----------------+ - * | rel_z | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * abs_x - int32_t, absolute X position (in FB pixels) - * abs_y - int32_t, absolute Y position (in FB pixels) - * rel_z - int32_t, relative Z motion (wheel) - */ - -struct xenkbd_position -{ - uint8_t type; - int32_t abs_x; - int32_t abs_y; - int32_t rel_z; -}; - -/* - * Multi-touch event and its sub-types - * - * All multi-touch event packets have common header: - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | event_type | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * - * event_type - unt8_t, multi-touch event sub-type, XENKBD_MT_EV_??? - * contact_id - unt8_t, ID of the contact - * - * Touch interactions can consist of one or more contacts. - * For each contact, a series of events is generated, starting - * with a down event, followed by zero or more motion events, - * and ending with an up event. Events relating to the same - * contact point can be identified by the ID of the sequence: contact ID. - * Contact ID may be reused after XENKBD_MT_EV_UP event and - * is in the [0; XENKBD_FIELD_NUM_CONTACTS - 1] range. - * - * For further information please refer to documentation on Wayland [1], - * Linux [2] and Windows [3] multi-touch support. - * - * [1] https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml - * [2] https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt - * [3] https://msdn.microsoft.com/en-us/library/jj151564(v=vs.85).aspx - * - * - * Multi-touch down event - sent when a new touch is made: touch is assigned - * a unique contact ID, sent with this and consequent events related - * to this touch. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_DOWN | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | abs_x | 12 - * +----------------+----------------+----------------+----------------+ - * | abs_y | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * abs_x - int32_t, absolute X position, in pixels - * abs_y - int32_t, absolute Y position, in pixels - * - * Multi-touch contact release event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_UP | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * Multi-touch motion event - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_MOTION | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | abs_x | 12 - * +----------------+----------------+----------------+----------------+ - * | abs_y | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * abs_x - int32_t, absolute X position, in pixels, - * abs_y - int32_t, absolute Y position, in pixels, - * - * Multi-touch input synchronization event - shows end of a set of events - * which logically belong together. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_SYN | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * Multi-touch shape event - touch point's shape has changed its shape. - * Shape is approximated by an ellipse through the major and minor axis - * lengths: major is the longer diameter of the ellipse and minor is the - * shorter one. Center of the ellipse is reported via - * XENKBD_MT_EV_DOWN/XENKBD_MT_EV_MOTION events. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_SHAPE | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | major | 12 - * +----------------+----------------+----------------+----------------+ - * | minor | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * major - unt32_t, length of the major axis, pixels - * minor - unt32_t, length of the minor axis, pixels - * - * Multi-touch orientation event - touch point's shape has changed - * its orientation: calculated as a clockwise angle between the major axis - * of the ellipse and positive Y axis in degrees, [-180; +180]. - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | _TYPE_MTOUCH | _MT_EV_ORIENT | contact_id | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | orientation | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 40 - * +----------------+----------------+----------------+----------------+ - * - * orientation - int16_t, clockwise angle of the major axis - */ - -struct xenkbd_mtouch { - 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 */ - union { - struct { - 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 */ - } shape; - int16_t orientation; /* clockwise angle of the major axis */ - } u; -}; - -#define XENKBD_IN_EVENT_SIZE 40 - -union xenkbd_in_event -{ - uint8_t type; - struct xenkbd_motion motion; - struct xenkbd_key key; - struct xenkbd_position pos; - struct xenkbd_mtouch mtouch; - char pad[XENKBD_IN_EVENT_SIZE]; -}; - -/* - ***************************************************************************** - * Frontend to backend events - ***************************************************************************** - * - * Out events may be sent only when requested by backend, and receipt - * of an unknown out event is an error. - * No out events currently defined. - - * All event packets have the same length (40 octets) - * All event packets have common header: - * 0 octet - * +-----------------+ - * | type | - * +-----------------+ - * type - uint8_t, event code - */ - -#define XENKBD_OUT_EVENT_SIZE 40 - -union xenkbd_out_event -{ - uint8_t type; - char pad[XENKBD_OUT_EVENT_SIZE]; -}; - -/* - ***************************************************************************** - * Shared page - ***************************************************************************** - */ - -#define XENKBD_IN_RING_SIZE 2048 -#define XENKBD_IN_RING_LEN (XENKBD_IN_RING_SIZE / XENKBD_IN_EVENT_SIZE) -#define XENKBD_IN_RING_OFFS 1024 -#define XENKBD_IN_RING(page) \ - ((union xenkbd_in_event *)((char *)(page) + XENKBD_IN_RING_OFFS)) -#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_OFFS (XENKBD_IN_RING_OFFS + XENKBD_IN_RING_SIZE) -#define XENKBD_OUT_RING(page) \ - ((union xenkbd_out_event *)((char *)(page) + XENKBD_OUT_RING_OFFS)) -#define XENKBD_OUT_RING_REF(page, idx) \ - (XENKBD_OUT_RING((page))[(idx) % XENKBD_OUT_RING_LEN]) - -struct xenkbd_page -{ - uint32_t in_cons, in_prod; - uint32_t out_cons, out_prod; -}; - -#endif /* __XEN_PUBLIC_IO_KBDIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/libxenvchan.h b/plat/xen/include/xen/io/libxenvchan.h deleted file mode 100644 index 44284f437ab30f01049f280035dbb711103ca9b0..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/libxenvchan.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file - * @section AUTHORS - * - * Copyright (C) 2010 Rafal Wojtczuk - * - * Authors: - * Rafal Wojtczuk - * Daniel De Graaf - * - * @section LICENSE - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * @section DESCRIPTION - * - * Originally borrowed from the Qubes OS Project, http://www.qubes-os.org, - * this code has been substantially rewritten to use the gntdev and gntalloc - * devices instead of raw MFNs and map_foreign_range. - * - * This is a library for inter-domain communication. A standard Xen ring - * buffer is used, with a datagram-based interface built on top. The grant - * reference and event channels are shared in XenStore under a user-specified - * path. - * - * The ring.h macros define an asymmetric interface to a shared data structure - * that assumes all rings reside in a single contiguous memory space. This is - * not suitable for vchan because the interface to the ring is symmetric except - * for the setup. Unlike the producer-consumer rings defined in ring.h, the - * size of the rings used in vchan are determined at execution time instead of - * compile time, so the macros in ring.h cannot be used to access the rings. - */ - -#include -#include - -struct ring_shared { - uint32_t cons, prod; -}; - -#define VCHAN_NOTIFY_WRITE 0x1 -#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]; -}; - diff --git a/plat/xen/include/xen/io/netif.h b/plat/xen/include/xen/io/netif.h deleted file mode 100644 index 2454448baa8d439d35bffe3b1840e5a2666b35e2..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/netif.h +++ /dev/null @@ -1,1076 +0,0 @@ -/****************************************************************************** - * netif.h - * - * Unified network-device I/O interface for Xen guest OSes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2003-2004, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_IO_NETIF_H__ -#define __XEN_PUBLIC_IO_NETIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Older implementation of Xen network frontend / backend has an - * implicit dependency on the MAX_SKB_FRAGS as the maximum number of - * ring slots a skb can use. Netfront / netback may not work as - * expected when frontend and backend have different MAX_SKB_FRAGS. - * - * A better approach is to add mechanism for netfront / netback to - * negotiate this value. However we cannot fix all possible - * frontends, so we need to define a value which states the minimum - * slots backend must support. - * - * The minimum value derives from older Linux kernel's MAX_SKB_FRAGS - * (18), which is proved to work with most frontends. Any new backend - * which doesn't negotiate with frontend should expect frontend to - * send a valid packet using slots up to this value. - */ -#define XEN_NETIF_NR_SLOTS_MIN 18 - -/* - * Notifications after enqueuing any type of message should be conditional on - * the appropriate req_event or rsp_event field in the shared ring. - * If the client sends notification for rx requests then it should specify - * feature 'feature-rx-notify' via xenbus. Otherwise the backend will assume - * that it cannot safely queue packets (as it may not be kicked to send them). - */ - -/* - * "feature-split-event-channels" is introduced to separate guest TX - * and RX notification. Backend either doesn't support this feature or - * advertises it via xenstore as 0 (disabled) or 1 (enabled). - * - * To make use of this feature, frontend should allocate two event - * channels for TX and RX, advertise them to backend as - * "event-channel-tx" and "event-channel-rx" respectively. If frontend - * doesn't want to use this feature, it just writes "event-channel" - * node as before. - */ - -/* - * Multiple transmit and receive queues: - * If supported, the backend will write the key "multi-queue-max-queues" to - * the directory for that vif, and set its value to the maximum supported - * number of queues. - * Frontends that are aware of this feature and wish to use it can write the - * key "multi-queue-num-queues", set to the number they wish to use, which - * must be greater than zero, and no more than the value reported by the backend - * in "multi-queue-max-queues". - * - * Queues replicate the shared rings and event channels. - * "feature-split-event-channels" may optionally be used when using - * multiple queues, but is not mandatory. - * - * Each queue consists of one shared ring pair, i.e. there must be the same - * number of tx and rx rings. - * - * For frontends requesting just one queue, the usual event-channel and - * ring-ref keys are written as before, simplifying the backend processing - * to avoid distinguishing between a frontend that doesn't understand the - * multi-queue feature, and one that does, but requested only one queue. - * - * Frontends requesting two or more queues must not write the toplevel - * event-channel (or event-channel-{tx,rx}) and {tx,rx}-ring-ref keys, - * instead writing those keys under sub-keys having the name "queue-N" where - * N is the integer ID of the queue for which those keys belong. Queues - * are indexed from zero. For example, a frontend with two queues and split - * event channels must write the following set of queue-related keys: - * - * /local/domain/1/device/vif/0/multi-queue-num-queues = "2" - * /local/domain/1/device/vif/0/queue-0 = "" - * /local/domain/1/device/vif/0/queue-0/tx-ring-ref = "" - * /local/domain/1/device/vif/0/queue-0/rx-ring-ref = "" - * /local/domain/1/device/vif/0/queue-0/event-channel-tx = "" - * /local/domain/1/device/vif/0/queue-0/event-channel-rx = "" - * /local/domain/1/device/vif/0/queue-1 = "" - * /local/domain/1/device/vif/0/queue-1/tx-ring-ref = "" - * /local/domain/1/device/vif/0/queue-1/rx-ring-ref = "//feature-ctrl-ring = "1" - * - * The frontend provides a control ring to the backend by setting: - * - * /local/domain//device/vif//ctrl-ring-ref = - * /local/domain//device/vif//event-channel-ctrl = - * - * where is the grant reference of the shared page used to - * implement the control ring and is an event channel to be used - * as a mailbox interrupt. These keys must be set before the frontend - * moves into the connected state. - * - * The control ring uses a fixed request/response message size and is - * balanced (i.e. one request to one response), so operationally it is much - * the same as a transmit or receive ring. - * Note that there is no requirement that responses are issued in the same - * order as requests. - */ - -/* - * Hash types - * ========== - * - * For the purposes of the definitions below, 'Packet[]' is an array of - * octets containing an IP packet without options, 'Array[X..Y]' means a - * sub-array of 'Array' containing bytes X thru Y inclusive, and '+' is - * used to indicate concatenation of arrays. - */ - -/* - * A hash calculated over an IP version 4 header as follows: - * - * Buffer[0..8] = Packet[12..15] (source address) + - * Packet[16..19] (destination address) - * - * 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) - -/* - * A hash calculated over an IP version 4 header and TCP header as - * follows: - * - * Buffer[0..12] = Packet[12..15] (source address) + - * Packet[16..19] (destination address) + - * Packet[20..21] (source port) + - * Packet[22..23] (destination port) - * - * Result = Hash(Buffer, 12) - */ -#define _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP 1 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP) - -/* - * A hash calculated over an IP version 6 header as follows: - * - * Buffer[0..32] = Packet[8..23] (source address ) + - * Packet[24..39] (destination address) - * - * 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) - -/* - * A hash calculated over an IP version 6 header and TCP header as - * follows: - * - * Buffer[0..36] = Packet[8..23] (source address) + - * Packet[24..39] (destination address) + - * Packet[40..41] (source port) + - * Packet[42..43] (destination port) - * - * Result = Hash(Buffer, 36) - */ -#define _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP 3 -#define XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP \ - (1 << _XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP) - -/* - * Hash algorithms - * =============== - */ - -#define XEN_NETIF_CTRL_HASH_ALGORITHM_NONE 0 - -/* - * Toeplitz hash: - */ - -#define XEN_NETIF_CTRL_HASH_ALGORITHM_TOEPLITZ 1 - -/* - * This algorithm uses a 'key' as well as the data buffer itself. - * (Buffer[] and Key[] are treated as shift-registers where the MSB of - * Buffer/Key[0] is considered 'left-most' and the LSB of Buffer/Key[N-1] - * is the 'right-most'). - * - * Value = 0 - * For number of bits in Buffer[] - * If (left-most bit of Buffer[] is 1) - * Value ^= left-most 32 bits of Key[] - * Key[] << 1 - * Buffer[] << 1 - * - * The code below is provided for convenience where an operating system - * 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) -{ - unsigned int keyi, bufi; - uint64_t prefix = 0; - uint64_t hash = 0; - - /* Pre-load prefix with the first 8 bytes of the key */ - for (keyi = 0; keyi < 8; keyi++) { - prefix <<= 8; - prefix |= (keyi < keylen) ? key[keyi] : 0; - } - - for (bufi = 0; bufi < buflen; bufi++) { - uint8_t byte = buf[bufi]; - unsigned int bit; - - for (bit = 0; bit < 8; bit++) { - if (byte & 0x80) - hash ^= prefix; - prefix <<= 1; - byte <<=1; - } - - /* - * 'prefix' has now been left-shifted by 8, so - * OR in the next byte. - */ - prefix |= (keyi < keylen) ? key[keyi] : 0; - keyi++; - } - - /* The valid part of the hash is in the upper 32 bits. */ - return hash >> 32; -} -#endif /* XEN_NETIF_DEFINE_TOEPLITZ */ - -/* - * Control requests (struct xen_netif_ctrl_request) - * ================================================ - * - * All requests have the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | type | data[0] | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | data[1] | data[2] | - * +-----+-----+-----+-----+-----------------------+ - * - * id: the request identifier, echoed in response. - * type: the type of request (see below) - * data[]: any data associated with the request (determined by type) - */ - -struct xen_netif_ctrl_request { - uint16_t id; - uint16_t type; - -#define XEN_NETIF_CTRL_TYPE_INVALID 0 -#define XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS 1 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS 2 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_KEY 3 -#define XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE 4 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE 5 -#define XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING 6 -#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 - - uint32_t data[3]; -}; - -/* - * Control responses (struct xen_netif_ctrl_response) - * ================================================== - * - * All responses have the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | type | status | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | data | - * +-----+-----+-----+-----+ - * - * id: the corresponding request identifier - * type: the type of the corresponding request - * status: the status of request processing - * data: any data associated with the response (determined by type and - * status) - */ - -struct xen_netif_ctrl_response { - uint16_t id; - uint16_t type; - uint32_t status; - -#define XEN_NETIF_CTRL_STATUS_SUCCESS 0 -#define XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED 1 -#define XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER 2 -#define XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW 3 - - uint32_t data; -}; - -/* - * Static Grants (struct xen_netif_gref) - * ===================================== - * - * A frontend may provide a fixed set of grant references to be mapped on - * the backend. The message of type XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * prior its usage in the command ring allows for creation of these mappings. - * The backend will maintain a fixed amount of these mappings. - * - * XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE lets a frontend query how many - * of these mappings can be kept. - * - * Each entry in the XEN_NETIF_CTRL_TYPE_{ADD,DEL}_GREF_MAPPING input table has - * the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | grant ref | flags | status | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * grant ref: grant reference (IN) - * flags: flags describing the control operation (IN) - * status: XEN_NETIF_CTRL_STATUS_* (OUT) - * - * 'status' is an output parameter which does not require to be set to zero - * prior to its usage in the corresponding control messages. - */ - -struct xen_netif_gref { - 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) - - uint16_t status; -}; - -/* - * Control messages - * ================ - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM - * -------------------------------------- - * - * This is sent by the frontend to set the desired hash algorithm. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM - * data[0] = a XEN_NETIF_CTRL_HASH_ALGORITHM_* value - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - The algorithm is not - * supported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * - * NOTE: Setting data[0] to XEN_NETIF_CTRL_HASH_ALGORITHM_NONE disables - * hashing and the backend is free to choose how it steers packets - * to queues (which is the default behaviour). - * - * XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS - * ---------------------------------- - * - * This is sent by the frontend to query the types of hash supported by - * the backend. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS - * data[0] = 0 - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not supported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = supported hash types (if operation was successful) - * - * NOTE: A valid hash algorithm must be selected before this operation can - * succeed. - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS - * ---------------------------------- - * - * This is sent by the frontend to set the types of hash that the backend - * should calculate. (See above for hash type definitions). - * Note that the 'maximal' type of hash should always be chosen. For - * example, if the frontend sets both IPV4 and IPV4_TCP hash types then - * the latter hash type should be calculated for any TCP packet and the - * former only calculated for non-TCP packets. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS - * data[0] = bitwise OR of XEN_NETIF_CTRL_HASH_TYPE_* values - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - One or more flag - * value is invalid or - * unsupported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: A valid hash algorithm must be selected before this operation can - * succeed. - * Also, setting data[0] to zero disables hashing and the backend - * is free to choose how it steers packets to queues. - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_KEY - * -------------------------------- - * - * This is sent by the frontend to set the key of the hash if the algorithm - * requires it. (See hash algorithms above). - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_KEY - * data[0] = grant reference of page containing the key (assumed to - * start at beginning of grant) - * data[1] = size of key in octets - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Key size is invalid - * XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW - Key size is larger - * than the backend - * supports - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: Any key octets not specified are assumed to be zero (the key - * is assumed to be empty by default) and specifying a new key - * invalidates any previous key, hence specifying a key size of - * zero will clear the key (which ensures that the calculated hash - * will always be zero). - * The maximum size of key is algorithm and backend specific, but - * is also limited by the single grant reference. - * The grant reference may be read-only and must remain valid until - * the response has been processed. - * - * XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE - * ----------------------------------------- - * - * This is sent by the frontend to query the maximum size of mapping - * table supported by the backend. The size is specified in terms of - * table entries. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE - * data[0] = 0 - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not supported - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = maximum number of entries allowed in the mapping table - * (if operation was successful) or zero if a mapping table is - * not supported (i.e. hash mapping is done only by modular - * arithmetic). - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE - * ------------------------------------- - * - * This is sent by the frontend to set the actual size of the mapping - * table to be used by the backend. The size is specified in terms of - * table entries. - * Any previous table is invalidated by this message and any new table - * is assumed to be zero filled. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE - * data[0] = number of entries in mapping table - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Table size is invalid - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: Setting data[0] to 0 means that hash mapping should be done - * using modular arithmetic. - * - * XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING - * ------------------------------------ - * - * This is sent by the frontend to set the content of the table mapping - * hash value to queue number. The backend should calculate the hash from - * the packet header, use it as an index into the table (modulo the size - * of the table) and then steer the packet to the queue number found at - * that index. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING - * data[0] = grant reference of page containing the mapping (sub-)table - * (assumed to start at beginning of grant) - * data[1] = size of (sub-)table in entries - * data[2] = offset, in entries, of sub-table within overall table - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Table size or content - * is invalid - * XEN_NETIF_CTRL_STATUS_BUFFER_OVERFLOW - Table size is larger - * than the backend - * supports - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = 0 - * - * NOTE: The overall table has the following format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | mapping[0] | mapping[1] | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | . | - * | . | - * | . | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | mapping[N-2] | mapping[N-1] | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * where N is specified by a XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE - * message and each mapping must specifies a queue between 0 and - * "multi-queue-num-queues" (see above). - * The backend may support a mapping table larger than can be - * mapped by a single grant reference. Thus sub-tables within a - * larger table can be individually set by sending multiple messages - * with differing offset values. Specifying a new sub-table does not - * invalidate any table data outside that range. - * The grant reference may be read-only and must remain valid until - * the response has been processed. - * - * XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE - * ----------------------------------------- - * - * This is sent by the frontend to fetch the number of grefs that can be kept - * mapped in the backend. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_GET_GREF_MAPPING_SIZE - * data[0] = queue index (assumed 0 for single queue) - * data[1] = 0 - * data[2] = 0 - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - The queue index is - * out of range - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = maximum number of entries allowed in the gref mapping table - * (if operation was successful) or zero if it is not supported. - * - * XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * ------------------------------------ - * - * This is sent by the frontend for backend to map a list of grant - * references. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * data[0] = queue index - * data[1] = grant reference of page containing the mapping list - * (r/w and assumed to start at beginning of page) - * data[2] = size of list in entries - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Operation failed - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * - * NOTE: Each entry in the input table has the format outlined - * in struct xen_netif_gref. - * Contrary to XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING, the struct - * xen_netif_gref 'status' field is not used and therefore the response - * 'status' determines the success of this operation. In case of - * failure none of grants mappings get added in the backend. - * - * XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING - * ------------------------------------ - * - * This is sent by the frontend for backend to unmap a list of grant - * references. - * - * Request: - * - * type = XEN_NETIF_CTRL_TYPE_DEL_GREF_MAPPING - * data[0] = queue index - * data[1] = grant reference of page containing the mapping list - * (r/w and assumed to start at beginning of page) - * data[2] = size of list in entries - * - * Response: - * - * status = XEN_NETIF_CTRL_STATUS_NOT_SUPPORTED - Operation not - * supported - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER - Operation failed - * XEN_NETIF_CTRL_STATUS_SUCCESS - Operation successful - * data = number of entries that were unmapped - * - * NOTE: Each entry in the input table has the format outlined in struct - * xen_netif_gref. - * The struct xen_netif_gref 'status' field determines if the entry - * was successfully removed. - * The entries used are only the ones representing grant references that - * were previously the subject of a XEN_NETIF_CTRL_TYPE_ADD_GREF_MAPPING - * operation. Any other entries will have their status set to - * XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER upon completion. - */ - -DEFINE_RING_TYPES(xen_netif_ctrl, - struct xen_netif_ctrl_request, - struct xen_netif_ctrl_response); - -/* - * Guest transmit - * ============== - * - * This is the 'wire' format for transmit (frontend -> backend) packets: - * - * Fragment 1: netif_tx_request_t - flags = NETTXF_* - * size = total packet size - * [Extra 1: netif_extra_info_t] - (only if fragment 1 flags include - * NETTXF_extra_info) - * ... - * [Extra N: netif_extra_info_t] - (only if extra N-1 flags include - * XEN_NETIF_EXTRA_MORE) - * ... - * Fragment N: netif_tx_request_t - (only if fragment N-1 flags include - * NETTXF_more_data - flags on preceding - * extras are not relevant here) - * flags = 0 - * size = fragment size - * - * NOTE: - * - * This format slightly is different from that used for receive - * (backend -> frontend) packets. Specifically, in a multi-fragment - * packet the actual size of fragment 1 can only be determined by - * subtracting the sizes of fragments 2..N from the total packet size. - * - * Ring slot size is 12 octets, however not all request/response - * structs use the full size. - * - * tx request data (netif_tx_request_t) - * ------------------------------------ - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | grant ref | offset | flags | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | size | - * +-----+-----+-----+-----+ - * - * grant ref: Reference to buffer page. - * offset: Offset within buffer page. - * flags: NETTXF_*. - * id: request identifier, echoed in response. - * size: packet size in bytes. - * - * tx response (netif_tx_response_t) - * --------------------------------- - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | status | unused | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | unused | - * +-----+-----+-----+-----+ - * - * id: reflects id in transmit request - * status: NETIF_RSP_* - * - * Guest receive - * ============= - * - * This is the 'wire' format for receive (backend -> frontend) packets: - * - * Fragment 1: netif_rx_request_t - flags = NETRXF_* - * size = fragment size - * [Extra 1: netif_extra_info_t] - (only if fragment 1 flags include - * NETRXF_extra_info) - * ... - * [Extra N: netif_extra_info_t] - (only if extra N-1 flags include - * XEN_NETIF_EXTRA_MORE) - * ... - * Fragment N: netif_rx_request_t - (only if fragment N-1 flags include - * NETRXF_more_data - flags on preceding - * extras are not relevant here) - * flags = 0 - * size = fragment size - * - * NOTE: - * - * This format slightly is different from that used for transmit - * (frontend -> backend) packets. Specifically, in a multi-fragment - * packet the size of the packet can only be determined by summing the - * sizes of fragments 1..N. - * - * Ring slot size is 8 octets. - * - * rx request (netif_rx_request_t) - * ------------------------------- - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | pad | gref | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * id: request identifier, echoed in response. - * gref: reference to incoming granted frame. - * - * rx response (netif_rx_response_t) - * --------------------------------- - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | id | offset | flags | status | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * id: reflects id in receive request - * offset: offset in page of start of received packet - * flags: NETRXF_* - * status: -ve: NETIF_RSP_*; +ve: Rx'ed pkt size. - * - * NOTE: Historically, to support GSO on the frontend receive side, Linux - * netfront does not make use of the rx response id (because, as - * described below, extra info structures overlay the id field). - * Instead it assumes that responses always appear in the same ring - * slot as their corresponding request. Thus, to maintain - * compatibility, backends must make sure this is the case. - * - * Extra Info - * ========== - * - * Can be present if initial request or response has NET{T,R}XF_extra_info, - * or previous extra request has XEN_NETIF_EXTRA_MORE. - * - * The struct therefore needs to fit into either a tx or rx slot and - * is therefore limited to 8 octets. - * - * NOTE: Because extra info data overlays the usual request/response - * structures, there is no id information in the opposite direction. - * So, if an extra info overlays an rx response the frontend can - * assume that it is in the same ring slot as the request that was - * consumed to make the slot available, and the backend must ensure - * this assumption is true. - * - * extra info (netif_extra_info_t) - * ------------------------------- - * - * General format: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags| type specific data | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * | padding for tx | - * +-----+-----+-----+-----+ - * - * type: XEN_NETIF_EXTRA_TYPE_* - * flags: XEN_NETIF_EXTRA_FLAG_* - * padding for tx: present only in the tx case due to 8 octet limit - * from rx case. Not shown in type specific entries - * below. - * - * XEN_NETIF_EXTRA_TYPE_GSO: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags| size |type | pad | features | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * type: Must be XEN_NETIF_EXTRA_TYPE_GSO - * flags: XEN_NETIF_EXTRA_FLAG_* - * size: Maximum payload size of each segment. For example, - * for TCP this is just the path MSS. - * type: XEN_NETIF_GSO_TYPE_*: This determines the protocol of - * the packet and any extra features required to segment the - * packet properly. - * features: EN_NETIF_GSO_FEAT_*: This specifies any extra GSO - * features required to process this packet, such as ECN - * support for TCPv4. - * - * XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL}: - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags| addr | - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * type: Must be XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL} - * flags: XEN_NETIF_EXTRA_FLAG_* - * addr: address to add/remove - * - * XEN_NETIF_EXTRA_TYPE_HASH: - * - * A backend that supports teoplitz hashing is assumed to accept - * this type of extra info in transmit packets. - * A frontend that enables hashing is assumed to accept - * this type of extra info in receive packets. - * - * 0 1 2 3 4 5 6 7 octet - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * |type |flags|htype| alg |LSB ---- value ---- MSB| - * +-----+-----+-----+-----+-----+-----+-----+-----+ - * - * type: Must be XEN_NETIF_EXTRA_TYPE_HASH - * flags: XEN_NETIF_EXTRA_FLAG_* - * htype: Hash type (one of _XEN_NETIF_CTRL_HASH_TYPE_* - see above) - * alg: The algorithm used to calculate the hash (one of - * XEN_NETIF_CTRL_HASH_TYPE_ALGORITHM_* - see above) - * value: Hash value - */ - -/* Protocol checksum field is blank in the packet (hardware offload)? */ -#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) - -/* Packet continues in the next request descriptor. */ -#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 XEN_NETIF_MAX_TX_SIZE 0xFFFF -struct netif_tx_request { - grant_ref_t gref; - uint16_t offset; - uint16_t flags; - uint16_t id; - uint16_t size; -}; -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_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) - -/* GSO types */ -#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 - * netif_rx_response_t for compatibility. - */ -struct netif_extra_info { - uint8_t type; - uint8_t flags; - union { - struct { - uint16_t size; - uint8_t type; - uint8_t pad; - uint16_t features; - } gso; - struct { - uint8_t addr[6]; - } mcast; - struct { - uint8_t type; - uint8_t algorithm; - uint8_t value[4]; - } hash; - uint16_t pad[3]; - } u; -}; -typedef struct netif_extra_info netif_extra_info_t; - -struct netif_tx_response { - uint16_t id; - 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; - 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) - -/* Protocol checksum field is blank in the packet (hardware offload)? */ -#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) - -/* Packet to be followed by extra descriptor(s). */ -#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) - -struct netif_rx_response { - uint16_t id; - uint16_t offset; - uint16_t flags; - int16_t status; -}; -typedef struct netif_rx_response netif_rx_response_t; - -/* - * Generate netif ring structures and types. - */ - -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 -/* No response: used for auxiliary requests (e.g., netif_extra_info_t). */ -#define NETIF_RSP_NULL 1 - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/pciif.h b/plat/xen/include/xen/io/pciif.h deleted file mode 100644 index a4ba13cc13c040400ac06593b07ba8f927bf861d..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/pciif.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * PCI Backend/Frontend Common Data Structures & Macros - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Author: Ryan Wilson - */ -#ifndef __XEN_PCI_COMMON_H__ -#define __XEN_PCI_COMMON_H__ - -/* Be sure to bump this number if you change this file */ -#define XEN_PCI_MAGIC "7" - -/* xen_pci_sharedinfo flags */ -#define _XEN_PCIF_active (0) -#define XEN_PCIF_active (1<<_XEN_PCIF_active) -#define _XEN_PCIB_AERHANDLER (1) -#define XEN_PCIB_AERHANDLER (1<<_XEN_PCIB_AERHANDLER) -#define _XEN_PCIB_active (2) -#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) - -/* xen_pci_op error numbers */ -#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) - -/* - * it should be PAGE_SIZE-sizeof(struct xen_pci_op))/sizeof(struct msix_entry)) - * Should not exceed 128 - */ -#define SH_INFO_MAX_VEC 128 - -struct xen_msix_entry { - uint16_t vector; - uint16_t entry; -}; -struct xen_pci_op { - /* IN: what action to perform: XEN_PCI_OP_* */ - uint32_t cmd; - - /* OUT: will contain an error number (if any) from errno.h */ - int32_t err; - - /* IN: which device to touch */ - uint32_t domain; /* PCI Domain/Segment */ - uint32_t bus; - uint32_t devfn; - - /* IN: which configuration registers to touch */ - int32_t offset; - int32_t size; - - /* IN/OUT: Contains the result after a READ or the value to WRITE */ - uint32_t value; - /* IN: Contains extra infor for this operation */ - uint32_t info; - /*IN: param for msi-x */ - struct xen_msix_entry msix_entries[SH_INFO_MAX_VEC]; -}; - -/*used for pcie aer handling*/ -struct xen_pcie_aer_op -{ - - /* IN: what action to perform: XEN_PCI_OP_* */ - uint32_t cmd; - /*IN/OUT: return aer_op result or carry error_detected state as input*/ - int32_t err; - - /* IN: which device to touch */ - uint32_t domain; /* PCI Domain/Segment*/ - uint32_t bus; - uint32_t devfn; -}; -struct xen_pci_sharedinfo { - /* flags - XEN_PCIF_* */ - uint32_t flags; - struct xen_pci_op op; - struct xen_pcie_aer_op aer_op; -}; - -#endif /* __XEN_PCI_COMMON_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/protocols.h b/plat/xen/include/xen/io/protocols.h deleted file mode 100644 index 40a9b30d60d01a296fa60c2fbc2a8e1db4fa82e2..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/protocols.h +++ /dev/null @@ -1,42 +0,0 @@ -/****************************************************************************** - * protocols.h - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2008, Keir Fraser - */ - -#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" - -#if defined(__i386__) -# 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 -#elif defined(__arm__) || defined(__aarch64__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM -#else -# error arch fixup needed here -#endif - -#endif diff --git a/plat/xen/include/xen/io/pvcalls.h b/plat/xen/include/xen/io/pvcalls.h deleted file mode 100644 index cb8171275c13ffcf3a6c8ea171f084714ccf560f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/pvcalls.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * pvcalls.h -- Xen PV Calls Protocol - * - * Refer to docs/misc/pvcalls.markdown for the specification - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2017 Stefano Stabellini - */ - -#ifndef __XEN_PUBLIC_IO_PVCALLS_H__ -#define __XEN_PUBLIC_IO_PVCALLS_H__ - -#include "../grant_table.h" -#include "ring.h" - -/* - * See docs/misc/pvcalls.markdown in xen.git for the full specification: - * https://xenbits.xen.org/docs/unstable/misc/pvcalls.html - */ -struct pvcalls_data_intf { - RING_IDX in_cons, in_prod, in_error; - - uint8_t pad1[52]; - - RING_IDX out_cons, out_prod, out_error; - - uint8_t pad2[52]; - - RING_IDX ring_order; - grant_ref_t ref[]; -}; -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 - -struct xen_pvcalls_request { - uint32_t req_id; /* private to guest, echoed in response */ - uint32_t cmd; /* command to execute */ - union { - struct xen_pvcalls_socket { - uint64_t id; - uint32_t domain; - uint32_t type; - uint32_t protocol; - } socket; - struct xen_pvcalls_connect { - uint64_t id; - uint8_t addr[28]; - uint32_t len; - uint32_t flags; - grant_ref_t ref; - uint32_t evtchn; - } connect; - struct xen_pvcalls_release { - uint64_t id; - uint8_t reuse; - } release; - struct xen_pvcalls_bind { - uint64_t id; - uint8_t addr[28]; - uint32_t len; - } bind; - struct xen_pvcalls_listen { - uint64_t id; - uint32_t backlog; - } listen; - struct xen_pvcalls_accept { - uint64_t id; - uint64_t id_new; - grant_ref_t ref; - uint32_t evtchn; - } accept; - struct xen_pvcalls_poll { - uint64_t id; - } poll; - /* dummy member to force sizeof(struct xen_pvcalls_request) - * to match across archs */ - struct xen_pvcalls_dummy { - uint8_t dummy[56]; - } dummy; - } u; -}; - -struct xen_pvcalls_response { - uint32_t req_id; - uint32_t cmd; - int32_t ret; - uint32_t pad; - union { - struct _xen_pvcalls_socket { - uint64_t id; - } socket; - struct _xen_pvcalls_connect { - uint64_t id; - } connect; - struct _xen_pvcalls_release { - uint64_t id; - } release; - struct _xen_pvcalls_bind { - uint64_t id; - } bind; - struct _xen_pvcalls_listen { - uint64_t id; - } listen; - struct _xen_pvcalls_accept { - uint64_t id; - } accept; - struct _xen_pvcalls_poll { - uint64_t id; - } poll; - struct _xen_pvcalls_dummy { - uint8_t dummy[8]; - } dummy; - } u; -}; - -DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request, - struct xen_pvcalls_response); - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/ring.h b/plat/xen/include/xen/io/ring.h deleted file mode 100644 index 30342fc8c022bb1d9a51c86c9e0ce46675d68e60..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/ring.h +++ /dev/null @@ -1,484 +0,0 @@ -/****************************************************************************** - * ring.h - * - * Shared producer-consumer ring macros. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Tim Deegan and Andrew Warfield November 2004. - */ - -#ifndef __XEN_PUBLIC_IO_RING_H__ -#define __XEN_PUBLIC_IO_RING_H__ - -/* - * When #include'ing this header, you need to provide the following - * declaration upfront: - * - standard integers types (uint8_t, uint16_t, etc) - * They are provided by stdint.h of the standard headers. - * - * In addition, if you intend to use the FLEX macros, you also need to - * provide the following, before invoking the FLEX macros: - * - size_t - * - memcpy - * - grant_ref_t - * These declarations are provided by string.h of the standard headers, - * and grant_table.h from the Xen public headers. - */ - -#include "../xen-compat.h" - -#if __XEN_INTERFACE_VERSION__ < 0x00030208 -#define xen_mb() mb() -#define xen_rmb() rmb() -#define xen_wmb() wmb() -#endif - -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)) - -/* - * Calculate size of a shared ring, given the total available space for the - * ring and indexes (_sz), and the name tag of the request/response structure. - * 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]))) -/* - * The same for passing in an actual pointer instead of a name tag. - */ -#define __RING_SIZE(_s, _sz) \ - (__RD32(((_sz) - (long)(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0]))) - -/* - * Macros to make the correct C datatypes for a new kind of ring. - * - * To make a new ring datatype, you need to have two message structures, - * let's say request_t, and response_t already defined. - * - * In a header where you want the ring datatype declared, you then do: - * - * DEFINE_RING_TYPES(mytag, request_t, response_t); - * - * These expand out to give you a set of types, as you can see below. - * The most important of these are: - * - * mytag_sring_t - The shared ring. - * mytag_front_ring_t - The 'front' half of the ring. - * mytag_back_ring_t - The 'back' half of the ring. - * - * To initialize a ring in your code you need to know the location and size - * of the shared memory area (PAGE_SIZE, for instance). To initialise - * the front half: - * - * mytag_front_ring_t front_ring; - * SHARED_RING_INIT((mytag_sring_t *)shared_page); - * FRONT_RING_INIT(&front_ring, (mytag_sring_t *)shared_page, PAGE_SIZE); - * - * Initializing the back follows similarly (note that only the front - * initializes the shared ring): - * - * mytag_back_ring_t back_ring; - * 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 - -/* - * Macros for manipulating rings. - * - * FRONT_RING_whatever works on the "front end" of a ring: here - * requests are pushed on to the ring and responses taken off it. - * - * BACK_RING_whatever works on the "back end" of a ring: here - * requests are taken off the ring and responses put on. - * - * N.B. these macros do NO INTERLOCKS OR FLOW CONTROL. - * This is OK in 1-for-1 request-response situations where the - * requestor (front end) never has more than RING_SIZE()-1 - * outstanding requests. - */ - -/* 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) - -/* How big is this ring? */ -#define RING_SIZE(_r) \ - ((_r)->nr_ents) - -/* Number of free requests (for use on front side only). */ -#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) - -/* Test if there are outstanding messages to be processed on a ring. */ -#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; \ -}) -#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))) -#endif - -/* Direct access to individual ring elements, by index. */ -#define RING_GET_REQUEST(_r, _idx) \ - (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].req)) - -/* - * Get a local copy of a request. - * - * Use this in preference to RING_GET_REQUEST() so all processing is - * done on a local copy that cannot be modified by the other end. - * - * 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_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) \ - (((_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) \ - (((_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_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): - * - * When queueing requests or responses on a shared ring, it may not always be - * necessary to notify the remote end. For example, if requests are in flight - * in a backend, the front may be able to queue further requests without - * notifying the back (if the back checks for new requests when it queues - * responses). - * - * When enqueuing requests or responses: - * - * Use RING_PUSH_{REQUESTS,RESPONSES}_AND_CHECK_NOTIFY(). The second argument - * is a boolean return value. True indicates that the receiver requires an - * asynchronous notification. - * - * After dequeuing requests or responses (before sleeping the connection): - * - * Use RING_FINAL_CHECK_FOR_REQUESTS() or RING_FINAL_CHECK_FOR_RESPONSES(). - * The second argument is a boolean return value. True indicates that there - * are pending messages on the ring (i.e., the connection should not be put - * to sleep). - * - * These macros will set the req_event/rsp_event field to trigger a - * notification on the very next message that is enqueued. If you want to - * create batches of work (i.e., only receive a notification after several - * messages have been enqueued) then you will need to create a customised - * version of the FINAL_CHECK macro in your own code, which sets the event - * 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_XEN_FLEX_RING_AND_INTF defines two monodirectional rings and - * functions to check if there is data on the ring, and to read and - * write to them. - * - * DEFINE_XEN_FLEX_RING is similar to DEFINE_XEN_FLEX_RING_AND_INTF, but - * does not define the indexes page. As different protocols can have - * extensions to the basic format, this macro allow them to define their - * own struct. - * - * XEN_FLEX_RING_SIZE - * Convenience macro to calculate the size of one of the two rings - * from the overall order. - * - * $NAME_mask - * Function to apply the size mask to an index, to reduce the index - * within the range [0-size]. - * - * $NAME_read_packet - * Function to read data from the ring. The amount of data to read is - * specified by the "size" argument. - * - * $NAME_write_packet - * Function to write data to the ring. The amount of data to write is - * specified by the "size" argument. - * - * $NAME_get_ring_ptr - * Convenience function that returns a pointer to read/write to the - * ring at the right location. - * - * $NAME_data_intf - * Indexes page, shared between frontend and backend. It also - * contains the array of grant refs. - * - * $NAME_queued - * Function to calculate how many bytes are currently on the ring, - * ready to be read. It can also be used to calculate how much free - * space is currently on the ring (XEN_FLEX_RING_SIZE() - - * $NAME_queued()). - */ - -#ifndef XEN_PAGE_SHIFT -/* The PAGE_SIZE for ring protocols and hypercall interfaces is always - * 4K, regardless of the architecture, and page granularity chosen by - * operating systems. - */ -#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) - -#endif /* __XEN_PUBLIC_IO_RING_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/sndif.h b/plat/xen/include/xen/io/sndif.h deleted file mode 100644 index c5c1978406b3a6591d982b330e730a4af3d2b9ef..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/sndif.h +++ /dev/null @@ -1,803 +0,0 @@ -/****************************************************************************** - * sndif.h - * - * Unified sound-device I/O interface for Xen guest OSes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2013-2015 GlobalLogic Inc. - * Copyright (C) 2016-2017 EPAM Systems Inc. - * - * Authors: Oleksandr Andrushchenko - * Oleksandr Grytsov - * Oleksandr Dmytryshyn - * Iurii Konovalenko - */ - -#ifndef __XEN_PUBLIC_IO_SNDIF_H__ -#define __XEN_PUBLIC_IO_SNDIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - ****************************************************************************** - * Feature and Parameter Negotiation - ****************************************************************************** - * - * Front->back notifications: when enqueuing a new request, sending a - * notification can be made conditional on xensnd_req (i.e., the generic - * hold-off mechanism provided by the ring macros). Backends must set - * xensnd_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). - * - * Back->front notifications: when enqueuing a new response, sending a - * notification can be made conditional on xensnd_resp (i.e., the generic - * hold-off mechanism provided by the ring macros). Frontends must set - * xensnd_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). - * - * The two halves of a para-virtual sound card driver utilize nodes within - * XenStore to communicate capabilities and to negotiate operating parameters. - * This section enumerates these nodes which reside in the respective front and - * backend portions of XenStore, following the XenBus convention. - * - * All data in XenStore is stored as strings. Nodes specifying numeric - * values are encoded in decimal. Integer value ranges listed below are - * expressed as fixed sized integer types capable of storing the conversion - * of a properly formated node string, without loss of information. - * - ****************************************************************************** - * Example configuration - ****************************************************************************** - * - * Note: depending on the use-case backend can expose more sound cards and - * PCM devices/streams than the underlying HW physically has by employing - * SW mixers, configuring virtual sound streams, channels etc. - * - * This is an example of backend and frontend configuration: - * - *--------------------------------- Backend ----------------------------------- - * - * /local/domain/0/backend/vsnd/1/0/frontend-id = "1" - * /local/domain/0/backend/vsnd/1/0/frontend = "/local/domain/1/device/vsnd/0" - * /local/domain/0/backend/vsnd/1/0/state = "4" - * /local/domain/0/backend/vsnd/1/0/versions = "1,2" - * - *--------------------------------- Frontend ---------------------------------- - * - * /local/domain/1/device/vsnd/0/backend-id = "0" - * /local/domain/1/device/vsnd/0/backend = "/local/domain/0/backend/vsnd/1/0" - * /local/domain/1/device/vsnd/0/state = "4" - * /local/domain/1/device/vsnd/0/version = "1" - * - *----------------------------- Card configuration ---------------------------- - * - * /local/domain/1/device/vsnd/0/short-name = "Card short name" - * /local/domain/1/device/vsnd/0/long-name = "Card long name" - * /local/domain/1/device/vsnd/0/sample-rates = "8000,32000,44100,48000,96000" - * /local/domain/1/device/vsnd/0/sample-formats = "s8,u8,s16_le,s16_be" - * /local/domain/1/device/vsnd/0/buffer-size = "262144" - * - *------------------------------- PCM device 0 -------------------------------- - * - * /local/domain/1/device/vsnd/0/0/name = "General analog" - * /local/domain/1/device/vsnd/0/0/channels-max = "5" - * - *----------------------------- Stream 0, playback ---------------------------- - * - * /local/domain/1/device/vsnd/0/0/0/type = "p" - * /local/domain/1/device/vsnd/0/0/0/sample-formats = "s8,u8" - * /local/domain/1/device/vsnd/0/0/0/unique-id = "0" - * - * /local/domain/1/device/vsnd/0/0/0/ring-ref = "386" - * /local/domain/1/device/vsnd/0/0/0/event-channel = "15" - * - *------------------------------ Stream 1, capture ---------------------------- - * - * /local/domain/1/device/vsnd/0/0/1/type = "c" - * /local/domain/1/device/vsnd/0/0/1/channels-max = "2" - * /local/domain/1/device/vsnd/0/0/1/unique-id = "1" - * - * /local/domain/1/device/vsnd/0/0/1/ring-ref = "384" - * /local/domain/1/device/vsnd/0/0/1/event-channel = "13" - * - *------------------------------- PCM device 1 -------------------------------- - * - * /local/domain/1/device/vsnd/0/1/name = "HDMI-0" - * /local/domain/1/device/vsnd/0/1/sample-rates = "8000,32000,44100" - * - *------------------------------ Stream 0, capture ---------------------------- - * - * /local/domain/1/device/vsnd/0/1/0/type = "c" - * /local/domain/1/device/vsnd/0/1/0/unique-id = "2" - * - * /local/domain/1/device/vsnd/0/1/0/ring-ref = "387" - * /local/domain/1/device/vsnd/0/1/0/event-channel = "151" - * - *------------------------------- PCM device 2 -------------------------------- - * - * /local/domain/1/device/vsnd/0/2/name = "SPDIF" - * - *----------------------------- Stream 0, playback ---------------------------- - * - * /local/domain/1/device/vsnd/0/2/0/type = "p" - * /local/domain/1/device/vsnd/0/2/0/unique-id = "3" - * - * /local/domain/1/device/vsnd/0/2/0/ring-ref = "389" - * /local/domain/1/device/vsnd/0/2/0/event-channel = "152" - * - ****************************************************************************** - * Backend XenBus Nodes - ****************************************************************************** - * - *----------------------------- Protocol version ------------------------------ - * - * versions - * Values: - * - * List of XENSND_LIST_SEPARATOR separated protocol versions supported - * by the backend. For example "1,2,3". - * - ****************************************************************************** - * Frontend XenBus Nodes - ****************************************************************************** - * - *-------------------------------- Addressing --------------------------------- - * - * dom-id - * Values: - * - * Domain identifier. - * - * dev-id - * Values: - * - * Device identifier. - * - * pcm-dev-idx - * Values: - * - * Zero based contigous index of the PCM device. - * - * stream-idx - * Values: - * - * Zero based contigous index of the stream of the PCM device. - * - * The following pattern is used for addressing: - * /local/domain//device/vsnd////... - * - *----------------------------- Protocol version ------------------------------ - * - * version - * Values: - * - * Protocol version, chosen among the ones supported by the backend. - * - *------------------------------- PCM settings -------------------------------- - * - * Every virtualized sound frontend has a set of PCM devices and streams, each - * could be individually configured. Part of the PCM configuration can be - * defined at higher level of the hierarchy and be fully or partially re-used - * by the underlying layers. These configuration values are: - * o number of channels (min/max) - * o supported sample rates - * o supported sample formats. - * E.g. one can define these values for the whole card, device or stream. - * Every underlying layer in turn can re-define some or all of them to better - * fit its needs. For example, card may define number of channels to be - * in [1; 8] range, and some particular stream may be limited to [1; 2] only. - * The rule is that the underlying layer must be a subset of the upper layer - * range. - * - * channels-min - * Values: - * - * The minimum amount of channels that is supported, [1; channels-max]. - * Optional, if not set or omitted a value of 1 is used. - * - * channels-max - * Values: - * - * The maximum amount of channels that is supported. - * Must be at least . - * - * sample-rates - * Values: - * - * List of supported sample rates separated by XENSND_LIST_SEPARATOR. - * Sample rates are expressed as a list of decimal values w/o any - * ordering requirement. - * - * sample-formats - * Values: - * - * List of supported sample formats separated by XENSND_LIST_SEPARATOR. - * Items must not exceed XENSND_SAMPLE_FORMAT_MAX_LEN length. - * - * buffer-size - * Values: - * - * The maximum size in octets of the buffer to allocate per stream. - * - *----------------------- Virtual sound card settings ------------------------- - * short-name - * Values: - * - * Short name of the virtual sound card. Optional. - * - * long-name - * Values: - * - * Long name of the virtual sound card. Optional. - * - *----------------------------- Device settings ------------------------------- - * name - * Values: - * - * Name of the sound device within the virtual sound card. Optional. - * - *----------------------------- Stream settings ------------------------------- - * - * type - * Values: "p", "c" - * - * Stream type: "p" - playback stream, "c" - capture stream - * - * If both capture and playback are needed then two streams need to be - * defined under the same device. - * - * unique-id - * Values: - * - * After stream initialization it is assigned a unique ID (within the front - * driver), so every stream of the frontend can be identified by the - * backend by this ID. This is not equal to stream-idx as the later is - * zero based within the device, but this index is contigous within the - * driver. - * - *-------------------- Stream Request Transport Parameters -------------------- - * - * event-channel - * Values: - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * ring-ref - * Values: - * - * The Xen grant reference granting permission for the backend to map - * a sole page in a single page sized ring buffer. - * - ****************************************************************************** - * STATE DIAGRAMS - ****************************************************************************** - * - * Tool stack creates front and back state nodes with initial state - * XenbusStateInitialising. - * Tool stack creates and sets up frontend sound configuration nodes per domain. - * - * Front Back - * ================================= ===================================== - * XenbusStateInitialising XenbusStateInitialising - * o Query backend device identification - * data. - * o Open and validate backend device. - * | - * | - * V - * XenbusStateInitWait - * - * o Query frontend configuration - * o Allocate and initialize - * event channels per configured - * playback/capture stream. - * o Publish transport parameters - * that will be in effect during - * this connection. - * | - * | - * V - * XenbusStateInitialised - * - * o Query frontend transport parameters. - * o Connect to the event channels. - * | - * | - * V - * XenbusStateConnected - * - * o Create and initialize OS - * virtual sound device instances - * as per configuration. - * | - * | - * V - * XenbusStateConnected - * - * XenbusStateUnknown - * XenbusStateClosed - * XenbusStateClosing - * o Remove virtual sound device - * o Remove event channels - * | - * | - * V - * XenbusStateClosed - * - *------------------------------- Recovery flow ------------------------------- - * - * In case of frontend unrecoverable errors backend handles that as - * if frontend goes into the XenbusStateClosed state. - * - * In case of backend unrecoverable errors frontend tries removing - * the virtualized device. If this is possible at the moment of error, - * then frontend goes into the XenbusStateInitialising state and is ready for - * new connection with backend. If the virtualized device is still in use and - * cannot be removed, then frontend goes into the XenbusStateReconfiguring state - * until either the virtualized device removed or backend initiates a new - * connection. On the virtualized device removal frontend goes into the - * XenbusStateInitialising state. - * - * Note on XenbusStateReconfiguring state of the frontend: if backend has - * unrecoverable errors then frontend cannot send requests to the backend - * and thus cannot provide functionality of the virtualized device anymore. - * After backend is back to normal the virtualized device may still hold some - * state: configuration in use, allocated buffers, client application state etc. - * So, in most cases, this will require frontend to implement complex recovery - * reconnect logic. Instead, by going into XenbusStateReconfiguring state, - * frontend will make sure no new clients of the virtualized device are - * accepted, allow existing client(s) to exit gracefully by signaling error - * state etc. - * Once all the clients are gone frontend can reinitialize the virtualized - * device and get into XenbusStateInitialising state again signaling the - * backend that a new connection can be made. - * - * There are multiple conditions possible under which frontend will go from - * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS - * specific. For example: - * 1. The underlying OS framework may provide callbacks to signal that the last - * client of the virtualized device has gone and the device can be removed - * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) - * to periodically check if this is the right time to re-try removal of - * the virtualized device. - * 3. By any other means. - * - ****************************************************************************** - * PCM FORMATS - ****************************************************************************** - * - * XENSND_PCM_FORMAT_[_] - * - * format: or - * S - signed, U - unsigned, F - float - * bits - 8, 16, 24, 32 - * name - MU_LAW, GSM, etc. - * - * 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_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 - -/* - ****************************************************************************** - * 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 - -/* - ****************************************************************************** - * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS - ****************************************************************************** - */ -#define XENSND_DRIVER_NAME "vsnd" - -#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_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" -/* Sample rate max string length */ -#define XENSND_SAMPLE_RATE_MAX_LEN 11 -/* Sample format field values */ -#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_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" - - -/* - ****************************************************************************** - * STATUS RETURN CODES - ****************************************************************************** - * - * Status return code is zero on success and -XEN_EXX on failure. - * - ****************************************************************************** - * Assumptions - ****************************************************************************** - * o usage of grant reference 0 as invalid grant reference: - * grant reference 0 is valid, but never exposed to a PV driver, - * because of the fact it is already in use/reserved by the PV console. - * o all references in this document to page sizes must be treated - * as pages of size XEN_PAGE_SIZE unless otherwise noted. - * - ****************************************************************************** - * Description of the protocol between frontend and backend driver - ****************************************************************************** - * - * The two halves of a Para-virtual sound driver communicate with - * each other using shared pages and event channels. - * Shared page contains a ring with request/response packets. - * - * Packets, used for input/output operations, e.g. read/write, set/get volume, - * etc., provide offset/length fields in order to allow asynchronous protocol - * operation with buffer space sharing: part of the buffer allocated at - * XENSND_OP_OPEN can be used for audio samples and part, for example, - * for volume control. - * - * All reserved fields in the structures below must be 0. - * - *---------------------------------- Requests --------------------------------- - * - * All request packets have the same length (32 octets) - * All request packets have common header: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * id - uint16_t, private guest value, echoed in response - * operation - uint8_t, operation code, XENSND_OP_??? - * - * For all packets which use offset and length: - * offset - uint32_t, read or write data offset within the shared buffer, - * passed with XENSND_OP_OPEN request, octets, - * [0; XENSND_OP_OPEN.buffer_sz - 1]. - * length - uint32_t, read or write data length, octets - * - * Request open - open a PCM stream for playback or capture: - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | XENSND_OP_OPEN | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | pcm_rate | 12 - * +----------------+----------------+----------------+----------------+ - * | pcm_format | pcm_channels | reserved | 16 - * +----------------+----------------+----------------+----------------+ - * | buffer_sz | 20 - * +----------------+----------------+----------------+----------------+ - * | gref_directory | 24 - * +----------------+----------------+----------------+----------------+ - * | reserved | 28 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * - * pcm_rate - uint32_t, stream data rate, Hz - * pcm_format - uint8_t, XENSND_PCM_FORMAT_XXX value - * pcm_channels - uint8_t, number of channels of this stream, - * [channels-min; channels-max] - * buffer_sz - uint32_t, buffer size to be allocated, octets - * gref_directory - grant_ref_t, a reference to the first shared page - * describing shared buffer references. At least one page exists. If shared - * buffer size (buffer_sz) exceeds what can be addressed by this single page, - * then reference to the next page must be supplied (see gref_dir_next_page - * below) - */ - -struct xensnd_open_req { - uint32_t pcm_rate; - uint8_t pcm_format; - uint8_t pcm_channels; - uint16_t reserved; - uint32_t buffer_sz; - grant_ref_t gref_directory; -}; - -/* - * Shared page for XENSND_OP_OPEN buffer descriptor (gref_directory in the - * request) employs a list of pages, describing all pages of the shared data - * buffer: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | gref_dir_next_page | 4 - * +----------------+----------------+----------------+----------------+ - * | gref[0] | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[i] | i*4+8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | gref[N - 1] | N*4+8 - * +----------------+----------------+----------------+----------------+ - * - * gref_dir_next_page - grant_ref_t, reference to the next page describing - * page directory. Must be 0 if there are no more pages in the list. - * gref[i] - grant_ref_t, reference to a shared page of the buffer - * allocated at XENSND_OP_OPEN - * - * Number of grant_ref_t entries in the whole page directory is not - * passed, but instead can be calculated as: - * num_grefs_total = (XENSND_OP_OPEN.buffer_sz + XEN_PAGE_SIZE - 1) / - * XEN_PAGE_SIZE - */ - -struct xensnd_page_directory { - grant_ref_t gref_dir_next_page; - grant_ref_t gref[1]; /* Variable length */ -}; - -/* - * Request close - close an opened pcm stream: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | XENSND_OP_CLOSE| reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * - * Request read/write - used for read (for capture) or write (for playback): - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | offset | 12 - * +----------------+----------------+----------------+----------------+ - * | length | 16 - * +----------------+----------------+----------------+----------------+ - * | reserved | 20 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * - * operation - XENSND_OP_READ for read or XENSND_OP_WRITE for write - */ - -struct xensnd_rw_req { - uint32_t offset; - uint32_t length; -}; - -/* - * Request set/get volume - set/get channels' volume of the stream given: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | offset | 12 - * +----------------+----------------+----------------+----------------+ - * | length | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * - * operation - XENSND_OP_SET_VOLUME for volume set - * or XENSND_OP_GET_VOLUME for volume get - * Buffer passed with XENSND_OP_OPEN is used to exchange volume - * values: - * - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | channel[0] | 4 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[i] | i*4 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[N - 1] | (N-1)*4 - * +----------------+----------------+----------------+----------------+ - * - * N = XENSND_OP_OPEN.pcm_channels - * i - uint8_t, index of a channel - * channel[i] - sint32_t, volume of i-th channel - * Volume is expressed as a signed value in steps of 0.001 dB, - * while 0 being 0 dB. - * - * Request mute/unmute - mute/unmute stream: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | reserved | 8 - * +----------------+----------------+----------------+----------------+ - * | offset | 12 - * +----------------+----------------+----------------+----------------+ - * | length | 16 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * - * operation - XENSND_OP_MUTE for mute or XENSND_OP_UNMUTE for unmute - * Buffer passed with XENSND_OP_OPEN is used to exchange mute/unmute - * values: - * - * 0 octet - * +----------------+----------------+----------------+----------------+ - * | channel[0] | 4 - * +----------------+----------------+----------------+----------------+ - * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[i] | i*4 - * +----------------+----------------+----------------+----------------+ - * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | channel[N - 1] | (N-1)*4 - * +----------------+----------------+----------------+----------------+ - * - * N = XENSND_OP_OPEN.pcm_channels - * i - uint8_t, index of a channel - * channel[i] - uint8_t, non-zero if i-th channel needs to be muted/unmuted - * - *------------------------------------ N.B. ----------------------------------- - * - * The 'struct xensnd_rw_req' is also used for XENSND_OP_SET_VOLUME, - * XENSND_OP_GET_VOLUME, XENSND_OP_MUTE, XENSND_OP_UNMUTE. - */ - -/* - *---------------------------------- Responses -------------------------------- - * - * All response packets have the same length (32 octets) - * - * Response for all requests: - * 0 1 2 3 octet - * +----------------+----------------+----------------+----------------+ - * | id | operation | reserved | 4 - * +----------------+----------------+----------------+----------------+ - * | status | 8 - * +----------------+----------------+----------------+----------------+ - * | reserved | 12 - * +----------------+----------------+----------------+----------------+ - * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| - * +----------------+----------------+----------------+----------------+ - * | reserved | 32 - * +----------------+----------------+----------------+----------------+ - * - * id - uint16_t, copied from the request - * operation - uint8_t, XENSND_OP_* - copied from request - * status - int32_t, response status, zero on success and -XEN_EXX on failure - */ - -struct xensnd_req { - uint16_t id; - uint8_t operation; - uint8_t reserved[5]; - union { - struct xensnd_open_req open; - struct xensnd_rw_req rw; - uint8_t reserved[24]; - } op; -}; - -struct xensnd_resp { - uint16_t id; - uint8_t operation; - uint8_t reserved; - int32_t status; - uint8_t reserved1[24]; -}; - -DEFINE_RING_TYPES(xen_sndif, struct xensnd_req, struct xensnd_resp); - -#endif /* __XEN_PUBLIC_IO_SNDIF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/tpmif.h b/plat/xen/include/xen/io/tpmif.h deleted file mode 100644 index 9743dc9369d2eac160dcb4f086690e3eade9e1e6..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/tpmif.h +++ /dev/null @@ -1,143 +0,0 @@ -/****************************************************************************** - * tpmif.h - * - * TPM I/O interface for Xen guest OSes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2005, IBM Corporation - * - * Author: Stefan Berger, stefanb@us.ibm.com - * Grant table support: Mahadevan Gomathisankaran - * - * This code has been derived from tools/libxc/xen/io/netif.h - * - * Copyright (c) 2003-2004, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_IO_TPMIF_H__ -#define __XEN_PUBLIC_IO_TPMIF_H__ - -#include "../grant_table.h" - -struct tpmif_tx_request { - 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. */ -}; -typedef struct tpmif_tx_request tpmif_tx_request_t; - -/* - * The TPMIF_TX_RING_SIZE defines the number of pages the - * front-end and backend can exchange (= size of array). - */ -typedef uint32_t TPMIF_RING_IDX; - -#define TPMIF_TX_RING_SIZE 1 - -/* This structure must fit in a memory page. */ - -struct tpmif_ring { - struct tpmif_tx_request req; -}; -typedef struct tpmif_ring tpmif_ring_t; - -struct tpmif_tx_interface { - struct tpmif_ring ring[TPMIF_TX_RING_SIZE]; -}; -typedef struct tpmif_tx_interface tpmif_tx_interface_t; - -/****************************************************************************** - * TPM I/O interface for Xen guest OSes, v2 - * - * Author: Daniel De Graaf - * - * This protocol emulates the request/response behavior of a TPM using a Xen - * shared memory interface. All interaction with the TPM is at the direction - * of the frontend, since a TPM (hardware or virtual) is a passive device - - * the backend only processes commands as requested by the frontend. - * - * The frontend sends a request to the TPM by populating the shared page with - * the request packet, changing the state to TPMIF_STATE_SUBMIT, and sending - * and event channel notification. When the backend is finished, it will set - * the state to TPMIF_STATE_FINISH and send an event channel notification. - * - * In order to allow long-running commands to be canceled, the frontend can - * at any time change the state to TPMIF_STATE_CANCEL and send a notification. - * The TPM can either finish the command (changing state to TPMIF_STATE_FINISH) - * or can cancel the command and change the state to TPMIF_STATE_IDLE. The TPM - * can also change the state to TPMIF_STATE_IDLE instead of TPMIF_STATE_FINISH - * if another reason for cancellation is required - for example, a physical - * TPM may cancel a command if the interface is seized by another locality. - * - * The TPM command format is defined by the TCG, and is available at - * http://www.trustedcomputinggroup.org/resources/tpm_main_specification - */ - -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 */ -}; -/* 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 - * to use atomic operations. - */ - - -/* The shared page for vTPM request/response packets looks like: - * - * Offset Contents - * ================================================= - * 0 struct tpmif_shared_page - * 16 [optional] List of grant IDs - * 16+4*nr_extra_pages TPM packet data - * - * If the TPM packet data extends beyond the end of a single page, the grant IDs - * defined in extra_pages are used as if they were mapped immediately following - * the primary shared page. The grants are allocated by the frontend and mapped - * by the backend. Before sending a request spanning multiple pages, the - * frontend should verify that the TPM supports such large requests by querying - * the TPM_CAP_PROP_INPUT_BUFFER property from the TPM. - */ -struct tpmif_shared_page { - 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 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; - -#endif - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/usbif.h b/plat/xen/include/xen/io/usbif.h deleted file mode 100644 index c6a58639d6ccc3202c1d2819fa457a8e002fb325..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/usbif.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * usbif.h - * - * USB I/O interface for Xen guest OSes. - * - * Copyright (C) 2009, FUJITSU LABORATORIES LTD. - * Author: Noboru Iwamatsu - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __XEN_PUBLIC_IO_USBIF_H__ -#define __XEN_PUBLIC_IO_USBIF_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Feature and Parameter Negotiation - * ================================= - * The two halves of a Xen pvUSB driver utilize nodes within the XenStore to - * communicate capabilities and to negotiate operating parameters. This - * section enumerates these nodes which reside in the respective front and - * backend portions of the XenStore, following the XenBus convention. - * - * Any specified default value is in effect if the corresponding XenBus node - * is not present in the XenStore. - * - * XenStore nodes in sections marked "PRIVATE" are solely for use by the - * driver side whose XenBus tree contains them. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *------------------ Backend Device Identification (PRIVATE) ------------------ - * - * num-ports - * Values: unsigned [1...31] - * - * Number of ports for this (virtual) USB host connector. - * - * usb-ver - * Values: unsigned [1...2] - * - * USB version of this host connector: 1 = USB 1.1, 2 = USB 2.0. - * - * port/[1...31] - * Values: string - * - * Physical USB device connected to the given port, e.g. "3-1.5". - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: unsigned - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * urb-ring-ref - * Values: unsigned - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. This is the ring - * buffer for urb requests. - * - * conn-ring-ref - * Values: unsigned - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. This is the ring - * buffer for connection/disconnection requests. - * - * protocol - * Values: string (XEN_IO_PROTO_ABI_*) - * Default Value: XEN_IO_PROTO_ABI_NATIVE - * - * The machine ABI rules governing the format of all ring request and - * response structures. - * - */ - -enum usb_spec_version { - USB_VER_UNKNOWN = 0, - USB_VER_USB11, - USB_VER_USB20, - USB_VER_USB30, /* not supported yet */ -}; - -/* - * USB pipe in usbif_request - * - * - port number: bits 0-4 - * (USB_MAXCHILDREN is 31) - * - * - operation flag: bit 5 - * (0 = submit urb, - * 1 = unlink urb) - * - * - direction: bit 7 - * (0 = Host-to-Device [Out] - * 1 = Device-to-Host [In]) - * - * - device address: bits 8-14 - * - * - endpoint: bits 15-18 - * - * - pipe type: bits 30-31 - * (00 = isochronous, 01 = interrupt, - * 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_MAX_SEGMENTS_PER_REQUEST (16) -#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; -}; - -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]; -}; -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 */ -}; -typedef struct usbif_urb_response usbif_urb_response_t; - -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; -}; -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 -}; -typedef struct usbif_conn_response usbif_conn_response_t; - -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/plat/xen/include/xen/io/vscsiif.h b/plat/xen/include/xen/io/vscsiif.h deleted file mode 100644 index d0bd3b589e9ae9989fba558fe2e8e0a838801998..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/vscsiif.h +++ /dev/null @@ -1,330 +0,0 @@ -/****************************************************************************** - * vscsiif.h - * - * Based on the blkif.h code. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright(c) FUJITSU Limited 2008. - */ - -#ifndef __XEN__PUBLIC_IO_SCSI_H__ -#define __XEN__PUBLIC_IO_SCSI_H__ - -#include "ring.h" -#include "../grant_table.h" - -/* - * Feature and Parameter Negotiation - * ================================= - * The two halves of a Xen pvSCSI driver utilize nodes within the XenStore to - * communicate capabilities and to negotiate operating parameters. This - * section enumerates these nodes which reside in the respective front and - * backend portions of the XenStore, following the XenBus convention. - * - * Any specified default value is in effect if the corresponding XenBus node - * is not present in the XenStore. - * - * XenStore nodes in sections marked "PRIVATE" are solely for use by the - * driver side whose XenBus tree contains them. - * - ***************************************************************************** - * Backend XenBus Nodes - ***************************************************************************** - * - *------------------ Backend Device Identification (PRIVATE) ------------------ - * - * p-devname - * Values: string - * - * A free string used to identify the physical device (e.g. a disk name). - * - * p-dev - * Values: string - * - * A string specifying the backend device: either a 4-tuple "h:c:t:l" - * (host, controller, target, lun, all integers), or a WWN (e.g. - * "naa.60014054ac780582:0"). - * - * v-dev - * Values: string - * - * A string specifying the frontend device in form of a 4-tuple "h:c:t:l" - * (host, controller, target, lun, all integers). - * - *--------------------------------- Features --------------------------------- - * - * feature-sg-grant - * Values: unsigned [VSCSIIF_SG_TABLESIZE...65535] - * Default Value: 0 - * - * Specifies the maximum number of scatter/gather elements in grant pages - * supported. If not set, the backend supports up to VSCSIIF_SG_TABLESIZE - * SG elements specified directly in the request. - * - ***************************************************************************** - * Frontend XenBus Nodes - ***************************************************************************** - * - *----------------------- Request Transport Parameters ----------------------- - * - * event-channel - * Values: unsigned - * - * The identifier of the Xen event channel used to signal activity - * in the ring buffer. - * - * ring-ref - * Values: unsigned - * - * The Xen grant reference granting permission for the backend to map - * the sole page in a single page sized ring buffer. - * - * protocol - * Values: string (XEN_IO_PROTO_ABI_*) - * Default Value: XEN_IO_PROTO_ABI_NATIVE - * - * The machine ABI rules governing the format of all ring request and - * response structures. - */ - -/* - * Xenstore format in practice - * =========================== - * - * 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): - * - * //feature-host = "0" - * //frontend = "/local/domain//device/vscsi/0" - * //frontend-id = "" - * //online = "1" - * //state = "4" - * //vscsi-devs/dev-0/p-dev = "8:0:2:1" or "naa.wwn:lun" - * //vscsi-devs/dev-0/state = "4" - * //vscsi-devs/dev-0/v-dev = "0:0:0:0" - * //vscsi-devs/dev-1/p-dev = "8:0:2:2" - * //vscsi-devs/dev-1/state = "4" - * //vscsi-devs/dev-1/v-dev = "0:0:1:0" - * - * The frontend driver maintains its state in - * /local/domain//device/vscsi/. - * - * /backend = "/local/domain/0/backend/vscsi//" - * /backend-id = "0" - * /event-channel = "20" - * /ring-ref = "43" - * /state = "4" - * /vscsi-devs/dev-0/state = "4" - * /vscsi-devs/dev-1/state = "4" - * - * In addition to the entries for backend and frontend these flags are stored - * for the toolstack: - * - * //vscsi-devs/dev-1/p-devname = "/dev/$device" - * //libxl_ctrl_index = "0" - * - * - * Backend/frontend protocol - * ========================= - * - * To create a vhost along with a device: - * //feature-host = "0" - * //frontend = "/local/domain//device/vscsi/0" - * //frontend-id = "" - * //online = "1" - * //state = "1" - * //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 - * - * 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 - * - * To remove a device from a vhost: - * //state = "7" - * //vscsi-devs/dev-1/state = "5" - * Wait for //state to become 4 - * Wait for //vscsi-devs/dev-1/state become 6 - * Remove //vscsi-devs/dev-1/{state,p-dev,v-dev,p-devname} - * Remove //vscsi-devs/dev-1/ - * - */ - -/* Requests from the frontend to the backend */ - -/* - * Request a SCSI operation specified via a CDB in vscsiif_request.cmnd. - * The target is specified via channel, id and lun. - * - * The operation to be performed is specified via a CDB in cmnd[], the length - * of the CDB is in cmd_len. sc_data_direction specifies the direction of data - * (to the device, from the device, or none at all). - * - * If data is to be transferred to or from the device the buffer(s) in the - * guest memory is/are specified via one or multiple scsiif_request_segment - * descriptors each specifying a memory page via a grant_ref_t, a offset into - * the page and the length of the area in that page. All scsiif_request_segment - * areas concatenated form the resulting data buffer used by the operation. - * If the number of scsiif_request_segment areas is not too large (less than - * or equal VSCSIIF_SG_TABLESIZE) the areas can be specified directly in the - * seg[] array and the number of valid scsiif_request_segment elements is to be - * set in nr_segments. - * - * If "feature-sg-grant" in the Xenstore is set it is possible to specify more - * than VSCSIIF_SG_TABLESIZE scsiif_request_segment elements via indirection. - * The maximum number of allowed scsiif_request_segment elements is the value - * of the "feature-sg-grant" entry from Xenstore. When using indirection the - * seg[] array doesn't contain specifications of the data buffers, but - * references to scsiif_request_segment arrays, which in turn reference the - * data buffers. While nr_segments holds the number of populated seg[] entries - * (plus the set VSCSIIF_SG_GRANT bit), the number of scsiif_request_segment - * elements referencing the target data buffers is calculated from the lengths - * of the seg[] elements (the sum of all valid seg[].length divided by the - * size of one scsiif_request_segment structure). The frontend may use a mix of - * direct and indirect requests. - */ -#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 - -/* - * Request a device reset of the specified target (channel and id). - */ -#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 - -/* - * Maximum scatter/gather segments per request. - * - * Considering balance between allocating at least 16 "vscsiif_request" - * structures on one page (4096 bytes) and the number of scatter/gather - * elements needed, we decided to use 26 as a magic number. - * - * If "feature-sg-grant" is set, more scatter/gather elements can be specified - * by placing them in one or more (up to VSCSIIF_SG_TABLESIZE) granted pages. - * 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 - -/* - * based on Linux kernel 2.6.18, still valid - * - * Changing these values requires support of multiple protocols via the rings - * 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 - -struct scsiif_request_segment { - grant_ref_t gref; - uint16_t offset; - uint16_t length; -}; -typedef struct scsiif_request_segment vscsiif_segment_t; - -#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 */ - - 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 */ -/* - * 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 - - vscsiif_segment_t seg[VSCSIIF_SG_TABLESIZE]; - uint32_t reserved[3]; -}; -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)) - -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 */ - vscsiif_segment_t seg[VSCSIIF_SG_LIST_SIZE]; -}; -typedef struct vscsiif_sg_list vscsiif_sg_list_t; -/* End of deprecated interface */ - -/* 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 */ - 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 reserved[36]; -}; -typedef struct vscsiif_response vscsiif_response_t; - -DEFINE_RING_TYPES(vscsiif, struct vscsiif_request, struct vscsiif_response); - - -#endif /*__XEN__PUBLIC_IO_SCSI_H__*/ -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/xenbus.h b/plat/xen/include/xen/io/xenbus.h deleted file mode 100644 index 927f9db5528798fca00455fdd687662d68b18b2e..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/xenbus.h +++ /dev/null @@ -1,80 +0,0 @@ -/***************************************************************************** - * xenbus.h - * - * Xenbus protocol details. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2005 XenSource Ltd. - */ - -#ifndef _XEN_PUBLIC_IO_XENBUS_H -#define _XEN_PUBLIC_IO_XENBUS_H - -/* - * The state of either end of the Xenbus, i.e. the current communication - * status of initialisation across the bus. States here imply nothing about - * the state of the connection between the driver and the kernel's device - * layers. - */ -enum xenbus_state { - XenbusStateUnknown = 0, - - XenbusStateInitialising = 1, - - /* - * InitWait: Finished early initialisation but waiting for information - * from the peer or hotplug scripts. - */ - XenbusStateInitWait = 2, - - /* - * Initialised: Waiting for a connection from the peer. - */ - XenbusStateInitialised = 3, - - XenbusStateConnected = 4, - - /* - * Closing: The device is being closed due to an error or an unplug event. - */ - XenbusStateClosing = 5, - - XenbusStateClosed = 6, - - /* - * Reconfiguring: The device is being reconfigured. - */ - XenbusStateReconfiguring = 7, - - XenbusStateReconfigured = 8 -}; -typedef enum xenbus_state XenbusState; - -#endif /* _XEN_PUBLIC_IO_XENBUS_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/io/xs_wire.h b/plat/xen/include/xen/io/xs_wire.h deleted file mode 100644 index 4dd6632669619a5137fe2069d881b12c399ccc6f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/io/xs_wire.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Details of the "wire" protocol between Xen Store Daemon and client - * library or guest kernel. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2005 Rusty Russell IBM Corporation - */ - -#ifndef _XS_WIRE_H -#define _XS_WIRE_H - -enum xsd_sockmsg_type -{ - XS_CONTROL, -#define XS_DEBUG XS_CONTROL - XS_DIRECTORY, - XS_READ, - XS_GET_PERMS, - XS_WATCH, - XS_UNWATCH, - XS_TRANSACTION_START, - XS_TRANSACTION_END, - XS_INTRODUCE, - XS_RELEASE, - XS_GET_DOMAIN_PATH, - XS_WRITE, - XS_MKDIR, - XS_RM, - XS_SET_PERMS, - XS_WATCH_EVENT, - XS_ERROR, - XS_IS_DOMAIN_INTRODUCED, - XS_RESUME, - XS_SET_TARGET, - /* XS_RESTRICT has been removed */ - XS_RESET_WATCHES = XS_SET_TARGET + 2, - XS_DIRECTORY_PART, - - 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_CREATE_EXCL "CREATE|EXCL" - -/* We hand errors as strings, for portability. */ -struct xsd_errors -{ - int errnum; - const char *errstring; -}; -#ifdef EINVAL -#define XSD_ERROR(x) { x, #x } -/* LINTED: static unused */ -static struct xsd_errors xsd_errors[] -#if defined(__GNUC__) -__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) -}; -#endif - -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. */ - - /* Generally followed by nul-terminated string(s). */ -}; - -enum xs_watch_type -{ - XS_WATCH_PATH = 0, - XS_WATCH_TOKEN -}; - -/* - * `incontents 150 xenstore_struct XenStore wire protocol. - * - * 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)) -struct xenstore_domain_interface { - char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */ - char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */ - XENSTORE_RING_IDX req_cons, req_prod; - XENSTORE_RING_IDX rsp_cons, rsp_prod; - uint32_t server_features; /* Bitmap of features supported by the server */ - uint32_t connection; -}; - -/* Violating this is very bad. See docs/misc/xenstore.txt. */ -#define XENSTORE_PAYLOAD_MAX 4096 - -/* Violating these just gets you an error back */ -#define XENSTORE_ABS_PATH_MAX 3072 -#define XENSTORE_REL_PATH_MAX 2048 - -/* The ability to reconnect a ring */ -#define XENSTORE_SERVER_FEATURE_RECONNECTION 1 - -/* Valid values for the connection field */ -#define XENSTORE_CONNECTED 0 /* the steady-state */ -#define XENSTORE_RECONNECT 1 /* guest has initiated a reconnect */ - -#endif /* _XS_WIRE_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/kexec.h b/plat/xen/include/xen/kexec.h deleted file mode 100644 index 74ea981ab26f5fd180ada445313689f89aa5334e..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/kexec.h +++ /dev/null @@ -1,263 +0,0 @@ -/****************************************************************************** - * kexec.h - Public portion - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Xen port written by: - * - Simon 'Horms' Horman - * - Magnus Damm - */ - -#ifndef _XEN_PUBLIC_KEXEC_H -#define _XEN_PUBLIC_KEXEC_H - - -/* This file describes the Kexec / Kdump hypercall interface for Xen. - * - * Kexec under vanilla Linux allows a user to reboot the physical machine - * into a new user-specified kernel. The Xen port extends this idea - * to allow rebooting of the machine from dom0. When kexec for dom0 - * is used to reboot, both the hypervisor and the domains get replaced - * with some other kernel. It is possible to kexec between vanilla - * Linux and Xen and back again. Xen to Xen works well too. - * - * The hypercall interface for kexec can be divided into three main - * types of hypercall operations: - * - * 1) Range information: - * This is used by the dom0 kernel to ask the hypervisor about various - * address information. This information is needed to allow kexec-tools - * to fill in the ELF headers for /proc/vmcore properly. - * - * 2) Load and unload of images: - * There are no big surprises here, the kexec binary from kexec-tools - * runs in userspace in dom0. The tool loads/unloads data into the - * dom0 kernel such as new kernel, initramfs and hypervisor. When - * loaded the dom0 kernel performs a load hypercall operation, and - * before releasing all page references the dom0 kernel calls unload. - * - * 3) Kexec operation: - * This is used to start a previously loaded kernel. - */ - -#include "xen.h" - -#if defined(__i386__) || defined(__x86_64__) -#define KEXEC_XEN_NO_PAGES 17 -#endif - -/* - * Prototype for this hypercall is: - * int kexec_op(int cmd, void *args) - * @cmd == KEXEC_CMD_... - * KEXEC operation to perform - * @args == Operation-specific extra arguments (NULL if none). - */ - -/* - * Kexec supports two types of operation: - * - kexec into a regular kernel, very similar to a standard reboot - * - KEXEC_TYPE_DEFAULT is used to specify this type - * - kexec into a special "crash kernel", aka kexec-on-panic - * - KEXEC_TYPE_CRASH is used to specify this type - * - parts of our system may be broken at kexec-on-panic time - * - the code should be kept as simple and self-contained as possible - */ - -#define KEXEC_TYPE_DEFAULT 0 -#define KEXEC_TYPE_CRASH 1 - - -/* The kexec implementation for Xen allows the user to load two - * types of kernels, KEXEC_TYPE_DEFAULT and KEXEC_TYPE_CRASH. - * All data needed for a kexec reboot is kept in one xen_kexec_image_t - * per "instance". The data mainly consists of machine address lists to pages - * together with destination addresses. The data in xen_kexec_image_t - * is passed to the "code page" which is one page of code that performs - * the final relocations before jumping to the new kernel. - */ - -typedef struct xen_kexec_image { -#if defined(__i386__) || defined(__x86_64__) - unsigned long page_list[KEXEC_XEN_NO_PAGES]; -#endif - unsigned long indirection_page; - unsigned long start_address; -} xen_kexec_image_t; - -/* - * Perform kexec having previously loaded a kexec or kdump kernel - * as appropriate. - * type == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in] - * - * Control is transferred to the image entry point with the host in - * the following state. - * - * - The image may be executed on any PCPU and all other PCPUs are - * stopped. - * - * - Local interrupts are disabled. - * - * - Register values are undefined. - * - * - The image segments have writeable 1:1 virtual to machine - * mappings. The location of any page tables is undefined and these - * page table frames are not be mapped. - */ -#define KEXEC_CMD_kexec 0 -typedef struct xen_kexec_exec { - int type; -} xen_kexec_exec_t; - -/* - * Load/Unload kernel image for kexec or kdump. - * 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 */ -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 */ - -/* - * Find the address and size of certain memory areas - * range == KEXEC_RANGE_... [in] - * nr == physical CPU number (starting from 0) if KEXEC_RANGE_MA_CPU [in] - * 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 -typedef struct xen_kexec_range { - int range; - int nr; - unsigned long size; - unsigned long start; -} xen_kexec_range_t; - -#if __XEN_INTERFACE_VERSION__ >= 0x00040400 -/* - * A contiguous chunk of a kexec image and it's destination machine - * address. - */ -typedef struct xen_kexec_segment { - union { - XEN_GUEST_HANDLE(const_void) h; - uint64_t _pad; - } buf; - uint64_t buf_size; - uint64_t dest_maddr; - uint64_t dest_size; -} xen_kexec_segment_t; -DEFINE_XEN_GUEST_HANDLE(xen_kexec_segment_t); - -/* - * Load a kexec image into memory. - * - * For KEXEC_TYPE_DEFAULT images, the segments may be anywhere in RAM. - * The image is relocated prior to being executed. - * - * For KEXEC_TYPE_CRASH images, each segment of the image must reside - * in the memory region reserved for kexec (KEXEC_RANGE_MA_CRASH) and - * the entry point must be within the image. The caller is responsible - * for ensuring that multiple images do not overlap. - * - * All image segments will be loaded to their destination machine - * addresses prior to being executed. The trailing portion of any - * segments with a source buffer (from dest_maddr + buf_size to - * dest_maddr + dest_size) will be zeroed. - * - * Segments with no source buffer will be accessible to the image when - * it is executed. - */ - -#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_*). */ - uint32_t nr_segments; - union { - XEN_GUEST_HANDLE(xen_kexec_segment_t) h; - uint64_t _pad; - } segments; - uint64_t entry_maddr; /* image entry point machine address. */ -} xen_kexec_load_t; -DEFINE_XEN_GUEST_HANDLE(xen_kexec_load_t); - -/* - * Unload a kexec image. - * - * Type must be one of KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH. - */ -#define KEXEC_CMD_kexec_unload 5 -typedef struct xen_kexec_unload { - uint8_t type; -} xen_kexec_unload_t; -DEFINE_XEN_GUEST_HANDLE(xen_kexec_unload_t); - -/* - * Figure out whether we have an image loaded. A return value of - * zero indicates no image loaded. A return value of one - * indicates an image is loaded. A negative return value - * indicates an error. - * - * Type must be one of KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH. - */ -#define KEXEC_CMD_kexec_status 6 -typedef struct xen_kexec_status { - uint8_t type; -} xen_kexec_status_t; -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_unload KEXEC_CMD_kexec_unload_v1 -#define xen_kexec_load xen_kexec_load_v1 -#define xen_kexec_load_t xen_kexec_load_v1_t - -#endif - -#endif /* _XEN_PUBLIC_KEXEC_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/memory.h b/plat/xen/include/xen/memory.h deleted file mode 100644 index 29386df98b018921d98bf39a64b1518330192564..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/memory.h +++ /dev/null @@ -1,665 +0,0 @@ -/****************************************************************************** - * memory.h - * - * Memory reservation and information. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_MEMORY_H__ -#define __XEN_PUBLIC_MEMORY_H__ - -#include "xen.h" -#include "physdev.h" - -/* - * Increase or decrease the specified domain's memory reservation. Returns the - * number of extents successfully allocated or freed. - * arg == addr of struct xen_memory_reservation. - */ -#define XENMEM_increase_reservation 0 -#define XENMEM_decrease_reservation 1 -#define XENMEM_populate_physmap 6 - -#if __XEN_INTERFACE_VERSION__ >= 0x00030209 -/* - * Maximum # bits addressable by the user of the allocated region (e.g., I/O - * devices often have a 32-bit limitation even in 64-bit systems). If zero - * then the user has no addressing restriction. This field is not used by - * XENMEM_decrease_reservation. - */ -#define XENMEMF_address_bits(x) (x) -#define XENMEMF_get_address_bits(x) ((x) & 0xffu) -/* NUMA node to allocate from. */ -#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) -/* Flag to request allocation only from the node specified */ -#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) -#endif - -struct xen_memory_reservation { - - /* - * XENMEM_increase_reservation: - * OUT: MFN (*not* GMFN) bases of extents that were allocated - * XENMEM_decrease_reservation: - * IN: GMFN bases of extents to free - * XENMEM_populate_physmap: - * IN: GPFN bases of extents to populate with memory - * OUT: GMFN bases of extents that were allocated - * (NB. This command also updates the mach_to_phys translation table) - * XENMEM_claim_pages: - * IN: must be zero - */ - 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; - -#if __XEN_INTERFACE_VERSION__ >= 0x00030209 - /* XENMEMF flags. */ - unsigned int mem_flags; -#else - unsigned int address_bits; -#endif - - /* - * Domain whose reservation is being changed. - * Unprivileged domains can specify only DOMID_SELF. - */ - domid_t domid; -}; -typedef struct xen_memory_reservation xen_memory_reservation_t; -DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t); - -/* - * An atomic exchange of memory pages. If return code is zero then - * @out.extent_list provides GMFNs of the newly-allocated memory. - * Returns zero on complete success, otherwise a negative error code. - * On complete success then always @nr_exchanged == @in.nr_extents. - * On partial success @nr_exchanged indicates how much work was done. - * - * Note that only PV guests can use this operation. - */ -#define XENMEM_exchange 11 -struct xen_memory_exchange { - /* - * [IN] Details of memory extents to be exchanged (GMFN bases). - * Note that @in.address_bits is ignored and unused. - */ - struct xen_memory_reservation in; - - /* - * [IN/OUT] Details of new memory extents. - * We require that: - * 1. @in.domid == @out.domid - * 2. @in.nr_extents << @in.extent_order == - * @out.nr_extents << @out.extent_order - * 3. @in.extent_start and @out.extent_start lists must not overlap - * 4. @out.extent_start lists GPFN bases to be populated - * 5. @out.extent_start is overwritten with allocated GMFN bases - */ - struct xen_memory_reservation out; - - /* - * [OUT] Number of input extents that were successfully exchanged: - * 1. The first @nr_exchanged input extents were successfully - * deallocated. - * 2. The corresponding first entries in the output extent list correctly - * indicate the GMFNs that were successfully exchanged. - * 3. All other input and output extents are untouched. - * 4. If not all input exents are exchanged then the return code of this - * command will be non-zero. - * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! - */ - xen_ulong_t nr_exchanged; -}; -typedef struct xen_memory_exchange xen_memory_exchange_t; -DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t); - -/* - * Returns the maximum machine frame number of mapped RAM in this system. - * This command always succeeds (it never returns an error code). - * arg == NULL. - */ -#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 - -/* - * Returns the maximum GPFN in use by the guest, or -ve errcode on failure. - */ -#define XENMEM_maximum_gpfn 14 - -/* - * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys - * mapping table. Architectures which do not have a m2p table do not implement - * this command. - * arg == addr of xen_machphys_mfn_list_t. - */ -#define XENMEM_machphys_mfn_list 5 -struct xen_machphys_mfn_list { - /* - * Size of the 'extent_start' array. Fewer entries will be filled if the - * machphys table is smaller than max_extents * 2MB. - */ - unsigned int max_extents; - - /* - * Pointer to buffer to fill with list of extent starts. If there are - * any large discontiguities in the machine address space, 2MB gaps in - * the machphys table will be represented by an MFN base of zero. - */ - XEN_GUEST_HANDLE(xen_pfn_t) extent_start; - - /* - * Number of extents written to the above array. This will be smaller - * than 'max_extents' if the machphys table is smaller than max_e * 2MB. - */ - unsigned int nr_extents; -}; -typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t; -DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t); - -/* - * For a compat caller, this is identical to XENMEM_machphys_mfn_list. - * - * For a non compat caller, this functions similarly to - * XENMEM_machphys_mfn_list, but returns the mfns making up the compatibility - * m2p table. - */ -#define XENMEM_machphys_compat_mfn_list 25 - -/* - * Returns the location in virtual address space of the machine_to_phys - * mapping table. Architectures which do not have a m2p table, or which do not - * 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 -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. */ -}; -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. */ -/* ` } */ - -/* - * Sets the GPFN at which a particular page appears in the specified guest's - * pseudophysical address space. - * arg == addr of xen_add_to_physmap_t. - */ -#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; - - unsigned int space; /* => enum phys_map_space */ - -#define XENMAPIDX_grant_table_status 0x80000000 - - /* Index into space being mapped. */ - xen_ulong_t idx; - - /* GPFN in domid where the source mapping page should appear. */ - xen_pfn_t gpfn; -}; -typedef struct xen_add_to_physmap xen_add_to_physmap_t; -DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t); - -/* A batched version of add_to_physmap. */ -#define XENMEM_add_to_physmap_batch 23 -struct xen_add_to_physmap_batch { - /* IN */ - /* Which domain to change the mapping for. */ - domid_t domid; - uint16_t space; /* => enum phys_map_space */ - - /* Number of pages to go through */ - uint16_t size; - -#if __XEN_INTERFACE_VERSION__ < 0x00040700 - domid_t foreign_domid; /* IFF gmfn_foreign. Should be 0 for other spaces. */ -#else - union xen_add_to_physmap_batch_extra { - domid_t foreign_domid; /* gmfn_foreign */ - uint16_t res0; /* All the other spaces. Should be 0 */ - } u; -#endif - - /* Indexes into space being mapped. */ - XEN_GUEST_HANDLE(xen_ulong_t) idxs; - - /* GPFN in domid where the source mapping page should appear. */ - XEN_GUEST_HANDLE(xen_pfn_t) gpfns; - - /* OUT */ - - /* Per index error code. */ - XEN_GUEST_HANDLE(int) errs; -}; -typedef struct xen_add_to_physmap_batch xen_add_to_physmap_batch_t; -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 -typedef struct xen_add_to_physmap_batch xen_add_to_physmap_range_t; -DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_range_t); -#endif - -/* - * Unmaps the page appearing at a particular GPFN from the specified guest's - * pseudophysical address space. - * arg == addr of xen_remove_from_physmap_t. - */ -#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; -}; -typedef struct xen_remove_from_physmap xen_remove_from_physmap_t; -DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t); - -/*** REMOVED ***/ -/*#define XENMEM_translate_gpfn_list 8*/ - -/* - * Returns the pseudo-physical memory map as it was when the domain - * was started (specified by XENMEM_set_memory_map). - * arg == addr of xen_memory_map_t. - */ -#define XENMEM_memory_map 9 -struct xen_memory_map { - /* - * On call the number of entries which can be stored in buffer. On - * return the number of entries which have been stored in - * buffer. - */ - unsigned int nr_entries; - - /* - * Entries in the buffer are in the same format as returned by the - * BIOS INT 0x15 EAX=0xE820 call. - */ - XEN_GUEST_HANDLE(void) buffer; -}; -typedef struct xen_memory_map xen_memory_map_t; -DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t); - -/* - * Returns the real physical memory map. Passes the same structure as - * XENMEM_memory_map. - * Specifying buffer as NULL will return the number of entries required - * to store the complete memory map. - * arg == addr of xen_memory_map_t. - */ -#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 -struct xen_foreign_memory_map { - domid_t domid; - struct xen_memory_map 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 -struct xen_pod_target { - /* IN */ - uint64_t target_pages; - /* OUT */ - uint64_t tot_pages; - uint64_t pod_cache_pages; - uint64_t pod_entries; - /* IN */ - domid_t domid; -}; -typedef struct xen_pod_target xen_pod_target_t; - -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#ifndef uint64_aligned_t -#define uint64_aligned_t uint64_t -#endif - -/* - * 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_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; - - /* PAGING_PREP IN: buffer to immediately fill page in */ - uint64_aligned_t buffer; - /* Other OPs */ - 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 -/* - * 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. - * - * #define XENMEM_access_op_enable_emulate 2 - * #define XENMEM_access_op_disable_emulate 3 - */ -#define XENMEM_access_op_set_access_multi 4 - -typedef enum { - XENMEM_access_n, - XENMEM_access_r, - XENMEM_access_w, - XENMEM_access_rw, - XENMEM_access_x, - XENMEM_access_rx, - XENMEM_access_wx, - XENMEM_access_rwx, - /* - * Page starts off as r-x, but automatically - * change to r-w on a write - */ - XENMEM_access_rx2rw, - /* - * Log access: starts off as n, automatically - * goes to rwx, generating an event without - * pausing the vcpu - */ - XENMEM_access_n2rwx, - /* Take the domain default */ - XENMEM_access_default -} xenmem_access_t; - -struct xen_mem_access_op { - /* XENMEM_access_op_* */ - uint8_t op; - /* xenmem_access_t */ - uint8_t access; - domid_t domid; - /* - * Number of pages for set op (or size of pfn_list for - * XENMEM_access_op_set_access_multi) - * Ignored on setting default access and other ops - */ - uint32_t nr; - /* - * First pfn for set op - * pfn for get op - * ~0ull is used to set and get the default access for pages - */ - uint64_aligned_t pfn; - /* - * List of pfns to set access for - * Used only with XENMEM_access_op_set_access_multi - */ - XEN_GUEST_HANDLE(const_uint64) pfn_list; - /* - * Corresponding list of access settings for pfn_list - * Used only with XENMEM_access_op_set_access_multi - */ - XEN_GUEST_HANDLE(const_uint8) access_list; -}; -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_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_MAKE_GREF(field, val) \ - (field) = (XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG | val) -#define XENMEM_SHARING_OP_FIELD_IS_GREF(field) \ - ((field) & XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG) -#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; - - union { - 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 */ - } u; - 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 */ - uint64_aligned_t source_handle; /* IN: handle to the source page */ - 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 */ - } 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 */ - } range; - 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 */ - } u; - } debug; - } u; -}; -typedef struct xen_mem_sharing_op xen_mem_sharing_op_t; -DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t); - -/* - * Attempt to stake a claim for a domain on a quantity of pages - * of system RAM, but _not_ assign specific pageframes. Only - * arithmetic is performed so the hypercall is very fast and need - * not be preemptible, thus sidestepping time-of-check-time-of-use - * races for memory allocation. Returns 0 if the hypervisor page - * allocator has atomically and successfully claimed the requested - * number of pages, else non-zero. - * - * Any domain may have only one active claim. When sufficient memory - * has been allocated to resolve the claim, the claim silently expires. - * Claiming zero pages effectively resets any outstanding claim and - * is always successful. - * - * Note that a valid claim may be staked even after memory has been - * allocated for a domain. In this case, the claim is not incremental, - * i.e. if the domain's tot_pages is 3, and a claim is staked for 10, - * only 7 additional pages are claimed. - * - * Caller must be privileged or the hypercall fails. - */ -#define XENMEM_claim_pages 24 - -/* - * XENMEM_claim_pages flags - the are no flags at this time. - * The zero value is appropriate. - */ - -/* - * With some legacy devices, certain guest-physical addresses cannot safely - * 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 -struct xen_reserved_device_memory { - xen_pfn_t start_pfn; - xen_ulong_t nr_pages; -}; -typedef struct xen_reserved_device_memory xen_reserved_device_memory_t; -DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_t); - -struct xen_reserved_device_memory_map { -#define XENMEM_RDM_ALL 1 /* Request all regions (ignore dev union). */ - /* IN */ - uint32_t flags; - /* - * IN/OUT - * - * Gets set to the required number of entries when too low, - * signaled by error code -ERANGE. - */ - unsigned int nr_entries; - /* OUT */ - XEN_GUEST_HANDLE(xen_reserved_device_memory_t) buffer; - /* IN */ - union { - struct physdev_pci_device pci; - } dev; -}; -typedef struct xen_reserved_device_memory_map xen_reserved_device_memory_map_t; -DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_map_t); - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ - -/* - * XENMEM_get_vnumainfo used by guest to get - * vNUMA topology from hypervisor. - */ -#define XENMEM_get_vnumainfo 26 - -/* vNUMA node memory ranges */ -struct xen_vmemrange { - uint64_t start, end; - unsigned int flags; - unsigned int nid; -}; -typedef struct xen_vmemrange xen_vmemrange_t; -DEFINE_XEN_GUEST_HANDLE(xen_vmemrange_t); - -/* - * vNUMA topology specifies vNUMA node number, distance table, - * memory ranges and vcpu mapping provided for guests. - * XENMEM_get_vnumainfo hypercall expects to see from guest - * nr_vnodes, nr_vmemranges and nr_vcpus to indicate available memory. - * After filling guests structures, nr_vnodes, nr_vmemranges and nr_vcpus - * copied back to guest. Domain returns expected values of nr_vnodes, - * nr_vmemranges and nr_vcpus to guest if the values where incorrect. - */ -struct xen_vnuma_topology_info { - /* IN */ - domid_t domid; - uint16_t pad; - /* IN/OUT */ - unsigned int nr_vnodes; - unsigned int nr_vcpus; - unsigned int nr_vmemranges; - /* OUT */ - union { - XEN_GUEST_HANDLE(uint) h; - uint64_t pad; - } vdistance; - union { - XEN_GUEST_HANDLE(uint) h; - uint64_t pad; - } vcpu_to_vnode; - union { - XEN_GUEST_HANDLE(xen_vmemrange_t) h; - uint64_t pad; - } vmemrange; -}; -typedef struct xen_vnuma_topology_info xen_vnuma_topology_info_t; -DEFINE_XEN_GUEST_HANDLE(xen_vnuma_topology_info_t); - -/* Next available subop number is 28 */ - -#endif /* __XEN_PUBLIC_MEMORY_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/nmi.h b/plat/xen/include/xen/nmi.h deleted file mode 100644 index 604b2938eb7adff6004d5af75922f160db64efd4..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/nmi.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************** - * nmi.h - * - * NMI callback registration and reason codes. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_NMI_H__ -#define __XEN_PUBLIC_NMI_H__ - -#include "xen.h" - -/* - * 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) -#if __XEN_INTERFACE_VERSION__ < 0x00040300 /* legacy alias of the above */ - /* 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) - -/* - * long nmi_op(unsigned int cmd, void *arg) - * NB. All ops return zero on success, else a negative error code. - */ - -/* - * Register NMI callback for this (calling) VCPU. Currently this only makes - * sense for domain 0, vcpu 0. All other callers will be returned EINVAL. - * arg == pointer to xennmi_callback structure. - */ -#define XENNMI_register_callback 0 -struct xennmi_callback { - unsigned long handler_address; - unsigned long pad; -}; -typedef struct xennmi_callback xennmi_callback_t; -DEFINE_XEN_GUEST_HANDLE(xennmi_callback_t); - -/* - * Deregister NMI callback for this (calling) VCPU. - * arg == NULL. - */ -#define XENNMI_unregister_callback 1 - -#endif /* __XEN_PUBLIC_NMI_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/physdev.h b/plat/xen/include/xen/physdev.h deleted file mode 100644 index 0e5463562361f5069b9572f9f2da414411c973da..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/physdev.h +++ /dev/null @@ -1,387 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2006, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_PHYSDEV_H__ -#define __XEN_PUBLIC_PHYSDEV_H__ - -#include "xen.h" - -/* - * Prototype for this hypercall is: - * int physdev_op(int cmd, void *args) - * @cmd == PHYSDEVOP_??? (physdev operation). - * @args == Operation-specific extra arguments (NULL if none). - */ - -/* - * Notify end-of-interrupt (EOI) for the specified IRQ. - * @arg == pointer to physdev_eoi structure. - */ -#define PHYSDEVOP_eoi 12 -struct physdev_eoi { - /* IN */ - uint32_t irq; -}; -typedef struct physdev_eoi physdev_eoi_t; -DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t); - -/* - * Register a shared page for the hypervisor to indicate whether the guest - * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly - * once the guest used this function in that the associated event channel - * 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 -/* - * Register a shared page for the hypervisor to indicate whether the - * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to - * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of - * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by - * Xen's PIRQ value. - */ -#define PHYSDEVOP_pirq_eoi_gmfn_v2 28 -struct physdev_pirq_eoi_gmfn { - /* IN */ - xen_pfn_t gmfn; -}; -typedef struct physdev_pirq_eoi_gmfn physdev_pirq_eoi_gmfn_t; -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 -struct physdev_irq_status_query { - /* IN */ - uint32_t irq; - /* OUT */ - uint32_t flags; /* XENIRQSTAT_* */ -}; -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) - -/* IRQ shared by multiple guests? */ -#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 -struct physdev_set_iopl { - /* IN */ - uint32_t iopl; -}; -typedef struct physdev_set_iopl physdev_set_iopl_t; -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 -struct physdev_set_iobitmap { - /* IN */ -#if __XEN_INTERFACE_VERSION__ >= 0x00030205 - XEN_GUEST_HANDLE(uint8) bitmap; -#else - uint8_t *bitmap; -#endif - uint32_t nr_ports; -}; -typedef struct physdev_set_iobitmap physdev_set_iobitmap_t; -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 -struct physdev_apic { - /* IN */ - unsigned long apic_physbase; - uint32_t reg; - /* IN or OUT */ - uint32_t value; -}; -typedef struct physdev_apic physdev_apic_t; -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 -struct physdev_irq { - /* IN */ - uint32_t irq; - /* IN or OUT */ - uint32_t vector; -}; -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 PHYSDEVOP_map_pirq 13 -struct physdev_map_pirq { - domid_t domid; - /* IN */ - int type; - /* IN (ignored for ..._MULTI_MSI) */ - int index; - /* IN or OUT */ - int pirq; - /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */ - int bus; - /* IN */ - int devfn; - /* IN (also OUT for ..._MULTI_MSI) */ - int entry_nr; - /* IN */ - uint64_t table_base; -}; -typedef struct physdev_map_pirq physdev_map_pirq_t; -DEFINE_XEN_GUEST_HANDLE(physdev_map_pirq_t); - -#define PHYSDEVOP_unmap_pirq 14 -struct physdev_unmap_pirq { - domid_t domid; - /* IN */ - int 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 -struct physdev_manage_pci { - /* IN */ - uint8_t bus; - uint8_t devfn; -}; - -typedef struct physdev_manage_pci physdev_manage_pci_t; -DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_t); - -#define PHYSDEVOP_restore_msi 19 -struct physdev_restore_msi { - /* IN */ - uint8_t bus; - uint8_t devfn; -}; -typedef struct physdev_restore_msi physdev_restore_msi_t; -DEFINE_XEN_GUEST_HANDLE(physdev_restore_msi_t); - -#define PHYSDEVOP_manage_pci_add_ext 20 -struct physdev_manage_pci_ext { - /* IN */ - uint8_t bus; - uint8_t devfn; - unsigned is_extfn; - unsigned is_virtfn; - struct { - uint8_t bus; - uint8_t devfn; - } physfn; -}; - -typedef struct physdev_manage_pci_ext physdev_manage_pci_ext_t; -DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_ext_t); - -/* - * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op() - * hypercall since 0x00030202. - */ -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; - } u; -}; -typedef struct physdev_op physdev_op_t; -DEFINE_XEN_GUEST_HANDLE(physdev_op_t); - -#define PHYSDEVOP_setup_gsi 21 -struct physdev_setup_gsi { - int gsi; - /* IN */ - uint8_t triggering; - /* IN */ - uint8_t polarity; - /* IN */ -}; - -typedef struct physdev_setup_gsi physdev_setup_gsi_t; -DEFINE_XEN_GUEST_HANDLE(physdev_setup_gsi_t); - -/* leave PHYSDEVOP 22 free */ - -/* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI - * the hypercall returns a free pirq */ -#define PHYSDEVOP_get_free_pirq 23 -struct physdev_get_free_pirq { - /* IN */ - int type; - /* OUT */ - uint32_t 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 PHYSDEVOP_pci_mmcfg_reserved 24 -struct physdev_pci_mmcfg_reserved { - uint64_t address; - uint16_t segment; - uint8_t start_bus; - uint8_t end_bus; - uint32_t flags; -}; -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 PHYSDEVOP_pci_device_add 25 -struct physdev_pci_device_add { - /* IN */ - uint16_t seg; - uint8_t bus; - uint8_t devfn; - uint32_t flags; - struct { - uint8_t bus; - uint8_t devfn; - } physfn; - /* - * Optional parameters array. - * First element ([0]) is PXM domain associated with the device (if - * XEN_PCI_DEV_PXM is set) - */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - uint32_t optarr[]; -#elif defined(__GNUC__) - uint32_t optarr[0]; -#endif -}; -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 -/* - * 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 -struct physdev_pci_device { - /* IN */ - uint16_t seg; - uint8_t bus; - uint8_t devfn; -}; -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_BUS_UNKNOWN 0 -#define PHYSDEVOP_DBGP_BUS_PCI 1 - -#define PHYSDEVOP_dbgp_op 29 -struct physdev_dbgp_op { - /* IN */ - uint8_t op; - uint8_t bus; - union { - struct physdev_pci_device pci; - } u; -}; -typedef struct physdev_dbgp_op physdev_dbgp_op_t; -DEFINE_XEN_GUEST_HANDLE(physdev_dbgp_op_t); - -/* - * Notify that some PIRQ-bound event channels have been unmasked. - * ** This command is obsolete since interface version 0x00030202 and is ** - * ** unsupported by newer versions of Xen. ** - */ -#define PHYSDEVOP_IRQ_UNMASK_NOTIFY 4 - -#if __XEN_INTERFACE_VERSION__ < 0x00040600 -/* - * These all-capitals physdev operation names are superceded by the new names - * (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_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi -#define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared -#endif - -#if __XEN_INTERFACE_VERSION__ < 0x00040200 -#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v1 -#else -#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v2 -#endif - -#endif /* __XEN_PUBLIC_PHYSDEV_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/platform.h b/plat/xen/include/xen/platform.h deleted file mode 100644 index 94dbc3feb48ba2325183b7a38d11521eee7444d0..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/platform.h +++ /dev/null @@ -1,663 +0,0 @@ -/****************************************************************************** - * platform.h - * - * Hardware platform operations. Intended for use by domain-0 kernel. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_PLATFORM_H__ -#define __XEN_PUBLIC_PLATFORM_H__ - -#include "xen.h" - -#define XENPF_INTERFACE_VERSION 0x03000001 - -/* - * 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 -struct xenpf_settime32 { - /* IN variables. */ - uint32_t secs; - uint32_t nsecs; - uint64_t system_time; -}; -#define XENPF_settime64 62 -struct xenpf_settime64 { - /* IN variables. */ - uint64_t secs; - uint32_t nsecs; - uint32_t mbz; - uint64_t system_time; -}; -#if __XEN_INTERFACE_VERSION__ < 0x00040600 -#define XENPF_settime XENPF_settime32 -#define xenpf_settime xenpf_settime32 -#else -#define XENPF_settime XENPF_settime64 -#define xenpf_settime xenpf_settime64 -#endif -typedef struct xenpf_settime xenpf_settime_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_settime_t); - -/* - * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. - * On x86, @type is an architecture-defined MTRR memory type. - * On success, returns the MTRR that was used (@reg) and a handle that can - * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting. - * (x86-specific). - */ -#define XENPF_add_memtype 31 -struct xenpf_add_memtype { - /* IN variables. */ - xen_pfn_t mfn; - uint64_t nr_mfns; - uint32_t type; - /* OUT variables. */ - uint32_t handle; - uint32_t reg; -}; -typedef struct xenpf_add_memtype xenpf_add_memtype_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_add_memtype_t); - -/* - * Tear down an existing memory-range type. If @handle is remembered then it - * should be passed in to accurately tear down the correct setting (in case - * of overlapping memory regions with differing types). If it is not known - * then @handle should be set to zero. In all cases @reg must be set. - * (x86-specific). - */ -#define XENPF_del_memtype 32 -struct xenpf_del_memtype { - /* IN variables. */ - uint32_t handle; - uint32_t reg; -}; -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 -struct xenpf_read_memtype { - /* IN variables. */ - uint32_t reg; - /* OUT variables. */ - xen_pfn_t mfn; - uint64_t nr_mfns; - uint32_t type; -}; -typedef struct xenpf_read_memtype xenpf_read_memtype_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_read_memtype_t); - -#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. */ -}; -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 */ -struct xenpf_platform_quirk { - /* IN variables. */ - uint32_t quirk_id; -}; -typedef struct xenpf_platform_quirk xenpf_platform_quirk_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); - -#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 -#define XEN_EFI_set_wakeup_time 4 -#define XEN_EFI_get_next_high_monotonic_count 5 -#define XEN_EFI_get_variable 6 -#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 - -struct xenpf_efi_time { - uint16_t year; - uint8_t month; - uint8_t day; - uint8_t hour; - uint8_t min; - uint8_t sec; - uint32_t ns; - int16_t tz; - uint8_t daylight; -}; - -struct xenpf_efi_guid { - uint32_t data1; - uint16_t data2; - uint16_t data3; - uint8_t data4[8]; -}; - -struct xenpf_efi_runtime_call { - uint32_t function; - /* - * This field is generally used for per sub-function flags (defined - * below), except for the XEN_EFI_get_next_high_monotonic_count case, - * where it holds the single returned value. - */ - uint32_t misc; - xen_ulong_t status; - union { -#define XEN_EFI_GET_TIME_SET_CLEARS_NS 0x00000001 - struct { - struct xenpf_efi_time time; - uint32_t resolution; - uint32_t accuracy; - } get_time; - - struct xenpf_efi_time set_time; - -#define XEN_EFI_GET_WAKEUP_TIME_ENABLED 0x00000001 -#define XEN_EFI_GET_WAKEUP_TIME_PENDING 0x00000002 - struct xenpf_efi_time get_wakeup_time; - -#define XEN_EFI_SET_WAKEUP_TIME_ENABLE 0x00000001 -#define XEN_EFI_SET_WAKEUP_TIME_ENABLE_ONLY 0x00000002 - struct xenpf_efi_time set_wakeup_time; - -#define XEN_EFI_VARIABLE_NON_VOLATILE 0x00000001 -#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_ulong_t size; - XEN_GUEST_HANDLE(void) data; - struct xenpf_efi_guid vendor_guid; - } get_variable, set_variable; - - struct { - xen_ulong_t size; - 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 - struct { - uint32_t attr; - uint64_t max_store_size; - uint64_t remain_store_size; - uint64_t max_size; - } query_variable_info; - - struct { - XEN_GUEST_HANDLE(void) capsule_header_array; - xen_ulong_t capsule_count; - uint64_t max_capsule_size; - uint32_t reset_type; - } query_capsule_capabilities; - - struct { - XEN_GUEST_HANDLE(void) capsule_header_array; - xen_ulong_t capsule_count; - uint64_t sg_list; /* machine address */ - } update_capsule; - } u; -}; -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 -struct xenpf_firmware_info { - /* IN variables. */ - uint32_t type; - uint32_t index; - /* OUT variables. */ - 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 */ - /* 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 # */ - 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 */ - } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ - struct { - /* Int10, AX=4F15: Get EDID info. */ - uint8_t capabilities; - uint8_t edid_transfer_time; - /* must refer to 128-byte buffer */ - XEN_GUEST_HANDLE(uint8) edid; - } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ - union xenpf_efi_info { - uint32_t version; - struct { - 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 */ - } vendor; - struct { - uint64_t addr; - uint64_t size; - uint64_t attr; - uint32_t type; - } mem; - struct { - /* IN variables */ - uint16_t segment; - uint8_t bus; - uint8_t devfn; - uint16_t vendor; - uint16_t devid; - /* OUT variables */ - uint64_t address; - xen_ulong_t size; - } pci_rom; - struct { - /* OUT variables */ - uint64_t address; - xen_ulong_t size; - } apple_properties; - } efi_info; /* XEN_FW_EFI_INFO */ - - /* Int16, Fn02: Get keyboard shift flags. */ - uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ - } u; -}; -typedef struct xenpf_firmware_info xenpf_firmware_info_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_firmware_info_t); - -#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. */ -#else - 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). */ -#define XENPF_ACPI_SLEEP_EXTENDED 0x00000001 - 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 -struct xenpf_change_freq { - /* IN variables */ - uint32_t flags; /* Must be zero. */ - 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); - -/* - * Get idle times (nanoseconds since boot) for physical CPUs specified in the - * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is - * indexed by CPU number; only entries with the corresponding @cpumap_bitmap - * bit set are written to. On return, @cpumap_bitmap is modified so that any - * non-existent CPUs are cleared. Such CPUs have their @idletime array entry - * cleared. - */ -#define XENPF_getidletime 53 -struct xenpf_getidletime { - /* IN/OUT variables */ - /* IN: CPUs to interrogate; OUT: subset of IN which are present */ - XEN_GUEST_HANDLE(uint8) cpumap_bitmap; - /* IN variables */ - /* Size of cpumap bitmap. */ - uint32_t cpumap_nr_cpus; - /* Must be indexable for every cpu in cpumap_bitmap. */ - XEN_GUEST_HANDLE(uint64) idletime; - /* OUT variables */ - /* System time when the idletime snapshots were taken. */ - uint64_t now; -}; -typedef struct xenpf_getidletime xenpf_getidletime_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t); - -#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 - -/* cmd type */ -#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 - -struct xen_power_register { - 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 */ -}; -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 */ - 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; -}; - -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 */ - XEN_GUEST_HANDLE(xen_processor_cx_t) states; /* supported c states */ -}; - -struct xen_pct_register { - uint8_t descriptor; - uint16_t length; - 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 transition_latency; /* microseconds */ - uint64_t bus_master_latency; /* microseconds */ - 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); - -struct xen_psd_package { - uint64_t num_entries; - uint64_t revision; - uint64_t domain; - uint64_t coord_type; - uint64_t num_processors; -}; - -struct xen_processor_performance { - 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 */ - XEN_GUEST_HANDLE(xen_processor_px_t) states; - struct xen_psd_package domain_info; - 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} */ - 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 */ - } u; -}; -typedef struct xenpf_set_processor_pminfo xenpf_set_processor_pminfo_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_set_processor_pminfo_t); - -#define XENPF_get_cpuinfo 55 -struct xenpf_pcpuinfo { - /* IN */ - uint32_t xen_cpuid; - /* OUT */ - /* The maxium cpu_id that is present */ - uint32_t max_present; -#define XEN_PCPU_FLAGS_ONLINE 1 - /* Correponding xen_cpuid is not present*/ -#define XEN_PCPU_FLAGS_INVALID 2 - uint32_t flags; - uint32_t apic_id; - uint32_t acpi_id; -}; -typedef struct xenpf_pcpuinfo xenpf_pcpuinfo_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_pcpuinfo_t); - -#define XENPF_get_cpu_version 48 -struct xenpf_pcpu_version { - /* IN */ - uint32_t xen_cpuid; - /* OUT */ - /* The maxium cpu_id that is present */ - uint32_t max_present; - char vendor_id[12]; - uint32_t family; - uint32_t model; - uint32_t stepping; -}; -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 -{ - 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_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 XEN_CORE_PARKING_SET 1 -#define XEN_CORE_PARKING_GET 2 -struct xenpf_core_parking { - /* IN variables */ - uint32_t type; - /* IN variables: set cpu nums expected to be idled */ - /* OUT variables: get cpu nums actually be idled */ - uint32_t idle_nums; -}; -typedef struct xenpf_core_parking xenpf_core_parking_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t); - -/* - * Access generic platform resources(e.g., accessing MSR, port I/O, etc) - * in unified way. Batch resource operations in one call are supported and - * they are always non-preemptible and executed in their original order. - * The batch itself returns a negative integer for general errors, or a - * 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 XEN_RESOURCE_OP_MSR_READ 0 -#define XEN_RESOURCE_OP_MSR_WRITE 1 - -/* - * Specially handled MSRs: - * - MSR_IA32_TSC - * READ: Returns the scaled system time(ns) instead of raw timestamp. In - * multiple entry case, if other MSR read is followed by a MSR_IA32_TSC - * read, then both reads are guaranteed to be performed atomically (with - * IRQ disabled). The return time indicates the point of reading that MSR. - * WRITE: Not supported. - */ - -struct xenpf_resource_entry { - union { - 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 */ -}; -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 */ - 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 -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 variables */ - XEN_GUEST_HANDLE(char) name; - uint64_t address; - char type; -}; -typedef struct xenpf_symdata xenpf_symdata_t; -DEFINE_XEN_GUEST_HANDLE(xenpf_symdata_t); - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_platform_op(const struct xen_platform_op*); - */ -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_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]; - } u; -}; -typedef struct xen_platform_op xen_platform_op_t; -DEFINE_XEN_GUEST_HANDLE(xen_platform_op_t); - -#endif /* __XEN_PUBLIC_PLATFORM_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/pmu.h b/plat/xen/include/xen/pmu.h deleted file mode 100644 index 0e1312cfe50d6b924ea07dad8c8aaaf9ec9bde78..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/pmu.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved. - */ - -#ifndef __XEN_PUBLIC_PMU_H__ -#define __XEN_PUBLIC_PMU_H__ - -#include "xen.h" -#if defined(__i386__) || defined(__x86_64__) -#include "arch-x86/pmu.h" -#elif defined (__arm__) || defined (__aarch64__) -#include "arch-arm.h" -#else -#error "Unsupported architecture" -#endif - -#define XENPMU_VER_MAJ 0 -#define XENPMU_VER_MIN 1 - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_xenpmu_op(enum xenpmu_op cmd, struct xenpmu_params *args); - * - * @cmd == XENPMU_* (PMU operation) - * @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 */ -/* ` } */ - -/* Parameters structure for HYPERVISOR_xenpmu_op call */ -struct xen_pmu_params { - /* IN/OUT parameters */ - struct { - uint32_t maj; - uint32_t min; - } version; - uint64_t val; - - /* IN parameters */ - uint32_t vcpu; - uint32_t pad; -}; -typedef struct xen_pmu_params xen_pmu_params_t; -DEFINE_XEN_GUEST_HANDLE(xen_pmu_params_t); - -/* PMU modes: - * - XENPMU_MODE_OFF: No PMU virtualization - * - XENPMU_MODE_SELF: Guests can profile themselves - * - XENPMU_MODE_HV: Guests can profile themselves, dom0 profiles - * itself and Xen - * - 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) - -/* - * PMU features: - * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD) - * - XENPMU_FEATURE_IPC_ONLY: Restrict PMCs to the most minimum set possible. - * Instructions, cycles, and ref cycles. Can be - * used to calculate instructions-per-cycle (IPC) - * (ignored on AMD). - * - XENPMU_FEATURE_ARCH_ONLY: Restrict PMCs to the Intel Pre-Defined - * Architectural Performance Events exposed by - * 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) - -/* - * Shared PMU data between hypervisor and PV(H) domains. - * - * The hypervisor fills out this structure during PMU interrupt and sends an - * interrupt to appropriate VCPU. - * Architecture-independent fields of xen_pmu_data are WO for the hypervisor - * and RO for the guest but some fields in xen_pmu_arch can be writable - * by both the hypervisor and the guest (see arch-$arch/pmu.h). - */ -struct xen_pmu_data { - /* Interrupted VCPU */ - uint32_t vcpu_id; - - /* - * Physical processor on which the interrupt occurred. On non-privileged - * guests set to vcpu_id; - */ - uint32_t pcpu_id; - - /* - * Domain that was interrupted. On non-privileged guests set to DOMID_SELF. - * 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; - - uint8_t pad[6]; - - /* Architecture-specific information */ - struct xen_pmu_arch pmu; -}; - -#endif /* __XEN_PUBLIC_PMU_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/sched.h b/plat/xen/include/xen/sched.h deleted file mode 100644 index 811bd87c82e7e561318a4bfdf44f214651b2ea54..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/sched.h +++ /dev/null @@ -1,202 +0,0 @@ -/****************************************************************************** - * sched.h - * - * Scheduler state interactions - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_SCHED_H__ -#define __XEN_PUBLIC_SCHED_H__ - -#include "event_channel.h" - -/* - * `incontents 150 sched Guest Scheduler Operations - * - * The SCHEDOP interface provides mechanisms for a guest to interact - * with the scheduler, including yield, blocking and shutting itself - * down. - */ - -/* - * The prototype for this hypercall is: - * ` long HYPERVISOR_sched_op(enum sched_op cmd, void *arg, ...) - * - * @cmd == SCHEDOP_??? (scheduler operation). - * @arg == Operation-specific extra argument(s), as described below. - * ... == Additional Operation-specific extra arguments, described below. - * - * Versions of Xen prior to 3.0.2 provided only the following legacy version - * of this hypercall, supporting only the commands yield, block and shutdown: - * long sched_op(int cmd, unsigned long arg) - * @cmd == SCHEDOP_??? (scheduler operation). - * @arg == 0 (SCHEDOP_yield and SCHEDOP_block) - * == SHUTDOWN_* code (SCHEDOP_shutdown) - * - * This legacy version is available to new guests as: - * ` long HYPERVISOR_sched_op_compat(enum sched_op cmd, unsigned long arg) - */ - -/* ` enum sched_op { // SCHEDOP_* => struct sched_* */ -/* - * Voluntarily yield the CPU. - * @arg == NULL. - */ -#define SCHEDOP_yield 0 - -/* - * Block execution of this VCPU until an event is received for processing. - * If called with event upcalls masked, this operation will atomically - * reenable event delivery and check for pending events before blocking the - * VCPU. This avoids a "wakeup waiting" race. - * @arg == NULL. - */ -#define SCHEDOP_block 1 - -/* - * Halt execution of this domain (all VCPUs) and notify the system controller. - * @arg == pointer to sched_shutdown_t structure. - * - * If the sched_shutdown_t reason is SHUTDOWN_suspend then - * x86 PV guests must also set RDX (EDX for 32-bit guests) to the MFN - * of the guest's start info page. RDX/EDX is the third hypercall - * argument. - * - * In addition, which reason is SHUTDOWN_suspend this hypercall - * 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 - -/* - * 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 - -/* - * Declare a shutdown for another domain. The main use of this function is - * in interpreting shutdown requests and reasons for fully-virtualized - * domains. A para-virtualized domain may use SCHEDOP_shutdown directly. - * @arg == pointer to sched_remote_shutdown_t structure. - */ -#define SCHEDOP_remote_shutdown 4 - -/* - * Latch a shutdown code, so that when the domain later shuts down it - * reports this code to the control tools. - * @arg == sched_shutdown_t, as for SCHEDOP_shutdown. - */ -#define SCHEDOP_shutdown_code 5 - -/* - * Setup, poke and destroy a domain watchdog timer. - * @arg == pointer to sched_watchdog_t structure. - * With id == 0, setup a domain watchdog timer to cause domain shutdown - * after timeout, returns watchdog id. - * 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 - -/* - * Override the current vcpu affinity by pinning it to one physical cpu or - * undo this override restoring the previous affinity. - * @arg == pointer to sched_pin_override_t structure. - * - * A negative pcpu value will undo a previous pin override and restore the - * previous cpu affinity. - * This call is allowed for the hardware domain only and requires the cpu - * to be part of the domain's cpupool. - */ -#define SCHEDOP_pin_override 7 -/* ` } */ - -struct sched_shutdown { - unsigned int reason; /* SHUTDOWN_* => enum sched_shutdown_reason */ -}; -typedef struct sched_shutdown sched_shutdown_t; -DEFINE_XEN_GUEST_HANDLE(sched_shutdown_t); - -struct sched_poll { - XEN_GUEST_HANDLE(evtchn_port_t) ports; - unsigned int nr_ports; - uint64_t timeout; -}; -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 */ -}; -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 */ -}; -typedef struct sched_watchdog sched_watchdog_t; -DEFINE_XEN_GUEST_HANDLE(sched_watchdog_t); - -struct sched_pin_override { - int32_t pcpu; -}; -typedef struct sched_pin_override sched_pin_override_t; -DEFINE_XEN_GUEST_HANDLE(sched_pin_override_t); - -/* - * Reason codes for SCHEDOP_shutdown. These may be interpreted by control - * software to determine the appropriate action. For the most part, Xen does - * 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. */ - -/* - * Domain asked to perform 'soft reset' for it. The expected behavior is to - * reset internal Xen state for the domain returning it to the point where it - * was created but leaving the domain's memory contents and vCPU contexts - * intact. This will allow the domain to start over and set up all Xen specific - * interfaces again. - */ -#define SHUTDOWN_soft_reset 5 -#define SHUTDOWN_MAX 5 /* Maximum valid shutdown reason. */ -/* ` } */ - -#endif /* __XEN_PUBLIC_SCHED_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/sysctl.h b/plat/xen/include/xen/sysctl.h deleted file mode 100644 index 6140f1a059b28f915c5095f659fd334b211fabb7..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/sysctl.h +++ /dev/null @@ -1,1122 +0,0 @@ -/****************************************************************************** - * sysctl.h - * - * System management operations. For use by node control stack. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2002-2006, K Fraser - */ - -#ifndef __XEN_PUBLIC_SYSCTL_H__ -#define __XEN_PUBLIC_SYSCTL_H__ - -#if !defined(__XEN__) && !defined(__XEN_TOOLS__) -#error "sysctl operations are intended for use by node control tools only" -#endif - -#include "xen.h" -#include "domctl.h" -#include "physdev.h" -#include "tmem.h" - -#define XEN_SYSCTL_INTERFACE_VERSION 0x00000010 - -/* - * Read console content from Xen buffer ring. - */ -/* XEN_SYSCTL_readconsole */ -struct xen_sysctl_readconsole { - /* IN: Non-zero -> clear after reading. */ - uint8_t clear; - /* IN: Non-zero -> start index specified by @index field. */ - uint8_t incremental; - uint8_t pad0, pad1; - /* - * IN: Start index for consuming from ring buffer (if @incremental); - * OUT: End index after consuming from ring buffer. - */ - uint32_t index; - /* IN: Virtual address to write console data. */ - XEN_GUEST_HANDLE_64(char) buffer; - /* IN: Size of buffer; OUT: Bytes written to buffer. */ - uint32_t count; -}; - -/* Get trace buffers machine base address */ -/* XEN_SYSCTL_tbuf_op */ -struct xen_sysctl_tbuf_op { - /* IN variables */ -#define XEN_SYSCTL_TBUFOP_get_info 0 -#define XEN_SYSCTL_TBUFOP_set_cpu_mask 1 -#define XEN_SYSCTL_TBUFOP_set_evt_mask 2 -#define XEN_SYSCTL_TBUFOP_set_size 3 -#define XEN_SYSCTL_TBUFOP_enable 4 -#define XEN_SYSCTL_TBUFOP_disable 5 - uint32_t cmd; - /* IN/OUT variables */ - struct xenctl_bitmap cpu_mask; - uint32_t evt_mask; - /* OUT variables */ - uint64_aligned_t buffer_mfn; - uint32_t size; /* Also an IN variable! */ -}; - -/* - * Get physical information about the host machine - */ -/* XEN_SYSCTL_physinfo */ - /* (x86) The platform supports HVM guests. */ -#define _XEN_SYSCTL_PHYSCAP_hvm 0 -#define XEN_SYSCTL_PHYSCAP_hvm (1u<<_XEN_SYSCTL_PHYSCAP_hvm) - /* (x86) The platform supports HVM-guest direct access to I/O devices. */ -#define _XEN_SYSCTL_PHYSCAP_hvm_directio 1 -#define XEN_SYSCTL_PHYSCAP_hvm_directio (1u<<_XEN_SYSCTL_PHYSCAP_hvm_directio) -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 max_node_id; /* Largest possible node ID on this host */ - uint32_t cpu_khz; - uint32_t capabilities;/* XEN_SYSCTL_PHYSCAP_??? */ - uint64_aligned_t total_pages; - uint64_aligned_t free_pages; - uint64_aligned_t scrub_pages; - uint64_aligned_t outstanding_pages; - uint64_aligned_t max_mfn; /* Largest possible MFN on this host */ - uint32_t hw_cap[8]; -}; - -/* - * Get the ID of the current scheduler. - */ -/* XEN_SYSCTL_sched_id */ -struct xen_sysctl_sched_id { - /* OUT variable */ - uint32_t 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. */ -struct xen_sysctl_perfc_desc { - 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); -typedef uint32_t xen_sysctl_perfc_val_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t); - -struct xen_sysctl_perfc_op { - /* IN variables. */ - uint32_t cmd; /* XEN_SYSCTL_PERFCOP_??? */ - /* OUT variables. */ - 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) */ - XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val; -}; - -/* XEN_SYSCTL_getdomaininfolist */ -struct xen_sysctl_getdomaininfolist { - /* IN variables. */ - domid_t first_domain; - uint32_t max_domains; - XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer; - /* OUT variables. */ - uint32_t num_domains; -}; - -/* Inject debug keys into Xen. */ -/* XEN_SYSCTL_debug_keys */ -struct xen_sysctl_debug_keys { - /* IN variables. */ - XEN_GUEST_HANDLE_64(char) keys; - uint32_t nr_keys; -}; - -/* Get physical CPU information. */ -/* XEN_SYSCTL_getcpuinfo */ -struct xen_sysctl_cpuinfo { - uint64_aligned_t idletime; -}; -typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t); -struct xen_sysctl_getcpuinfo { - /* IN variables. */ - uint32_t max_cpus; - XEN_GUEST_HANDLE_64(xen_sysctl_cpuinfo_t) info; - /* OUT variables. */ - uint32_t nr_cpus; -}; - -/* 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). */ - /* OUT variables. */ - 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 */ -}; -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 */ - 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 */ - XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */ - 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 - * hypervisor. It is therefore up to the caller to put a suitable sentinel - * into all slots before invoking the function. - * Indexing is 1-biased (PC1/CC1 being at index 0). - */ - XEN_GUEST_HANDLE_64(uint64) pc; - XEN_GUEST_HANDLE_64(uint64) cc; -}; - -struct xen_sysctl_get_pmstat { -#define PMSTAT_CATEGORY_MASK 0xf0 -#define PMSTAT_PX 0x10 -#define PMSTAT_CX 0x20 -#define PMSTAT_get_max_px (PMSTAT_PX | 0x1) -#define PMSTAT_get_pxstat (PMSTAT_PX | 0x2) -#define PMSTAT_reset_pxstat (PMSTAT_PX | 0x3) -#define PMSTAT_get_max_cx (PMSTAT_CX | 0x1) -#define PMSTAT_get_cxstat (PMSTAT_CX | 0x2) -#define PMSTAT_reset_cxstat (PMSTAT_CX | 0x3) - uint32_t type; - uint32_t cpuid; - union { - struct pm_px_stat getpx; - struct pm_cx_stat getcx; - /* other struct for tx, etc */ - } u; -}; - -/* XEN_SYSCTL_cpu_hotplug */ -struct xen_sysctl_cpu_hotplug { - /* IN variables */ - uint32_t cpu; /* Physical cpu. */ -#define XEN_SYSCTL_CPU_HOTPLUG_ONLINE 0 -#define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1 - uint32_t op; /* hotplug opcode */ -}; - -/* - * Get/set xen power management, include - * 1. cpufreq governors and related parameters - */ -/* XEN_SYSCTL_pm_op */ -struct xen_userspace { - uint32_t scaling_setspeed; -}; - -struct xen_ondemand { - uint32_t sampling_rate_max; - uint32_t sampling_rate_min; - - uint32_t sampling_rate; - uint32_t up_threshold; -}; - -/* - * cpufreq para name of this structure named - * same as sysfs file name of native linux - */ -#define CPUFREQ_NAME_LEN 16 -struct xen_get_cpufreq_para { - /* IN/OUT variable */ - uint32_t cpu_num; - uint32_t freq_num; - uint32_t gov_num; - - /* for all governors */ - /* 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; - char scaling_driver[CPUFREQ_NAME_LEN]; - - uint32_t cpuinfo_cur_freq; - uint32_t cpuinfo_max_freq; - uint32_t cpuinfo_min_freq; - uint32_t scaling_cur_freq; - - char scaling_governor[CPUFREQ_NAME_LEN]; - uint32_t scaling_max_freq; - uint32_t scaling_min_freq; - - /* for specific governor */ - union { - struct xen_userspace userspace; - struct xen_ondemand ondemand; - } u; - - int32_t turbo_enabled; -}; - -struct xen_set_cpufreq_gov { - char scaling_governor[CPUFREQ_NAME_LEN]; -}; - -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 - - uint32_t ctrl_type; - uint32_t ctrl_value; -}; - -struct xen_sysctl_pm_op { - #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) - - /* set/reset scheduler power saving option */ - #define XEN_SYSCTL_pm_op_set_sched_opt_smt 0x21 - - /* cpuidle max_cstate access command */ - #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 - - /* 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_para set_para; - uint64_aligned_t get_avgfreq; - uint32_t set_sched_opt_smt; - uint32_t get_max_cstate; - uint32_t set_max_cstate; - uint32_t get_vcpu_migration_delay; - uint32_t set_vcpu_migration_delay; - } 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 - uint32_t cmd; - uint32_t start; - uint32_t end; - /* OUT: result of page offline request */ - /* - * bit 0~15: result flags - * bit 16~31: owner - */ - XEN_GUEST_HANDLE(uint32) status; -}; - -#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_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_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) - -/* 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_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. */ -/* 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 */ -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 */ -}; -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 */ - /* OUT variables (query only). */ - 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) - -struct xen_sysctl_cputopo { - uint32_t core; - uint32_t socket; - uint32_t node; -}; -typedef struct xen_sysctl_cputopo xen_sysctl_cputopo_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cputopo_t); - -/* - * IN: - * - a NULL 'cputopo' handle is a request for maximun 'num_cpus'. - * - otherwise it's the number of entries in 'cputopo' - * - * OUT: - * - If 'num_cpus' is less than the number Xen wants to write but the handle - * handle is not a NULL one, partial data gets returned and 'num_cpus' gets - * updated to reflect the intended number. - * - Otherwise, 'num_cpus' shall indicate the number of entries written, which - * may be less than the input value. - */ -struct xen_sysctl_cputopoinfo { - uint32_t num_cpus; - XEN_GUEST_HANDLE_64(xen_sysctl_cputopo_t) cputopo; -}; - -/* XEN_SYSCTL_numainfo */ -#define XEN_INVALID_MEM_SZ (~0U) -#define XEN_INVALID_NODE_DIST (~0U) - -struct xen_sysctl_meminfo { - uint64_t memsize; - uint64_t memfree; -}; -typedef struct xen_sysctl_meminfo xen_sysctl_meminfo_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_meminfo_t); - -/* - * IN: - * - Both 'meminfo' and 'distance' handles being null is a request - * for maximum value of 'num_nodes'. - * - Otherwise it's the number of entries in 'meminfo' and square root - * of number of entries in 'distance' (when corresponding handle is - * non-null) - * - * OUT: - * - If 'num_nodes' is less than the number Xen wants to write but either - * handle is not a NULL one, partial data gets returned and 'num_nodes' - * gets updated to reflect the intended number. - * - Otherwise, 'num_nodes' shall indicate the number of entries written, which - * may be less than the input value. - */ - -struct xen_sysctl_numainfo { - uint32_t num_nodes; - - XEN_GUEST_HANDLE_64(xen_sysctl_meminfo_t) meminfo; - - /* - * Distance between nodes 'i' and 'j' is stored in index 'i*N + j', - * where N is the number of nodes that will be returned in 'num_nodes' - * (i.e. not 'num_nodes' provided by the caller) - */ - XEN_GUEST_HANDLE_64(uint32) distance; -}; - -/* 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 -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 */ - struct xenctl_bitmap cpumap; /* OUT: IF */ -}; - -/* - * Error return values of cpupool operations: - * - * -EADDRINUSE: - * XEN_SYSCTL_CPUPOOL_OP_RMCPU: A vcpu is temporarily pinned to the cpu - * which is to be removed from a cpupool. - * -EADDRNOTAVAIL: - * XEN_SYSCTL_CPUPOOL_OP_ADDCPU, XEN_SYSCTL_CPUPOOL_OP_RMCPU: A previous - * request to remove a cpu from a cpupool was terminated with -EAGAIN - * and has not been retried using the same parameters. - * -EAGAIN: - * XEN_SYSCTL_CPUPOOL_OP_RMCPU: The cpu can't be removed from the cpupool - * as it is active in the hypervisor. A retry will succeed soon. - * -EBUSY: - * XEN_SYSCTL_CPUPOOL_OP_DESTROY, XEN_SYSCTL_CPUPOOL_OP_RMCPU: A cpupool - * can't be destroyed or the last cpu can't be removed as there is still - * a running domain in that cpupool. - * -EEXIST: - * XEN_SYSCTL_CPUPOOL_OP_CREATE: A cpupool_id was specified and is already - * existing. - * -EINVAL: - * XEN_SYSCTL_CPUPOOL_OP_ADDCPU, XEN_SYSCTL_CPUPOOL_OP_RMCPU: An illegal - * cpu was specified (cpu does not exist). - * XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN: An illegal domain was specified - * (domain id illegal or not suitable for operation). - * -ENODEV: - * XEN_SYSCTL_CPUPOOL_OP_ADDCPU, XEN_SYSCTL_CPUPOOL_OP_RMCPU: The specified - * cpu is either not free (add) or not member of the specified cpupool - * (remove). - * -ENOENT: - * all: The cpupool with the specified cpupool_id doesn't exist. - * - * Some common error return values like -ENOMEM and -EFAULT are possible for - * all the operations. - */ - -#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. - */ -struct xen_sysctl_arinc653_schedule { - /* major_frame holds the time for the new schedule's major frame - * in nanoseconds. */ - 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; - /* The sched_entries array holds the actual schedule entries. */ - struct { - /* dom_handle must match a domain's UUID */ - xen_domain_handle_t dom_handle; - /* If a domain has multiple VCPUs, vcpu_id specifies which one - * this schedule entry applies to. It should be set to 0 if - * there is only one VCPU for the domain. */ - unsigned int vcpu_id; - /* runtime specifies the amount of time that should be allocated - * to this VCPU per major frame. It is specified in nanoseconds */ - uint64_aligned_t runtime; - } sched_entries[ARINC653_MAX_DOMAINS_PER_SCHEDULE]; -}; -typedef struct xen_sysctl_arinc653_schedule xen_sysctl_arinc653_schedule_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_arinc653_schedule_t); - -/* - * Valid range for context switch rate limit (in microseconds). - * Applicable to Credit and Credit2 schedulers. - */ -#define XEN_SYSCTL_SCHED_RATELIMIT_MAX 500000 -#define XEN_SYSCTL_SCHED_RATELIMIT_MIN 100 - -struct xen_sysctl_credit_schedule { - /* Length of timeslice in milliseconds */ -#define XEN_SYSCTL_CSCHED_TSLICE_MAX 1000 -#define XEN_SYSCTL_CSCHED_TSLICE_MIN 1 - unsigned tslice_ms; - unsigned ratelimit_us; -}; - -struct xen_sysctl_credit2_schedule { - unsigned ratelimit_us; -}; - -/* XEN_SYSCTL_scheduler_op */ -/* Set or get info? */ -#define XEN_SYSCTL_SCHEDOP_putinfo 0 -#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_* */ - union { - struct xen_sysctl_sched_arinc653 { - XEN_GUEST_HANDLE_64(xen_sysctl_arinc653_schedule_t) schedule; - } sched_arinc653; - struct xen_sysctl_credit_schedule sched_credit; - struct xen_sysctl_credit2_schedule sched_credit2; - } u; -}; - -/* - * Output format of gcov data: - * - * XEN_GCOV_FORMAT_MAGIC XEN_GCOV_RECORD ... XEN_GCOV_RECORD - * - * That is, one magic number followed by 0 or more record. - * - * The magic number is stored as an uint32_t field. - * - * The record is packed and variable in length. It has the form: - * - * filename: a NULL terminated path name extracted from gcov, used to - * create the name of gcda file. - * size: a uint32_t field indicating the size of the payload, the - * unit is byte. - * payload: the actual payload, length is `size' bytes. - * - * Userspace tool will split the record to different files. - */ - -#define XEN_GCOV_FORMAT_MAGIC 0x58434f56 /* XCOV */ - -#define XEN_SYSCTL_GCOV_get_size 0 /* Get total size of output data */ -#define XEN_SYSCTL_GCOV_read 1 /* Read output data */ -#define XEN_SYSCTL_GCOV_reset 2 /* Reset all counters */ - -struct xen_sysctl_gcov_op { - uint32_t cmd; - uint32_t size; /* IN/OUT: size of the buffer */ - 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 -/* 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 -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 */ - union { - uint64_t data; /* OUT */ - struct { - uint32_t cpu; /* IN */ - uint32_t rsvd; - } l3_cache; - } u; -}; - -/* XEN_SYSCTL_pcitopoinfo */ -#define XEN_INVALID_DEV (XEN_INVALID_NODE_ID - 1) -struct xen_sysctl_pcitopoinfo { - /* - * IN: Number of elements in 'pcitopo' and 'nodes' arrays. - * OUT: Number of processed elements of those arrays. - */ - uint32_t num_devs; - - /* IN: list of devices for which node IDs are requested. */ - XEN_GUEST_HANDLE_64(physdev_pci_device_t) devs; - - /* - * OUT: node identifier for each device. - * If information for a particular device is not available then - * corresponding entry will be set to XEN_INVALID_NODE_ID. If - * device is not known to the hypervisor then XEN_INVALID_DEV - * will be provided. - */ - XEN_GUEST_HANDLE_64(uint32) nodes; -}; - -#define XEN_SYSCTL_PSR_CAT_get_l3_info 0 -#define XEN_SYSCTL_PSR_CAT_get_l2_info 1 -struct xen_sysctl_psr_cat_op { - uint32_t cmd; /* IN: XEN_SYSCTL_PSR_CAT_* */ - 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 */ - } cat_info; - } u; -}; - -#define XEN_SYSCTL_TMEM_OP_ALL_CLIENTS 0xFFFFU - -#define XEN_SYSCTL_TMEM_OP_THAW 0 -#define XEN_SYSCTL_TMEM_OP_FREEZE 1 -#define XEN_SYSCTL_TMEM_OP_FLUSH 2 -#define XEN_SYSCTL_TMEM_OP_DESTROY 3 -#define XEN_SYSCTL_TMEM_OP_LIST 4 -#define XEN_SYSCTL_TMEM_OP_GET_CLIENT_INFO 5 -#define XEN_SYSCTL_TMEM_OP_SET_CLIENT_INFO 6 -#define XEN_SYSCTL_TMEM_OP_GET_POOLS 7 -#define XEN_SYSCTL_TMEM_OP_QUERY_FREEABLE_MB 8 -#define XEN_SYSCTL_TMEM_OP_SET_POOLS 9 -#define XEN_SYSCTL_TMEM_OP_SAVE_BEGIN 10 -#define XEN_SYSCTL_TMEM_OP_SET_AUTH 11 -#define XEN_SYSCTL_TMEM_OP_SAVE_GET_NEXT_PAGE 19 -#define XEN_SYSCTL_TMEM_OP_SAVE_GET_NEXT_INV 20 -#define XEN_SYSCTL_TMEM_OP_SAVE_END 21 -#define XEN_SYSCTL_TMEM_OP_RESTORE_BEGIN 30 -#define XEN_SYSCTL_TMEM_OP_RESTORE_PUT_PAGE 32 -#define XEN_SYSCTL_TMEM_OP_RESTORE_FLUSH_PAGE 33 - -/* - * XEN_SYSCTL_TMEM_OP_SAVE_GET_NEXT_[PAGE|INV] override the 'buf' in - * xen_sysctl_tmem_op with this structure - sometimes with an extra - * page tackled on. - */ -struct tmem_handle { - uint32_t pool_id; - uint32_t index; - xen_tmem_oid_t oid; -}; - -/* - * XEN_SYSCTL_TMEM_OP_[GET,SAVE]_CLIENT uses the 'client' in - * xen_tmem_op with this structure, which is mostly used during migration. - */ -struct xen_tmem_client { - uint32_t version; /* If mismatched we will get XEN_EOPNOTSUPP. */ - uint32_t maxpools; /* If greater than what hypervisor supports, will get - XEN_ERANGE. */ - uint32_t nr_pools; /* Current amount of pools. Ignored on SET*/ - union { /* See TMEM_CLIENT_[COMPRESS,FROZEN] */ - uint32_t raw; - struct { - uint8_t frozen:1, - compress:1, - migrating:1; - } u; - } flags; - uint32_t weight; -}; -typedef struct xen_tmem_client xen_tmem_client_t; -DEFINE_XEN_GUEST_HANDLE(xen_tmem_client_t); - -/* - * XEN_SYSCTL_TMEM_OP_[GET|SET]_POOLS or XEN_SYSCTL_TMEM_OP_SET_AUTH - * uses the 'pool' array in * xen_sysctl_tmem_op with this structure. - * The XEN_SYSCTL_TMEM_OP_GET_POOLS hypercall will - * return the number of entries in 'pool' or a negative value - * if an error was encountered. - * The XEN_SYSCTL_TMEM_OP_SET_[AUTH|POOLS] will return the number of - * entries in 'pool' processed or a negative value if an error - * was encountered. - */ -struct xen_tmem_pool_info { - union { - uint32_t raw; - struct { - uint32_t persist:1, /* See TMEM_POOL_PERSIST. */ - shared:1, /* See TMEM_POOL_SHARED. */ - auth:1, /* See TMEM_POOL_AUTH. */ - rsv1:1, - pagebits:8, /* TMEM_POOL_PAGESIZE_[SHIFT,MASK]. */ - rsv2:12, - version:8; /* TMEM_POOL_VERSION_[SHIFT,MASK]. */ - } u; - } flags; - uint32_t id; /* Less than tmem_client.maxpools. */ - uint64_t n_pages; /* Zero on XEN_SYSCTL_TMEM_OP_SET_[AUTH|POOLS]. */ - uint64_aligned_t uuid[2]; -}; -typedef struct xen_tmem_pool_info xen_tmem_pool_info_t; -DEFINE_XEN_GUEST_HANDLE(xen_tmem_pool_info_t); - -struct xen_sysctl_tmem_op { - uint32_t cmd; /* IN: XEN_SYSCTL_TMEM_OP_* . */ - int32_t pool_id; /* IN: 0 by default unless _SAVE_*, RESTORE_* .*/ - uint32_t cli_id; /* IN: client id, 0 for XEN_SYSCTL_TMEM_QUERY_FREEABLE_MB - for all others can be the domain id or - XEN_SYSCTL_TMEM_OP_ALL_CLIENTS for all. */ - uint32_t len; /* IN: length of 'buf'. If not applicable to use 0. */ - uint32_t arg; /* IN: If not applicable to command use 0. */ - uint32_t pad; /* Padding so structure is the same under 32 and 64. */ - xen_tmem_oid_t oid; /* IN: If not applicable to command use 0s. */ - union { - XEN_GUEST_HANDLE_64(char) buf; /* IN/OUT: Buffer to save/restore */ - XEN_GUEST_HANDLE_64(xen_tmem_client_t) client; /* IN/OUT for */ - /* XEN_SYSCTL_TMEM_OP_[GET,SAVE]_CLIENT. */ - XEN_GUEST_HANDLE_64(xen_tmem_pool_info_t) pool; /* OUT for */ - /* XEN_SYSCTL_TMEM_OP_GET_POOLS. Must have 'len' */ - /* of them. */ - } u; -}; - -/* - * XEN_SYSCTL_get_cpu_levelling_caps (x86 specific) - * - * Return hardware capabilities concerning masking or faulting of the cpuid - * 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 */ - uint32_t caps; -}; - -/* - * XEN_SYSCTL_get_cpu_featureset (x86 specific) - * - * Return information about featuresets available on this host. - * - Raw: The real cpuid values. - * - Host: The values Xen is using, (after command line overrides, etc). - * - PV: Maximum set of features which can be given to a PV guest. - * - 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? */ - 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 - * come from the same numberspace, so have the same - * maximum length. */ - XEN_GUEST_HANDLE_64(uint32) features; /* OUT: */ -}; - -/* - * XEN_SYSCTL_LIVEPATCH_op - * - * Refer to the docs/unstable/misc/livepatch.markdown - * for the design details of this hypercall. - * - * There are four sub-ops: - * XEN_SYSCTL_LIVEPATCH_UPLOAD (0) - * XEN_SYSCTL_LIVEPATCH_GET (1) - * XEN_SYSCTL_LIVEPATCH_LIST (2) - * XEN_SYSCTL_LIVEPATCH_ACTION (3) - * - * The normal sequence of sub-ops is to: - * 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. - */ - -#define LIVEPATCH_PAYLOAD_VERSION 1 -/* - * .livepatch.funcs structure layout defined in the `Payload format` - * section in the Live Patch design document. - * - * We guard this with __XEN__ as toolstacks SHOULD not use it. - */ -#ifdef __XEN__ -struct livepatch_func { - 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 opaque[31]; -}; -typedef struct livepatch_func livepatch_func_t; -#endif - -/* - * Structure describing an ELF payload. Uniquely identifies the - * payload. Should be human readable. - * Recommended length is upto XEN_LIVEPATCH_NAME_SIZE. - * Includes the NUL terminator. - */ -#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. */ -}; - -/* - * Upload a payload to the hypervisor. The payload is verified - * against basic checks and if there are any issues the proper return code - * will be returned. The payload is not applied at this time - that is - * controlled by XEN_SYSCTL_LIVEPATCH_ACTION. - * - * The return value is zero if the payload was succesfully uploaded. - * Otherwise an EXX return value is provided. Duplicate `name` are not - * supported. - * - * The payload at this point is verified against basic checks. - * - * The `payload` is the ELF payload as mentioned in the `Payload format` - * section in the Live Patch design document. - */ -#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. */ -}; - -/* - * Retrieve an status of an specific payload. - * - * Upon completion the `struct xen_livepatch_status` is updated. - * - * The return value is zero on success and XEN_EXX on failure. This operation - * is synchronous and does not require preemption. - */ -#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. */ -}; -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. */ -}; - -/* - * Retrieve an array of abbreviated status and names of payloads that are - * 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`, - * `name`, and `len`' are updated at their designed index value (`idx`) with - * the returned value of data. - * - * If the hypercall returns E2BIG the `nr` is too big and should be - * lowered. The upper limit of `nr` is left to the implemention. - * - * Note that due to the asynchronous nature of hypercalls the domain might have - * added or removed the number of payloads making this information stale. It is - * the responsibility of the toolstack to use the `version` field to check - * between each invocation. if the version differs it should discard the stale - * data and start from scratch. It is OK for the toolstack to use the new - * `version` field. - */ -#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. */ -}; - -/* - * 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. - */ -#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_sysctl_livepatch_op { - 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; - struct xen_sysctl_livepatch_get get; - struct xen_sysctl_livepatch_action action; - } u; -}; - -/* - * XEN_SYSCTL_set_parameter - * - * Change hypervisor parameters at runtime. - * The input string is parsed similar to the boot parameters. - * Parameters are a single string terminated by a NUL byte of max. size - * characters. Multiple settings can be specified by separating them - * with blanks. - */ - -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. */ -}; - -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_gcov_op 20 -#define XEN_SYSCTL_psr_cmt_op 21 -#define XEN_SYSCTL_pcitopoinfo 22 -#define XEN_SYSCTL_psr_cat_op 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 - 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_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_gcov_op gcov_op; - struct xen_sysctl_psr_cmt_op psr_cmt_op; - struct xen_sysctl_psr_cat_op psr_cat_op; - struct xen_sysctl_tmem_op tmem_op; - 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; - uint8_t pad[128]; - } u; -}; -typedef struct xen_sysctl xen_sysctl_t; -DEFINE_XEN_GUEST_HANDLE(xen_sysctl_t); - -#endif /* __XEN_PUBLIC_SYSCTL_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/tmem.h b/plat/xen/include/xen/tmem.h deleted file mode 100644 index aa0aafaa9d08b3e952828aa94d1d9af2524e2dbb..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/tmem.h +++ /dev/null @@ -1,124 +0,0 @@ -/****************************************************************************** - * tmem.h - * - * Guest OS interface to Xen Transcendent Memory. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004, K A Fraser - */ - -#ifndef __XEN_PUBLIC_TMEM_H__ -#define __XEN_PUBLIC_TMEM_H__ - -#include "xen.h" - -/* version of ABI */ -#define TMEM_SPEC_VERSION 1 - -/* Commands to HYPERVISOR_tmem_op() */ -#ifdef __XEN__ -#define TMEM_CONTROL 0 /* Now called XEN_SYSCTL_tmem_op */ -#else -#undef TMEM_CONTROL -#endif -#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 -#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. */ - -/* 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_PAGESIZE_MASK 0xf -#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 - -/* Special errno values */ -#define EFROZEN 1000 -#define EEMPTY 1001 - -struct xen_tmem_oid { - uint64_t oid[3]; -}; -typedef struct xen_tmem_oid xen_tmem_oid_t; -DEFINE_XEN_GUEST_HANDLE(xen_tmem_oid_t); - -#ifndef __ASSEMBLY__ -#if __XEN_INTERFACE_VERSION__ < 0x00040400 -typedef xen_pfn_t tmem_cli_mfn_t; -#endif -typedef XEN_GUEST_HANDLE(char) tmem_cli_va_t; -struct tmem_op { - uint32_t cmd; - int32_t pool_id; - union { - struct { - uint64_t uuid[2]; - uint32_t flags; - uint32_t arg1; - } creat; /* for cmd == TMEM_NEW_POOL. */ - struct { -#if __XEN_INTERFACE_VERSION__ < 0x00040600 - uint64_t oid[3]; -#else - xen_tmem_oid_t oid; -#endif - uint32_t index; - uint32_t tmem_offset; - uint32_t pfn_offset; - uint32_t len; - xen_pfn_t cmfn; /* client machine page frame */ - } gen; /* for all other cmd ("generic") */ - } u; -}; -typedef struct tmem_op tmem_op_t; -DEFINE_XEN_GUEST_HANDLE(tmem_op_t); -#endif - -#endif /* __XEN_PUBLIC_TMEM_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/trace.h b/plat/xen/include/xen/trace.h deleted file mode 100644 index 3746bff2688698b4e495c38114777534ff0883aa..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/trace.h +++ /dev/null @@ -1,339 +0,0 @@ -/****************************************************************************** - * include/public/trace.h - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Mark Williamson, (C) 2004 Intel Research Cambridge - * Copyright (C) 2005 Bin Ren - */ - -#ifndef __XEN_PUBLIC_TRACE_H__ -#define __XEN_PUBLIC_TRACE_H__ - -#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) - -/* 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_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 - * reserved for encoding what scheduler produced the information. The - * actual event is encoded in the last 9 bits. - * - * This means we have 8 scheduling IDs available (which means at most 8 - * schedulers generating events) and, in each scheduler, up to 512 - * different events. - */ -#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]). - */ -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 */ - /* MFN lists immediately after the header */ -}; - -#endif /* __XEN_PUBLIC_TRACE_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/vcpu.h b/plat/xen/include/xen/vcpu.h deleted file mode 100644 index 8a9e30d8c5693760b1f69cace74473973411ba9f..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/vcpu.h +++ /dev/null @@ -1,248 +0,0 @@ -/****************************************************************************** - * vcpu.h - * - * VCPU initialisation, query, and hotplug. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_VCPU_H__ -#define __XEN_PUBLIC_VCPU_H__ - -#include "xen.h" - -/* - * Prototype for this hypercall is: - * long vcpu_op(int cmd, unsigned int vcpuid, void *extra_args) - * @cmd == VCPUOP_??? (VCPU operation). - * @vcpuid == VCPU to operate on. - * @extra_args == Operation-specific extra arguments (NULL if none). - */ - -/* - * Initialise a VCPU. Each VCPU can be initialised only once. A - * newly-initialised VCPU will not run until it is brought up by VCPUOP_up. - * - * @extra_arg == For PV or ARM guests this is a pointer to a vcpu_guest_context - * structure containing the initial state for the VCPU. For x86 - * HVM based guests this is a pointer to a vcpu_hvm_context - * structure. - */ -#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 - -/* - * Bring down a VCPU (i.e., make it non-runnable). - * There are a few caveats that callers should observe: - * 1. This operation may return, and VCPU_is_up may return false, before the - * VCPU stops running (i.e., the command is asynchronous). It is a good - * idea to ensure that the VCPU has entered a non-critical loop before - * bringing it down. Alternatively, this operation is guaranteed - * synchronous if invoked by the VCPU itself. - * 2. After a VCPU is initialised, there is currently no way to drop all its - * references to domain memory. Even a VCPU that is down still holds - * memory references via its pagetable base pointer and GDT. It is good - * practise to move a VCPU onto an 'idle' or default page table, LDT and - * GDT before bringing it down. - */ -#define VCPUOP_down 2 - -/* Returns 1 if the given VCPU is up. */ -#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 -struct vcpu_runstate_info { - /* VCPU's current state (RUNSTATE_*). */ - int state; - /* When was current state entered (system time, ns)? */ - uint64_t state_entry_time; - /* - * Update indicator set in state_entry_time: - * 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) - /* - * Time spent in each RUNSTATE_* (ns). The sum of these times is - * guaranteed not to drift from system time. - */ - uint64_t time[4]; -}; -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 - -/* 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 - -/* - * VCPU is not runnable, but it is not blocked. - * This is a 'catch all' state for things like hotplug and pauses by the - * system administrator (or for critical sections in the hypervisor). - * RUNSTATE_blocked dominates this state (it is the preferred state). - */ -#define RUNSTATE_offline 3 - -/* - * Register a shared memory area from which the guest may obtain its own - * runstate information without needing to execute a hypercall. - * Notes: - * 1. The registered address may be virtual or physical or guest handle, - * depending on the platform. Virtual address or guest handle should be - * registered on x86 systems. - * 2. Only one shared area may be registered per VCPU. The shared area is - * updated by the hypervisor each time the VCPU is scheduled. Thus - * runstate.state will always be RUNSTATE_running and - * runstate.state_entry_time will indicate the system time at which the - * VCPU was last scheduled to run. - * @extra_arg == pointer to vcpu_register_runstate_memory_area structure. - */ -#define VCPUOP_register_runstate_memory_area 5 -struct vcpu_register_runstate_memory_area { - union { - XEN_GUEST_HANDLE(vcpu_runstate_info_t) h; - struct vcpu_runstate_info *v; - uint64_t p; - } addr; -}; -typedef struct vcpu_register_runstate_memory_area vcpu_register_runstate_memory_area_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_register_runstate_memory_area_t); - -/* - * Set or stop a VCPU's periodic timer. Every VCPU has one periodic timer - * 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 */ -struct vcpu_set_periodic_timer { - uint64_t period_ns; -}; -typedef struct vcpu_set_periodic_timer vcpu_set_periodic_timer_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_set_periodic_timer_t); - -/* - * Set or stop a VCPU's single-shot timer. Every VCPU has one single-shot - * timer which can be set via these commands. - */ -#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_??? */ -}; -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). */ -#define _VCPU_SSHOTTMR_future (0) -#define VCPU_SSHOTTMR_future (1U << _VCPU_SSHOTTMR_future) - -/* - * Register a memory location in the guest address space for the - * vcpu_info structure. This allows the guest to place the vcpu_info - * structure in a convenient place, such as in a per-cpu data area. - * The pointer need not be page aligned, but the structure must not - * cross a page boundary. - * - * This may be called only once per vcpu. - */ -#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 */ - uint32_t offset; /* offset within page */ - 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 - -/* - * Get the physical ID information for a pinned vcpu's underlying physical - * processor. The physical ID informmation is architecture-specific. - * 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 */ -struct vcpu_get_physid { - uint64_t phys_id; -}; -typedef struct vcpu_get_physid vcpu_get_physid_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t); -#define xen_vcpu_physid_to_x86_apicid(physid) ((uint32_t)(physid)) -#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint32_t)((physid) >> 32)) - -/* - * Register a memory location to get a secondary copy of the vcpu time - * parameters. The master copy still exists as part of the vcpu shared - * memory area, and this secondary copy is updated whenever the master copy - * is updated (and using the same versioning scheme for synchronisation). - * - * The intent is that this copy may be mapped (RO) into userspace so - * that usermode can compute system time using the time info and the - * tsc. Usermode will see an array of vcpu_time_info structures, one - * for each vcpu, and choose the right one by an existing mechanism - * which allows it to get the current vcpu number (such as via a - * segment limit). It can then apply the normal algorithm to compute - * system time from the tsc. - * - * @extra_arg == pointer to vcpu_register_time_info_memory_area structure. - */ -#define VCPUOP_register_vcpu_time_memory_area 13 -DEFINE_XEN_GUEST_HANDLE(vcpu_time_info_t); -struct vcpu_register_time_memory_area { - union { - XEN_GUEST_HANDLE(vcpu_time_info_t) h; - struct vcpu_time_info *v; - uint64_t p; - } addr; -}; -typedef struct vcpu_register_time_memory_area vcpu_register_time_memory_area_t; -DEFINE_XEN_GUEST_HANDLE(vcpu_register_time_memory_area_t); - -#endif /* __XEN_PUBLIC_VCPU_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/version.h b/plat/xen/include/xen/version.h deleted file mode 100644 index cb84565c0604b43eaf5f6509910d9db31df885a9..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/version.h +++ /dev/null @@ -1,116 +0,0 @@ -/****************************************************************************** - * version.h - * - * Xen version, type, and compile information. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2005, Nguyen Anh Quynh - * Copyright (c) 2005, Keir Fraser - */ - -#ifndef __XEN_PUBLIC_VERSION_H__ -#define __XEN_PUBLIC_VERSION_H__ - -#include "xen.h" - -/* NB. All ops return zero on success, except XENVER_{version,pagesize} - * XENVER_{version,pagesize,build_id} */ - -/* arg == NULL; returns major:minor (16:16). */ -#define XENVER_version 0 - -/* arg == xen_extraversion_t. */ -#define XENVER_extraversion 1 -typedef char xen_extraversion_t[16]; -#define XEN_EXTRAVERSION_LEN (sizeof(xen_extraversion_t)) - -/* arg == xen_compile_info_t. */ -#define XENVER_compile_info 2 -struct xen_compile_info { - char compiler[64]; - char compile_by[16]; - char compile_domain[32]; - char compile_date[32]; -}; -typedef struct xen_compile_info xen_compile_info_t; - -#define XENVER_capabilities 3 -typedef char xen_capabilities_info_t[1024]; -#define XEN_CAPABILITIES_INFO_LEN (sizeof(xen_capabilities_info_t)) - -#define XENVER_changeset 4 -typedef char xen_changeset_info_t[64]; -#define XEN_CHANGESET_INFO_LEN (sizeof(xen_changeset_info_t)) - -#define XENVER_platform_parameters 5 -struct xen_platform_parameters { - xen_ulong_t virt_start; -}; -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 */ -}; -typedef struct xen_feature_info xen_feature_info_t; - -/* Declares the features reported by XENVER_get_features. */ -#include "features.h" - -/* arg == NULL; returns host memory page size. */ -#define XENVER_pagesize 7 - -/* arg == xen_domain_handle_t. - * - * The toolstack fills it out for guest consumption. It is intended to hold - * the UUID of the guest. - */ -#define XENVER_guest_handle 8 - -#define XENVER_commandline 9 -typedef char xen_commandline_t[1024]; - -/* - * Return value is the number of bytes written, or XEN_Exx on error. - * Calling with empty parameter returns the size of build_id. - */ -#define XENVER_build_id 10 -struct xen_build_id { - uint32_t len; /* IN: size of buf[]. */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - unsigned char buf[]; -#elif defined(__GNUC__) - unsigned char buf[1]; /* OUT: Variable length buffer with build_id. */ -#endif -}; -typedef struct xen_build_id xen_build_id_t; - -#endif /* __XEN_PUBLIC_VERSION_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/vm_event.h b/plat/xen/include/xen/vm_event.h deleted file mode 100644 index b531f71596de652dd7d8b68e7b5135e427113bd1..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/vm_event.h +++ /dev/null @@ -1,378 +0,0 @@ -/****************************************************************************** - * vm_event.h - * - * Memory event common structures. - * - * Copyright (c) 2009 by Citrix Systems, Inc. (Patrick Colp) - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 _XEN_PUBLIC_VM_EVENT_H -#define _XEN_PUBLIC_VM_EVENT_H - -#include "xen.h" - -#define VM_EVENT_INTERFACE_VERSION 0x00000002 - -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#include "io/ring.h" - -/* - * Memory event flags - */ - -/* - * VCPU_PAUSED in a request signals that the vCPU triggering the event has been - * paused - * VCPU_PAUSED in a response signals to unpause the vCPU - */ -#define VM_EVENT_FLAG_VCPU_PAUSED (1 << 0) -/* Flags to aid debugging vm_event */ -#define VM_EVENT_FLAG_FOREIGN (1 << 1) -/* - * The following flags can be set in response to a mem_access event. - * - * Emulate the fault-causing instruction (if set in the event response flags). - * This will allow the guest to continue execution without lifting the page - * access restrictions. - */ -#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) -/* - * Toggle singlestepping on vm_event response. - * Requires the vCPU to be paused already (synchronous events only). - */ -#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. - * This flag is only useful when combined with VM_EVENT_FLAG_EMULATE - * and takes precedence if combined with VM_EVENT_FLAG_EMULATE_NOWRITE - * (i.e. if both VM_EVENT_FLAG_EMULATE_NOWRITE and - * VM_EVENT_FLAG_SET_EMUL_READ_DATA are set, only the latter will be honored). - */ -#define VM_EVENT_FLAG_SET_EMUL_READ_DATA (1 << 5) -/* - * Deny completion of the operation that triggered the event. - * 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) -/* - * This flag can be set in a request or a response - * - * On a request, indicates that the event occurred in the alternate p2m - * specified by the altp2m_idx request field. - * - * 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) -/* - * 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) -/* - * 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 - * VM_EVENT_FLAG_EMULATE and does not take presedence if combined with - * VM_EVENT_FLAG_EMULATE_NOWRITE or VM_EVENT_FLAG_SET_EMUL_READ_DATA, (i.e. - * if any of those flags are set, only those will be honored). - */ -#define VM_EVENT_FLAG_SET_EMUL_INSN_DATA (1 << 9) -/* - * Have a one-shot VM_EVENT_REASON_INTERRUPT event sent for the first - * interrupt pending after resuming the VCPU. - */ -#define VM_EVENT_FLAG_GET_NEXT_INTERRUPT (1 << 10) - -/* - * Reasons for the vm event request - */ - -/* Default case */ -#define VM_EVENT_REASON_UNKNOWN 0 -/* Memory access violation */ -#define VM_EVENT_REASON_MEM_ACCESS 1 -/* Memory sharing event */ -#define VM_EVENT_REASON_MEM_SHARING 2 -/* Memory paging event */ -#define VM_EVENT_REASON_MEM_PAGING 3 -/* A control register was updated */ -#define VM_EVENT_REASON_WRITE_CTRLREG 4 -/* An MSR was updated. */ -#define VM_EVENT_REASON_MOV_TO_MSR 5 -/* Debug operation executed (e.g. int3) */ -#define VM_EVENT_REASON_SOFTWARE_BREAKPOINT 6 -/* Single-step (e.g. MTF) */ -#define VM_EVENT_REASON_SINGLESTEP 7 -/* An event has been requested via HVMOP_guest_request_vm_event. */ -#define VM_EVENT_REASON_GUEST_REQUEST 8 -/* A debug exception was caught */ -#define VM_EVENT_REASON_DEBUG_EXCEPTION 9 -/* CPUID executed */ -#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 -/* An interrupt has been delivered. */ -#define VM_EVENT_REASON_INTERRUPT 12 -/* A descriptor table register was accessed. */ -#define VM_EVENT_REASON_DESCRIPTOR_ACCESS 13 -/* Current instruction is not implemented by the emulator */ -#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 - -/* - * Using custom vCPU structs (i.e. not hvm_hw_cpu) for both x86 and ARM - * so as to not fill the vm_event ring buffer too quickly. - */ -struct vm_event_regs_x86 { - uint64_t rax; - uint64_t rcx; - uint64_t rdx; - uint64_t rbx; - uint64_t rsp; - uint64_t rbp; - uint64_t rsi; - uint64_t rdi; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - uint64_t rflags; - uint64_t dr7; - uint64_t rip; - uint64_t cr0; - uint64_t cr2; - uint64_t cr3; - uint64_t cr4; - uint64_t sysenter_cs; - uint64_t sysenter_esp; - uint64_t sysenter_eip; - uint64_t msr_efer; - uint64_t msr_star; - uint64_t msr_lstar; - uint64_t fs_base; - uint64_t gs_base; - uint32_t cs_arbytes; - uint32_t _pad; -}; - -/* - * Only the register 'pc' can be set on a vm_event response using the - * VM_EVENT_FLAG_SET_REGISTERS flag. - */ -struct vm_event_regs_arm { - uint64_t ttbr0; - uint64_t ttbr1; - uint64_t ttbcr; - uint64_t pc; - uint32_t cpsr; - uint32_t _pad; -}; - -/* - * mem_access flag definitions - * - * These flags are set only as part of a mem_event request. - * - * R/W/X: Defines the type of violation that has triggered the event - * Multiple types can be set in a single violation! - * GLA_VALID: If the gla field holds a guest VA associated with the event - * 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) - -struct vm_event_mem_access { - uint64_t gfn; - uint64_t offset; - uint64_t gla; /* if flags has MEM_ACCESS_GLA_VALID set */ - uint32_t flags; /* MEM_ACCESS_* */ - uint32_t _pad; -}; - -struct vm_event_write_ctrlreg { - uint32_t index; - uint32_t _pad; - uint64_t new_value; - uint64_t old_value; -}; - -struct vm_event_singlestep { - uint64_t gfn; -}; - -struct vm_event_debug { - uint64_t gfn; - uint32_t insn_length; - uint8_t type; /* HVMOP_TRAP_* */ - uint8_t _pad[3]; -}; - -struct vm_event_mov_to_msr { - uint64_t msr; - uint64_t 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 - -struct vm_event_desc_access { - union { - struct { - 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 _pad2; - } svm; - } arch; - uint8_t descriptor; /* VM_EVENT_DESC_* */ - uint8_t is_write; - uint8_t _pad[6]; -}; - -struct vm_event_cpuid { - uint32_t insn_length; - uint32_t leaf; - uint32_t subleaf; - uint32_t _pad; -}; - -struct vm_event_interrupt_x86 { - uint32_t vector; - uint32_t type; - uint32_t error_code; - uint32_t _pad; - uint64_t cr2; -}; - -#define MEM_PAGING_DROP_PAGE (1 << 0) -#define MEM_PAGING_EVICT_FAIL (1 << 1) - -struct vm_event_paging { - uint64_t gfn; - uint32_t p2mt; - uint32_t flags; -}; - -struct vm_event_sharing { - uint64_t gfn; - uint32_t p2mt; - uint32_t _pad; -}; - -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)]; -}; - -struct vm_event_emul_insn_data { - uint8_t data[16]; /* Has to be completely filled */ -}; - -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 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; - union { - struct vm_event_interrupt_x86 x86; - } interrupt; - } u; - - union { - union { - struct vm_event_regs_x86 x86; - struct vm_event_regs_arm arm; - } regs; - - union { - struct vm_event_emul_read_data read; - struct vm_event_emul_insn_data insn; - } emul; - } data; -} vm_event_request_t, vm_event_response_t; - -DEFINE_RING_TYPES(vm_event, vm_event_request_t, vm_event_response_t); - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ -#endif /* _XEN_PUBLIC_VM_EVENT_H */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/xen-compat.h b/plat/xen/include/xen/xen-compat.h deleted file mode 100644 index b67365340bf115d552b6df3807d8eef7fa36eca4..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/xen-compat.h +++ /dev/null @@ -1,44 +0,0 @@ -/****************************************************************************** - * xen-compat.h - * - * Guest OS interface to Xen. Compatibility layer. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2006, Christian Limpach - */ - -#ifndef __XEN_PUBLIC_XEN_COMPAT_H__ -#define __XEN_PUBLIC_XEN_COMPAT_H__ - -#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040900 - -#if defined(__XEN__) || defined(__XEN_TOOLS__) -/* Xen is built with matching headers and implements the latest interface. */ -#define __XEN_INTERFACE_VERSION__ __XEN_LATEST_INTERFACE_VERSION__ -#elif !defined(__XEN_INTERFACE_VERSION__) -/* Guests which do not specify a version get the legacy interface. */ -#define __XEN_INTERFACE_VERSION__ 0x00000000 -#endif - -#if __XEN_INTERFACE_VERSION__ > __XEN_LATEST_INTERFACE_VERSION__ -#error "These header files do not support the requested interface version." -#endif - -#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */ diff --git a/plat/xen/include/xen/xen.h b/plat/xen/include/xen/xen.h deleted file mode 100644 index 308109f1767022948e48c00251560553ddb7a874..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/xen.h +++ /dev/null @@ -1,998 +0,0 @@ -/****************************************************************************** - * xen.h - * - * Guest OS interface to Xen. - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (c) 2004, K A Fraser - */ - -#ifndef __XEN_PUBLIC_XEN_H__ -#define __XEN_PUBLIC_XEN_H__ - -#include "xen-compat.h" - -#if defined(__i386__) || defined(__x86_64__) -#include "arch-x86/xen.h" -#elif defined(__arm__) || defined (__aarch64__) -#include "arch-arm.h" -#else -#error "Unsupported architecture" -#endif - -#ifndef __ASSEMBLY__ -/* Guest handles for primitive C types. */ -DEFINE_XEN_GUEST_HANDLE(char); -__DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); -DEFINE_XEN_GUEST_HANDLE(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); -#endif -DEFINE_XEN_GUEST_HANDLE(void); - -DEFINE_XEN_GUEST_HANDLE(uint64_t); -DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); -DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); - -/* 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 -#ifndef __xen_mk_ullong -# 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) - -#else - -/* In assembly code we cannot use C numeric constant suffixes. */ -#define xen_mk_uint(x) x -#define xen_mk_ulong(x) x -#define xen_mk_ullong(x) x - -#endif - -/* - * HYPERCALLS - */ - -/* `incontents 100 hcalls List of hypercalls - * ` 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_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_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_xc_reserved_op 39 /* reserved for XenClient */ -#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 - -/* ` } */ - -/* - * HYPERCALL COMPATIBILITY. - */ - -/* New sched_op hypercall introduced in 0x00030101. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030101 -#undef __HYPERVISOR_sched_op -#define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat -#endif - -/* New event-channel and physdev hypercalls introduced in 0x00030202. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030202 -#undef __HYPERVISOR_event_channel_op -#define __HYPERVISOR_event_channel_op __HYPERVISOR_event_channel_op_compat -#undef __HYPERVISOR_physdev_op -#define __HYPERVISOR_physdev_op __HYPERVISOR_physdev_op_compat -#endif - -/* New platform_op hypercall introduced in 0x00030204. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030204 -#define __HYPERVISOR_dom0_op __HYPERVISOR_platform_op -#endif - -/* - * VIRTUAL INTERRUPTS - * - * Virtual interrupts that a guest OS may receive from Xen. - * - * In the side comments, 'V.' denotes a per-VCPU VIRQ while 'G.' denotes a - * global VIRQ. The former can be bound once per VCPU and cannot be re-bound. - * The latter can be allocated only once per guest: they must initially be - * 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_MEM_EVENT 10 /* G. (DOM0) A memory event has occured */ -#define VIRQ_XC_RESERVED 11 /* G. Reserved for XenClient */ -#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 NR_VIRQS 24 - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_mmu_update(const struct mmu_update reqs[], - * ` unsigned count, unsigned *done_out, - * ` unsigned foreigndom) - * ` - * @reqs is an array of mmu_update_t structures ((ptr, val) pairs). - * @count is the length of the above array. - * @pdone is an output parameter indicating number of completed operations - * @foreigndom[15:0]: FD, the expected owner of data pages referenced in this - * hypercall invocation. Can be DOMID_SELF. - * @foreigndom[31:16]: PFD, the expected owner of pagetable pages referenced - * in this hypercall invocation. The value of this field - * (x) encodes the PFD as follows: - * x == 0 => PFD == DOMID_SELF - * x != 0 => PFD == x - 1 - * - * Sub-commands: ptr[1:0] specifies the appropriate MMU_* command. - * ------------- - * ptr[1:0] == MMU_NORMAL_PT_UPDATE: - * Updates an entry in a page table belonging to PFD. If updating an L1 table, - * and the new table entry is valid/present, the mapped frame must belong to - * FD. If attempting to map an I/O page then the caller assumes the privilege - * of the FD. - * FD == DOMID_IO: Permit /only/ I/O mappings, at the priv level of the caller. - * FD == DOMID_XEN: Map restricted areas of Xen's heap space. - * ptr[:2] -- Machine address of the page-table entry to modify. - * val -- Value to write. - * - * There also certain implicit requirements when using this hypercall. The - * pages that make up a pagetable must be mapped read-only in the guest. - * This prevents uncontrolled guest updates to the pagetable. Xen strictly - * enforces this, and will disallow any pagetable update which will end up - * mapping pagetable page RW, and will disallow using any writable page as a - * pagetable. In practice it means that when constructing a page table for a - * process, thread, etc, we MUST be very dilligient in following these rules: - * 1). Start with top-level page (PGD or in Xen language: L4). Fill out - * the entries. - * 2). Keep on going, filling out the upper (PUD or L3), and middle (PMD - * or L2). - * 3). Start filling out the PTE table (L1) with the PTE entries. Once - * done, make sure to set each of those entries to RO (so writeable bit - * is unset). Once that has been completed, set the PMD (L2) for this - * PTE table as RO. - * 4). When completed with all of the PMD (L2) entries, and all of them have - * been set to RO, make sure to set RO the PUD (L3). Do the same - * operation on PGD (L4) pagetable entries that have a PUD (L3) entry. - * 5). Now before you can use those pages (so setting the cr3), you MUST also - * pin them so that the hypervisor can verify the entries. This is done - * via the HYPERVISOR_mmuext_op(MMUEXT_PIN_L4_TABLE, guest physical frame - * number of the PGD (L4)). And this point the HYPERVISOR_mmuext_op( - * MMUEXT_NEW_BASEPTR, guest physical frame number of the PGD (L4)) can be - * issued. - * For 32-bit guests, the L4 is not used (as there is less pagetables), so - * instead use L3. - * At this point the pagetables can be modified using the MMU_NORMAL_PT_UPDATE - * hypercall. Also if so desired the OS can also try to write to the PTE - * and be trapped by the hypervisor (as the PTE entry is RO). - * - * To deallocate the pages, the operations are the reverse of the steps - * mentioned above. The argument is MMUEXT_UNPIN_TABLE for all levels and the - * pagetable MUST not be in use (meaning that the cr3 is not set to it). - * - * ptr[1:0] == MMU_MACHPHYS_UPDATE: - * Updates an entry in the machine->pseudo-physical mapping table. - * ptr[:2] -- Machine address within the frame whose mapping to modify. - * The frame must belong to the FD, if one is specified. - * val -- Value to write into the mapping entry. - * - * ptr[1:0] == MMU_PT_UPDATE_PRESERVE_AD: - * As MMU_NORMAL_PT_UPDATE above, but A/D bits currently in the PTE are ORed - * with those in @val. - * - * @val is usually the machine frame number along with some attributes. - * The attributes by default follow the architecture defined bits. Meaning that - * if this is a X86_64 machine and four page table layout is used, the layout - * of val is: - * - 63 if set means No execute (NX) - * - 46-13 the machine frame number - * - 12 available for guest - * - 11 available for guest - * - 10 available for guest - * - 9 available for guest - * - 8 global - * - 7 PAT (PSE is disabled, must use hypercall to make 4MB or 2MB pages) - * - 6 dirty - * - 5 accessed - * - 4 page cached disabled - * - 3 page write through - * - 2 userspace accessible - * - 1 writeable - * - 0 present - * - * The one bits that does not fit with the default layout is the PAGE_PSE - * also called PAGE_PAT). The MMUEXT_[UN]MARK_SUPER arguments to the - * HYPERVISOR_mmuext_op serve as mechanism to set a pagetable to be 4MB - * (or 2MB) instead of using the PAGE_PSE bit. - * - * The reason that the PAGE_PSE (bit 7) is not being utilized is due to Xen - * using it as the Page Attribute Table (PAT) bit - for details on it please - * refer to Intel SDM 10.12. The PAT allows to set the caching attributes of - * pages instead of using MTRRs. - * - * The PAT MSR is as follows (it is a 64-bit value, each entry is 8 bits): - * PAT4 PAT0 - * +-----+-----+----+----+----+-----+----+----+ - * | UC | UC- | WC | WB | UC | UC- | WC | WB | <= Linux - * +-----+-----+----+----+----+-----+----+----+ - * | UC | UC- | WT | WB | UC | UC- | WT | WB | <= BIOS (default when machine boots) - * +-----+-----+----+----+----+-----+----+----+ - * | rsv | rsv | WP | WC | UC | UC- | WT | WB | <= Xen - * +-----+-----+----+----+----+-----+----+----+ - * - * The lookup of this index table translates to looking up - * Bit 7, Bit 4, and Bit 3 of val entry: - * - * PAT/PSE (bit 7) ... PCD (bit 4) .. PWT (bit 3). - * - * If all bits are off, then we are using PAT0. If bit 3 turned on, - * then we are using PAT1, if bit 3 and bit 4, then PAT2.. - * - * As you can see, the Linux PAT1 translates to PAT4 under Xen. Which means - * that if a guest that follows Linux's PAT setup and would like to set Write - * Combined on pages it MUST use PAT4 entry. Meaning that Bit 7 (PAGE_PAT) is - * set. For example, under Linux it only uses PAT0, PAT1, and PAT2 for the - * caching as: - * - * WB = none (so PAT0) - * WC = PWT (bit 3 on) - * UC = PWT | PCD (bit 3 and 4 are on). - * - * To make it work with Xen, it needs to translate the WC bit as so: - * - * PWT (so bit 3 on) --> PAT (so bit 7 is on) and clear bit 3 - * - * And to translate back it would: - * - * 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)) */ - -/* - * MMU EXTENDED OPERATIONS - * - * ` enum neg_errnoval - * ` HYPERVISOR_mmuext_op(mmuext_op_t uops[], - * ` unsigned int count, - * ` unsigned int *pdone, - * ` unsigned int foreigndom) - */ -/* HYPERVISOR_mmuext_op() accepts a list of mmuext_op structures. - * A foreigndom (FD) can be specified (or DOMID_SELF for none). - * Where the FD has some effect, it is described below. - * - * cmd: MMUEXT_(UN)PIN_*_TABLE - * mfn: Machine frame number to be (un)pinned as a p.t. page. - * The frame must belong to the FD, if one is specified. - * - * cmd: MMUEXT_NEW_BASEPTR - * mfn: Machine frame number of new page-table base to install in MMU. - * - * cmd: MMUEXT_NEW_USER_BASEPTR [x86/64 only] - * mfn: Machine frame number of new page-table base to install in MMU - * when in user space. - * - * cmd: MMUEXT_TLB_FLUSH_LOCAL - * No additional arguments. Flushes local TLB. - * - * cmd: MMUEXT_INVLPG_LOCAL - * linear_addr: Linear address to be flushed from the local TLB. - * - * cmd: MMUEXT_TLB_FLUSH_MULTI - * vcpumask: Pointer to bitmap of VCPUs to be flushed. - * - * cmd: MMUEXT_INVLPG_MULTI - * linear_addr: Linear address to be flushed. - * vcpumask: Pointer to bitmap of VCPUs to be flushed. - * - * cmd: MMUEXT_TLB_FLUSH_ALL - * No additional arguments. Flushes all VCPUs' TLBs. - * - * cmd: MMUEXT_INVLPG_ALL - * linear_addr: Linear address to be flushed from all VCPUs' TLBs. - * - * cmd: MMUEXT_FLUSH_CACHE - * No additional arguments. Writes back and flushes cache contents. - * - * cmd: MMUEXT_FLUSH_CACHE_GLOBAL - * No additional arguments. Writes back and flushes cache contents - * on all CPUs in the system. - * - * cmd: MMUEXT_SET_LDT - * linear_addr: Linear address of LDT base (NB. must be page-aligned). - * nr_ents: Number of entries in LDT. - * - * cmd: MMUEXT_CLEAR_PAGE - * mfn: Machine frame number to be cleared. - * - * cmd: MMUEXT_COPY_PAGE - * mfn: Machine frame number of the destination page. - * src_mfn: Machine frame number of the source page. - * - * cmd: MMUEXT_[UN]MARK_SUPER - * 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_FLUSH_CACHE_GLOBAL 18 -#define MMUEXT_MARK_SUPER 19 -#define MMUEXT_UNMARK_SUPER 20 -/* ` } */ - -#ifndef __ASSEMBLY__ -struct mmuext_op { - unsigned int cmd; /* => enum mmuext_cmd */ - union { - /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR - * CLEAR_PAGE, COPY_PAGE, [UN]MARK_SUPER */ - xen_pfn_t mfn; - /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */ - unsigned long linear_addr; - } arg1; - union { - /* SET_LDT */ - unsigned int nr_ents; - /* TLB_FLUSH_MULTI, INVLPG_MULTI */ -#if __XEN_INTERFACE_VERSION__ >= 0x00030205 - XEN_GUEST_HANDLE(const_void) vcpumask; -#else - const void *vcpumask; -#endif - /* COPY_PAGE */ - xen_pfn_t src_mfn; - } arg2; -}; -typedef struct mmuext_op mmuext_op_t; -DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); -#endif - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_update_va_mapping(unsigned long va, u64 val, - * ` enum uvm_flags flags) - * ` - * ` enum neg_errnoval - * ` HYPERVISOR_update_va_mapping_otherdomain(unsigned long va, u64 val, - * ` enum uvm_flags flags, - * ` domid_t domid) - * ` - * ` @va: The virtual address whose mapping we want to change - * ` @val: The new page table entry, must contain a machine address - * ` @flags: Control TLB flushes - */ -/* These are passed as 'flags' to update_va_mapping. They can be ORed. */ -/* 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. */ -/* ` } */ - -/* - * Commands to HYPERVISOR_console_io(). - */ -#define CONSOLEIO_write 0 -#define CONSOLEIO_read 1 - -/* - * Commands to HYPERVISOR_vm_assist(). - */ -#define VMASST_CMD_enable 0 -#define VMASST_CMD_disable 1 - -/* x86/32 guests: simulate full 4GB segment limits. */ -#define VMASST_TYPE_4gb_segments 0 - -/* x86/32 guests: trap (vector 15) whenever above vmassist is used. */ -#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 - -/* x86/PAE guests: support PDPTs above 4GB. */ -#define VMASST_TYPE_pae_extended_cr3 3 - -/* - * x86 guests: Sane behaviour for virtual iopl - * - virtual iopl updated from do_iret() hypercalls. - * - 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 - -/* - * All guests: activate update indicator in vcpu_runstate_info - * Enable setting the XEN_RUNSTATE_UPDATE flag in guest memory mapped - * vcpu_runstate_info during updates of the runstate information. - */ -#define VMASST_TYPE_runstate_update_flag 5 - -/* - * x86/64 guests: strictly hide M2P from user mode. - * This allows the guest to control respective hypervisor behavior: - * - when not set, L4 tables get created with the respective slot blank, - * and whenever the L4 table gets used as a kernel one the missing - * mapping gets inserted, - * - when set, L4 tables get created with the respective slot initialized - * as before, and whenever the L4 table gets used as a user one the - * mapping gets zapped. - */ -#define VMASST_TYPE_m2p_strict 32 - -#if __XEN_INTERFACE_VERSION__ < 0x00040600 -#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) - -/* - * DOMID_IO is used to restrict page-table updates to mapping I/O memory. - * Although no Foreign Domain need be specified to map I/O pages, DOMID_IO - * is useful to ensure that no mappings to the OS's own heap are accidentally - * installed. (e.g., in Linux this could cause havoc as reference counts - * aren't adjusted on the I/O-mapping code path). - * This only makes sense as HYPERVISOR_mmu_update()'s and - * HYPERVISOR_update_va_mapping_otherdomain()'s "foreigndom" argument. For - * 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) - -/* - * DOMID_XEN is used to allow privileged domains to map restricted parts of - * Xen's heap space (e.g., the machine_to_phys table). - * This only makes sense as - * - HYPERVISOR_mmu_update()'s, HYPERVISOR_mmuext_op()'s, or - * HYPERVISOR_update_va_mapping_otherdomain()'s "foreigndom" argument, - * - with XENMAPSPACE_gmfn_foreign, - * and is only permitted if the caller is privileged. - */ -#define DOMID_XEN xen_mk_uint(0x7FF2) - -/* - * DOMID_COW is used as the owner of sharable pages */ -#define DOMID_COW xen_mk_uint(0x7FF3) - -/* DOMID_INVALID is used to identify pages with unknown owner. */ -#define DOMID_INVALID xen_mk_uint(0x7FF4) - -/* Idle domain. */ -#define DOMID_IDLE xen_mk_uint(0x7FFF) - -#ifndef __ASSEMBLY__ - -typedef uint16_t domid_t; - -/* - * Send an array of these to HYPERVISOR_mmu_update(). - * 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. */ -}; -typedef struct mmu_update mmu_update_t; -DEFINE_XEN_GUEST_HANDLE(mmu_update_t); - -/* - * ` enum neg_errnoval - * ` HYPERVISOR_multicall(multicall_entry_t call_list[], - * ` uint32_t nr_calls); - * - * NB. The fields are logically the natural register size for this - * architecture. In cases where xen_ulong_t is larger than this then - * any unused bits in the upper portion must be zero. - */ -struct multicall_entry { - xen_ulong_t op, result; - xen_ulong_t args[6]; -}; -typedef struct multicall_entry multicall_entry_t; -DEFINE_XEN_GUEST_HANDLE(multicall_entry_t); - -#if __XEN_INTERFACE_VERSION__ < 0x00040400 -/* - * Event channel endpoints per domain (when using the 2-level ABI): - * 1024 if a long is 32 bits; 4096 if a long is 64 bits. - */ -#define NR_EVENT_CHANNELS EVTCHN_2L_NR_CHANNELS -#endif - -struct vcpu_time_info { - /* - * Updates to the following values are preceded and followed by an - * increment of 'version'. The guest can therefore detect updates by - * looking for changes to 'version'. If the least-significant bit of - * the version number is set then an update is in progress and the guest - * must wait to read a consistent set of values. - * The correct way to interact with the version number is similar to - * Linux's seqlock: see the implementations of read_seqbegin/read_seqretry. - */ - 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. */ - /* - * Current system time: - * system_time + - * ((((tsc - tsc_timestamp) << tsc_shift) * tsc_to_system_mul) >> 32) - * CPU frequency (Hz): - * ((10^9 << 32) / tsc_to_system_mul) >> tsc_shift - */ - uint32_t tsc_to_system_mul; - int8_t tsc_shift; -#if __XEN_INTERFACE_VERSION__ > 0x040600 - uint8_t flags; - uint8_t pad1[2]; -#else - 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) - -struct vcpu_info { - /* - * 'evtchn_upcall_pending' is written non-zero by Xen to indicate - * a pending notification for a particular VCPU. It is then cleared - * by the guest OS /before/ checking for pending work, thus avoiding - * a set-and-check race. Note that the mask is only accessed by Xen - * on the CPU that is currently hosting the VCPU. This means that the - * pending and mask flags can be updated by the guest without special - * synchronisation (i.e., no need for the x86 LOCK prefix). - * This may seem suboptimal because if the pending flag is set by - * a different CPU then an IPI may be scheduled even when the mask - * is set. However, note: - * 1. The task of 'interrupt holdoff' is covered by the per-event- - * channel mask bits. A 'noisy' event that is continually being - * triggered can be masked at source at this very precise - * granularity. - * 2. The main purpose of the per-VCPU mask is therefore to restrict - * reentrant execution: whether for concurrency control, or to - * prevent unbounded stack usage. Whatever the purpose, we expect - * that the mask will be asserted only for short periods at a time, - * and so the likelihood of a 'spurious' IPI is suitably small. - * The mask is read before making an event upcall to the guest: a - * non-zero mask therefore guarantees that the VCPU will not receive - * an upcall activation. The mask is cleared when the VCPU requests - * to block: this avoids wakeup-waiting races. - */ - uint8_t evtchn_upcall_pending; -#ifdef XEN_HAVE_PV_UPCALL_MASK - uint8_t evtchn_upcall_mask; -#else /* XEN_HAVE_PV_UPCALL_MASK */ - uint8_t pad0; -#endif /* XEN_HAVE_PV_UPCALL_MASK */ - xen_ulong_t evtchn_pending_sel; - struct arch_vcpu_info arch; - struct vcpu_time_info time; -}; /* 64 bytes (x86) */ -#ifndef __XEN__ -typedef struct vcpu_info vcpu_info_t; -#endif - -/* - * `incontents 200 startofday_shared Start-of-day shared data structure - * Xen/kernel shared data -- pointer provided in start_info. - * - * This structure is defined to be both smaller than a page, and the - * only data on the shared page, but may vary in actual size even within - * compatible Xen versions; guests should not rely on the size - * of this structure remaining constant. - */ -struct shared_info { - struct vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS]; - - /* - * A domain can create "event channels" on which it can send and receive - * asynchronous event notifications. There are three classes of event that - * are delivered by this mechanism: - * 1. Bi-directional inter- and intra-domain connections. Domains must - * arrange out-of-band to set up a connection (usually by allocating - * an unbound 'listener' port and avertising that via a storage service - * such as xenstore). - * 2. Physical interrupts. A domain with suitable hardware-access - * privileges can bind an event-channel port to a physical interrupt - * source. - * 3. Virtual interrupts ('events'). A domain can bind an event-channel - * port to a virtual interrupt source, such as the virtual-timer - * device or the emergency console. - * - * Event channels are addressed by a "port index". Each channel is - * associated with two bits of information: - * 1. PENDING -- notifies the domain that there is a pending notification - * to be processed. This bit is cleared by the guest. - * 2. MASK -- if this bit is clear then a 0->1 transition of PENDING - * will cause an asynchronous upcall to be scheduled. This bit is only - * updated by the guest. It is read-only within Xen. If a channel - * becomes pending while the channel is masked then the 'edge' is lost - * (i.e., when the channel is unmasked, the guest must manually handle - * pending notifications as no upcall will be scheduled by Xen). - * - * To expedite scanning of pending notifications, any 0->1 pending - * transition on an unmasked channel causes a corresponding bit in a - * per-vcpu selector word to be set. Each bit in the selector covers a - * 'C long' in the PENDING bitfield array. - */ - xen_ulong_t evtchn_pending[sizeof(xen_ulong_t) * 8]; - xen_ulong_t evtchn_mask[sizeof(xen_ulong_t) * 8]; - - /* - * Wallclock time: updated only by control software. Guests should base - * their gettimeofday() syscall on this wallclock-base value. - */ - uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ - uint32_t wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */ - uint32_t wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */ -#if !defined(__i386__) - uint32_t 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 -#endif - - struct arch_shared_info arch; - -}; -#ifndef __XEN__ -typedef struct shared_info shared_info_t; -#endif - -/* - * `incontents 200 startofday Start-of-day memory layout - * - * 1. The domain is started within contiguous virtual-memory region. - * 2. The contiguous region ends on an aligned 4MB boundary. - * 3. This the order of bootstrap elements in the initial virtual region: - * a. relocated kernel image - * b. initial ram disk [mod_start, mod_len] - * (may be omitted) - * c. list of allocated page frames [mfn_list, nr_pages] - * (unless relocated due to XEN_ELFNOTE_INIT_P2M) - * d. start_info_t structure [register rSI (x86)] - * in case of dom0 this page contains the console info, too - * e. unless dom0: xenstore ring page - * f. unless dom0: console ring page - * g. bootstrap page tables [pt_base and CR3 (x86)] - * h. bootstrap stack [register ESP (x86)] - * 4. Bootstrap elements are packed together, but each is 4kB-aligned. - * 5. The list of page frames forms a contiguous 'pseudo-physical' memory - * layout for the domain. In particular, the bootstrap virtual-memory - * region is a 1:1 mapping to the first section of the pseudo-physical map. - * 6. All bootstrap elements are mapped read-writable for the guest OS. The - * only exception is the bootstrap page table, which is mapped read-only. - * 7. There is guaranteed to be at least 512kB padding after the final - * bootstrap element. If necessary, the bootstrap virtual region is - * extended by an extra 4MB to ensure this. - * - * Note: Prior to 25833:bb85bbccb1c9. ("x86/32-on-64 adjust Dom0 initial page - * table layout") a bug caused the pt_base (3.g above) and cr3 to not point - * to the start of the guest page tables (it was offset by two pages). - * This only manifested itself on 32-on-64 dom0 kernels and not 32-on-64 domU - * or 64-bit kernels of any colour. The page tables for a 32-on-64 dom0 got - * allocated in the order: 'first L1','first L2', 'first L3', so the offset - * to the page table base is by two pages back. The initial domain if it is - * 32-bit and runs under a 64-bit hypervisor should _NOT_ use two of the - * pages preceding pt_base and mark them as reserved/unused. - */ -#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. */ - union { - struct { - 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_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 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. */ -#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. */ -}; -typedef struct start_info start_info_t; - -/* New console union for dom0 introduced in 0x00030203. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030203 -#define console_mfn console.domU.mfn -#define console_evtchn console.domU.evtchn -#endif -#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 */ - -/* - * A multiboot module is a package containing modules very similar to a - * multiboot module array. The only differences are: - * - the array of module descriptors is by convention simply at the beginning - * of the multiboot module, - * - addresses in the module descriptors are based on the beginning of the - * multiboot module, - * - the number of modules is determined by a termination descriptor that has - * mod_start == 0. - * - * This permits to both build it statically and reference it in a configuration - * 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 -{ - /* Address of first byte of the module */ - uint32_t mod_start; - /* Address of last byte of the module (inclusive) */ - uint32_t mod_end; - /* Address of zero-terminated command line */ - uint32_t cmdline; - /* Unused, must be zero */ - uint32_t pad; -}; -/* - * `incontents 200 startofday_dom0_console Dom0_console - * - * The console structure in start_info.console.dom0 - * - * This structure includes a variety of information required to - * have a working VGA/VESA console. - */ -typedef struct dom0_vga_console_info { - uint8_t video_type; /* DOM0_VGA_CONSOLE_??? */ -#define XEN_VGATYPE_TEXT_MODE_3 0x03 -#define XEN_VGATYPE_VESA_LFB 0x23 -#define XEN_VGATYPE_EFI_LFB 0x70 - - union { - struct { - /* Font height, in pixels. */ - uint16_t font_height; - /* Cursor location (column, row). */ - uint16_t cursor_x, cursor_y; - /* Number of rows and columns (dimensions in characters). */ - uint16_t rows, columns; - } text_mode_3; - - struct { - /* Width and height, in pixels. */ - uint16_t width, height; - /* Bytes per scan line. */ - uint16_t bytes_per_line; - /* Bits per pixel. */ - uint16_t bits_per_pixel; - /* LFB physical address, and size (in units of 64kB). */ - 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; -#if __XEN_INTERFACE_VERSION__ >= 0x00030206 - /* VESA capabilities (offset 0xa, VESA command 0x4f00). */ - uint32_t gbl_caps; - /* Mode attributes (offset 0x0, VESA command 0x4f01). */ - uint16_t mode_attrs; -#endif - } vesa_lfb; - } u; -} dom0_vga_console_info_t; -#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(uint16, uint16_t); -__DEFINE_XEN_GUEST_HANDLE(uint32, uint32_t); -__DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t); - -typedef struct { - uint8_t a[16]; -} xen_uuid_t; - -/* - * XEN_DEFINE_UUID(0x00112233, 0x4455, 0x6677, 0x8899, - * 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff) - * will construct UUID 00112233-4455-6677-8899-aabbccddeeff presented as - * {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, - * 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; - * - * NB: This is compatible with Linux kernel and with libuuid, but it is not - * 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}} - -#if defined(__STDC_VERSION__) ? __STDC_VERSION__ >= 199901L : defined(__GNUC__) -#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) \ - XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) -#endif /* __STDC_VERSION__ / __GNUC__ */ - -#endif /* !__ASSEMBLY__ */ - -/* Default definitions for macros used by domctl/sysctl. */ -#if defined(__XEN__) || defined(__XEN_TOOLS__) - -#ifndef int64_aligned_t -#define int64_aligned_t int64_t -#endif -#ifndef uint64_aligned_t -#define uint64_aligned_t uint64_t -#endif -#ifndef XEN_GUEST_HANDLE_64 -#define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name) -#endif - -#ifndef __ASSEMBLY__ -struct xenctl_bitmap { - XEN_GUEST_HANDLE_64(uint8) bitmap; - uint32_t nr_bits; -}; -#endif - -#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ - -#endif /* __XEN_PUBLIC_XEN_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/xencomm.h b/plat/xen/include/xen/xencomm.h deleted file mode 100644 index ac45e0712afa09e9fa2004c48224e02e86f20fd6..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/xencomm.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) IBM Corp. 2006 - */ - -#ifndef _XEN_XENCOMM_H_ -#define _XEN_XENCOMM_H_ - -/* A xencomm descriptor is a scatter/gather list containing physical - * addresses corresponding to a virtually contiguous memory area. The - * hypervisor translates these physical addresses to machine addresses to copy - * to and from the virtually contiguous area. - */ - -#define XENCOMM_MAGIC 0x58434F4D /* 'XCOM' */ -#define XENCOMM_INVALID (~0UL) - -struct xencomm_desc { - uint32_t magic; - uint32_t nr_addrs; /* the number of entries in address[] */ - uint64_t address[0]; -}; - -#endif /* _XEN_XENCOMM_H_ */ diff --git a/plat/xen/include/xen/xenoprof.h b/plat/xen/include/xen/xenoprof.h deleted file mode 100644 index 1955db1941c736e38792587a8b0c788b4117172a..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/xenoprof.h +++ /dev/null @@ -1,152 +0,0 @@ -/****************************************************************************** - * xenoprof.h - * - * Interface for enabling system wide profiling based on hardware performance - * counters - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Copyright (C) 2005 Hewlett-Packard Co. - * Written by Aravind Menon & Jose Renato Santos - */ - -#ifndef __XEN_PUBLIC_XENOPROF_H__ -#define __XEN_PUBLIC_XENOPROF_H__ - -#include "xen.h" - -/* - * 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_stop 10 -#define XENOPROF_disable_virq 11 -#define XENOPROF_release_counters 12 -#define XENOPROF_shutdown 13 -#define XENOPROF_get_buffer 14 -#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 MAX_OPROF_EVENTS 32 -#define MAX_OPROF_DOMAINS 25 -#define XENOPROF_CPU_TYPE_SIZE 64 - -/* Xenoprof performance events (not Xen events) */ -struct event_log { - uint64_t eip; - uint8_t mode; - uint8_t event; -}; - -/* PC value that indicates a special code */ -#define XENOPROF_ESCAPE_CODE (~xen_mk_ullong(0)) -/* Transient events for the xenoprof->oprofile cpu buf */ -#define XENOPROF_TRACE_BEGIN 1 - -/* Xenoprof buffer shared between Xen and domain - 1 per VCPU */ -struct xenoprof_buf { - uint32_t event_head; - uint32_t event_tail; - uint32_t event_size; - uint32_t vcpu_id; - uint64_t xen_samples; - uint64_t kernel_samples; - uint64_t user_samples; - uint64_t lost_samples; - struct event_log event_log[1]; -}; -#ifndef __XEN__ -typedef struct xenoprof_buf xenoprof_buf_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_buf_t); -#endif - -struct xenoprof_init { - 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; - uint64_t buf_gmaddr; -}; -typedef struct xenoprof_get_buffer xenoprof_get_buffer_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_get_buffer_t); - -struct xenoprof_counter { - uint32_t ind; - uint64_t count; - uint32_t enabled; - uint32_t event; - uint32_t hypervisor; - uint32_t kernel; - uint32_t user; - uint64_t unit_mask; -}; -typedef struct xenoprof_counter xenoprof_counter_t; -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; - uint64_t buf_gmaddr; -} xenoprof_passive_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_passive_t); - -struct xenoprof_ibs_counter { - uint64_t op_enabled; - uint64_t fetch_enabled; - uint64_t max_cnt_fetch; - uint64_t max_cnt_op; - uint64_t rand_en; - uint64_t dispatched_ops; -}; -typedef struct xenoprof_ibs_counter xenoprof_ibs_counter_t; -DEFINE_XEN_GUEST_HANDLE(xenoprof_ibs_counter_t); - -#endif /* __XEN_PUBLIC_XENOPROF_H__ */ - -/* - * Local variables: - * mode: C - * c-file-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/plat/xen/include/xen/xsm/flask_op.h b/plat/xen/include/xen/xsm/flask_op.h deleted file mode 100644 index 970ec07f0b36eb47d1ac36b480b9c55bc8d4e6a2..0000000000000000000000000000000000000000 --- a/plat/xen/include/xen/xsm/flask_op.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * This file contains the flask_op hypercall commands and definitions. - * - * Author: George Coker, - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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 __FLASK_OP_H__ -#define __FLASK_OP_H__ - -#include "../event_channel.h" - -#define XEN_FLASK_INTERFACE_VERSION 1 - -struct xen_flask_load { - XEN_GUEST_HANDLE(char) buffer; - uint32_t size; -}; - -struct xen_flask_setenforce { - uint32_t enforcing; -}; - -struct xen_flask_sid_context { - /* IN/OUT: sid to convert to/from string */ - uint32_t sid; - /* IN: size of the context buffer - * OUT: actual size of the output context string - */ - uint32_t size; - XEN_GUEST_HANDLE(char) context; -}; - -struct xen_flask_access { - /* IN: access request */ - uint32_t ssid; - uint32_t tsid; - uint32_t tclass; - uint32_t req; - /* OUT: AVC data */ - uint32_t allowed; - uint32_t audit_allow; - uint32_t audit_deny; - uint32_t seqno; -}; - -struct xen_flask_transition { - /* IN: transition SIDs and class */ - uint32_t ssid; - uint32_t tsid; - uint32_t tclass; - /* OUT: new SID */ - uint32_t newsid; -}; - -#if __XEN_INTERFACE_VERSION__ < 0x00040800 -struct xen_flask_userlist { - /* IN: starting SID for list */ - uint32_t start_sid; - /* IN: size of user string and output buffer - * OUT: number of SIDs returned */ - uint32_t size; - union { - /* IN: user to enumerate SIDs */ - XEN_GUEST_HANDLE(char) user; - /* OUT: SID list */ - XEN_GUEST_HANDLE(uint32) sids; - } u; -}; -#endif - -struct xen_flask_boolean { - /* IN/OUT: numeric identifier for boolean [GET/SET] - * If -1, name will be used and bool_id will be filled in. */ - uint32_t bool_id; - /* OUT: current enforcing value of boolean [GET/SET] */ - uint8_t enforcing; - /* OUT: pending value of boolean [GET/SET] */ - uint8_t pending; - /* IN: new value of boolean [SET] */ - uint8_t new_value; - /* IN: commit new value instead of only setting pending [SET] */ - uint8_t commit; - /* IN: size of boolean name buffer [GET/SET] - * OUT: actual size of name [GET only] */ - uint32_t size; - /* IN: if bool_id is -1, used to find boolean [GET/SET] - * OUT: textual name of boolean [GET only] - */ - XEN_GUEST_HANDLE(char) name; -}; - -struct xen_flask_setavc_threshold { - /* IN */ - uint32_t threshold; -}; - -struct xen_flask_hash_stats { - /* OUT */ - uint32_t entries; - uint32_t buckets_used; - uint32_t buckets_total; - uint32_t max_chain_len; -}; - -struct xen_flask_cache_stats { - /* IN */ - uint32_t cpu; - /* OUT */ - uint32_t lookups; - uint32_t hits; - uint32_t misses; - uint32_t allocations; - uint32_t reclaims; - uint32_t frees; -}; - -struct xen_flask_ocontext { - /* IN */ - uint32_t ocon; - uint32_t sid; - uint64_t low, high; -}; - -struct xen_flask_peersid { - /* IN */ - evtchn_port_t evtchn; - /* OUT */ - uint32_t sid; -}; - -struct xen_flask_relabel { - /* IN */ - uint32_t domid; - uint32_t sid; -}; - -struct xen_flask_devicetree_label { - /* IN */ - uint32_t sid; - uint32_t length; - XEN_GUEST_HANDLE(char) path; -}; - -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 - uint32_t interface_version; /* XEN_FLASK_INTERFACE_VERSION */ - union { - struct xen_flask_load load; - struct xen_flask_setenforce enforce; - /* FLASK_CONTEXT_TO_SID and FLASK_SID_TO_CONTEXT */ - struct xen_flask_sid_context sid_context; - struct xen_flask_access access; - /* FLASK_CREATE, FLASK_RELABEL, FLASK_MEMBER */ - struct xen_flask_transition transition; -#if __XEN_INTERFACE_VERSION__ < 0x00040800 - struct xen_flask_userlist userlist; -#endif - /* FLASK_GETBOOL, FLASK_SETBOOL */ - struct xen_flask_boolean boolean; - struct xen_flask_setavc_threshold setavc_threshold; - struct xen_flask_hash_stats hash_stats; - struct xen_flask_cache_stats cache_stats; - /* FLASK_ADD_OCONTEXT, FLASK_DEL_OCONTEXT */ - struct xen_flask_ocontext ocontext; - struct xen_flask_peersid peersid; - struct xen_flask_relabel relabel; - struct xen_flask_devicetree_label devicetree_label; - } u; -}; -typedef struct xen_flask_op xen_flask_op_t; -DEFINE_XEN_GUEST_HANDLE(xen_flask_op_t); - -#endif diff --git a/plat/xen/include/xenbus/client.h b/plat/xen/include/xenbus/client.h deleted file mode 100644 index aa362fef754bcb8a7b5f1edbfcb69149b7149d8e..0000000000000000000000000000000000000000 --- a/plat/xen/include/xenbus/client.h +++ /dev/null @@ -1,123 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* - * Client interface between the device and the Xenbus driver. - * Ported from Mini-OS xenbus.c - */ - -#ifndef __XENBUS_CLIENT_H__ -#define __XENBUS_CLIENT_H__ - -#include - -/* - * Returns the name of the state for tracing/debugging purposes. - * - * @param state The Xenbus state - * @return A string representing the state name - */ -const char *xenbus_state_to_str(XenbusState state); - -/* - * Converts a device type value to name - * - * @param devtype The Xenbus device type - * @return A string representing the device type name - */ -const char *xenbus_devtype_to_str(enum xenbus_dev_type devtype); - -/* - * Converts a device type name to value - * - * @param devtypestr The Xenbus device type name - * @return The Xenbus device type - */ -enum xenbus_dev_type xenbus_str_to_devtype(const char *devtypestr); - - -/* - * Watches - */ - -/* - * Waits for a watch event. Called by a client driver. - * - * @param watch Xenbus watch - * @return 0 on success, a negative errno value on error. - */ -int xenbus_watch_wait_event(struct xenbus_watch *watch); - -/* - * Notifies a client driver waiting for watch events. - * - * @param watch Xenbus watch - * @return 0 on success, a negative errno value on error. - */ -int xenbus_watch_notify_event(struct xenbus_watch *watch); - -/* - * Driver states - */ - -/* - * Returns the driver state found at the given Xenstore path. - * - * @param path Xenstore path - * @return The Xenbus driver state - */ -XenbusState xenbus_read_driver_state(const char *path); - -/* - * Changes the state of a Xen PV driver - * - * @param xbt Xenbus transaction id - * @param xendev Xenbus device - * @param state The new Xenbus state - * @return 0 on success, a negative errno value on error. - */ -int xenbus_switch_state(xenbus_transaction_t xbt, - struct xenbus_device *xendev, XenbusState state); - -/* - * Waits for the driver state found at the given Xenstore path to change by - * using watches. - * - * @param path Xenstore path - * @param state The returned Xenbus state - * @param watch Xenbus watch. It may be NULL, in which case a local watch - * will be created. - * @return 0 on success, a negative errno value on error. - */ -int xenbus_wait_for_state_change(const char *path, XenbusState *state, - struct xenbus_watch *watch); - -#endif /* __XENBUS_CLIENT_H__ */ diff --git a/plat/xen/include/xenbus/xenbus.h b/plat/xen/include/xenbus/xenbus.h deleted file mode 100644 index f018c0393c33e7532f914bd15d9ca25919d458f8..0000000000000000000000000000000000000000 --- a/plat/xen/include/xenbus/xenbus.h +++ /dev/null @@ -1,156 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __XENBUS_H__ -#define __XENBUS_H__ - -#include -#include -#include -#include -#include -#include -#include - - -/* - * Supported device types - */ -typedef enum xenbus_dev_type { - xenbus_dev_none = 0, - xenbus_dev_vif, - xenbus_dev_vbd, - xenbus_dev_9pfs, -} xenbus_dev_type_t; - -struct xenbus_device; - -/* - * Xenbus driver - */ - -typedef int (*xenbus_driver_init_func_t)(struct uk_alloc *a); -typedef int (*xenbus_driver_add_func_t)(struct xenbus_device *dev); - - -struct xenbus_driver { - UK_TAILQ_ENTRY(struct xenbus_driver) next; - const xenbus_dev_type_t *device_types; - - xenbus_driver_init_func_t init; - xenbus_driver_add_func_t add_dev; -}; -UK_TAILQ_HEAD(xenbus_driver_list, struct xenbus_driver); - - -#define XENBUS_REGISTER_DRIVER(b) \ - _XENBUS_REGISTER_DRIVER(__LIBNAME__, (b)) - -#define _XENBUS_REGFNNAME(x, y) x##y - -#define _XENBUS_REGISTER_CTOR(ctor) \ - UK_CTOR_PRIO(ctor, UK_PRIO_AFTER(UK_BUS_REGISTER_PRIO)) - -#define _XENBUS_REGISTER_DRIVER(libname, b) \ - static void \ - _XENBUS_REGFNNAME(libname, _xenbus_register_driver)(void) \ - { \ - _xenbus_register_driver((b)); \ - } \ - _XENBUS_REGISTER_CTOR( \ - _XENBUS_REGFNNAME(libname, _xenbus_register_driver)) - -/* Do not use this function directly: */ -void _xenbus_register_driver(struct xenbus_driver *drv); - -typedef unsigned long xenbus_transaction_t; -#define XBT_NIL ((xenbus_transaction_t) 0) - -/* - * Xenbus watch - */ - -struct xenbus_watch { - /**< in use internally */ - UK_TAILQ_ENTRY(struct xenbus_watch) watch_list; - /**< Lock */ - __spinlock lock; - /**< Number of pending events */ - int pending_events; - /**< Watch waiting queue */ - struct uk_waitq wq; -}; -UK_TAILQ_HEAD(xenbus_watch_list, struct xenbus_watch); - - -/* - * Xenbus device - */ - -struct xenbus_device { - /**< in use by Xenbus handler */ - UK_TAILQ_ENTRY(struct xenbus_device) next; - /**< Device state */ - XenbusState state; - /**< Device type */ - enum xenbus_dev_type devtype; - /**< Xenstore path of the device */ - char *nodename; - /**< Xenstore path of the device peer (e.g. backend for frontend) */ - char *otherend; - /**< Domain id of the other end */ - domid_t otherend_id; - /**< Watch for monitoring changes on other end */ - struct xenbus_watch *otherend_watch; - /**< Xenbus driver */ - struct xenbus_driver *drv; -}; -UK_TAILQ_HEAD(xenbus_device_list, struct xenbus_device); - - -/* - * Xenbus handler - */ - -struct xenbus_handler { - struct uk_bus b; - struct uk_alloc *a; - struct xenbus_driver_list drv_list; /**< List of Xenbus drivers */ - struct xenbus_device_list dev_list; /**< List of Xenbus devices */ -}; - -/* Helper functions for Xenbus related allocations */ -void *uk_xb_malloc(size_t size); -void *uk_xb_calloc(size_t nmemb, size_t size); -void uk_xb_free(void *ptr); - -#endif /* __XENBUS_H__ */ diff --git a/plat/xen/include/xenbus/xs.h b/plat/xen/include/xenbus/xs.h deleted file mode 100644 index f41f53dcb5692750e6050bb2ff71a241d2ae03b4..0000000000000000000000000000000000000000 --- a/plat/xen/include/xenbus/xs.h +++ /dev/null @@ -1,299 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* Xenstore API */ -/* - * TODO The intention for this API is to be used by applications as well. - * Therefore, all data allocated by this API for external use must be free'd - * calling 'free' function (and not uk_xb_free). This is the reason why such - * data is allocated with 'malloc'/'calloc'. - */ - -#ifndef __XS_H__ -#define __XS_H__ - -#include - - -/* - * Read the value associated with a path. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @param node Xenstore subdirectory - * @return On success, returns a malloc'd copy of the value. On error, returns - * a negative error number which should be checked using PTRISERR. - */ -char *xs_read(xenbus_transaction_t xbt, const char *path, const char *node); - -/* - * Associates a value with a path. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @param node Xenstore subdirectory (optional) - * @param value Xenstore value - * @return 0 on success, a negative errno value on error. - */ -int xs_write(xenbus_transaction_t xbt, const char *path, const char *node, - const char *value); - -/* - * List the contents of a directory. - * - * @param xbt Xenbus transaction id - * @param path Xenstore directory path - * @param node Xenstore subdirectory (optional) - * @return On success, returns a malloc'd array of pointers to strings. The - * array is NULL terminated. The caller should free only the array. On error, - * returns a negative error number which should be checked using PTRISERR. - * May block. - */ -char **xs_ls(xenbus_transaction_t xbt, const char *path); - -/* - * Removes the value associated with a path. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @return 0 on success, a negative errno value on error. - */ -int xs_rm(xenbus_transaction_t xbt, const char *path); - -/* - * Xenstore permissions - */ -enum xs_perm { - XS_PERM_NONE = 0x0, - XS_PERM_READ = 0x1, - XS_PERM_WRITE = 0x2, - XS_PERM_BOTH = XS_PERM_WRITE | XS_PERM_READ -}; - -/* - * Converts a character to corresponding permission value. - * - * @param c Permission character - * @param perm Permission value - * @return 0 on success, a negative errno value on error. - */ -int xs_char_to_perm(char c, enum xs_perm *perm); - -/* - * Converts a permission value to corresponding character. - * - * @param perm Permission value - * @param c Permission character - * @return 0 on success, a negative errno value on error. - */ -int xs_perm_to_char(enum xs_perm perm, char *c); - -/* - * Extracts domid and permission value out of a permission string. - * - * @param str Permission string - * @param domid Domain ID - * @param perm Permission value - * @return 0 on success, a negative errno value on error. - */ -int xs_str_to_perm(const char *str, domid_t *domid, enum xs_perm *perm); - -/* - * Returns a permission string from domid and permission value. - * - * @param domid Domain ID - * @param perm Permission value - * @return On success, returns a malloc'd string. On error, returns a negative - * error number which should be checked using PTRISERR. - */ -char *xs_perm_to_str(domid_t domid, enum xs_perm perm); - -/* - * Xenstore ACL - */ -struct xs_acl_entry { - domid_t domid; - enum xs_perm perm; -}; - -struct xs_acl { - domid_t ownerid; - enum xs_perm others_perm; - int entries_num; - struct xs_acl_entry entries[]; -}; - -/* - * Returns the ACL for input path. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @return On success, returns a malloc'd ACL. On error, returns a - * negative error number which should be checked using PTRISERR. - */ -struct xs_acl *xs_get_acl(xenbus_transaction_t xbt, const char *path); - -/* - * Sets ACL for input path. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @param acl New ACL - * @return 0 on success, a negative errno value on error. - */ -int xs_set_acl(xenbus_transaction_t xbt, const char *path, struct xs_acl *acl); - -/* - * Reads permissions for input path and domid. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @param domid Domain ID - * @param perm Permission value - * @return 0 on success, a negative errno value on error. - */ -int xs_get_perm(xenbus_transaction_t xbt, const char *path, - domid_t domid, enum xs_perm *perm); - -/* - * Sets permissions for input path and domid. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @param domid Domain ID - * @param perm Permission value - * @return 0 on success, a negative errno value on error. - */ -int xs_set_perm(xenbus_transaction_t xbt, const char *path, - domid_t domid, enum xs_perm perm); - -/* - * Deletes permissions for domid. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @param domid Domain ID - * @return 0 on success, a negative errno value on error. - */ -int xs_del_perm(xenbus_transaction_t xbt, const char *path, - domid_t domid); - -/* - * Creates and registers a Xenbus watch - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @return On success, returns a malloc'd Xenbus watch. On error, returns - * a negative error number which should be checked using PTRISERR. - */ -struct xenbus_watch *xs_watch_path(xenbus_transaction_t xbt, const char *path); - -/* - * Unregisters and destroys a Xenbus watch - * - * @param xbt Xenbus transaction id - * @param watch Xenbus watch - * @return 0 on success, a negative errno value on error. - */ -int xs_unwatch(xenbus_transaction_t xbt, struct xenbus_watch *watch); - -/* - * Start a xenbus transaction. Returns the transaction in xbt on - * success or an error number otherwise. - * - * @param xbt Address for returning the Xenbus transaction id - * @return 0 on success, a negative errno value on error. - */ -int xs_transaction_start(xenbus_transaction_t *xbt); - -/* - * End a xenbus transaction. Returns non-zero on failure. - * Parameter abort says whether the transaction should be aborted. - * Returns 1 in *retry iff the transaction should be retried. - * - * @param xbt Xenbus transaction id - * @param abort Non-zero if transaction should be aborted - * @return 0 on success, a negative errno value on error. - */ -int xs_transaction_end(xenbus_transaction_t xbt, int abort); - -/* - * Sends a debug message to the Xenstore daemon for writing it in the debug log - * - * @param msg The logged message - * @return 0 on success, a negative errno value on error. - */ -int xs_debug_msg(const char *msg); - -/* - * Read path and parse it as an integer. - * - * @param xbt Xenbus transaction id - * @param path Xenstore path - * @param value Returned int value - * @return 0 on success, a negative errno value on error. - */ -int xs_read_integer(xenbus_transaction_t xbt, const char *path, int *value); - -/* - * Contraction of sscanf and xs_read(node/path). - * - * @param xbt Xenbus transaction id - * @param dir Xenstore directory - * @param node Xenstore directory entry - * @param fmt Path format string - * @return On success returns the number of input items successfully matched - * and assigned. On error returns a negative errno value. - */ -int xs_scanf(xenbus_transaction_t xbt, const char *dir, const char *node, - const char *fmt, ...) __scanf(4, 5); - -/* - * Contraction of sprintf and xs_write(node/path). - * - * @param xbt Xenbus transaction id - * @param dir Xenstore directory - * @param node Xenstore directory entry - * @param fmt Path format string - * @return On success returns the number of the number of characters printed. - * On error returns a negative errno value. - */ -int xs_printf(xenbus_transaction_t xbt, const char *dir, const char *node, - const char *fmt, ...) __printf(4, 5); - -/* - * Utility function to figure out our domain id - * - * @return Our domain id - */ -domid_t xs_get_self_id(void); - -#endif /* __XS_H__ */ diff --git a/plat/xen/io.c b/plat/xen/io.c deleted file mode 100644 index 9f31ef48f3f226a4ec4ac35a1f3054493fc89800..0000000000000000000000000000000000000000 --- a/plat/xen/io.c +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Sharan Santhanam - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#if (defined __X86_32__) || (defined __X86_64__) -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#endif -#include - -/** - * Implementation support for the guest physical address conversion. - * The function support only Para-Virtualized guest. - */ -__paddr_t ukplat_virt_to_phys(const volatile void *address) -{ - return (__paddr_t)virt_to_mfn(address); -} diff --git a/plat/xen/lcpu.c b/plat/xen/lcpu.c deleted file mode 100644 index 396cde658abac3b93d913fe62c985b22d398a7c1..0000000000000000000000000000000000000000 --- a/plat/xen/lcpu.c +++ /dev/null @@ -1,82 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#if defined(__X86_32__) || defined(__x86_64__) -#include -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#include -#else -#error "Unsupported architecture" -#endif -#include -#include - -void ukplat_lcpu_enable_irq(void) -{ - local_irq_enable(); -} - -void ukplat_lcpu_disable_irq(void) -{ - local_irq_disable(); -} - -void ukplat_lcpu_halt_irq(void) -{ - UK_ASSERT(ukplat_lcpu_irqs_disabled()); - - ukplat_lcpu_enable_irq(); - halt(); - ukplat_lcpu_disable_irq(); -} - -unsigned long ukplat_lcpu_save_irqf(void) -{ - unsigned long flags; - - local_irq_save(flags); - - return flags; -} - -void ukplat_lcpu_restore_irqf(unsigned long flags) -{ - local_irq_restore(flags); -} - -int ukplat_lcpu_irqs_disabled(void) -{ - return irqs_disabled(); -} diff --git a/plat/xen/memory.c b/plat/xen/memory.c deleted file mode 100644 index fa1af9e04cc58e2501ad32a10850bec11224d3a2..0000000000000000000000000000000000000000 --- a/plat/xen/memory.c +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 - -#include -#if (defined __X86_32__) || (defined __X86_64__) -#include -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#include -#endif - -void mm_init(void) -{ - arch_mm_init(ukplat_memallocator_get()); -} - -int _ukplat_mem_mappings_init(void) -{ - mm_init(); -#ifdef CONFIG_XEN_GNTTAB - gnttab_init(); -#endif - return 0; -} diff --git a/plat/xen/shutdown.c b/plat/xen/shutdown.c deleted file mode 100644 index ba6c3fad4466038b8b00cd46b1c5fffa216f8bef..0000000000000000000000000000000000000000 --- a/plat/xen/shutdown.c +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Simon Kuenzer - * - * - * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include -#include -#include -#include - -#include -#include - -#if defined __X86_32__ -#include -#elif defined __X86_64__ -#include -#elif (defined __ARM_32__) || (defined __ARM_64__) -#include -#endif - -void ukplat_terminate(enum ukplat_gstate request) -{ - int reason; - - switch (request) { - case UKPLAT_HALT: - reason = SHUTDOWN_poweroff; - break; - case UKPLAT_RESTART: - reason = SHUTDOWN_reboot; - break; - default: /* UKPLAT_CRASH */ - reason = SHUTDOWN_crash; - break; - } - - flush_console(); - - for (;;) { - struct sched_shutdown sched_shutdown = { .reason = reason }; - - HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); - } -} - -int ukplat_suspend(void) -{ - int ret; - - ret = EBUSY; - /* ret = HYPERVISOR_suspend(virt_to_mfn(start_info_ptr)); */ - return -ret; -} diff --git a/plat/xen/x86/arch_events.c b/plat/xen/x86/arch_events.c deleted file mode 100644 index 8515a64609a819504fd1e3e9668d088b83c0d1b2..0000000000000000000000000000000000000000 --- a/plat/xen/x86/arch_events.c +++ /dev/null @@ -1,66 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Copyright (c) 2009 Citrix Systems, Inc. All rights reserved. - * - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* - * Arch-specific events functions - * Ported from Mini-OS - */ -#include -#include -#include -#include -#include - -#if defined(__x86_64__) -char irqstack[CPU_EXCEPT_STACK_SIZE] __align(UKARCH_SP_ALIGN); - -static struct pda { - int irqcount; /* offset 0 (used in x86_64.S) */ - char *irqstackptr; /* 8 */ -} cpu0_pda; -#endif - -void arch_init_events(void) -{ -#if defined(__x86_64__) - asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0)); - /* 0xc0000101 is MSR_GS_BASE */ - wrmsrl(0xc0000101, (uint64_t) &cpu0_pda); - cpu0_pda.irqcount = -1; - cpu0_pda.irqstackptr = - (void *) ((unsigned long) irqstack + STACK_SIZE); -#endif -} - -void arch_unbind_ports(void) -{ -} - -void arch_fini_events(void) -{ -#if defined(__x86_64__) - wrmsrl(0xc0000101, 0); /* 0xc0000101 is MSR_GS_BASE */ -#endif -} diff --git a/plat/xen/x86/arch_time.c b/plat/xen/x86/arch_time.c deleted file mode 100644 index 0f9f4b033979be4c2bc9787efb35be4e4cea39b4..0000000000000000000000000000000000000000 --- a/plat/xen/x86/arch_time.c +++ /dev/null @@ -1,244 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - **************************************************************************** - * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge - * (C) 2002-2003 - Keir Fraser - University of Cambridge - * (C) 2005 - Grzegorz Milos - Intel Research Cambridge - * (C) 2006 - Robert Kaiser - FH Wiesbaden - **************************************************************************** - * - * File: time.c - * Author: Rolf Neugebauer and Keir Fraser - * Changes: Grzegorz Milos - * - * Description: Simple time and timer functions - * Ported from Mini-OS - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/************************************************************************ - * Time functions - *************************************************************************/ - -/* These are peridically updated in shared_info, and then copied here. */ -struct shadow_time_info { - uint64_t tsc_timestamp; /* TSC at last update of time vals. */ - uint64_t system_timestamp; /* Time, in nanosecs, since boot. */ - uint32_t tsc_to_nsec_mul; - uint32_t tsc_to_usec_mul; - int tsc_shift; - uint32_t version; -}; - -static struct timespec shadow_ts; - -static uint32_t shadow_ts_version; - -static struct shadow_time_info shadow; - - -/* TODO move this where it belongs: */ -#ifndef rmb -#define rmb() __asm__ __volatile__("lock; addl $0,0(%%esp)" : : : "memory") -#endif - -#define HANDLE_USEC_OVERFLOW(_tv) \ - do { \ - while ((_tv)->tv_usec >= 1000000) { \ - (_tv)->tv_usec -= 1000000; \ - (_tv)->tv_sec++; \ - } \ - } while (0) - -static inline int time_values_up_to_date(void) -{ - struct vcpu_time_info *src = &HYPERVISOR_shared_info->vcpu_info[0].time; - - return (shadow.version == src->version); -} - -static inline int wc_values_up_to_date(void) -{ - shared_info_t *s = HYPERVISOR_shared_info; - - return (shadow_ts_version == s->wc_version); -} - -/* - * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction, - * yielding a 64-bit result. - */ -static inline uint64_t scale_delta(uint64_t delta, uint32_t mul_frac, int shift) -{ - uint64_t product; - - if (shift < 0) - delta >>= -shift; - else - delta <<= shift; - - __asm__( - "mul %%rdx ; shrd $32,%%rdx,%%rax" - : "=a" (product) : "0" (delta), "d" ((uint64_t)mul_frac) - ); - - return product; -} - - -static unsigned long get_nsec_offset(void) -{ - uint64_t now, delta; - - now = rdtsc(); - delta = now - shadow.tsc_timestamp; - - return scale_delta(delta, shadow.tsc_to_nsec_mul, shadow.tsc_shift); -} - - -static void get_time_values_from_xen(void) -{ - struct vcpu_time_info *src = &HYPERVISOR_shared_info->vcpu_info[0].time; - - do { - shadow.version = src->version; - rmb(); - shadow.tsc_timestamp = src->tsc_timestamp; - shadow.system_timestamp = src->system_time; - shadow.tsc_to_nsec_mul = src->tsc_to_system_mul; - shadow.tsc_shift = src->tsc_shift; - rmb(); - } while ((src->version & 1) | (shadow.version ^ src->version)); - - shadow.tsc_to_usec_mul = shadow.tsc_to_nsec_mul / 1000; -} - - - - -/* monotonic_clock(): returns # of nanoseconds passed since time_init() - * Note: This function is required to return accurate - * time even in the absence of multiple timer ticks. - */ -__nsec ukplat_monotonic_clock(void) -{ - uint64_t time; - uint32_t local_time_version; - - do { - local_time_version = shadow.version; - rmb(); - time = shadow.system_timestamp + get_nsec_offset(); - if (!time_values_up_to_date()) - get_time_values_from_xen(); - rmb(); - } while (local_time_version != shadow.version); - - return time; -} - -static void update_wallclock(void) -{ - shared_info_t *s = HYPERVISOR_shared_info; - - do { - shadow_ts_version = s->wc_version; - rmb(); - shadow_ts.tv_sec = s->wc_sec; - shadow_ts.tv_nsec = s->wc_nsec; - rmb(); - } while ((s->wc_version & 1) | (shadow_ts_version ^ s->wc_version)); -} - -__nsec ukplat_wall_clock(void) -{ - __nsec ret = ukplat_monotonic_clock(); - - if (!wc_values_up_to_date()) - update_wallclock(); - - ret += ukarch_time_sec_to_nsec((__nsec) shadow_ts.tv_sec); - ret += (__nsec) shadow_ts.tv_nsec; - - return ret; -} - -void time_block_until(__snsec until) -{ - UK_ASSERT(irqs_disabled()); - - if ((__snsec) ukplat_monotonic_clock() < until) { - HYPERVISOR_set_timer_op(until); - ukplat_lcpu_halt_irq(); - HYPERVISOR_set_timer_op(0); - } -} - -static void timer_handler(evtchn_port_t ev __unused, - struct __regs *regs __unused, void *ign __unused) -{ - __nsec until = ukplat_monotonic_clock() + UKPLAT_TIME_TICK_NSEC; - - HYPERVISOR_set_timer_op(until); -} - - - -static evtchn_port_t port; -void ukplat_time_init(void) -{ - uk_pr_debug("Initializing timer interface\n"); - port = bind_virq(VIRQ_TIMER, &timer_handler, NULL); - unmask_evtchn(port); -} - -void ukplat_time_fini(void) -{ - /* Clear any pending timer */ - HYPERVISOR_set_timer_op(0); - unbind_evtchn(port); -} - -#ifdef CONFIG_MIGRATION /* TODO wip */ -void suspend_time(void) -{ - /* Clear any pending timer */ - HYPERVISOR_set_timer_op(0); - unbind_evtchn(port); -} - -void resume_time(void) -{ - port = bind_virq(VIRQ_TIMER, &timer_handler, NULL); - unmask_evtchn(port); -} -#endif diff --git a/plat/xen/x86/cpu_pv.c b/plat/xen/x86/cpu_pv.c deleted file mode 100644 index fa50fb1c4f229795b34dd5c11cafda8155143e36..0000000000000000000000000000000000000000 --- a/plat/xen/x86/cpu_pv.c +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 -#include - - -void halt(void) -{ - HYPERVISOR_sched_op(SCHEDOP_block, 0); -} - -unsigned long read_cr2(void) -{ - return HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].arch.cr2; -} diff --git a/plat/xen/x86/entry64.S b/plat/xen/x86/entry64.S deleted file mode 100644 index 39b5f6781fce0cc4ead9b35f45b01ec9f2f956b5..0000000000000000000000000000000000000000 --- a/plat/xen/x86/entry64.S +++ /dev/null @@ -1,431 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* Taken from Mini-OS */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define ELFNOTE(name, type, desc) \ - .pushsection .note.name ; \ - .align 4 ; \ - .long 2f - 1f /* namesz */ ; \ - .long 4f - 3f /* descsz */ ; \ - .long type /* type */ ; \ -1:.asciz #name /* name */ ; \ -2:.align 4 ; \ -3:desc /* desc */ ; \ -4:.align 4 ; \ - .popsection - -#ifdef CONFIG_PARAVIRT -ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "Unikraft") -ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic") -ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, _WORD hypercall_page) -ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz "xen-3.0") -.text - -.globl _libxenplat_start - -.section .text.boot, "ax" -_libxenplat_start: - -#endif - cld - - /* esi contains pointer to start_info page - * Temporarily store it on the default scratch stack given by Xen */ - pushq %rsi - - /* Zero-out the first two arguments of do_uk_reloc. - * do_uk_reloc can detect the base load address on its own in 64-bit */ - xorq %rsi, %rsi - xorq %rdi, %rdi - call do_uk_reloc - popq %rsi - - movq stack_start(%rip),%rsp - andq $STACK_MASK_TOP, %rsp - movq %rsi, %r8 /* esi contains pointer to start_info page */ - /* We will work on cr0 and cr4 multiple times. - * We put cr0 into rsi and cr4 into rdi, because cpuid and - * xgetbv/xsetbv work on eax/ebx/ecx/edx. */ - movq %cr0, %rsi - movq %cr4, %rdi - /* FPU and SSE are part of base x86-64, so no need to check for their - * availability before enabling and initializing. */ - andl $(~(X86_CR0_EM | X86_CR0_TS)), %esi - orl $(X86_CR0_MP | X86_CR0_NE), %esi - movq %rsi, %cr0 - fninit -#if __SSE__ - orl $(X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT), %edi - movq %rdi, %cr4 - - leaq mxcsr_ptr(%rip),%r9 - ldmxcsr (%r9d) -#endif /* __SSE__ */ -#if (__AVX__ || CONFIG_HAVE_X86PKU) - /* Check capabilities subject to availability as indicated by cpuid. - * First, start off with "standard features" */ - movl $0x1, %eax - cpuid - /* ecx and edx now contain capability information, so we can now - * enable capabilities based on the indicated features */ - /* note: OSXSAVE needs to be enabled before AVX and PKU */ - testl $(X86_CPUID1_ECX_XSAVE), %ecx - jz noxsave - orl $(X86_CR4_OSXSAVE), %edi - movq %rdi, %cr4 -#if __AVX__ - /* now enable AVX. This needs to be last checking cpuid features from - * the eax=1 cpuid call, because it clobbers ecx */ - testl $(X86_CPUID1_ECX_AVX), %ecx - jz noavx - xorl %ecx, %ecx - xgetbv - orl $(X86_XCR0_SSE | X86_XCR0_AVX), %eax - xsetbv -noavx: -#endif /* __AVX__ */ -/* Do not enable AVX without XSAVE, otherwise we'll get #UD */ -noxsave: -#endif /* __AVX__ || CONFIG_HAVE_X86PKU */ - /* Now, check for extended features. */ - movl $0x7, %eax - movl $0x0, %ecx - cpuid - /* ebx, ecx, edx now contain extended capabilities information. */ - /* check for and enable FS/GSBASE */ - testl $(X86_CPUID7_EBX_FSGSBASE), %ebx - jz nofsgsbase - orl $(X86_CR4_FSGSBASE), %edi - movq %rdi, %cr4 -nofsgsbase: -#if CONFIG_HAVE_X86PKU - /* check for Memory Protection Keys (PKU) */ - testl $(X86_CPUID7_ECX_PKU), %ecx - jz nopku - /* only enable PKU if we support XSAVE */ - testl $(X86_CR4_OSXSAVE), %edi - jz nopku - /* PKU is supported, enable it via CR4 */ - orl $(X86_CR4_PKE), %edi - movq %rdi, %cr4 - /* also enable XSAVE for the PKRU */ - xorl %ecx, %ecx - xgetbv - orl $(X86_XCR0_PKRU), %eax - xsetbv -nopku: -#endif /* CONFIG_HAVE_X86PKU */ - /* Done setting up CPU capabilities, hand over to C entry point. */ - movq %r8, %rdi /* pass pointer to start_info page to C entry */ - call _libxenplat_x86entry - -.type mxcsr_ptr, @object -mxcsr_ptr: - .long 0x1f80 /* Intel SDM power-on default */ - - -stack_start: - .quad _libxenplat_bootstack + (2*__STACK_SIZE) - -.globl _libxenplat_shared_info, hypercall_page - /* Unpleasant -- the PTE that maps this page is actually overwritten */ - /* to map the real shared-info page! :-) */ - .align __PAGE_SIZE -_libxenplat_shared_info: - .fill __PAGE_SIZE,1,0 - -hypercall_page: - .fill __PAGE_SIZE,1,0 - - -#define XEN_GET_VCPU_INFO(reg) movq HYPERVISOR_shared_info(%rip),reg -#define XEN_LOCKED_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg) -#define XEN_LOCKED_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg) -#define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg) - -/* Offsets into shared_info_t. */ -#define evtchn_upcall_pending /* 0 */ -#define evtchn_upcall_mask 1 - -NMI_MASK = 0x80000000 -KERNEL_CS_MASK = 0xfc - -/* Macros */ -.macro SAVE_PARAVIRT -#ifdef CONFIG_PARAVIRT - pop %rcx - pop %r11 /* rsp points to the error code */ -#endif -.endm - -.macro zeroentry sym - SAVE_PARAVIRT - pushq $0 /* push error code/oldrax */ - pushq %rax /* push real oldrax to the rdi slot */ - leaq \sym(%rip),%rax - jmp error_entry -.endm - -.macro errorentry sym - SAVE_PARAVIRT - pushq %rax - leaq \sym(%rip),%rax - jmp error_entry -.endm - -.macro TRAP_ENTRY trapname, has_ec -ENTRY(ASM_TRAP_SYM(\trapname)) -.if \has_ec - errorentry do_\trapname -.else - zeroentry do_\trapname -.endif -.endm - -.macro RESTORE_ALL - movq __REGS_OFFSETOF_R15(%rsp), %r15 - movq __REGS_OFFSETOF_R14(%rsp), %r14 - movq __REGS_OFFSETOF_R13(%rsp), %r13 - movq __REGS_OFFSETOF_R12(%rsp), %r12 - movq __REGS_OFFSETOF_RBP(%rsp), %rbp - movq __REGS_OFFSETOF_RBX(%rsp), %rbx - movq __REGS_OFFSETOF_R11(%rsp), %r11 - movq __REGS_OFFSETOF_R10(%rsp), %r10 - movq __REGS_OFFSETOF_R9(%rsp), %r9 - movq __REGS_OFFSETOF_R8(%rsp), %r8 - movq __REGS_OFFSETOF_RAX(%rsp), %rax - movq __REGS_OFFSETOF_RCX(%rsp), %rcx - movq __REGS_OFFSETOF_RDX(%rsp), %rdx - movq __REGS_OFFSETOF_RSI(%rsp), %rsi - movq __REGS_OFFSETOF_RDI(%rsp), %rdi - addq $__REGS_OFFSETOF_RIP,%rsp -.endm - -.macro SAVE_ALL - /* rdi slot contains rax, oldrax contains error code */ - cld - subq $__REGS_OFFSETOF_RDI, %rsp - movq %rsi, __REGS_OFFSETOF_RSI(%rsp) - movq __REGS_OFFSETOF_RDI(%rsp), %rsi /* load rax from rdi slot */ - movq %rdx, __REGS_OFFSETOF_RDX(%rsp) - movq %rcx, __REGS_OFFSETOF_RCX(%rsp) - movq %rsi, __REGS_OFFSETOF_RAX(%rsp) /* store rax */ - movq %r8, __REGS_OFFSETOF_R8(%rsp) - movq %r9, __REGS_OFFSETOF_R9(%rsp) - movq %r10, __REGS_OFFSETOF_R10(%rsp) - movq %r11, __REGS_OFFSETOF_R11(%rsp) - movq %rbx, __REGS_OFFSETOF_RBX(%rsp) - movq %rbp, __REGS_OFFSETOF_RBP(%rsp) - movq %r12, __REGS_OFFSETOF_R12(%rsp) - movq %r13, __REGS_OFFSETOF_R13(%rsp) - movq %r14, __REGS_OFFSETOF_R14(%rsp) - movq %r15, __REGS_OFFSETOF_R15(%rsp) - movq %rdi, __REGS_OFFSETOF_RDI(%rsp) /* put rdi into the slot */ -.endm - -.macro HYPERVISOR_IRET -#ifdef CONFIG_PARAVIRT - testl $NMI_MASK,2*8(%rsp) - jnz 2f - - /* Direct iret to kernel space. Correct CS and SS. */ - orb $3,1*8(%rsp) - orb $3,4*8(%rsp) -#endif - iretq - -#ifdef CONFIG_PARAVIRT -2: /* Slow iret via hypervisor. */ - andl $~NMI_MASK, 16(%rsp) - pushq $0 - jmp hypercall_page + (__HYPERVISOR_iret * 32) -#endif -.endm - - -/* - * Exception entry point. This expects an error code/orig_rax on the stack - * and the exception handler in %rax. - */ -error_entry: - SAVE_ALL - - movq %rsp,%rdi - movq __REGS_OFFSETOF_ORIG_RAX(%rsp),%rsi # get error code - movq $-1,__REGS_OFFSETOF_ORIG_RAX(%rsp) - call *%rax - jmp error_exit - - -#ifdef CONFIG_PARAVIRT -/* - * Xen event (virtual interrupt) entry point. - */ -ENTRY(ASM_TRAP_SYM(hypervisor_callback)) - zeroentry hypervisor_callback2 - -hypervisor_callback2: - movq %rdi, %rsp - - /* check against event re-entrant */ - movq __REGS_OFFSETOF_RIP(%rsp),%rax - leaq scrit(%rip),%r9 - cmpq %r9,%rax - jb 11f - leaq ecrit(%rip),%r9 - cmpq %r9,%rax - jb critical_region_fixup - -11: movq %gs:8,%rax - incl %gs:0 - cmovzq %rax,%rsp - pushq %rdi - call do_hypervisor_callback - popq %rsp - decl %gs:0 - -error_exit: - movl __REGS_OFFSETOF_EFLAGS(%rsp), %eax - shr $9, %eax # EAX[0] == IRET_RFLAGS.IF - XEN_GET_VCPU_INFO(%rsi) - andb evtchn_upcall_mask(%rsi),%al - andb $1,%al # EAX[0] == IRET_RFLAGS.IF & event_mask - jnz restore_all_enable_events # != 0 => enable event delivery - - RESTORE_ALL - HYPERVISOR_IRET - -restore_all_enable_events: - RESTORE_ALL - pushq %rax # save rax; it will be clobbered later - RSP_OFFSET=8 # record the stack frame layout changes - XEN_GET_VCPU_INFO(%rax) # safe to use rax since it is saved - XEN_LOCKED_UNBLOCK_EVENTS(%rax) - -scrit: /**** START OF CRITICAL REGION ****/ - XEN_TEST_PENDING(%rax) - jz 12f - XEN_LOCKED_BLOCK_EVENTS(%rax) # if pending, mask events and handle - # by jumping to hypervisor_prologue -12: popq %rax # all registers restored from this point - -restore_end: - jnz hypervisor_prologue # safe to jump out of critical region - # because events are masked if ZF = 0 - HYPERVISOR_IRET -ecrit: /**** END OF CRITICAL REGION ****/ - -# Set up the stack as Xen does before calling event callback -hypervisor_prologue: - pushq %r11 - pushq %rcx - jmp ASM_TRAP_SYM(hypervisor_callback) - -# [How we do the fixup]. We want to merge the current stack frame with the -# just-interrupted frame. How we do this depends on where in the critical -# region the interrupted handler was executing, and so if rax has been -# restored. We determine by comparing interrupted rip with "restore_end". -# We always copy all registers below RIP from the current stack frame -# to the end of the previous activation frame so that we can continue -# as if we've never even reached 11 running in the old activation frame. - -critical_region_fixup: - # Set up source and destination region pointers - leaq __REGS_OFFSETOF_RIP(%rsp),%rsi # esi points at end of src region - # Acquire interrupted rsp which was saved-on-stack. This points to - # the end of dst region. Note that it is not necessarily current rsp - # plus 0xb0, because the second interrupt might align the stack frame. - movq __REGS_OFFSETOF_RSP(%rsp),%rdi # edi points at end of dst region - - leaq restore_end(%rip),%r9 - cmpq %r9,%rax - jae 13f - - # If interrupted rip is before restore_end - # then rax hasn't been restored yet - movq (%rdi),%rax - movq %rax, __REGS_OFFSETOF_RAX(%rsp) # save rax - addq $RSP_OFFSET,%rdi - - # Set up the copy -13: movq $__REGS_OFFSETOF_RIP,%rcx - shr $3,%rcx # convert bytes into count of 64-bit entities -15: subq $8,%rsi # pre-decrementing copy loop - subq $8,%rdi - movq (%rsi),%rax - movq %rax,(%rdi) - loop 15b -16: movq %rdi,%rsp # final rdi is top of merged stack - andb $KERNEL_CS_MASK,__REGS_OFFSETOF_CS(%rsp) # CS might have changed - jmp 11b -#endif - -ENTRY(asm_failsafe_callback) -#ifdef CONFIG_PARAVIRT - popq %rcx - popq %r11 -#endif - iretq - - -TRAP_ENTRY divide_error, 0 -TRAP_ENTRY debug, 0 -/* no NMI */ -TRAP_ENTRY int3, 0 -TRAP_ENTRY overflow, 0 -TRAP_ENTRY bounds, 0 -TRAP_ENTRY invalid_op, 0 -TRAP_ENTRY no_device, 0 -/* no Double Fault */ -TRAP_ENTRY coproc_seg_overrun, 0 -TRAP_ENTRY invalid_tss, 1 -TRAP_ENTRY no_segment, 1 -TRAP_ENTRY stack_error, 1 /* runs on exception stack */ -TRAP_ENTRY gp_fault, 1 -TRAP_ENTRY page_fault, 1 -TRAP_ENTRY spurious_int, 1 -TRAP_ENTRY coproc_error, 0 -TRAP_ENTRY alignment_check, 1 -/* no Machine Check */ -TRAP_ENTRY simd_error, 0 -/* no Virtualization Exception */ - -/* - * We do not want to unmap anything. - */ -.section .bss -.align 4 -.globl bpt_unmap_mrd -bpt_unmap_mrd: -.space 64 diff --git a/plat/xen/x86/gnttab.c b/plat/xen/x86/gnttab.c deleted file mode 100644 index 7a647481b20e025ca65d59731e6a5d684f095bfb..0000000000000000000000000000000000000000 --- a/plat/xen/x86/gnttab.c +++ /dev/null @@ -1,60 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* Taken from Mini-OS */ - -#include -#include -#include -#include -#include -#include -#include - - -grant_entry_v1_t *gnttab_arch_init(int grant_frames_num) -{ - grant_entry_v1_t *gnte = NULL; - struct gnttab_setup_table setup; - unsigned long frames[grant_frames_num]; - int rc; - - setup.dom = DOMID_SELF; - setup.nr_frames = grant_frames_num; - set_xen_guest_handle(setup.frame_list, frames); - - rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1); - if (rc) { - uk_pr_err("Hypercall error: %d\n", rc); - goto out; - } - if (setup.status != GNTST_okay) { - uk_pr_err("Hypercall status: %d\n", setup.status); - goto out; - } - - gnte = map_frames(frames, grant_frames_num, ukplat_memallocator_get()); - -out: - return gnte; -} diff --git a/plat/xen/x86/link64.lds.S b/plat/xen/x86/link64.lds.S deleted file mode 100644 index a567fcc99a70a5f9a5b98391095aa53f880cb452..0000000000000000000000000000000000000000 --- a/plat/xen/x86/link64.lds.S +++ /dev/null @@ -1,113 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* Taken from Mini-OS */ - -#include /* for __PAGE_SIZE */ -#include - -OUTPUT_FORMAT("elf64-x86-64") -OUTPUT_ARCH(i386:x86-64) - -PHDRS -{ - text PT_LOAD FLAGS(PHDRS_PF_RX); - rodata PT_LOAD FLAGS(PHDRS_PF_R); - data PT_LOAD; - tls PT_TLS; - tls_load PT_LOAD; - stack PT_GNU_STACK FLAGS(PHDRS_PF_RW); -} - -ENTRY(_libxenplat_start) -SECTIONS -{ - . = 0x0; - - _base_addr = .; /* Symbol to represent the load base address */ - - _text = .; /* Text and read-only data */ - .text : { - *(.text.boot) - *(.text) - *(.gnu.warning) - } :text = 0x2000 - - _etext = .; /* End of text section */ - - . = ALIGN(__PAGE_SIZE); - - _rodata = .; - .rodata : { - *(.rodata) - *(.rodata.*) - } :rodata - . = ALIGN(__PAGE_SIZE); - _erodata = .; - - EXCEPTION_SECTIONS - - CTORTAB_SECTION - - INITTAB_SECTION - - EVENTTAB_SECTION - - . = ALIGN(0x8); - _ctors = .; - .preinit_array : { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } - - . = ALIGN(0x8); - .init_array : { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } - . = ALIGN(__PAGE_SIZE); - _ectors = .; - - TLS_SECTIONS - - DATA_SECTIONS - - _end = .; - - /* Sections to be discarded */ - /* TODO: Revisit when we have a solution for discarded sections - /DISCARD/ : { - *(.text.exit) - *(.data.exit) - *(.exitcall.exit) - } - */ - - .comment 0 : { *(.comment) } - DEBUG_SYMBOLS - - DISCARDS -} diff --git a/plat/xen/x86/mm.c b/plat/xen/x86/mm.c deleted file mode 100644 index e940fbab9c962330c51b646e5644544ae943803c..0000000000000000000000000000000000000000 --- a/plat/xen/x86/mm.c +++ /dev/null @@ -1,733 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* - **************************************************************************** - * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge - * (C) 2005 - Grzegorz Milos - Intel Research Cambridge - **************************************************************************** - * - * File: mm.c - * Author: Rolf Neugebauer (neugebar@dcs.gla.ac.uk) - * Changes: Grzegorz Milos - * - * Date: Aug 2003, chages Aug 2005 - * - * Environment: Xen Minimal OS - * Description: memory management related functions - * contains buddy page allocator from Xen. - * - **************************************************************************** - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_PARAVIRT -#include -unsigned long *phys_to_machine_mapping; -#endif -unsigned long mfn_zero; -pgentry_t *pt_base; - -/* - * Make pt_pfn a new 'level' page table frame and hook it into the page - * table at offset in previous level MFN (pref_l_mfn). pt_pfn is a guest - * PFN. - */ -static pgentry_t pt_prot[PAGETABLE_LEVELS] = { - L1_PROT, - L2_PROT, - L3_PROT, -#if defined(__x86_64__) - L4_PROT, -#endif -}; - -static void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn, - unsigned long offset, unsigned long level) -{ - pgentry_t *tab; - unsigned long pt_page = (unsigned long)pfn_to_virt(*pt_pfn); -#ifdef CONFIG_PARAVIRT - mmu_update_t mmu_updates[1]; - int rc; -#endif - - uk_pr_debug("Allocating new L%lu pt frame for pfn=%lx, " - "prev_l_mfn=%lx, offset=%lx\n", - level, *pt_pfn, prev_l_mfn, offset); - - /* We need to clear the page, otherwise we might fail to map it - as a page table page */ - memset((void*) pt_page, 0, PAGE_SIZE); - - UK_ASSERT(level >= 1 && level <= PAGETABLE_LEVELS); - -#ifdef CONFIG_PARAVIRT - /* Make PFN a page table page */ - tab = pt_base; -#if defined(__x86_64__) - tab = pte_to_virt(tab[l4_table_offset(pt_page)]); -#endif - tab = pte_to_virt(tab[l3_table_offset(pt_page)]); - - mmu_updates[0].ptr = (tab[l2_table_offset(pt_page)] & PAGE_MASK) + - sizeof(pgentry_t) * l1_table_offset(pt_page); - mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | - (pt_prot[level - 1] & ~_PAGE_RW); - - if ( (rc = HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF)) < 0 ) - UK_CRASH("PTE for new page table page could not be updated: " - "mmu_update failed with rc=%d\n", rc); - - /* Hook the new page table page into the hierarchy */ - mmu_updates[0].ptr = - ((pgentry_t)prev_l_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset; - mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | - pt_prot[level]; - - if ( (rc = HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF)) < 0 ) - UK_CRASH("mmu_update failed with rc=%d\n", rc); -#endif - *pt_pfn += 1; -} - -/* - * Build the initial pagetable. - */ -void _init_mem_build_pagetable(unsigned long *start_pfn, unsigned long *max_pfn) -{ - unsigned long start_address, end_address; - unsigned long pfn_to_map, pt_pfn = *start_pfn; - pgentry_t *tab = pt_base, page; - unsigned long pt_mfn = pfn_to_mfn(virt_to_pfn(pt_base)); - unsigned long offset; -#ifdef CONFIG_PARAVIRT - static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1]; - int count = 0; - int rc; -#endif - - /* Be conservative: even if we know there will be more pages already - mapped, start the loop at the very beginning. */ - pfn_to_map = *start_pfn; - -#ifdef CONFIG_PARAVIRT - if ( *max_pfn >= virt_to_pfn(HYPERVISOR_VIRT_START) ) - { - uk_pr_warn("Trying to use Xen virtual space. " - "Truncating memory from %luMB to ", - ((unsigned long)pfn_to_virt(*max_pfn) - __TEXT)>>20); - *max_pfn = virt_to_pfn(HYPERVISOR_VIRT_START - PAGE_SIZE); - uk_pr_warn("%luMB\n", - ((unsigned long)pfn_to_virt(*max_pfn) - __TEXT)>>20); - } -#endif - - start_address = (unsigned long)pfn_to_virt(pfn_to_map); - end_address = (unsigned long)pfn_to_virt(*max_pfn); - - /* We worked out the virtual memory range to map, now mapping loop */ - uk_pr_info("Mapping memory range 0x%lx - 0x%lx\n", - start_address, end_address); - - while ( start_address < end_address ) - { - tab = pt_base; - pt_mfn = pfn_to_mfn(virt_to_pfn(pt_base)); - -#if defined(__x86_64__) - offset = l4_table_offset(start_address); - /* Need new L3 pt frame */ - if ( !(tab[offset] & _PAGE_PRESENT) ) - new_pt_frame(&pt_pfn, pt_mfn, offset, L3_FRAME); - - page = tab[offset]; - pt_mfn = pte_to_mfn(page); - tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT); -#endif - offset = l3_table_offset(start_address); - /* Need new L2 pt frame */ - if ( !(tab[offset] & _PAGE_PRESENT) ) - new_pt_frame(&pt_pfn, pt_mfn, offset, L2_FRAME); - - page = tab[offset]; - pt_mfn = pte_to_mfn(page); - tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT); - offset = l2_table_offset(start_address); -#ifdef CONFIG_PARAVIRT - /* Need new L1 pt frame */ - if ( !(tab[offset] & _PAGE_PRESENT) ) - new_pt_frame(&pt_pfn, pt_mfn, offset, L1_FRAME); - - page = tab[offset]; - pt_mfn = pte_to_mfn(page); - tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT); - offset = l1_table_offset(start_address); - - if ( !(tab[offset] & _PAGE_PRESENT) ) - { - mmu_updates[count].ptr = - ((pgentry_t)pt_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset; - mmu_updates[count].val = - (pgentry_t)pfn_to_mfn(pfn_to_map) << PAGE_SHIFT | L1_PROT; - count++; - } - pfn_to_map++; - if ( count == L1_PAGETABLE_ENTRIES || - (count && pfn_to_map == *max_pfn) ) - { - rc = HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF); - if ( rc < 0 ) - UK_CRASH("PTE could not be updated. " - "mmu_update failed with rc=%d\n", rc); - count = 0; - } - start_address += PAGE_SIZE; -#endif - } - - *start_pfn = pt_pfn; -} - -/* - * Get the PTE for virtual address va if it exists. Otherwise NULL. - */ -static pgentry_t *get_pte(unsigned long va) -{ - unsigned long mfn; - pgentry_t *tab; - unsigned int offset; - - tab = pt_base; - -#if defined(__x86_64__) - offset = l4_table_offset(va); - if (!(tab[offset] & _PAGE_PRESENT)) - return NULL; - - mfn = pte_to_mfn(tab[offset]); - tab = mfn_to_virt(mfn); -#endif - offset = l3_table_offset(va); - if (!(tab[offset] & _PAGE_PRESENT)) - return NULL; - - mfn = pte_to_mfn(tab[offset]); - tab = mfn_to_virt(mfn); - offset = l2_table_offset(va); - if (!(tab[offset] & _PAGE_PRESENT)) - return NULL; - - if (tab[offset] & _PAGE_PSE) - return &tab[offset]; - - mfn = pte_to_mfn(tab[offset]); - tab = mfn_to_virt(mfn); - offset = l1_table_offset(va); - - return &tab[offset]; -} - -/* - * Return a valid PTE for a given virtual address. - * If PTE does not exist, allocate page-table pages. - */ -static pgentry_t *need_pte(unsigned long va, struct uk_alloc *a) -{ - unsigned long pt_mfn; - pgentry_t *tab; - unsigned long pt_pfn; - unsigned int offset; - - tab = pt_base; - pt_mfn = virt_to_mfn(pt_base); -#if defined(__x86_64__) - offset = l4_table_offset(va); - if (!(tab[offset] & _PAGE_PRESENT)) { - pt_pfn = virt_to_pfn(uk_palloc(a, 1)); - if (!pt_pfn) - return NULL; - new_pt_frame(&pt_pfn, pt_mfn, offset, L3_FRAME); - } - UK_ASSERT(tab[offset] & _PAGE_PRESENT); - - pt_mfn = pte_to_mfn(tab[offset]); - tab = mfn_to_virt(pt_mfn); -#endif - offset = l3_table_offset(va); - if (!(tab[offset] & _PAGE_PRESENT)) { - pt_pfn = virt_to_pfn(uk_palloc(a, 1)); - if (!pt_pfn) - return NULL; - new_pt_frame(&pt_pfn, pt_mfn, offset, L2_FRAME); - } - UK_ASSERT(tab[offset] & _PAGE_PRESENT); - - pt_mfn = pte_to_mfn(tab[offset]); - tab = mfn_to_virt(pt_mfn); - offset = l2_table_offset(va); - if (!(tab[offset] & _PAGE_PRESENT)) { - pt_pfn = virt_to_pfn(uk_palloc(a, 1)); - if (!pt_pfn) - return NULL; - new_pt_frame(&pt_pfn, pt_mfn, offset, L1_FRAME); - } - UK_ASSERT(tab[offset] & _PAGE_PRESENT); - - if (tab[offset] & _PAGE_PSE) - return &tab[offset]; - - pt_mfn = pte_to_mfn(tab[offset]); - tab = mfn_to_virt(pt_mfn); - offset = l1_table_offset(va); - - return &tab[offset]; -} - -/** - * do_map_frames - Map an array of MFNs contiguously into virtual - * address space starting at va. - * @va: Starting address of the virtual address range - * @mfns: Array of MFNs - * @n: Number of MFNs - * @stride: Stride used for selecting the MFNs on each iteration - * @incr: Increment added to MFNs on each iteration - * @id: Domain id - * @err: Array of errors statuses - * @prot: Page protection flags - * @a: Memory allocator used when new page table entries are needed - * - * Note that either @stride or @incr must be non-zero, not both of - * them. One should use a non-zero value for @stride when providing - * an array of MFNs. @incr parameter should be used when only the - * first MFN is provided and the subsequent MFNs values are simply - * derived by adding @incr. - */ -#define MAP_BATCH ((STACK_SIZE / 4) / sizeof(mmu_update_t)) -int do_map_frames(unsigned long va, - const unsigned long *mfns, unsigned long n, - unsigned long stride, unsigned long incr, - domid_t id, int *err, unsigned long prot, - struct uk_alloc *a) -{ - pgentry_t *pte = NULL; - unsigned long mapped = 0; - - if (!mfns) { - uk_pr_warn("do_map_frames: no mfns supplied\n"); - return -EINVAL; - } - - uk_pr_debug("Mapping va=%p n=%lu, mfns[0]=0x%lx stride=%lu incr=%lu prot=0x%lx\n", - (void *) va, n, mfns[0], stride, incr, prot); - - if (err) - memset(err, 0, n * sizeof(int)); - - while (mapped < n) { -#ifdef CONFIG_PARAVIRT - unsigned long i; - int rc; - unsigned long batched; - - if (err) - batched = 1; - else - batched = n - mapped; - - if (batched > MAP_BATCH) - batched = MAP_BATCH; - - mmu_update_t mmu_updates[batched]; - - for (i = 0; i < batched; i++, va += PAGE_SIZE, pte++) { - if (!pte || !(va & L1_MASK)) - pte = need_pte(va, a); - if (!pte) - return -ENOMEM; - - mmu_updates[i].ptr = - virt_to_mach(pte) | MMU_NORMAL_PT_UPDATE; - mmu_updates[i].val = - ((pgentry_t) (mfns[(mapped + i) * stride] - + (mapped + i) * incr) << PAGE_SHIFT) | prot; - } - - rc = HYPERVISOR_mmu_update(mmu_updates, batched, NULL, id); - if (rc < 0) { - if (err) - err[mapped * stride] = rc; - else - UK_CRASH( - "Map %ld (%lx, ...) at %lx failed: %d.\n", - batched, - mfns[mapped * stride] + mapped * incr, - va, rc); - } - mapped += batched; -#endif - } - - return 0; -} - -static unsigned long demand_map_area_start; -static unsigned long demand_map_area_end; - -unsigned long allocate_ondemand(unsigned long n, unsigned long align) -{ - unsigned long page_idx, contig = 0; - - /* Find a properly aligned run of n contiguous frames */ - for (page_idx = 0; - page_idx <= DEMAND_MAP_PAGES - n; - page_idx = (page_idx + contig + 1 + align - 1) & ~(align - 1)) { - - unsigned long addr = - demand_map_area_start + page_idx * PAGE_SIZE; - pgentry_t *pte = get_pte(addr); - - for (contig = 0; contig < n; contig++, addr += PAGE_SIZE) { - if (!(addr & L1_MASK)) - pte = get_pte(addr); - - if (pte) { - if (*pte & _PAGE_PRESENT) - break; - - pte++; - } - } - - if (contig == n) - break; - } - - if (contig != n) { - uk_pr_err("Failed to find %ld frames!\n", n); - return 0; - } - - return demand_map_area_start + page_idx * PAGE_SIZE; -} - -/** - * map_frames_ex - Map an array of MFNs contiguously into virtual - * address space. Virtual addresses are allocated from the on demand - * area. - * @mfns: Array of MFNs - * @n: Number of MFNs - * @stride: Stride used for selecting the MFNs on each iteration - * (e.g. 1 for every element, 0 always first element) - * @incr: Increment added to MFNs on each iteration - * @alignment: Alignment - * @id: Domain id - * @err: Array of errors statuses - * @prot: Page protection flags - * @a: Memory allocator used when new page table entries are needed - * - * Note that either @stride or @incr must be non-zero, not both of - * them. One should use a non-zero value for @stride when providing - * an array of MFNs. @incr parameter should be used when only the - * first MFN is provided and the subsequent MFNs values are simply - * derived by adding @incr. - */ -void *map_frames_ex(const unsigned long *mfns, unsigned long n, - unsigned long stride, unsigned long incr, - unsigned long alignment, - domid_t id, int *err, unsigned long prot, - struct uk_alloc *a) -{ - unsigned long va = allocate_ondemand(n, alignment); - - if (!va) - return NULL; - - if (do_map_frames(va, mfns, n, stride, incr, id, err, prot, a)) - return NULL; - - return (void *) va; -} - -/* - * Unmap num_frames frames mapped at virtual address va. - */ -#define UNMAP_BATCH ((STACK_SIZE / 4) / sizeof(multicall_entry_t)) -int unmap_frames(unsigned long va, unsigned long num_frames) -{ -#ifdef CONFIG_PARAVIRT - unsigned long i, n = UNMAP_BATCH; - multicall_entry_t call[n]; - int ret; -#endif - - UK_ASSERT(!((unsigned long) va & ~PAGE_MASK)); - - uk_pr_debug("Unmapping va=%p, num=%lu\n", - (void *) va, num_frames); - - while (num_frames) { -#ifdef CONFIG_PARAVIRT - if (n > num_frames) - n = num_frames; - - for (i = 0; i < n; i++) { - int arg = 0; - /* - * simply update the PTE for the VA and - * invalidate TLB - */ - call[i].op = __HYPERVISOR_update_va_mapping; - call[i].args[arg++] = va; - call[i].args[arg++] = 0; - call[i].args[arg++] = UVMF_INVLPG; - - va += PAGE_SIZE; - } - - ret = HYPERVISOR_multicall(call, n); - if (ret) { - uk_pr_err("update_va_mapping hypercall failed with rc=%d.\n", - ret); - return -ret; - } - - for (i = 0; i < n; i++) { - if (call[i].result) { - uk_pr_err("update_va_mapping failed for with rc=%d.\n", - ret); - return -(call[i].result); - } - } - num_frames -= n; -#endif - } - return 0; -} - -/* - * Mark portion of the address space read only. - */ -extern struct shared_info _libxenplat_shared_info; -void _init_mem_set_readonly(void *text, void *etext) -{ - unsigned long start_address = - PAGE_ALIGN((unsigned long)text); - unsigned long end_address = (unsigned long) etext; - pgentry_t *tab = pt_base, page; - unsigned long mfn; - unsigned long offset; - unsigned long page_size = PAGE_SIZE; -#ifdef CONFIG_PARAVIRT - static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1]; - int count = 0; - int rc; -#endif - - uk_pr_debug("Set %p-%p readonly\n", text, etext); - mfn = pfn_to_mfn(virt_to_pfn(pt_base)); - - while ( start_address + page_size <= end_address ) - { - tab = pt_base; - mfn = pfn_to_mfn(virt_to_pfn(pt_base)); - -#if defined(__x86_64__) - offset = l4_table_offset(start_address); - page = tab[offset]; - mfn = pte_to_mfn(page); - tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT); -#endif - offset = l3_table_offset(start_address); - page = tab[offset]; - mfn = pte_to_mfn(page); - tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT); - offset = l2_table_offset(start_address); - if ( !(tab[offset] & _PAGE_PSE) ) - { - page = tab[offset]; - mfn = pte_to_mfn(page); - tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT); - - offset = l1_table_offset(start_address); - } - - if ( start_address != (unsigned long)&_libxenplat_shared_info ) - { -#ifdef CONFIG_PARAVIRT - mmu_updates[count].ptr = - ((pgentry_t)mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset; - mmu_updates[count].val = tab[offset] & ~_PAGE_RW; - count++; -#endif - } else { - uk_pr_debug("skipped %lx\n", start_address); - } - - start_address += page_size; - -#ifdef CONFIG_PARAVIRT - if ( count == L1_PAGETABLE_ENTRIES || - start_address + page_size > end_address ) - { - rc = HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF); - if ( rc < 0 ) - UK_CRASH("PTE could not be updated\n"); - count = 0; - } -#endif - } - -#ifdef CONFIG_PARAVIRT - { - mmuext_op_t op = { - .cmd = MMUEXT_TLB_FLUSH_ALL, - }; - int count; - HYPERVISOR_mmuext_op(&op, 1, &count, DOMID_SELF); - } -#endif -} - -/* - * Clear some of the bootstrap memory - */ -void _init_mem_clear_bootstrap(void) -{ -#ifdef CONFIG_PARAVIRT - pte_t nullpte = { }; - int rc; -#endif - - uk_pr_debug("Clear bootstrapping memory: %p\n", (void *)__TEXT); - - /* Use first page as the CoW zero page */ - memset((void *)__TEXT, 0, PAGE_SIZE); - mfn_zero = virt_to_mfn(__TEXT); -#ifdef CONFIG_PARAVIRT - if ( (rc = HYPERVISOR_update_va_mapping(0, nullpte, UVMF_INVLPG)) ) - uk_pr_err("Unable to unmap NULL page. rc=%d\n", rc); -#endif -} - -#ifdef CONFIG_XEN_PV_BUILD_P2M -static unsigned long max_pfn; -static unsigned long *l3_list; -static unsigned long *l2_list_pages[P2M_ENTRIES]; - -void _arch_init_p2m(struct uk_alloc *a) -{ - unsigned long pfn; - unsigned long *l2_list = NULL; - - max_pfn = HYPERVISOR_start_info->nr_pages; - - if (((max_pfn - 1) >> L3_P2M_SHIFT) > 0) - UK_CRASH("Error: Too many pfns.\n"); - - l3_list = uk_palloc(a, 1); - if (l3_list == NULL) - UK_CRASH("Error: Cannot allocate l3_list.\n"); - for (pfn = 0; pfn < max_pfn; pfn += P2M_ENTRIES) { - if (!(pfn % (P2M_ENTRIES * P2M_ENTRIES))) { - l2_list = uk_palloc(a, 1); - if (l2_list == NULL) - UK_CRASH("Error: Cannot allocate l2_list.\n"); - l3_list[L3_P2M_IDX(pfn)] = virt_to_mfn(l2_list); - l2_list_pages[L3_P2M_IDX(pfn)] = l2_list; - } - - l2_list[L2_P2M_IDX(pfn)] = - virt_to_mfn(phys_to_machine_mapping + pfn); - } - HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = - virt_to_mfn(l3_list); - HYPERVISOR_shared_info->arch.max_pfn = max_pfn; -} - -void _arch_rebuild_p2m(void) -{ - unsigned long pfn; - unsigned long *l2_list = NULL; - - for (pfn = 0; pfn < max_pfn; pfn += P2M_ENTRIES) { - if (!(pfn % (P2M_ENTRIES * P2M_ENTRIES))) { - l2_list = l2_list_pages[L3_P2M_IDX(pfn)]; - l3_list[L3_P2M_IDX(pfn)] = virt_to_mfn(l2_list); - } - - l2_list[L2_P2M_IDX(pfn)] = - virt_to_mfn(phys_to_machine_mapping + pfn); - } - HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = - virt_to_mfn(l3_list); - HYPERVISOR_shared_info->arch.max_pfn = max_pfn; -} - -#ifdef CONFIG_MIGRATION -void arch_mm_pre_suspend(void) -{ - -} -void arch_mm_post_suspend(int canceled) -{ - if (!canceled) - _arch_rebuild_p2m(); -} -#endif -#endif /* CONFIG_XEN_PV_BUILD_P2M */ - -void arch_mm_init(struct uk_alloc *a) -{ -#ifdef CONFIG_XEN_PV_BUILD_P2M - _arch_init_p2m(a); -#endif -} - -void _init_mem_prepare(unsigned long *start_pfn, unsigned long *max_pfn) -{ -#ifdef CONFIG_PARAVIRT - phys_to_machine_mapping = (unsigned long *)HYPERVISOR_start_info->mfn_list; - pt_base = (pgentry_t *)HYPERVISOR_start_info->pt_base; - *start_pfn = PFN_UP(to_phys(pt_base)) + HYPERVISOR_start_info->nr_pt_frames; - *max_pfn = HYPERVISOR_start_info->nr_pages; -#endif -} - -/* - * Reserve an area of virtual address space for mappings - */ - -void _init_mem_demand_area(unsigned long start, unsigned long page_num) -{ - demand_map_area_start = start; - demand_map_area_end = demand_map_area_start + page_num * PAGE_SIZE; - - uk_pr_info("Demand map pfns at %lx-%lx.\n", - demand_map_area_start, demand_map_area_end); -} diff --git a/plat/xen/x86/setup.c b/plat/xen/x86/setup.c deleted file mode 100644 index 71ed4a8c62c29d5b8d700dd2710ec611c0599f88..0000000000000000000000000000000000000000 --- a/plat/xen/x86/setup.c +++ /dev/null @@ -1,281 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/****************************************************************************** - * common.c - * - * Common stuff special to x86 goes here. - * - * Copyright (c) 2002-2003, K A Fraser & R Neugebauer - * Copyright (c) 2005, Grzegorz Milos, Intel Research Cambridge - * Copyright (c) 2017, Simon Kuenzer - * - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - * - */ -/* mm.c - **************************************************************************** - * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge - * (C) 2005 - Grzegorz Milos - Intel Research Cambridge - **************************************************************************** - * - * File: mm.c - * Author: Rolf Neugebauer (neugebar@dcs.gla.ac.uk) - * Changes: Grzegorz Milos - * - * Date: Aug 2003, chages Aug 2005 - * - * Environment: Xen Minimal OS - * Description: memory management related functions - * contains buddy page allocator from Xen. - * - **************************************************************************** - * 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 without limitation the - * rights 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 - * AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef __X86_64__ -#include -#else -#include -#endif -#include -#include -#include -#include -#include - -start_info_t *HYPERVISOR_start_info; -shared_info_t *HYPERVISOR_shared_info; - -/* - * Just allocate the kernel stack here. SS:ESP is set up to point here - * in head.S. - */ -char _libxenplat_bootstack[2*__STACK_SIZE]; - -static inline void _init_traps(void) -{ - traps_lcpu_init(NULL); -} - -static inline void _init_shared_info(void) -{ - int ret; - unsigned long pa = HYPERVISOR_start_info->shared_info; - extern char _libxenplat_shared_info[__PAGE_SIZE]; - - if ((ret = HYPERVISOR_update_va_mapping( - (unsigned long)_libxenplat_shared_info, __pte(pa | 7), - UVMF_INVLPG))) - UK_CRASH("Failed to map shared_info: %d\n", ret); - HYPERVISOR_shared_info = (shared_info_t *)_libxenplat_shared_info; -} - -static int _init_mem(struct ukplat_bootinfo *const bi) -{ - unsigned long start_pfn, max_pfn; - struct ukplat_memregion_desc mrd; - int rc; - - _init_mem_prepare(&start_pfn, &max_pfn); - - if (max_pfn >= MAX_MEM_SIZE / __PAGE_SIZE) - max_pfn = MAX_MEM_SIZE / __PAGE_SIZE - 1; - - uk_pr_info(" start_pfn: %lx\n", start_pfn); - uk_pr_info(" max_pfn: %lx\n", max_pfn); - - _init_mem_build_pagetable(&start_pfn, &max_pfn); - _init_mem_clear_bootstrap(); - _init_mem_set_readonly((void *)__TEXT, (void *)__ERODATA); - - /* Fill out mrd array */ - /* heap */ - mrd = (struct ukplat_memregion_desc) { - .vbase = (__vaddr_t)to_virt(start_pfn << PAGE_SHIFT), - .pbase = start_pfn << PAGE_SHIFT, - .len = (max_pfn - start_pfn) << PAGE_SHIFT, - .type = UKPLAT_MEMRT_FREE, - .flags = UKPLAT_MEMRF_READ | UKPLAT_MEMRF_WRITE | - UKPLAT_MEMRF_MAP, - }; -#if CONFIG_UKPLAT_MEMRNAME - strncpy(mrd.name, "heap", sizeof(mrd.name) - 1); -#endif - rc = ukplat_memregion_list_insert(&bi->mrds, &mrd); - if (unlikely(rc < 0)) - return rc; - - mrd = (struct ukplat_memregion_desc) { - .vbase = VIRT_DEMAND_AREA, - .pbase = __PADDR_MAX, - .len = DEMAND_MAP_PAGES * PAGE_SIZE, - .type = UKPLAT_MEMRT_RESERVED, - .flags = UKPLAT_MEMRF_READ | UKPLAT_MEMRF_MAP, - }; -#if CONFIG_UKPLAT_MEMRNAME - strncpy(mrd.name, "demand", sizeof(mrd.name) - 1); -#endif - rc = ukplat_memregion_list_insert(&bi->mrds, &mrd); - if (unlikely(rc < 0)) - return rc; - - _init_mem_demand_area((unsigned long)mrd.vbase, DEMAND_MAP_PAGES); - - /* initrd */ - mrd = (struct ukplat_memregion_desc){0}; - if (HYPERVISOR_start_info->mod_len) { - if (HYPERVISOR_start_info->flags & SIF_MOD_START_PFN) { - mrd.pbase = HYPERVISOR_start_info->mod_start; - mrd.vbase = (__vaddr_t)to_virt(mrd.pbase); - } else { - mrd.pbase = HYPERVISOR_start_info->mod_start; - mrd.vbase = mrd.pbase; - } - mrd.len = (size_t)HYPERVISOR_start_info->mod_len; - mrd.type = UKPLAT_MEMRT_INITRD; - mrd.flags = UKPLAT_MEMRF_READ | UKPLAT_MEMRF_WRITE | - UKPLAT_MEMRF_MAP; -#if CONFIG_UKPLAT_MEMRNAME - strncpy(mrd.name, "initrd", sizeof(mrd.name) - 1); -#endif - rc = ukplat_memregion_list_insert(&bi->mrds, &mrd); - if (unlikely(rc < 0)) - return rc; - } - - ukplat_memregion_list_coalesce(&bi->mrds); - - return 0; -} - -static char *cmdline; -static __sz cmdline_len; - -static void _libxenplat_x86bootinfo_setup_cmdl(struct ukplat_bootinfo *bi) -{ - cmdline_len = strlen((char *)HYPERVISOR_start_info->cmd_line); - if (!cmdline_len) - cmdline_len = sizeof(CONFIG_UK_NAME) - 1; - - cmdline = ukplat_memregion_alloc(cmdline_len, UKPLAT_MEMRT_CMDLINE, - UKPLAT_MEMRF_READ | UKPLAT_MEMRF_MAP); - if (unlikely(!cmdline)) - UK_CRASH("Could not allocate command-line memory"); - - strncpy(cmdline, (const char *)HYPERVISOR_start_info->cmd_line, - cmdline_len); - cmdline[cmdline_len] = '\0'; - - bi->cmdline = (__u64)cmdline; - bi->cmdline_len = cmdline_len; - - /* Tag this scratch cmdline as a kernel resource, to distinguish it - * from the original cmdline obtained above - */ - cmdline = ukplat_memregion_alloc(cmdline_len, UKPLAT_MEMRT_KERNEL, - UKPLAT_MEMRF_READ | UKPLAT_MEMRF_MAP); - if (unlikely(!cmdline)) - UK_CRASH("Could not allocate scratch command-line memory"); - - strncpy(cmdline, (const char *)HYPERVISOR_start_info->cmd_line, - cmdline_len); - cmdline[cmdline_len] = '\0'; -} - -static void _libxenplat_x86bootinfo_setup(void) -{ - const char bl[] = "Xen"; - const char bp[] = "PVH"; - struct ukplat_bootinfo *bi; - - bi = ukplat_bootinfo_get(); - if (unlikely(!bi)) - UK_CRASH("Failed to get bootinfo\n"); - - memcpy(bi->bootloader, bl, sizeof(bl)); - - memcpy(bi->bootprotocol, bp, sizeof(bp)); - - if (_init_mem(bi) < 0) - UK_CRASH("Failed to initialize memory\n"); - - _libxenplat_x86bootinfo_setup_cmdl(bi); -} - -void _libxenplat_x86entry(void *start_info) __noreturn; -void _libxenplat_x86entry(void *start_info) -{ - _init_traps(); - HYPERVISOR_start_info = (start_info_t *)start_info; - prepare_console(); /* enables buffering for console */ - - uk_pr_info("Entering from Xen (x86, PV)...\n"); - - _init_shared_info(); /* remaps shared info */ - - /* Set up events. */ - init_events(); - - uk_pr_info(" start_info: %p\n", HYPERVISOR_start_info); - uk_pr_info(" shared_info: %p\n", HYPERVISOR_shared_info); - uk_pr_info("hypercall_page: %p\n", hypercall_page); - - init_console(); - - _libxenplat_x86bootinfo_setup(); - -#if CONFIG_HAVE_X86PKU - _check_ospke(); -#endif /* CONFIG_HAVE_X86PKU */ - - ukplat_entry_argp(CONFIG_UK_NAME, cmdline, cmdline_len); -} diff --git a/plat/xen/x86/traps.c b/plat/xen/x86/traps.c deleted file mode 100644 index 4c01b2b13af24a851e4c3163e8c7898619d8ba56..0000000000000000000000000000000000000000 --- a/plat/xen/x86/traps.c +++ /dev/null @@ -1,78 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * 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. - * 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 AUTHOR 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 AUTHOR 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. - */ -/* Taken from Mini-OS */ - -#include -#include -#include -#include -#include - -/* Traps used only on Xen */ - -DECLARE_TRAP_EC(coproc_seg_overrun, "coprocessor segment overrun", NULL) -DECLARE_TRAP (spurious_int, "spurious interrupt bug", NULL) - - -#ifdef CONFIG_PARAVIRT - -#define TRAP_TABLE_ENTRY(trapname, pl) \ - { TRAP_##trapname, pl, __KERNEL_CS, (unsigned long) ASM_TRAP_SYM(trapname) } - -/* - * Submit a virtual IDT to teh hypervisor. This consists of tuples - * (interrupt vector, privilege ring, CS:EIP of handler). - * The 'privilege ring' field specifies the least-privileged ring that - * can trap to that vector using a software-interrupt instruction (INT). - */ -static trap_info_t trap_table[] = { - TRAP_TABLE_ENTRY(divide_error, 0), - TRAP_TABLE_ENTRY(debug, 0), - TRAP_TABLE_ENTRY(int3, 3), - TRAP_TABLE_ENTRY(overflow, 3), - TRAP_TABLE_ENTRY(bounds, 3), - TRAP_TABLE_ENTRY(invalid_op, 0), - TRAP_TABLE_ENTRY(no_device, 0), - TRAP_TABLE_ENTRY(coproc_seg_overrun, 0), - TRAP_TABLE_ENTRY(invalid_tss, 0), - TRAP_TABLE_ENTRY(no_segment, 0), - TRAP_TABLE_ENTRY(stack_error, 0), - TRAP_TABLE_ENTRY(gp_fault, 0), - TRAP_TABLE_ENTRY(page_fault, 0), - TRAP_TABLE_ENTRY(spurious_int, 0), - TRAP_TABLE_ENTRY(coproc_error, 0), - TRAP_TABLE_ENTRY(alignment_check, 0), - TRAP_TABLE_ENTRY(simd_error, 0), - { 0, 0, 0, 0 } -}; - -void traps_lcpu_init(struct lcpu *current __unused) -{ - HYPERVISOR_set_trap_table(trap_table); - - HYPERVISOR_set_callbacks((unsigned long) asm_trap_hypervisor_callback, - (unsigned long) asm_failsafe_callback, 0); -} - -#endif diff --git a/plat/xen/xenbus/client.c b/plat/xen/xenbus/client.c deleted file mode 100644 index 1e28dd1b0cf269247f4aeb12630b162081102593..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/client.c +++ /dev/null @@ -1,240 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Steven Smith (sos22@cam.ac.uk) - * Grzegorz Milos (gm281@cam.ac.uk) - * John D. Ramsdell - * Costin Lupu - * - * Copyright (c) 2006, Cambridge University - * 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* - * Client interface between the device and the Xenbus driver. - * Ported from Mini-OS xenbus.c - */ - -#include -#include -#include -#include -#include -#include - - -#define XENBUS_STATE_ENTRY(name) \ - [XenbusState##name] = #name - -static const char *const xb_state_tbl[] = { - XENBUS_STATE_ENTRY(Unknown), - XENBUS_STATE_ENTRY(Initialising), - XENBUS_STATE_ENTRY(InitWait), - XENBUS_STATE_ENTRY(Initialised), - XENBUS_STATE_ENTRY(Connected), - XENBUS_STATE_ENTRY(Closing), - XENBUS_STATE_ENTRY(Closed), - XENBUS_STATE_ENTRY(Reconfiguring), - XENBUS_STATE_ENTRY(Reconfigured), -}; - -const char *xenbus_state_to_str(XenbusState state) -{ - return (state < ARRAY_SIZE(xb_state_tbl)) ? - xb_state_tbl[state] : "INVALID"; -} - -#define XENBUS_DEVTYPE_ENTRY(name) \ - [xenbus_dev_##name] = #name - -static const char *const xb_devtype_tbl[] = { - XENBUS_DEVTYPE_ENTRY(none), - XENBUS_DEVTYPE_ENTRY(vif), - XENBUS_DEVTYPE_ENTRY(vbd), - XENBUS_DEVTYPE_ENTRY(9pfs), -}; - -const char *xenbus_devtype_to_str(enum xenbus_dev_type devtype) -{ - return (devtype < ARRAY_SIZE(xb_devtype_tbl)) ? - xb_devtype_tbl[devtype] : "INVALID"; -} - -enum xenbus_dev_type xenbus_str_to_devtype(const char *devtypestr) -{ - for (int i = 0; i < (int) ARRAY_SIZE(xb_devtype_tbl); i++) { - if (!strcmp(xb_devtype_tbl[i], devtypestr)) - return (enum xenbus_dev_type) i; - } - - return xenbus_dev_none; -} - -/* - * Watches - */ - -int xenbus_watch_wait_event(struct xenbus_watch *watch) -{ - if (watch == NULL) - return -EINVAL; - - while (1) { - ukarch_spin_lock(&watch->lock); - - if (watch->pending_events > 0) - break; - - ukarch_spin_unlock(&watch->lock); - - uk_waitq_wait_event(&watch->wq, - (watch->pending_events > 0)); - } - - watch->pending_events--; - ukarch_spin_unlock(&watch->lock); - - return 0; -} - -int xenbus_watch_notify_event(struct xenbus_watch *watch) -{ - if (watch == NULL) - return -EINVAL; - - ukarch_spin_lock(&watch->lock); - watch->pending_events++; - uk_waitq_wake_up(&watch->wq); - ukarch_spin_unlock(&watch->lock); - - return 0; -} - -XenbusState xenbus_read_driver_state(const char *path) -{ - char state_path[strlen(path) + sizeof("/state")]; - XenbusState state = XenbusStateUnknown; - - sprintf(state_path, "%s/state", path); - xs_read_integer(XBT_NIL, state_path, (int *) &state); - - return state; -} - -int xenbus_switch_state(xenbus_transaction_t xbt, - struct xenbus_device *xendev, XenbusState state) -{ - char state_path[strlen(xendev->nodename) + sizeof("/state")]; - char new_state_str[2]; - XenbusState crnt_state; - int need_transaction_end = 0; /* non-zero if local transaction */ - int abort; - int err; - - if (xendev == NULL) - return -EINVAL; - - sprintf(state_path, "%s/state", xendev->nodename); - - do { - abort = 1; - - if (xbt == XBT_NIL) { - err = xs_transaction_start(&xbt); - if (err) - goto exit; - need_transaction_end = 1; - } - - /* check if state is already set */ - err = xs_read_integer(xbt, xendev->nodename, - (int *) &crnt_state); - if (err || crnt_state == state) - goto exit; - - /* set new state */ - snprintf(new_state_str, sizeof(new_state_str), "%d", state); - err = xs_write(xbt, state_path, NULL, new_state_str); - - abort = 0; -exit: - if (need_transaction_end) { - int _err; - - _err = xs_transaction_end(xbt, abort); - if (!err) - err = _err; - xbt = XBT_NIL; - } - } while (err == -EAGAIN); - - if (err) - uk_pr_err("Error switching state to %s: %d\n", - xenbus_state_to_str(state), err); - - return err; -} - -int xenbus_wait_for_state_change(const char *path, XenbusState *state, - struct xenbus_watch *watch) -{ - XenbusState crnt_state; - int err = 0, watch_is_local = 0; - - if (path == NULL || state == NULL) { - err = -EINVAL; - goto out; - } - - if (watch == NULL) { - /* create a local watch */ - watch = xs_watch_path(XBT_NIL, path); - if (PTRISERR(watch)) { - err = PTR2ERR(watch); - goto out; - } - watch_is_local = 1; - } - - for (;;) { - err = xs_read_integer(XBT_NIL, path, (int *) &crnt_state); - if (err) - break; - - if (crnt_state != *state) { - *state = crnt_state; - break; - } - - xenbus_watch_wait_event(watch); - } - -out: - if (watch_is_local) - xs_unwatch(XBT_NIL, watch); - - return err; -} diff --git a/plat/xen/xenbus/exportsyms.uk b/plat/xen/xenbus/exportsyms.uk deleted file mode 100644 index eca4bfd340eca70bd160cb84913464fcb5d0725e..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/exportsyms.uk +++ /dev/null @@ -1,35 +0,0 @@ -# Xenbus API -_xenbus_register_driver - -# Xenstore API -xs_read -xs_write -xs_ls -xs_rm -xs_char_to_perm -xs_perm_to_char -xs_str_to_perm -xs_perm_to_str -xs_get_acl -xs_set_acl -xs_get_perm -xs_set_perm -xs_del_perm -xs_watch_path -xs_unwatch -xs_transaction_start -xs_transaction_end -xs_debug_msg -xs_read_integer -xs_scanf -xs_printf -xs_get_self_id - -# Client API -xenbus_state_to_str -xenbus_devtype_to_str -xenbus_str_to_devtype -xenbus_watch_wait_event -xenbus_read_driver_state -xenbus_switch_state -xenbus_wait_for_state_change diff --git a/plat/xen/xenbus/xenbus.c b/plat/xen/xenbus/xenbus.c deleted file mode 100644 index 2fa23577fa1cca8c59781fdffa902afc19d86a3c..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/xenbus.c +++ /dev/null @@ -1,251 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "xs_comms.h" - -#define XS_DEV_PATH "device" - -static struct xenbus_handler xbh; - - -/* Helper functions for Xenbus related allocations */ -void *uk_xb_malloc(size_t size) -{ - UK_ASSERT(xbh.a != NULL); - return uk_malloc(xbh.a, size); -} - -void *uk_xb_calloc(size_t nmemb, size_t size) -{ - UK_ASSERT(xbh.a != NULL); - return uk_calloc(xbh.a, nmemb, size); -} - -void uk_xb_free(void *ptr) -{ - UK_ASSERT(xbh.a != NULL); - uk_free(xbh.a, ptr); -} - - -static struct xenbus_driver *xenbus_find_driver(xenbus_dev_type_t devtype) -{ - struct xenbus_driver *drv; - const xenbus_dev_type_t *pdevtype; - - UK_TAILQ_FOREACH(drv, &xbh.drv_list, next) { - for (pdevtype = drv->device_types; - *pdevtype != xenbus_dev_none; pdevtype++) { - if (*pdevtype == devtype) - return drv; - } - } - - return NULL; /* no driver found */ -} - -static int xenbus_probe_device(struct xenbus_driver *drv, - xenbus_dev_type_t type, const char *name) -{ - int err; - struct xenbus_device *dev; - char *nodename = NULL; - XenbusState state; - - /* device/type/name */ - err = asprintf(&nodename, "%s/%s/%s", - XS_DEV_PATH, xenbus_devtype_to_str(type), name); - if (err < 0) - goto out; - - state = xenbus_read_driver_state(nodename); - if (state != XenbusStateInitialising) - return 0; - - uk_pr_info("Xenbus device: %s\n", nodename); - - dev = uk_xb_calloc(1, sizeof(*dev) + strlen(nodename) + 1); - if (!dev) { - uk_pr_err("Failed to initialize: Out of memory!\n"); - err = -ENOMEM; - goto out; - } - - dev->state = XenbusStateInitialising; - dev->devtype = type; - dev->nodename = (char *) (dev + 1); - strcpy(dev->nodename, nodename); - - err = drv->add_dev(dev); - if (err) { - uk_pr_err("Failed to add device.\n"); - uk_xb_free(dev); - } - -out: - if (nodename) - free(nodename); - - return err; -} - -static int xenbus_probe_device_type(const char *devtype_str) -{ - struct xenbus_driver *drv; - xenbus_dev_type_t devtype; - char dirname[sizeof(XS_DEV_PATH) + strlen(devtype_str)]; - char **devices = NULL; - int err = 0; - - devtype = xenbus_str_to_devtype(devtype_str); - if (!devtype) { - uk_pr_warn("Unsupported device type: %s\n", devtype_str); - goto out; - } - - drv = xenbus_find_driver(devtype); - if (!drv) { - uk_pr_warn("No driver for device type: %s\n", devtype_str); - goto out; - } - - sprintf(dirname, "%s/%s", XS_DEV_PATH, devtype_str); - - /* Get device list */ - devices = xs_ls(XBT_NIL, dirname); - if (PTRISERR(devices)) { - err = PTR2ERR(devices); - uk_pr_err("Error reading %s devices: %d\n", devtype_str, err); - goto out; - } - - for (int i = 0; devices[i] != NULL; i++) { - /* Probe only if no prior error */ - if (err == 0) - err = xenbus_probe_device(drv, devtype, devices[i]); - } - -out: - if (!PTRISERR(devices)) - free(devices); - - return err; -} - -static int xenbus_probe(void) -{ - char **devtypes; - int err = 0; - - uk_pr_info("Probe Xenbus\n"); - - /* Get device types list */ - devtypes = xs_ls(XBT_NIL, XS_DEV_PATH); - if (PTRISERR(devtypes)) { - err = PTR2ERR(devtypes); - uk_pr_err("Error reading device types: %d\n", err); - goto out; - } - - for (int i = 0; devtypes[i] != NULL; i++) { - /* Probe only if no previous error */ - if (err == 0) - err = xenbus_probe_device_type(devtypes[i]); - } - -out: - if (!PTRISERR(devtypes)) - free(devtypes); - - return err; -} - -static int xenbus_init(struct uk_alloc *a) -{ - struct xenbus_driver *drv, *drv_next; - int ret = 0; - - UK_ASSERT(a != NULL); - - xbh.a = a; - - ret = xs_comms_init(); - if (ret) { - uk_pr_err("Error initializing Xenstore communication."); - return ret; - } - - UK_TAILQ_FOREACH_SAFE(drv, &xbh.drv_list, next, drv_next) { - if (drv->init) { - ret = drv->init(a); - if (ret == 0) - continue; - uk_pr_err("Failed to initialize driver %p: %d\n", - drv, ret); - UK_TAILQ_REMOVE(&xbh.drv_list, drv, next); - } - } - - return 0; -} - -void _xenbus_register_driver(struct xenbus_driver *drv) -{ - UK_ASSERT(drv != NULL); - UK_TAILQ_INSERT_TAIL(&xbh.drv_list, drv, next); -} - -/* - * Register this bus driver to libukbus: - */ -static struct xenbus_handler xbh = { - .b.init = xenbus_init, - .b.probe = xenbus_probe, - .drv_list = UK_TAILQ_HEAD_INITIALIZER(xbh.drv_list), - .dev_list = UK_TAILQ_HEAD_INITIALIZER(xbh.dev_list), -}; - -UK_BUS_REGISTER(&xbh.b); diff --git a/plat/xen/xenbus/xs.c b/plat/xen/xenbus/xs.c deleted file mode 100644 index 4fc10cb54c5fd474e6e95768783e63f93d29b2cd..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/xs.c +++ /dev/null @@ -1,735 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Steven Smith (sos22@cam.ac.uk) - * Grzegorz Milos (gm281@cam.ac.uk) - * John D. Ramsdell - * Costin Lupu - * - * Copyright (c) 2006, Cambridge University - * 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* - * Ported from Mini-OS xenbus.c - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include "xs_watch.h" -#include "xs_comms.h" - - -/* Helper macros for initializing xs requests from strings */ -#define XS_IOVEC_STR_NULL(str) \ - ((struct xs_iovec) { str, strlen(str) + 1 }) -#define XS_IOVEC_STR(str) \ - ((struct xs_iovec) { str, strlen(str) }) - - -/* Common function used for sending requests when replies aren't handled */ -static inline int xs_msg(enum xsd_sockmsg_type type, xenbus_transaction_t xbt, - struct xs_iovec *reqs, int reqs_num) -{ - return xs_msg_reply(type, xbt, reqs, reqs_num, NULL); -} - -char *xs_read(xenbus_transaction_t xbt, const char *path, const char *node) -{ - struct xs_iovec req, rep; - char *fullpath, *value; - int err; - - if (path == NULL) - return ERR2PTR(-EINVAL); - - if (node != NULL) { - err = asprintf(&fullpath, "%s/%s", path, node); - if (err < 0) { - value = ERR2PTR(-ENOMEM); - goto out; - } - } else - fullpath = (char *) path; - - req = XS_IOVEC_STR_NULL(fullpath); - err = xs_msg_reply(XS_READ, xbt, &req, 1, &rep); - if (err == 0) - value = rep.data; - else - value = ERR2PTR(err); - - if (node != NULL) - free(fullpath); -out: - return value; -} - -int xs_write(xenbus_transaction_t xbt, const char *path, const char *node, - const char *value) -{ - struct xs_iovec req[2]; - char *fullpath; - int err; - - if (path == NULL || value == NULL) - return -EINVAL; - - if (node != NULL) { - err = asprintf(&fullpath, "%s/%s", path, node); - if (err < 0) { - err = -ENOMEM; - goto out; - } - } else - fullpath = (char *) path; - - req[0] = XS_IOVEC_STR_NULL(fullpath); - req[1] = XS_IOVEC_STR((char *) value); - - err = xs_msg(XS_WRITE, xbt, req, ARRAY_SIZE(req)); - - if (node != NULL) - free(fullpath); -out: - return err; -} - -/* Returns an array of strings out of the serialized reply */ -static char **reply_to_string_array(struct xs_iovec *rep, int *size) -{ - int strings_num, offs, i; - char *rep_strings, *strings, **res = NULL; - - rep_strings = rep->data; - - /* count the strings */ - for (offs = strings_num = 0; offs < (int) rep->len; offs++) - strings_num += (rep_strings[offs] == 0); - - /* one alloc for both string addresses and contents */ - res = malloc((strings_num + 1) * sizeof(char *) + rep->len); - if (!res) - return ERR2PTR(-ENOMEM); - - /* copy the strings to the end of the array */ - strings = (char *) &res[strings_num + 1]; - memcpy(strings, rep_strings, rep->len); - - /* fill the string array */ - for (offs = i = 0; i < strings_num; i++) { - char *string = strings + offs; - int string_len = strlen(string); - - res[i] = string; - - offs += string_len + 1; - } - res[i] = NULL; - - if (size) - *size = strings_num; - - return res; -} - -char **xs_ls(xenbus_transaction_t xbt, const char *path) -{ - struct xs_iovec req, rep; - char **res = NULL; - int err; - - if (path == NULL) - return ERR2PTR(-EINVAL); - - req = XS_IOVEC_STR_NULL((char *) path); - err = xs_msg_reply(XS_DIRECTORY, xbt, &req, 1, &rep); - if (err) - return ERR2PTR(err); - - res = reply_to_string_array(&rep, NULL); - free(rep.data); - - return res; -} - -int xs_rm(xenbus_transaction_t xbt, const char *path) -{ - struct xs_iovec req; - - if (path == NULL) - return -EINVAL; - - req = XS_IOVEC_STR_NULL((char *) path); - - return xs_msg(XS_RM, xbt, &req, 1); -} - -/* - * Permissions - */ - -static const char xs_perm_tbl[] = { - [XS_PERM_NONE] = 'n', - [XS_PERM_READ] = 'r', - [XS_PERM_WRITE] = 'w', - [XS_PERM_BOTH] = 'b', -}; - -int xs_char_to_perm(char c, enum xs_perm *perm) -{ - int err = -EINVAL; - - if (perm == NULL) - goto out; - - for (int i = 0; i < (int) ARRAY_SIZE(xs_perm_tbl); i++) { - if (c == xs_perm_tbl[i]) { - *perm = i; - err = 0; - break; - } - } - -out: - return err; -} - -int xs_perm_to_char(enum xs_perm perm, char *c) -{ - if (c == NULL || perm >= ARRAY_SIZE(xs_perm_tbl)) - return -EINVAL; - - *c = xs_perm_tbl[perm]; - - return 0; -} - -int xs_str_to_perm(const char *str, domid_t *domid, enum xs_perm *perm) -{ - int err = 0; - - if (str == NULL || domid == NULL || perm == NULL) { - err = -EINVAL; - goto out; - } - - err = xs_char_to_perm(str[0], perm); - if (err) - goto out; - - *domid = (domid_t) strtoul(&str[1], NULL, 10); - -out: - return err; -} - -#define PERM_MAX_SIZE 32 -char *xs_perm_to_str(domid_t domid, enum xs_perm perm) -{ - int err = 0; - char permc, value[PERM_MAX_SIZE]; - - err = xs_perm_to_char(perm, &permc); - if (err) - return NULL; - - snprintf(value, PERM_MAX_SIZE, "%c%hu", permc, domid); - - return strdup(value); -} - -/* - * Returns the ACL for input path. An extra number of empty entries may be - * requested if caller intends to extend the list. - */ -static struct xs_acl *__xs_get_acl(xenbus_transaction_t xbt, const char *path, - int extra) -{ - struct xs_acl *acl = NULL; - struct xs_iovec req, rep; - char **values; - int values_num, err; - - if (path == NULL) { - err = EINVAL; - goto out; - } - - req = XS_IOVEC_STR_NULL((char *) path); - err = xs_msg_reply(XS_GET_PERMS, xbt, &req, 1, &rep); - if (err) - goto out; - - values = reply_to_string_array(&rep, &values_num); - free(rep.data); - if (PTRISERR(values)) { - err = PTR2ERR(values); - goto out; - } - - acl = malloc(sizeof(struct xs_acl) + - (values_num + extra) * sizeof(struct xs_acl_entry)); - if (acl == NULL) { - err = ENOMEM; - goto out_values; - } - - /* set owner id and permissions for others */ - err = xs_str_to_perm(values[0], - &acl->ownerid, &acl->others_perm); - if (err) - goto out_values; - - /* set ACL entries */ - acl->entries_num = values_num - 1; - for (int i = 0; i < acl->entries_num; i++) { - err = xs_str_to_perm(values[i + 1], - &acl->entries[i].domid, &acl->entries[i].perm); - if (err) - goto out_values; - } - -out_values: - free(values); -out: - if (err) { - if (acl) - free(acl); - acl = ERR2PTR(err); - } - return acl; -} - -struct xs_acl *xs_get_acl(xenbus_transaction_t xbt, const char *path) -{ - return __xs_get_acl(xbt, path, 0); -} - -int xs_set_acl(xenbus_transaction_t xbt, const char *path, struct xs_acl *acl) -{ - struct xs_iovec req[2 + acl->entries_num]; - char *s; - int i, err; - - if (path == NULL || acl == NULL) { - err = -EINVAL; - goto out; - } - - req[0] = XS_IOVEC_STR_NULL((char *) path); - - s = xs_perm_to_str(acl->ownerid, acl->others_perm); - if (s == NULL) { - err = -EINVAL; - goto out; - } - - req[1] = XS_IOVEC_STR_NULL(s); - - for (i = 0; i < acl->entries_num; i++) { - struct xs_acl_entry *acle = &acl->entries[i]; - - s = xs_perm_to_str(acle->domid, acle->perm); - if (s == NULL) { - err = -EINVAL; - goto out_req; - } - - req[i + 2] = XS_IOVEC_STR_NULL(s); - } - - err = xs_msg(XS_SET_PERMS, xbt, req, ARRAY_SIZE(req)); - -out_req: - for (i--; i > 0; i--) - free(req[i].data); -out: - return err; -} - -int xs_get_perm(xenbus_transaction_t xbt, const char *path, - domid_t domid, enum xs_perm *perm) -{ - struct xs_acl *acl; - int err = 0; - - if (perm == NULL) { - err = -EINVAL; - goto out; - } - - acl = xs_get_acl(xbt, path); - if (PTRISERR(acl)) { - err = PTR2ERR(acl); - goto out; - } - - if (acl->ownerid == domid) { - *perm = XS_PERM_BOTH; - goto out_acl; - } - - for (int i = 0; i < acl->entries_num; i++) { - struct xs_acl_entry *acle = &acl->entries[i]; - - if (acle->domid == domid) { - *perm = acle->perm; - goto out_acl; - } - } - - *perm = acl->others_perm; - -out_acl: - free(acl); -out: - return err; -} - -static int acl_find_entry_index(struct xs_acl *acl, domid_t domid) -{ - struct xs_acl_entry *acle; - int i; - - if (acl->ownerid == domid) - /* - * let's say the function isn't called correctly considering - * that the owner domain has all the rights, all the time - */ - return -EINVAL; - - for (i = 0; i < acl->entries_num; i++) { - acle = &acl->entries[i]; - if (acle->domid == domid) - break; - } - - if (i == acl->entries_num) - /* no entry found for domid */ - return -ENOENT; - - return i; -} - -int xs_set_perm(xenbus_transaction_t xbt, const char *path, - domid_t domid, enum xs_perm perm) -{ - struct xs_acl *acl; - struct xs_acl_entry *acle; - int err, idx; - - UK_ASSERT(xbt != XBT_NIL); - - /* one extra entry in case a new one will be added */ - acl = __xs_get_acl(xbt, path, 1); - if (PTRISERR(acl)) { - err = PTR2ERR(acl); - goto out; - } - - idx = acl_find_entry_index(acl, domid); - if (idx == -ENOENT) { - /* new entry */ - acle = &acl->entries[acl->entries_num]; - acle->domid = domid; - acle->perm = perm; - acl->entries_num++; - - } else if (idx < 0) { - /* some other error */ - err = idx; - goto out_acl; - - } else { - /* update entry */ - acle = &acl->entries[idx]; - acle->perm = perm; - } - - err = xs_set_acl(xbt, path, acl); - -out_acl: - free(acl); -out: - return err; -} - -int xs_del_perm(xenbus_transaction_t xbt, const char *path, - domid_t domid) -{ - struct xs_acl *acl; - int idx, err = 0; - - UK_ASSERT(xbt != XBT_NIL); - - acl = __xs_get_acl(xbt, path, 0); - if (PTRISERR(acl)) { - err = PTR2ERR(acl); - goto out; - } - - idx = acl_find_entry_index(acl, domid); - if (idx < 0) { - err = idx; - goto out_acl; - } - - /* remove entry */ - acl->entries_num--; - memmove(&acl->entries[idx], &acl->entries[idx + 1], - (acl->entries_num - idx) * sizeof(struct xs_acl_entry)); - - err = xs_set_acl(xbt, path, acl); - -out_acl: - free(acl); -out: - return err; -} - -/* - * Watches - */ - -struct xenbus_watch *xs_watch_path(xenbus_transaction_t xbt, const char *path) -{ - struct xs_watch *xsw; - struct xs_iovec req[2]; - int err; - - if (path == NULL) - return ERR2PTR(-EINVAL); - - xsw = xs_watch_create(path); - if (PTRISERR(xsw)) - return (struct xenbus_watch *) xsw; - - req[0] = XS_IOVEC_STR_NULL(xsw->xs.path); - req[1] = XS_IOVEC_STR_NULL(xsw->xs.token); - - err = xs_msg(XS_WATCH, xbt, req, ARRAY_SIZE(req)); - if (err) { - xs_watch_destroy(xsw); - return ERR2PTR(err); - } - - return &xsw->base; -} - -int xs_unwatch(xenbus_transaction_t xbt, struct xenbus_watch *watch) -{ - struct xs_watch *xsw, *_xsw; - struct xs_iovec req[2]; - int err; - - if (watch == NULL) { - err = -EINVAL; - goto out; - } - - xsw = __containerof(watch, struct xs_watch, base); - - _xsw = xs_watch_find(xsw->xs.path, xsw->xs.token); - if (_xsw != xsw) { - /* this watch was not registered */ - err = -ENOENT; - goto out; - } - - req[0] = XS_IOVEC_STR_NULL(xsw->xs.path); - req[1] = XS_IOVEC_STR_NULL(xsw->xs.token); - - err = xs_msg(XS_UNWATCH, xbt, req, ARRAY_SIZE(req)); - if (err) - goto out; - - err = xs_watch_destroy(xsw); - -out: - return err; -} - -/* - * Transactions - */ - -int xs_transaction_start(xenbus_transaction_t *xbt) -{ - /* - * xenstored becomes angry if you send a length 0 message, - * so just shove a nul terminator on the end - */ - struct xs_iovec req, rep; - int err; - - if (xbt == NULL) - return -EINVAL; - - req = XS_IOVEC_STR_NULL(""); - err = xs_msg_reply(XS_TRANSACTION_START, 0, &req, 1, &rep); - if (err) - return err; - - *xbt = strtoul(rep.data, NULL, 10); - free(rep.data); - - return err; -} - -int xs_transaction_end(xenbus_transaction_t xbt, int abort) -{ - struct xs_iovec req; - - req.data = abort ? "F" : "T"; - req.len = 2; - - return xs_msg(XS_TRANSACTION_END, xbt, &req, 1); -} - -/* - * Misc - */ - -/* Send a debug message to xenbus. Can block. */ -int xs_debug_msg(const char *msg) -{ - struct xs_iovec req[3], rep; - int err; - - if (msg == NULL) - return -EINVAL; - - req[0] = XS_IOVEC_STR_NULL("print"); - req[1] = XS_IOVEC_STR((char *) msg); - req[2] = XS_IOVEC_STR_NULL(""); - - err = xs_msg_reply(XS_DEBUG, XBT_NIL, req, ARRAY_SIZE(req), &rep); - if (err) - goto out; - - uk_pr_debug("Got a debug reply %s\n", (char *) rep.data); - free(rep.data); - -out: - return err; -} - -int xs_read_integer(xenbus_transaction_t xbt, const char *path, int *value) -{ - char *value_str; - - if (path == NULL || value == NULL) - return -EINVAL; - - value_str = xs_read(xbt, path, NULL); - if (PTRISERR(value_str)) - return PTR2ERR(value_str); - - *value = atoi(value_str); - - free(value_str); - - return 0; -} - -int xs_scanf(xenbus_transaction_t xbt, const char *dir, const char *node, - const char *fmt, ...) -{ - char *val; - va_list args; - int err = 0; - - if (fmt == NULL) - return -EINVAL; - - val = xs_read(xbt, dir, node); - if (PTRISERR(val)) { - err = PTR2ERR(val); - goto out; - } - - va_start(args, fmt); - err = vsscanf(val, fmt, args); - va_end(args); - - free(val); - -out: - return err; -} - -int xs_printf(xenbus_transaction_t xbt, const char *dir, const char *node, - const char *fmt, ...) -{ -#define VAL_SIZE 256 - char val[VAL_SIZE]; - va_list args; - int err = 0, _err; - - if (fmt == NULL) - return -EINVAL; - - va_start(args, fmt); - _err = vsnprintf(val, VAL_SIZE, fmt, args); - va_end(args); - - /* send to Xenstore if vsnprintf was successful */ - if (_err > 0) - err = xs_write(xbt, dir, node, val); - - /* - * if message sent to Xenstore was successful, - * return the number of characters - */ - if (err == 0) - err = _err; - - return err; -} - -domid_t xs_get_self_id(void) -{ - char *domid_str; - domid_t domid; - - domid_str = xs_read(XBT_NIL, "domid", NULL); - if (PTRISERR(domid_str)) - UK_CRASH("Error reading domain id."); - - domid = (domid_t) strtoul(domid_str, NULL, 10); - - free(domid_str); - - return domid; -} diff --git a/plat/xen/xenbus/xs_comms.c b/plat/xen/xenbus/xs_comms.c deleted file mode 100644 index 6b1ab9ecae404d1e60b8deb12487d16216ef68f5..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/xs_comms.c +++ /dev/null @@ -1,623 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Steven Smith (sos22@cam.ac.uk) - * Grzegorz Milos (gm281@cam.ac.uk) - * John D. Ramsdell - * Costin Lupu - * - * Copyright (c) 2006, Cambridge University - * 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* - * Communication with Xenstore - * Ported from Mini-OS xenbus.c - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "xs_comms.h" -#include "xs_watch.h" - - -/* - * Xenstore handler structure - */ -struct xs_handler { - /**< Communication: event channel */ - evtchn_port_t evtchn; - /**< Communication: shared memory */ - struct xenstore_domain_interface *buf; - /**< Thread processing incoming xs replies */ - struct uk_thread *thread; - /**< Waiting queue for notifying incoming xs replies */ - struct uk_waitq waitq; -}; - -static struct xs_handler xsh = { - .waitq = UK_WAIT_QUEUE_INITIALIZER(xsh.waitq), -}; - -/* - * In-flight request structure. - */ -struct xs_request { - /**< used when queueing requests */ - UK_TAILQ_ENTRY(struct xs_request) next; - /**< Waiting queue for incoming reply notification */ - struct uk_waitq waitq; - /**< Request header */ - struct xsd_sockmsg hdr; - /**< Request payload iovecs */ - const struct xs_iovec *payload_iovecs; - /**< Received reply */ - struct { - /**< Reply string + size */ - struct xs_iovec iovec; - /**< Error number */ - int errornum; - /**< Non-zero for incoming replies */ - int recvd; - } reply; -}; -UK_TAILQ_HEAD(xs_request_list, struct xs_request); - -/* - * Pool of in-flight requests. - * Request IDs are reused, hence the limited set of entries. - */ -struct xs_request_pool { - /**< Number of live requests */ - __u32 num_live; - /**< Last probed request index */ - __u32 last_probed; - /**< Lock */ - __spinlock lock; - /**< Waiting queue for 'not-full' notifications */ - struct uk_waitq waitq; - /**< Queue for requests to be sent */ - struct xs_request_list queued; - - /* Map size is power of 2 */ -#define XS_REQ_POOL_SHIFT 5 -#define XS_REQ_POOL_SIZE (1 << XS_REQ_POOL_SHIFT) -#define XS_REQ_POOL_MASK (XS_REQ_POOL_SIZE - 1) - unsigned long entries_bm[UK_BITS_TO_LONGS(XS_REQ_POOL_SIZE) - * sizeof(long)]; - /**< Entries */ - struct xs_request entries[XS_REQ_POOL_SIZE]; -}; - -static struct xs_request_pool xs_req_pool; - -static void xs_request_pool_init(struct xs_request_pool *pool) -{ - struct xs_request *xs_req; - - pool->num_live = 0; - pool->last_probed = -1; - ukarch_spin_init(&pool->lock); - uk_waitq_init(&pool->waitq); - UK_TAILQ_INIT(&pool->queued); - uk_bitmap_zero(pool->entries_bm, XS_REQ_POOL_SIZE); - for (int i = 0; i < XS_REQ_POOL_SIZE; i++) { - xs_req = &pool->entries[i]; - xs_req->hdr.req_id = i; - uk_waitq_init(&xs_req->waitq); - } -} - -/* - * Allocate an identifier for a Xenstore request. - * Blocks if none are available. - */ -static struct xs_request *xs_request_get(void) -{ - unsigned long entry_idx; - - /* wait for an available entry */ - while (1) { - ukarch_spin_lock(&xs_req_pool.lock); - - if (xs_req_pool.num_live < XS_REQ_POOL_SIZE) - break; - - ukarch_spin_unlock(&xs_req_pool.lock); - - uk_waitq_wait_event(&xs_req_pool.waitq, - (xs_req_pool.num_live < XS_REQ_POOL_SIZE)); - } - - /* find an available entry */ - entry_idx = - uk_find_next_zero_bit(xs_req_pool.entries_bm, XS_REQ_POOL_SIZE, - (xs_req_pool.last_probed + 1) & XS_REQ_POOL_MASK); - - if (entry_idx == XS_REQ_POOL_SIZE) - entry_idx = uk_find_next_zero_bit(xs_req_pool.entries_bm, - XS_REQ_POOL_SIZE, 0); - - uk_set_bit(entry_idx, xs_req_pool.entries_bm); - xs_req_pool.last_probed = entry_idx; - xs_req_pool.num_live++; - - ukarch_spin_unlock(&xs_req_pool.lock); - - return &xs_req_pool.entries[entry_idx]; -} - -/* Release a request identifier */ -static void xs_request_put(struct xs_request *xs_req) -{ - __u32 reqid = xs_req->hdr.req_id; - - ukarch_spin_lock(&xs_req_pool.lock); - - UK_ASSERT(uk_test_bit(reqid, xs_req_pool.entries_bm) == 1); - - uk_clear_bit(reqid, xs_req_pool.entries_bm); - xs_req_pool.num_live--; - - if (xs_req_pool.num_live == XS_REQ_POOL_SIZE - 1) - uk_waitq_wake_up(&xs_req_pool.waitq); - - ukarch_spin_unlock(&xs_req_pool.lock); -} - -static struct xs_request *xs_request_peek(void) -{ - struct xs_request *xs_req; - - ukarch_spin_lock(&xs_req_pool.lock); - xs_req = UK_TAILQ_FIRST(&xs_req_pool.queued); - ukarch_spin_unlock(&xs_req_pool.lock); - - return xs_req; -} - -static void xs_request_enqueue(struct xs_request *xs_req) -{ - ukarch_spin_lock(&xs_req_pool.lock); - UK_TAILQ_INSERT_TAIL(&xs_req_pool.queued, xs_req, next); - ukarch_spin_unlock(&xs_req_pool.lock); -} - -static struct xs_request *xs_request_dequeue(void) -{ - struct xs_request *xs_req; - - ukarch_spin_lock(&xs_req_pool.lock); - xs_req = UK_TAILQ_FIRST(&xs_req_pool.queued); - if (xs_req) - UK_TAILQ_REMOVE(&xs_req_pool.queued, xs_req, next); - ukarch_spin_unlock(&xs_req_pool.lock); - - return xs_req; -} - -static int xs_avail_to_read(void) -{ - return (xsh.buf->rsp_prod != xsh.buf->rsp_cons); -} - -static int xs_avail_space_for_read(unsigned int size) -{ - return (xsh.buf->rsp_prod - xsh.buf->rsp_cons >= size); -} - -static int xs_avail_to_write(void) -{ - return (xsh.buf->req_prod - xsh.buf->req_cons != XENSTORE_RING_SIZE && - !UK_TAILQ_EMPTY(&xs_req_pool.queued)); -} - -static int xs_avail_space_for_write(unsigned int size) -{ - return (xsh.buf->req_prod - xsh.buf->req_cons + - size <= XENSTORE_RING_SIZE); -} - -static int xs_avail_work(void) -{ - return (xs_avail_to_read() || xs_avail_to_write()); -} - -/* - * Send request to Xenstore. A request is made of multiple iovecs which are - * preceded by a single iovec referencing the request header. The iovecs are - * seen by Xenstore as if sent atomically. This can block. - */ -static int xs_msg_write(struct xsd_sockmsg *xsd_req, - const struct xs_iovec *iovec) -{ - XENSTORE_RING_IDX prod; - const struct xs_iovec *crnt_iovec; - struct xs_iovec hdr_iovec; - unsigned int req_size, req_off; - unsigned int buf_off; - unsigned int this_chunk_len; - int rc; - - req_size = sizeof(*xsd_req) + xsd_req->len; - if (req_size > XENSTORE_RING_SIZE) - return -ENOSPC; - - if (!xs_avail_space_for_write(req_size)) - return -ENOSPC; - - /* We must write requests after reading the consumer index. */ - mb(); - - /* - * We're now guaranteed to be able to send the message - * without overflowing the ring. Do so. - */ - - hdr_iovec.data = xsd_req; - hdr_iovec.len = sizeof(*xsd_req); - - /* The batched iovecs are preceded by a single header. */ - crnt_iovec = &hdr_iovec; - - prod = xsh.buf->req_prod; - req_off = 0; - buf_off = 0; - while (req_off < req_size) { - this_chunk_len = MIN(crnt_iovec->len - buf_off, - XENSTORE_RING_SIZE - MASK_XENSTORE_IDX(prod)); - - memcpy( - (char *) xsh.buf->req + MASK_XENSTORE_IDX(prod), - (char *) crnt_iovec->data + buf_off, - this_chunk_len - ); - - prod += this_chunk_len; - req_off += this_chunk_len; - buf_off += this_chunk_len; - - if (buf_off == crnt_iovec->len) { - buf_off = 0; - if (crnt_iovec == &hdr_iovec) - crnt_iovec = iovec; - else - crnt_iovec++; - } - } - - uk_pr_debug("Complete main loop of %s.\n", __func__); - UK_ASSERT(buf_off == 0); - UK_ASSERT(req_off == req_size); - UK_ASSERT(prod <= xsh.buf->req_cons + XENSTORE_RING_SIZE); - - /* Remote must see entire message before updating indexes */ - wmb(); - - xsh.buf->req_prod += req_size; - - /* Send evtchn to notify remote */ - rc = notify_remote_via_evtchn(xsh.evtchn); - UK_ASSERT(rc == 0); - - return 0; -} - -int xs_msg_reply(enum xsd_sockmsg_type msg_type, xenbus_transaction_t xbt, - const struct xs_iovec *req_iovecs, int req_iovecs_num, - struct xs_iovec *rep_iovec) -{ - struct xs_request *xs_req; - int err; - - if (req_iovecs == NULL) - return -EINVAL; - - xs_req = xs_request_get(); - xs_req->hdr.type = msg_type; - /* req_id was set on pool init */ - xs_req->hdr.tx_id = xbt; - xs_req->hdr.len = 0; - for (int i = 0; i < req_iovecs_num; i++) - xs_req->hdr.len += req_iovecs[i].len; - - xs_req->payload_iovecs = req_iovecs; - xs_req->reply.recvd = 0; - - /* enqueue the request */ - xs_request_enqueue(xs_req); - /* wake xenstore thread to send it */ - uk_waitq_wake_up(&xsh.waitq); - - /* wait reply */ - uk_waitq_wait_event(&xs_req->waitq, - xs_req->reply.recvd != 0); - - err = -xs_req->reply.errornum; - if (err == 0) { - if (rep_iovec) - *rep_iovec = xs_req->reply.iovec; - else - free(xs_req->reply.iovec.data); - } - - xs_request_put(xs_req); - - return err; -} - -void xs_send(void) -{ - struct xs_request *xs_req; - int err; - - xs_req = xs_request_peek(); - while (xs_req != NULL) { - err = xs_msg_write(&xs_req->hdr, xs_req->payload_iovecs); - if (err) { - if (err != -ENOSPC) - uk_pr_warn("Error sending message err=%d\n", - err); - break; - } - - /* remove it from queue */ - xs_request_dequeue(); - - xs_req = xs_request_peek(); - } -} - -/* - * Converts a Xenstore reply error to a positive error number. - * Returns 0 if the reply is successful. - */ -static int reply_to_errno(const char *reply) -{ - int err = 0; - - for (int i = 0; i < (int) ARRAY_SIZE(xsd_errors); i++) { - if (!strcmp(reply, xsd_errors[i].errstring)) { - err = xsd_errors[i].errnum; - goto out; - } - } - - uk_pr_warn("Unknown Xenstore error: %s\n", reply); - err = EINVAL; - -out: - return err; -} - -/* Process an incoming xs reply */ -static void process_reply(struct xsd_sockmsg *hdr, char *payload) -{ - struct xs_request *xs_req; - - if (!uk_test_bit(hdr->req_id, xs_req_pool.entries_bm)) { - uk_pr_warn("Invalid reply id=%d\n", hdr->req_id); - free(payload); - return; - } - - xs_req = &xs_req_pool.entries[hdr->req_id]; - - if (hdr->type == XS_ERROR) { - xs_req->reply.errornum = reply_to_errno(payload); - free(payload); - - } else if (hdr->type != xs_req->hdr.type) { - uk_pr_warn("Mismatching message type: %d\n", hdr->type); - free(payload); - return; - - } else { - /* set reply */ - xs_req->reply.iovec.data = payload; - xs_req->reply.iovec.len = hdr->len; - xs_req->reply.errornum = 0; - } - - xs_req->reply.recvd = 1; - - /* notify waiting requester */ - uk_waitq_wake_up(&xs_req->waitq); -} - -/* Process an incoming xs watch event */ -static void process_watch_event(char *watch_msg) -{ - struct xs_watch *watch; - char *path, *token; - - path = watch_msg; - token = watch_msg + strlen(path) + 1; - - watch = xs_watch_find(path, token); - free(watch_msg); - - if (watch) - xenbus_watch_notify_event(&watch->base); - else - uk_pr_err("Invalid watch event."); -} - -static void memcpy_from_ring(const char *ring, char *dest, int off, int len) -{ - int c1, c2; - - c1 = MIN(len, XENSTORE_RING_SIZE - off); - c2 = len - c1; - - memcpy(dest, ring + off, c1); - if (c2) - memcpy(dest + c1, ring, c2); -} - -static void xs_msg_read(struct xsd_sockmsg *hdr) -{ - XENSTORE_RING_IDX cons; - char *payload; - - payload = malloc(hdr->len + 1); - if (payload == NULL) { - uk_pr_warn("No memory available for saving Xenstore message!\n"); - return; - } - - cons = xsh.buf->rsp_cons; - - /* copy payload */ - memcpy_from_ring( - xsh.buf->rsp, - payload, - MASK_XENSTORE_IDX(cons + sizeof(*hdr)), - hdr->len - ); - payload[hdr->len] = '\0'; - - /* Remote must not see available space until we've copied the reply */ - mb(); - xsh.buf->rsp_cons += sizeof(*hdr) + hdr->len; - - if (xsh.buf->rsp_prod - cons >= XENSTORE_RING_SIZE) - notify_remote_via_evtchn(xsh.evtchn); - - if (hdr->type == XS_WATCH_EVENT) - process_watch_event(payload); - else - process_reply(hdr, payload); -} - -static void xs_recv(void) -{ - struct xsd_sockmsg msg; - - while (1) { - uk_pr_debug("Rsp_cons %d, rsp_prod %d.\n", - xsh.buf->rsp_cons, xsh.buf->rsp_prod); - - if (!xs_avail_space_for_read(sizeof(msg))) - break; - - /* Make sure data is read after reading the indexes */ - rmb(); - - /* copy the message header */ - memcpy_from_ring( - xsh.buf->rsp, - (char *) &msg, - MASK_XENSTORE_IDX(xsh.buf->rsp_cons), - sizeof(msg) - ); - - uk_pr_debug("Msg len %lu, %u avail, id %u.\n", - msg.len + sizeof(msg), - xsh.buf->rsp_prod - xsh.buf->rsp_cons, - msg.req_id); - - if (!xs_avail_space_for_read(sizeof(msg) + msg.len)) - break; - - /* Make sure data is read after reading the indexes */ - rmb(); - - uk_pr_debug("Message is good.\n"); - xs_msg_read(&msg); - } -} - -static __noreturn void xs_thread_func(void *ign __unused) -{ - for (;;) { - uk_waitq_wait_event(&xsh.waitq, xs_avail_work()); - - if (xs_avail_to_write()) - xs_send(); - - if (xs_avail_to_read()) - xs_recv(); - } -} - -static void xs_evtchn_handler(evtchn_port_t port, - struct __regs *regs __unused, void *ign __unused) -{ - UK_ASSERT(xsh.evtchn == port); - uk_waitq_wake_up(&xsh.waitq); -} - -int xs_comms_init(void) -{ - struct uk_thread *thread; - evtchn_port_t port; - - xs_request_pool_init(&xs_req_pool); - - uk_waitq_init(&xsh.waitq); - - thread = uk_sched_thread_create(uk_sched_current(), - xs_thread_func, NULL, - "xenstore"); - if (PTRISERR(thread)) - return PTR2ERR(thread); - - xsh.thread = thread; - - xsh.evtchn = HYPERVISOR_start_info->store_evtchn; - xsh.buf = mfn_to_virt(HYPERVISOR_start_info->store_mfn); - - port = bind_evtchn(xsh.evtchn, xs_evtchn_handler, NULL); - UK_ASSERT(port == xsh.evtchn); - unmask_evtchn(xsh.evtchn); - - uk_pr_info("Xenstore connection initialised on port %d, buf %p (mfn %#lx)\n", - port, xsh.buf, HYPERVISOR_start_info->store_mfn); - - return 0; -} - -void xs_comms_fini(void) -{ - mask_evtchn(xsh.evtchn); - unbind_evtchn(xsh.evtchn); - - xsh.buf = NULL; - - /* TODO: self-terminate thread, instead of killing it */ - uk_sched_thread_terminate(xsh.thread); - xsh.thread = NULL; -} diff --git a/plat/xen/xenbus/xs_comms.h b/plat/xen/xenbus/xs_comms.h deleted file mode 100644 index 4ece31e05ef9f65367fc0bee8452be184173aa5e..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/xs_comms.h +++ /dev/null @@ -1,62 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __XS_COMMS_H__ -#define __XS_COMMS_H__ - -#include -#include - -int xs_comms_init(void); -void xs_comms_fini(void); - -struct xs_iovec { - void *data; - unsigned int len; -}; - -/* - * Sends a message to Xenstore and blocks waiting for a reply. - * The reply is malloc'ed and should be freed by the caller. - * - * @param msg_type Xenstore message type - * @param xbt Xenbus transaction id - * @param req_iovecs Array of request strings buffers - * @param req_iovecs_num Request strings buffers number - * @param rep_iovec Incoming reply string buffer (optional) - * @return 0 on success, a negative errno value on error. - */ -int xs_msg_reply(enum xsd_sockmsg_type msg_type, xenbus_transaction_t xbt, - const struct xs_iovec *req_iovecs, int req_iovecs_num, - struct xs_iovec *rep_iovec); - -#endif /* __XS_COMMS_H__ */ diff --git a/plat/xen/xenbus/xs_watch.c b/plat/xen/xenbus/xs_watch.c deleted file mode 100644 index 28ca8db5c3813ae1dbbc0f9522b153eb01e81243..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/xs_watch.c +++ /dev/null @@ -1,119 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* Internal API for Xenstore watches */ - -#include -#include -#include -#include "xs_watch.h" - -/* Watches list */ -static struct xenbus_watch_list xs_watch_list = - UK_TAILQ_HEAD_INITIALIZER(xs_watch_list); - -static int xs_watch_info_equal(const struct xs_watch_info *xswi, - const char *path, const char *token) -{ - return (strcmp(xswi->path, path) == 0 && - strcmp(xswi->token, token) == 0); -} - -struct xs_watch *xs_watch_create(const char *path) -{ - struct xs_watch *xsw; - const int token_size = sizeof(xsw) * 2 + 1; - char *tmpstr; - int stringlen; - - UK_ASSERT(path != NULL); - - stringlen = token_size + strlen(path) + 1; - - xsw = uk_xb_malloc(sizeof(*xsw) + stringlen); - if (!xsw) - return ERR2PTR(-ENOMEM); - - ukarch_spin_init(&xsw->base.lock); - xsw->base.pending_events = 0; - uk_waitq_init(&xsw->base.wq); - - /* set path */ - tmpstr = (char *) (xsw + 1); - strcpy(tmpstr, path); - xsw->xs.path = tmpstr; - - /* set token (watch address as string) */ - tmpstr += strlen(path) + 1; - sprintf(tmpstr, "%lx", (long) xsw); - xsw->xs.token = tmpstr; - - UK_TAILQ_INSERT_HEAD(&xs_watch_list, &xsw->base, watch_list); - - return xsw; -} - -int xs_watch_destroy(struct xs_watch *watch) -{ - struct xenbus_watch *xbw; - struct xs_watch *xsw; - int err = -ENOENT; - - UK_ASSERT(watch != NULL); - - UK_TAILQ_FOREACH(xbw, &xs_watch_list, watch_list) { - xsw = __containerof(xbw, struct xs_watch, base); - - if (xsw == watch) { - UK_TAILQ_REMOVE(&xs_watch_list, xbw, watch_list); - uk_xb_free(xsw); - err = 0; - break; - } - } - - return err; -} - -struct xs_watch *xs_watch_find(const char *path, const char *token) -{ - struct xenbus_watch *xbw; - struct xs_watch *xsw; - - UK_TAILQ_FOREACH(xbw, &xs_watch_list, watch_list) { - xsw = __containerof(xbw, struct xs_watch, base); - - if (xs_watch_info_equal(&xsw->xs, path, token)) - return xsw; - } - - return NULL; -} diff --git a/plat/xen/xenbus/xs_watch.h b/plat/xen/xenbus/xs_watch.h deleted file mode 100644 index 662187b0203e1e600fa88bf30c4260dde9584b32..0000000000000000000000000000000000000000 --- a/plat/xen/xenbus/xs_watch.h +++ /dev/null @@ -1,79 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* - * Authors: Costin Lupu - * - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. - * - * 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. - * 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. - * 3. Neither the name of the copyright holder 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 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - */ -/* Internal API for Xenstore watches */ - -#ifndef __XS_WATCH_H__ -#define __XS_WATCH_H__ - -#include - -/* Xenstore watch info */ -struct xs_watch_info { - /**< Watched Xenstore path */ - char *path; - /**< Watch identification token */ - char *token; -}; - -/* Xenstore watch */ -struct xs_watch { - struct xenbus_watch base; - struct xs_watch_info xs; -}; - -/* - * Create a Xenstore watch associated with a path. - * - * @param path Xenstore path - * @return On success, returns a malloc'd Xenstore watch. On error, returns - * a negative error number which should be checked using PTRISERR. - */ -struct xs_watch *xs_watch_create(const char *path); - -/* - * Destroy a previously created Xenstore watch. - * - * @param watch Xenstore watch - * @return 0 on success, a negative errno value on error. - */ -int xs_watch_destroy(struct xs_watch *watch); - -/* - * Returns the Xenstore watch associated with path and token. - * - * @param path Watched path - * @param token Watch token - * @return On success returns the found watch. On error, returns NULL. - */ -struct xs_watch *xs_watch_find(const char *path, const char *token); - -#endif /* __XS_WATCH_H__ */