diff options
34 files changed, 76 insertions, 6719 deletions
diff --git a/main/grub/0001-util-grub.d-20_linux_xen.in-Add-xen_boot-command-sup.patch b/main/grub/0001-util-grub.d-20_linux_xen.in-Add-xen_boot-command-sup.patch deleted file mode 100644 index 350180b49a..0000000000 --- a/main/grub/0001-util-grub.d-20_linux_xen.in-Add-xen_boot-command-sup.patch +++ /dev/null @@ -1,64 +0,0 @@ -From cb8fc4eee92e19fe2977026ba45bad6ecf68f55f Mon Sep 17 00:00:00 2001 -From: Fu Wei <fu.wei@linaro.org> -Date: Sun, 14 May 2017 15:43:46 +0800 -Subject: [PATCH 1/3] util/grub.d/20_linux_xen.in: Add xen_boot command support - for aarch64 - -This patch adds the support of xen_boot command for aarch64: - xen_hypervisor - xen_module -These two commands are only for aarch64, since it has its own protocol and -commands to boot xen hypervisor and Dom0, but not multiboot. - -For other architectures, they are still using multiboot and module -commands. - -Signed-off-by: Fu Wei <fu.wei@linaro.org> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -(cherry picked from commit d33045ce7ffcb7c1e4a60c14d5ca64b36e3c5abe) ---- - util/grub.d/20_linux_xen.in | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - -diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in -index c48af948d..c002fc9f9 100644 ---- a/util/grub.d/20_linux_xen.in -+++ b/util/grub.d/20_linux_xen.in -@@ -122,16 +122,16 @@ linux_entry () - else - xen_rm_opts="no-real-mode edd=off" - fi -- multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} -+ ${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} - echo '$(echo "$lmessage" | grub_quote)' -- module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} -+ ${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} - EOF - if test -n "${initrd}" ; then - # TRANSLATORS: ramdisk isn't identifier. Should be translated. - message="$(gettext_printf "Loading initial ramdisk ...")" - sed "s/^/$submenu_indentation/" << EOF - echo '$(echo "$message" | grub_quote)' -- module --nounzip ${rel_dirname}/${initrd} -+ ${module_loader} --nounzip ${rel_dirname}/${initrd} - EOF - fi - sed "s/^/$submenu_indentation/" << EOF -@@ -206,6 +206,14 @@ while [ "x${xen_list}" != "x" ] ; do - if [ "x$is_top_level" != xtrue ]; then - echo " submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {" - fi -+ $grub_file --is-arm64-efi $current_xen -+ if [ $? -ne 0 ]; then -+ xen_loader="multiboot" -+ module_loader="module" -+ else -+ xen_loader="xen_hypervisor" -+ module_loader="xen_module" -+ fi - while [ "x$list" != "x" ] ; do - linux=`version_find_latest $list` - gettext_printf "Found linux image: %s\n" "$linux" >&2 --- -2.24.1 - diff --git a/main/grub/0001-xen-Add-some-Xen-headers.patch b/main/grub/0001-xen-Add-some-Xen-headers.patch deleted file mode 100644 index fc3f138537..0000000000 --- a/main/grub/0001-xen-Add-some-Xen-headers.patch +++ /dev/null @@ -1,2322 +0,0 @@ -From d05d23ac337d951d94b94002211b684759619634 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:29 +0100 -Subject: [PATCH 01/20] xen: Add some Xen headers - -In order to support grub2 in Xen PVH environment some additional Xen -headers are needed as grub2 will be started in PVH mode requiring to -use several HVM hypercalls and structures. - -Add the needed headers from Xen 4.10 being the first Xen version with -full (not only experimental) PVH guest support. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 9118effd1b1fb67d82168b37cf6dd1142feced3b) ---- - include/xen/hvm/hvm_op.h | 296 ++++++++++++++++ - include/xen/hvm/params.h | 284 +++++++++++++++ - include/xen/hvm/start_info.h | 98 ++++++ - include/xen/memory.h | 665 +++++++++++++++++++++++++++++++++++ - include/xen/physdev.h | 387 ++++++++++++++++++++ - include/xen/trace.h | 339 ++++++++++++++++++ - include/xen/xen.h | 104 ++++-- - 7 files changed, 2142 insertions(+), 31 deletions(-) - create mode 100644 include/xen/hvm/hvm_op.h - create mode 100644 include/xen/hvm/params.h - create mode 100644 include/xen/hvm/start_info.h - create mode 100644 include/xen/memory.h - create mode 100644 include/xen/physdev.h - create mode 100644 include/xen/trace.h - -diff --git a/include/xen/hvm/hvm_op.h b/include/xen/hvm/hvm_op.h -new file mode 100644 -index 000000000..0bdafdf59 ---- /dev/null -+++ b/include/xen/hvm/hvm_op.h -@@ -0,0 +1,296 @@ -+/* -+ * 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 <vector> that should be used for event -+ * channel upcalls on the specified <vcpu>. 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/include/xen/hvm/params.h b/include/xen/hvm/params.h -new file mode 100644 -index 000000000..2ec2e7c80 ---- /dev/null -+++ b/include/xen/hvm/params.h -@@ -0,0 +1,284 @@ -+/* -+ * 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 <hvm/ioreq.h> -+ */ -+#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/include/xen/hvm/start_info.h b/include/xen/hvm/start_info.h -new file mode 100644 -index 000000000..648415976 ---- /dev/null -+++ b/include/xen/hvm/start_info.h -@@ -0,0 +1,98 @@ -+/* -+ * 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/include/xen/memory.h b/include/xen/memory.h -new file mode 100644 -index 000000000..20deef5cb ---- /dev/null -+++ b/include/xen/memory.h -@@ -0,0 +1,665 @@ -+/****************************************************************************** -+ * 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 <keir@xensource.com> -+ */ -+ -+#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/include/xen/physdev.h b/include/xen/physdev.h -new file mode 100644 -index 000000000..b6faf8350 ---- /dev/null -+++ b/include/xen/physdev.h -@@ -0,0 +1,387 @@ -+/* -+ * 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/include/xen/trace.h b/include/xen/trace.h -new file mode 100644 -index 000000000..a00c01733 ---- /dev/null -+++ b/include/xen/trace.h -@@ -0,0 +1,339 @@ -+/****************************************************************************** -+ * 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<<TRC_SCHED_ID_BITS) - 1) << TRC_SCHED_ID_SHIFT) -+#define TRC_SCHED_EVT_MASK (~(TRC_SCHED_ID_MASK)) -+ -+/* Per-scheduler IDs, to identify scheduler specific events */ -+#define TRC_SCHED_CSCHED 0 -+#define TRC_SCHED_CSCHED2 1 -+/* #define XEN_SCHEDULER_SEDF 2 (Removed) */ -+#define TRC_SCHED_ARINC653 3 -+#define TRC_SCHED_RTDS 4 -+#define TRC_SCHED_SNULL 5 -+ -+/* Per-scheduler tracing */ -+#define TRC_SCHED_CLASS_EVT(_c, _e) \ -+ ( ( TRC_SCHED_CLASS | \ -+ ((TRC_SCHED_##_c << TRC_SCHED_ID_SHIFT) & TRC_SCHED_ID_MASK) ) + \ -+ (_e & TRC_SCHED_EVT_MASK) ) -+ -+/* Trace classes for DOM0 operations */ -+#define TRC_DOM0_DOMOPS 0x00041000 /* Domains manipulations */ -+ -+/* Trace classes for Hardware */ -+#define TRC_HW_PM 0x00801000 /* Power management traces */ -+#define TRC_HW_IRQ 0x00802000 /* Traces relating to the handling of IRQs */ -+ -+/* Trace events per class */ -+#define TRC_LOST_RECORDS (TRC_GEN + 1) -+#define TRC_TRACE_WRAP_BUFFER (TRC_GEN + 2) -+#define TRC_TRACE_CPU_CHANGE (TRC_GEN + 3) -+ -+#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1) -+#define TRC_SCHED_CONTINUE_RUNNING (TRC_SCHED_MIN + 2) -+#define TRC_SCHED_DOM_ADD (TRC_SCHED_VERBOSE + 1) -+#define TRC_SCHED_DOM_REM (TRC_SCHED_VERBOSE + 2) -+#define TRC_SCHED_SLEEP (TRC_SCHED_VERBOSE + 3) -+#define TRC_SCHED_WAKE (TRC_SCHED_VERBOSE + 4) -+#define TRC_SCHED_YIELD (TRC_SCHED_VERBOSE + 5) -+#define TRC_SCHED_BLOCK (TRC_SCHED_VERBOSE + 6) -+#define TRC_SCHED_SHUTDOWN (TRC_SCHED_VERBOSE + 7) -+#define TRC_SCHED_CTL (TRC_SCHED_VERBOSE + 8) -+#define TRC_SCHED_ADJDOM (TRC_SCHED_VERBOSE + 9) -+#define TRC_SCHED_SWITCH (TRC_SCHED_VERBOSE + 10) -+#define TRC_SCHED_S_TIMER_FN (TRC_SCHED_VERBOSE + 11) -+#define TRC_SCHED_T_TIMER_FN (TRC_SCHED_VERBOSE + 12) -+#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED_VERBOSE + 13) -+#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14) -+#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15) -+#define TRC_SCHED_SHUTDOWN_CODE (TRC_SCHED_VERBOSE + 16) -+#define TRC_SCHED_SWITCH_INFCONT (TRC_SCHED_VERBOSE + 17) -+ -+#define TRC_DOM0_DOM_ADD (TRC_DOM0_DOMOPS + 1) -+#define TRC_DOM0_DOM_REM (TRC_DOM0_DOMOPS + 2) -+ -+#define TRC_MEM_PAGE_GRANT_MAP (TRC_MEM + 1) -+#define TRC_MEM_PAGE_GRANT_UNMAP (TRC_MEM + 2) -+#define TRC_MEM_PAGE_GRANT_TRANSFER (TRC_MEM + 3) -+#define TRC_MEM_SET_P2M_ENTRY (TRC_MEM + 4) -+#define TRC_MEM_DECREASE_RESERVATION (TRC_MEM + 5) -+#define TRC_MEM_POD_POPULATE (TRC_MEM + 16) -+#define TRC_MEM_POD_ZERO_RECLAIM (TRC_MEM + 17) -+#define TRC_MEM_POD_SUPERPAGE_SPLINTER (TRC_MEM + 18) -+ -+#define TRC_PV_ENTRY 0x00201000 /* Hypervisor entry points for PV guests. */ -+#define TRC_PV_SUBCALL 0x00202000 /* Sub-call in a multicall hypercall */ -+ -+#define TRC_PV_HYPERCALL (TRC_PV_ENTRY + 1) -+#define TRC_PV_TRAP (TRC_PV_ENTRY + 3) -+#define TRC_PV_PAGE_FAULT (TRC_PV_ENTRY + 4) -+#define TRC_PV_FORCED_INVALID_OP (TRC_PV_ENTRY + 5) -+#define TRC_PV_EMULATE_PRIVOP (TRC_PV_ENTRY + 6) -+#define TRC_PV_EMULATE_4GB (TRC_PV_ENTRY + 7) -+#define TRC_PV_MATH_STATE_RESTORE (TRC_PV_ENTRY + 8) -+#define TRC_PV_PAGING_FIXUP (TRC_PV_ENTRY + 9) -+#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV_ENTRY + 10) -+#define TRC_PV_PTWR_EMULATION (TRC_PV_ENTRY + 11) -+#define TRC_PV_PTWR_EMULATION_PAE (TRC_PV_ENTRY + 12) -+#define TRC_PV_HYPERCALL_V2 (TRC_PV_ENTRY + 13) -+#define TRC_PV_HYPERCALL_SUBCALL (TRC_PV_SUBCALL + 14) -+ -+/* -+ * TRC_PV_HYPERCALL_V2 format -+ * -+ * Only some of the hypercall argument are recorded. Bit fields A0 to -+ * A5 in the first extra word are set if the argument is present and -+ * the arguments themselves are packed sequentially in the following -+ * words. -+ * -+ * The TRC_64_FLAG bit is not set for these events (even if there are -+ * 64-bit arguments in the record). -+ * -+ * Word -+ * 0 bit 31 30|29 28|27 26|25 24|23 22|21 20|19 ... 0 -+ * A5 |A4 |A3 |A2 |A1 |A0 |Hypercall op -+ * 1 First 32 bit (or low word of first 64 bit) arg in record -+ * 2 Second 32 bit (or high word of first 64 bit) arg in record -+ * ... -+ * -+ * A0-A5 bitfield values: -+ * -+ * 00b Argument not present -+ * 01b 32-bit argument present -+ * 10b 64-bit argument present -+ * 11b Reserved -+ */ -+#define TRC_PV_HYPERCALL_V2_ARG_32(i) (0x1 << (20 + 2*(i))) -+#define TRC_PV_HYPERCALL_V2_ARG_64(i) (0x2 << (20 + 2*(i))) -+#define TRC_PV_HYPERCALL_V2_ARG_MASK (0xfff00000) -+ -+#define TRC_SHADOW_NOT_SHADOW (TRC_SHADOW + 1) -+#define TRC_SHADOW_FAST_PROPAGATE (TRC_SHADOW + 2) -+#define TRC_SHADOW_FAST_MMIO (TRC_SHADOW + 3) -+#define TRC_SHADOW_FALSE_FAST_PATH (TRC_SHADOW + 4) -+#define TRC_SHADOW_MMIO (TRC_SHADOW + 5) -+#define TRC_SHADOW_FIXUP (TRC_SHADOW + 6) -+#define TRC_SHADOW_DOMF_DYING (TRC_SHADOW + 7) -+#define TRC_SHADOW_EMULATE (TRC_SHADOW + 8) -+#define TRC_SHADOW_EMULATE_UNSHADOW_USER (TRC_SHADOW + 9) -+#define TRC_SHADOW_EMULATE_UNSHADOW_EVTINJ (TRC_SHADOW + 10) -+#define TRC_SHADOW_EMULATE_UNSHADOW_UNHANDLED (TRC_SHADOW + 11) -+#define TRC_SHADOW_WRMAP_BF (TRC_SHADOW + 12) -+#define TRC_SHADOW_PREALLOC_UNPIN (TRC_SHADOW + 13) -+#define TRC_SHADOW_RESYNC_FULL (TRC_SHADOW + 14) -+#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 15) -+ -+/* trace events per subclass */ -+#define TRC_HVM_NESTEDFLAG (0x400) -+#define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01) -+#define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02) -+#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02) -+#define TRC_HVM_PF_XEN (TRC_HVM_HANDLER + 0x01) -+#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01) -+#define TRC_HVM_PF_INJECT (TRC_HVM_HANDLER + 0x02) -+#define TRC_HVM_PF_INJECT64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x02) -+#define TRC_HVM_INJ_EXC (TRC_HVM_HANDLER + 0x03) -+#define TRC_HVM_INJ_VIRQ (TRC_HVM_HANDLER + 0x04) -+#define TRC_HVM_REINJ_VIRQ (TRC_HVM_HANDLER + 0x05) -+#define TRC_HVM_IO_READ (TRC_HVM_HANDLER + 0x06) -+#define TRC_HVM_IO_WRITE (TRC_HVM_HANDLER + 0x07) -+#define TRC_HVM_CR_READ (TRC_HVM_HANDLER + 0x08) -+#define TRC_HVM_CR_READ64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x08) -+#define TRC_HVM_CR_WRITE (TRC_HVM_HANDLER + 0x09) -+#define TRC_HVM_CR_WRITE64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x09) -+#define TRC_HVM_DR_READ (TRC_HVM_HANDLER + 0x0A) -+#define TRC_HVM_DR_WRITE (TRC_HVM_HANDLER + 0x0B) -+#define TRC_HVM_MSR_READ (TRC_HVM_HANDLER + 0x0C) -+#define TRC_HVM_MSR_WRITE (TRC_HVM_HANDLER + 0x0D) -+#define TRC_HVM_CPUID (TRC_HVM_HANDLER + 0x0E) -+#define TRC_HVM_INTR (TRC_HVM_HANDLER + 0x0F) -+#define TRC_HVM_NMI (TRC_HVM_HANDLER + 0x10) -+#define TRC_HVM_SMI (TRC_HVM_HANDLER + 0x11) -+#define TRC_HVM_VMMCALL (TRC_HVM_HANDLER + 0x12) -+#define TRC_HVM_HLT (TRC_HVM_HANDLER + 0x13) -+#define TRC_HVM_INVLPG (TRC_HVM_HANDLER + 0x14) -+#define TRC_HVM_INVLPG64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x14) -+#define TRC_HVM_MCE (TRC_HVM_HANDLER + 0x15) -+#define TRC_HVM_IOPORT_READ (TRC_HVM_HANDLER + 0x16) -+#define TRC_HVM_IOMEM_READ (TRC_HVM_HANDLER + 0x17) -+#define TRC_HVM_CLTS (TRC_HVM_HANDLER + 0x18) -+#define TRC_HVM_LMSW (TRC_HVM_HANDLER + 0x19) -+#define TRC_HVM_LMSW64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19) -+#define TRC_HVM_RDTSC (TRC_HVM_HANDLER + 0x1a) -+#define TRC_HVM_INTR_WINDOW (TRC_HVM_HANDLER + 0x20) -+#define TRC_HVM_NPF (TRC_HVM_HANDLER + 0x21) -+#define TRC_HVM_REALMODE_EMULATE (TRC_HVM_HANDLER + 0x22) -+#define TRC_HVM_TRAP (TRC_HVM_HANDLER + 0x23) -+#define TRC_HVM_TRAP_DEBUG (TRC_HVM_HANDLER + 0x24) -+#define TRC_HVM_VLAPIC (TRC_HVM_HANDLER + 0x25) -+ -+#define TRC_HVM_IOPORT_WRITE (TRC_HVM_HANDLER + 0x216) -+#define TRC_HVM_IOMEM_WRITE (TRC_HVM_HANDLER + 0x217) -+ -+/* Trace events for emulated devices */ -+#define TRC_HVM_EMUL_HPET_START_TIMER (TRC_HVM_EMUL + 0x1) -+#define TRC_HVM_EMUL_PIT_START_TIMER (TRC_HVM_EMUL + 0x2) -+#define TRC_HVM_EMUL_RTC_START_TIMER (TRC_HVM_EMUL + 0x3) -+#define TRC_HVM_EMUL_LAPIC_START_TIMER (TRC_HVM_EMUL + 0x4) -+#define TRC_HVM_EMUL_HPET_STOP_TIMER (TRC_HVM_EMUL + 0x5) -+#define TRC_HVM_EMUL_PIT_STOP_TIMER (TRC_HVM_EMUL + 0x6) -+#define TRC_HVM_EMUL_RTC_STOP_TIMER (TRC_HVM_EMUL + 0x7) -+#define TRC_HVM_EMUL_LAPIC_STOP_TIMER (TRC_HVM_EMUL + 0x8) -+#define TRC_HVM_EMUL_PIT_TIMER_CB (TRC_HVM_EMUL + 0x9) -+#define TRC_HVM_EMUL_LAPIC_TIMER_CB (TRC_HVM_EMUL + 0xA) -+#define TRC_HVM_EMUL_PIC_INT_OUTPUT (TRC_HVM_EMUL + 0xB) -+#define TRC_HVM_EMUL_PIC_KICK (TRC_HVM_EMUL + 0xC) -+#define TRC_HVM_EMUL_PIC_INTACK (TRC_HVM_EMUL + 0xD) -+#define TRC_HVM_EMUL_PIC_POSEDGE (TRC_HVM_EMUL + 0xE) -+#define TRC_HVM_EMUL_PIC_NEGEDGE (TRC_HVM_EMUL + 0xF) -+#define TRC_HVM_EMUL_PIC_PEND_IRQ_CALL (TRC_HVM_EMUL + 0x10) -+#define TRC_HVM_EMUL_LAPIC_PIC_INTR (TRC_HVM_EMUL + 0x11) -+ -+/* trace events for per class */ -+#define TRC_PM_FREQ_CHANGE (TRC_HW_PM + 0x01) -+#define TRC_PM_IDLE_ENTRY (TRC_HW_PM + 0x02) -+#define TRC_PM_IDLE_EXIT (TRC_HW_PM + 0x03) -+ -+/* Trace events for IRQs */ -+#define TRC_HW_IRQ_MOVE_CLEANUP_DELAY (TRC_HW_IRQ + 0x1) -+#define TRC_HW_IRQ_MOVE_CLEANUP (TRC_HW_IRQ + 0x2) -+#define TRC_HW_IRQ_BIND_VECTOR (TRC_HW_IRQ + 0x3) -+#define TRC_HW_IRQ_CLEAR_VECTOR (TRC_HW_IRQ + 0x4) -+#define TRC_HW_IRQ_MOVE_FINISH (TRC_HW_IRQ + 0x5) -+#define TRC_HW_IRQ_ASSIGN_VECTOR (TRC_HW_IRQ + 0x6) -+#define TRC_HW_IRQ_UNMAPPED_VECTOR (TRC_HW_IRQ + 0x7) -+#define TRC_HW_IRQ_HANDLED (TRC_HW_IRQ + 0x8) -+ -+/* -+ * Event Flags -+ * -+ * Some events (e.g, TRC_PV_TRAP and TRC_HVM_IOMEM_READ) have multiple -+ * record formats. These event flags distinguish between the -+ * different formats. -+ */ -+#define TRC_64_FLAG 0x100 /* Addresses are 64 bits (instead of 32 bits) */ -+ -+/* This structure represents a single trace buffer record. */ -+struct t_rec { -+ uint32_t event:28; -+ uint32_t extra_u32:3; /* # entries in trailing extra_u32[] array */ -+ uint32_t cycles_included:1; /* u.cycles or u.no_cycles? */ -+ union { -+ struct { -+ uint32_t cycles_lo, cycles_hi; /* cycle counter timestamp */ -+ uint32_t extra_u32[7]; /* event data items */ -+ } cycles; -+ struct { -+ uint32_t extra_u32[7]; /* event data items */ -+ } nocycles; -+ } u; -+}; -+ -+/* -+ * This structure contains the metadata for a single trace buffer. The head -+ * field, indexes into an array of struct t_rec's. -+ */ -+struct t_buf { -+ /* Assume the data buffer size is X. X is generally not a power of 2. -+ * CONS and PROD are incremented modulo (2*X): -+ * 0 <= cons < 2*X -+ * 0 <= prod < 2*X -+ * This is done because addition modulo X breaks at 2^32 when X is not a -+ * power of 2: -+ * (((2^32 - 1) % X) + 1) % X != (2^32) % X -+ */ -+ uint32_t cons; /* Offset of next item to be consumed by control tools. */ -+ uint32_t prod; /* Offset of next item to be produced by Xen. */ -+ /* Records follow immediately after the meta-data header. */ -+}; -+ -+/* Structure used to pass MFNs to the trace buffers back to trace consumers. -+ * Offset is an offset into the mapped structure where the mfn list will be held. -+ * MFNs will be at ((unsigned long *)(t_info))+(t_info->cpu_offset[cpu]). -+ */ -+struct t_info { -+ uint16_t tbuf_size; /* Size in pages of each trace buffer */ -+ uint16_t mfn_offset[]; /* Offset within t_info structure of the page list per cpu */ -+ /* 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/include/xen/xen.h b/include/xen/xen.h -index 6c9e42b2b..308109f17 100644 ---- a/include/xen/xen.h -+++ b/include/xen/xen.h -@@ -53,17 +53,22 @@ 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) constant. */ -+/* 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_uint(x) x -+#define xen_mk_ulong(x) x -+#define xen_mk_ullong(x) x - - #endif - -@@ -115,6 +120,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); - #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 -@@ -501,6 +507,21 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); - /* 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: -@@ -529,16 +550,21 @@ DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); - * 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 in MMUEXT_SET_FOREIGNDOM, but in that context can -- * be specified by any calling domain. -+ * 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 in MMUEXT_SET_FOREIGNDOM, and is only permitted if -- * the caller is privileged. -+ * 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) - -@@ -614,10 +640,18 @@ struct vcpu_time_info { - */ - 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 -@@ -736,7 +770,7 @@ typedef struct shared_info shared_info_t; - * (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 ESI (x86)] -+ * 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 -@@ -797,29 +831,6 @@ struct start_info { - }; - typedef struct start_info start_info_t; - --/* -- * Start of day structure passed to PVH 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. -- */ --struct hvm_start_info { --#define HVM_START_MAGIC_VALUE 0x336ec578 -- uint32_t magic; /* Contains the magic value 0x336ec578 */ -- /* ("xEn3" with the 0x80 bit of the "E" set).*/ -- uint32_t flags; /* SIF_xxx flags. */ -- uint32_t cmdline_paddr; /* Physical address of the command line. */ -- uint32_t nr_modules; /* Number of modules passed to the kernel. */ -- uint32_t modlist_paddr; /* Physical address of an array of */ -- /* hvm_modlist_entry. */ --}; -- --struct hvm_modlist_entry { -- uint32_t paddr; /* Physical address of the module. */ -- uint32_t size; /* Size of the module in bytes. */ --}; -- - /* New console union for dom0 introduced in 0x00030203. */ - #if __XEN_INTERFACE_VERSION__ < 0x00030203 - #define console_mfn console.domU.mfn -@@ -919,6 +930,37 @@ __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. */ --- -2.21.0 - diff --git a/main/grub/0002-Fix-util-grub.d-20_linux_xen.in-Add-xen_boot-command.patch b/main/grub/0002-Fix-util-grub.d-20_linux_xen.in-Add-xen_boot-command.patch deleted file mode 100644 index 5b2b8b1a65..0000000000 --- a/main/grub/0002-Fix-util-grub.d-20_linux_xen.in-Add-xen_boot-command.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 0edfe09c35ed63630e2ccba60b9965e3d7f7f518 Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> -Date: Tue, 29 Aug 2017 16:40:52 -0400 -Subject: [PATCH 2/3] Fix util/grub.d/20_linux_xen.in: Add xen_boot command - support for aarch64 - -Commit d33045ce7ffcb7c1e4a60c14d5ca64b36e3c5abe introduced -the support for this, but it does not work under x86 (as it stops -20_linux_xen from running). - -The 20_linux_xen is run under a shell and any exits from within it: - -(For example on x86): -+ /usr/bin/grub2-file --is-arm64-efi /boot/xen-4.9.0.gz -[root@tst063 grub]# echo $? -1 - -will result in 20_linux_xen exiting without continuing -and also causing grub2-mkconfig to stop processing. - -As in: - - [root@tst063 grub]# ./grub-mkconfig | tail - Generating grub configuration file ... - Found linux image: /boot/vmlinuz-4.13.0-0.rc5.git1.1.fc27.x86_64 - Found initrd image: /boot/initramfs-4.13.0-0.rc5.git1.1.fc27.x86_64.img - Found linux image: /boot/vmlinuz-0-rescue-ec082ee24aea41b9b16aca52a6d10cc2 - Found initrd image: /boot/initramfs-0-rescue-ec082ee24aea41b9b16aca52a6d10cc2.img - echo 'Loading Linux 0-rescue-ec082ee24aea41b9b16aca52a6d10cc2 ...' - linux /vmlinuz-0-rescue-ec082ee24aea41b9b16aca52a6d10cc2 root=/dev/mapper/fedora_tst063-root ro single - echo 'Loading initial ramdisk ...' - initrd /initramfs-0-rescue-ec082ee24aea41b9b16aca52a6d10cc2.img - } - } - - ### END /usr/local/etc/grub.d/10_linux ### - - ### BEGIN /usr/local/etc/grub.d/20_linux_xen ### - - root@tst063 grub]# - -And no more. - -This patch wraps the invocation of grub-file to be a in subshell -and to process the return value in a conditional. That fixes -the issue. - -RH-BZ 1486002: grub2-mkconfig does not work if xen.gz is installed. - -CC: Fu Wei <fu.wei@linaro.org> -Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -(cherry picked from commit a8e0f1adf7019238fff263111794c86f4eea79ac) ---- - util/grub.d/20_linux_xen.in | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in -index c002fc9f9..083bcef5d 100644 ---- a/util/grub.d/20_linux_xen.in -+++ b/util/grub.d/20_linux_xen.in -@@ -206,13 +206,12 @@ while [ "x${xen_list}" != "x" ] ; do - if [ "x$is_top_level" != xtrue ]; then - echo " submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {" - fi -- $grub_file --is-arm64-efi $current_xen -- if [ $? -ne 0 ]; then -- xen_loader="multiboot" -- module_loader="module" -- else -+ if ($grub_file --is-arm64-efi $current_xen); then - xen_loader="xen_hypervisor" - module_loader="xen_module" -+ else -+ xen_loader="multiboot" -+ module_loader="module" - fi - while [ "x$list" != "x" ] ; do - linux=`version_find_latest $list` --- -2.24.1 - diff --git a/main/grub/0002-loader-linux-Support-passing-RSDP-address-via-boot-p.patch b/main/grub/0002-loader-linux-Support-passing-RSDP-address-via-boot-p.patch deleted file mode 100644 index 83f55c2681..0000000000 --- a/main/grub/0002-loader-linux-Support-passing-RSDP-address-via-boot-p.patch +++ /dev/null @@ -1,51 +0,0 @@ -From b800b2b23ac56a5d0fb39b1acfcd9e3d4e0a93c0 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:30 +0100 -Subject: [PATCH 02/20] loader/linux: Support passing RSDP address via boot - params - -Xen PVH guests will have the RSDP at an arbitrary address. Support that -by passing the RSDP address via the boot parameters to Linux. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit d170be42f12b0b2ab91d8d943d7b0bf563c906dd) ---- - grub-core/loader/i386/linux.c | 4 ++++ - include/grub/i386/linux.h | 3 ++- - 2 files changed, 6 insertions(+), 1 deletion(-) - -diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c -index 083f9417c..7d6d5d499 100644 ---- a/grub-core/loader/i386/linux.c -+++ b/grub-core/loader/i386/linux.c -@@ -551,6 +551,10 @@ grub_linux_boot (void) - } - } - -+#ifdef GRUB_KERNEL_USE_RSDP_ADDR -+ linux_params.acpi_rsdp_addr = grub_le_to_cpu64 (grub_rsdp_addr); -+#endif -+ - mmap_size = find_mmap_size (); - /* Make sure that each size is aligned to a page boundary. */ - cl_offset = ALIGN_UP (mmap_size + sizeof (linux_params), 4096); -diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h -index da0ca3b83..ada068fa5 100644 ---- a/include/grub/i386/linux.h -+++ b/include/grub/i386/linux.h -@@ -206,8 +206,9 @@ struct linux_kernel_params - grub_uint32_t ist_command; /* 64 */ - grub_uint32_t ist_event; /* 68 */ - grub_uint32_t ist_perf_level; /* 6c */ -+ grub_uint64_t acpi_rsdp_addr; /* 70 */ - -- grub_uint8_t padding5[0x80 - 0x70]; -+ grub_uint8_t padding5[0x80 - 0x78]; - - grub_uint8_t hd0_drive_info[0x10]; /* 80 */ - grub_uint8_t hd1_drive_info[0x10]; /* 90 */ --- -2.21.0 - diff --git a/main/grub/0003-Use-grub-file-to-figure-out-whether-multiboot2-shoul.patch b/main/grub/0003-Use-grub-file-to-figure-out-whether-multiboot2-shoul.patch deleted file mode 100644 index 63ade92a27..0000000000 --- a/main/grub/0003-Use-grub-file-to-figure-out-whether-multiboot2-shoul.patch +++ /dev/null @@ -1,40 +0,0 @@ -From b4148dbeceee4a2fe4e99acdeeb86edc5e4eed01 Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> -Date: Tue, 29 Aug 2017 16:40:53 -0400 -Subject: [PATCH 3/3] Use grub-file to figure out whether multiboot2 should be - used for Xen.gz - -The multiboot2 is much more preferable than multiboot. Especiall -if booting under EFI where multiboot does not have the functionality -to pass ImageHandler. - -Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -(cherry picked from commit b4d709b6ee789cdaf3fa7a80fd90c721a16f48c2) ---- - util/grub.d/20_linux_xen.in | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in -index 083bcef5d..0cb0f4e49 100644 ---- a/util/grub.d/20_linux_xen.in -+++ b/util/grub.d/20_linux_xen.in -@@ -210,8 +210,13 @@ while [ "x${xen_list}" != "x" ] ; do - xen_loader="xen_hypervisor" - module_loader="xen_module" - else -- xen_loader="multiboot" -- module_loader="module" -+ if ($grub_file --is-x86-multiboot2 $current_xen); then -+ xen_loader="multiboot2" -+ module_loader="module2" -+ else -+ xen_loader="multiboot" -+ module_loader="module" -+ fi - fi - while [ "x$list" != "x" ] ; do - linux=`version_find_latest $list` --- -2.24.1 - diff --git a/main/grub/0003-xen-Carve-out-grant-tab-initialization-into-dedicate.patch b/main/grub/0003-xen-Carve-out-grant-tab-initialization-into-dedicate.patch deleted file mode 100644 index daaae83c8a..0000000000 --- a/main/grub/0003-xen-Carve-out-grant-tab-initialization-into-dedicate.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 7c45df9ded4ca3201cf468de899bad28e4ac8c55 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:31 +0100 -Subject: [PATCH 03/20] xen: Carve out grant tab initialization into dedicated - function - -Initialize the grant tab in a dedicated function. This will enable -using it for PVH guests, too. - -Call the new function from grub_machine_init() as this will later -be common between Xen PV and Xen PVH mode. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit c84927272cea59084ad5b0705c55547e8c85b28d) ---- - grub-core/kern/xen/init.c | 35 +++++++++++++++++++++-------------- - 1 file changed, 21 insertions(+), 14 deletions(-) - -diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c -index 0559c033c..29f5bc23d 100644 ---- a/grub-core/kern/xen/init.c -+++ b/grub-core/kern/xen/init.c -@@ -318,6 +318,25 @@ grub_xenstore_dir (const char *dir, - - unsigned long gntframe = 0; - -+static void -+grub_xen_setup_gnttab (void) -+{ -+ struct gnttab_set_version gnttab_setver; -+ struct gnttab_setup_table gnttab_setup; -+ -+ grub_memset (&gnttab_setver, 0, sizeof (gnttab_setver)); -+ -+ gnttab_setver.version = 1; -+ grub_xen_grant_table_op (GNTTABOP_set_version, &gnttab_setver, 1); -+ -+ grub_memset (&gnttab_setup, 0, sizeof (gnttab_setup)); -+ gnttab_setup.dom = DOMID_SELF; -+ gnttab_setup.nr_frames = 1; -+ gnttab_setup.frame_list.p = &gntframe; -+ -+ grub_xen_grant_table_op (GNTTABOP_setup_table, &gnttab_setup, 1); -+} -+ - #define MAX_N_UNUSABLE_PAGES 4 - - static int -@@ -357,26 +376,12 @@ map_all_pages (void) - (grub_xen_mfn_t *) grub_xen_start_page_addr->mfn_list; - grub_uint64_t *pg = (grub_uint64_t *) window; - grub_uint64_t oldpgstart, oldpgend; -- struct gnttab_setup_table gnttab_setup; -- struct gnttab_set_version gnttab_setver; - grub_size_t n_unusable_pages = 0; - struct mmu_update m2p_updates[2 * MAX_N_UNUSABLE_PAGES]; - - if (total_pages > MAX_TOTAL_PAGES - 4) - total_pages = MAX_TOTAL_PAGES - 4; - -- grub_memset (&gnttab_setver, 0, sizeof (gnttab_setver)); -- -- gnttab_setver.version = 1; -- grub_xen_grant_table_op (GNTTABOP_set_version, &gnttab_setver, 1); -- -- grub_memset (&gnttab_setup, 0, sizeof (gnttab_setup)); -- gnttab_setup.dom = DOMID_SELF; -- gnttab_setup.nr_frames = 1; -- gnttab_setup.frame_list.p = &gntframe; -- -- grub_xen_grant_table_op (GNTTABOP_setup_table, &gnttab_setup, 1); -- - for (j = 0; j < total_pages - n_unusable_pages; j++) - while (!grub_xen_is_page_usable (mfn_list[j])) - { -@@ -537,6 +542,8 @@ grub_machine_init (void) - + GRUB_KERNEL_MACHINE_MOD_GAP, - GRUB_KERNEL_MACHINE_MOD_ALIGN); - -+ grub_xen_setup_gnttab (); -+ - map_all_pages (); - - grub_console_init (); --- -2.21.0 - diff --git a/main/grub/0004-xen-Prepare-common-code-for-Xen-PVH-support.patch b/main/grub/0004-xen-Prepare-common-code-for-Xen-PVH-support.patch deleted file mode 100644 index f5d42d8829..0000000000 --- a/main/grub/0004-xen-Prepare-common-code-for-Xen-PVH-support.patch +++ /dev/null @@ -1,245 +0,0 @@ -From 49a68b2a338cd55490c776d15b0b399303a08df5 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:32 +0100 -Subject: [PATCH 04/20] xen: Prepare common code for Xen PVH support - -Some common code needs to be special cased for Xen PVH mode. This hits -mostly Xen PV mode specific areas. - -Split include/grub/i386/pc/int_types.h off from -include/grub/i386/pc/int.h to support including this file later from -xen_pvh code without the grub_bios_interrupt definition. - -Move definition of struct grub_e820_mmap_entry from -grub-core/mmap/i386/pc/mmap.c to include/grub/i386/memory.h in order -to make it usable from xen_pvh code. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit fc9d47ead56365c3335bb42cf651008c9ac1f494) ---- - grub-core/kern/i386/tsc.c | 2 +- - grub-core/mmap/i386/pc/mmap.c | 8 ----- - include/grub/i386/memory.h | 7 ++++ - include/grub/i386/pc/int.h | 36 +------------------ - include/grub/i386/pc/int_types.h | 59 +++++++++++++++++++++++++++++++ - include/grub/i386/tsc.h | 2 +- - include/grub/i386/xen/hypercall.h | 5 ++- - include/grub/kernel.h | 4 ++- - 8 files changed, 76 insertions(+), 47 deletions(-) - create mode 100644 include/grub/i386/pc/int_types.h - -diff --git a/grub-core/kern/i386/tsc.c b/grub-core/kern/i386/tsc.c -index 2e85289d8..b50831bfc 100644 ---- a/grub-core/kern/i386/tsc.c -+++ b/grub-core/kern/i386/tsc.c -@@ -65,7 +65,7 @@ grub_tsc_init (void) - - tsc_boot_time = grub_get_tsc (); - --#ifdef GRUB_MACHINE_XEN -+#if defined (GRUB_MACHINE_XEN) || defined (GRUB_MACHINE_XEN_PVH) - (void) (grub_tsc_calibrate_from_xen () || calibrate_tsc_hardcode()); - #elif defined (GRUB_MACHINE_EFI) - (void) (grub_tsc_calibrate_from_pit () || grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_efi() || calibrate_tsc_hardcode()); -diff --git a/grub-core/mmap/i386/pc/mmap.c b/grub-core/mmap/i386/pc/mmap.c -index 609994516..6ab4f6730 100644 ---- a/grub-core/mmap/i386/pc/mmap.c -+++ b/grub-core/mmap/i386/pc/mmap.c -@@ -42,14 +42,6 @@ extern grub_uint16_t grub_machine_mmaphook_kblow; - extern grub_uint16_t grub_machine_mmaphook_kbin16mb; - extern grub_uint16_t grub_machine_mmaphook_64kbin4gb; - --struct grub_e820_mmap_entry --{ -- grub_uint64_t addr; -- grub_uint64_t len; -- grub_uint32_t type; --} GRUB_PACKED; -- -- - /* Helper for preboot. */ - static int fill_hook (grub_uint64_t addr, grub_uint64_t size, - grub_memory_type_t type, void *data) -diff --git a/include/grub/i386/memory.h b/include/grub/i386/memory.h -index 8bb6e1cbb..5cb607fb4 100644 ---- a/include/grub/i386/memory.h -+++ b/include/grub/i386/memory.h -@@ -44,6 +44,13 @@ - - #include <grub/types.h> - -+struct grub_e820_mmap_entry -+{ -+ grub_uint64_t addr; -+ grub_uint64_t len; -+ grub_uint32_t type; -+} GRUB_PACKED; -+ - grub_uint64_t grub_mmap_get_upper (void); - grub_uint64_t grub_mmap_get_lower (void); - grub_uint64_t grub_mmap_get_post64 (void); -diff --git a/include/grub/i386/pc/int.h b/include/grub/i386/pc/int.h -index 16a53e4fe..a60104001 100644 ---- a/include/grub/i386/pc/int.h -+++ b/include/grub/i386/pc/int.h -@@ -20,45 +20,11 @@ - #define GRUB_INTERRUPT_MACHINE_HEADER 1 - - #include <grub/symbol.h> --#include <grub/types.h> -- --struct grub_bios_int_registers --{ -- grub_uint32_t eax; -- grub_uint16_t es; -- grub_uint16_t ds; -- grub_uint16_t flags; -- grub_uint16_t dummy; -- grub_uint32_t ebx; -- grub_uint32_t ecx; -- grub_uint32_t edi; -- grub_uint32_t esi; -- grub_uint32_t edx; --}; -- --#define GRUB_CPU_INT_FLAGS_CARRY 0x1 --#define GRUB_CPU_INT_FLAGS_PARITY 0x4 --#define GRUB_CPU_INT_FLAGS_ADJUST 0x10 --#define GRUB_CPU_INT_FLAGS_ZERO 0x40 --#define GRUB_CPU_INT_FLAGS_SIGN 0x80 --#define GRUB_CPU_INT_FLAGS_TRAP 0x100 --#define GRUB_CPU_INT_FLAGS_INTERRUPT 0x200 --#define GRUB_CPU_INT_FLAGS_DIRECTION 0x400 --#define GRUB_CPU_INT_FLAGS_OVERFLOW 0x800 --#ifdef GRUB_MACHINE_PCBIOS --#define GRUB_CPU_INT_FLAGS_DEFAULT GRUB_CPU_INT_FLAGS_INTERRUPT --#else --#define GRUB_CPU_INT_FLAGS_DEFAULT 0 --#endif -+#include <grub/i386/pc/int_types.h> - - void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno, - struct grub_bios_int_registers *regs) - __attribute__ ((regparm(3))); --struct grub_i386_idt --{ -- grub_uint16_t limit; -- grub_uint32_t base; --} GRUB_PACKED; - - #ifdef GRUB_MACHINE_PCBIOS - extern struct grub_i386_idt *EXPORT_VAR(grub_realidt); -diff --git a/include/grub/i386/pc/int_types.h b/include/grub/i386/pc/int_types.h -new file mode 100644 -index 000000000..2c5a69b63 ---- /dev/null -+++ b/include/grub/i386/pc/int_types.h -@@ -0,0 +1,59 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2018 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#ifndef GRUB_INTERRUPT_TYPES_MACHINE_HEADER -+#define GRUB_INTERRUPT_TYPES_MACHINE_HEADER 1 -+ -+#include <grub/types.h> -+ -+#define GRUB_CPU_INT_FLAGS_CARRY 0x1 -+#define GRUB_CPU_INT_FLAGS_PARITY 0x4 -+#define GRUB_CPU_INT_FLAGS_ADJUST 0x10 -+#define GRUB_CPU_INT_FLAGS_ZERO 0x40 -+#define GRUB_CPU_INT_FLAGS_SIGN 0x80 -+#define GRUB_CPU_INT_FLAGS_TRAP 0x100 -+#define GRUB_CPU_INT_FLAGS_INTERRUPT 0x200 -+#define GRUB_CPU_INT_FLAGS_DIRECTION 0x400 -+#define GRUB_CPU_INT_FLAGS_OVERFLOW 0x800 -+#ifdef GRUB_MACHINE_PCBIOS -+#define GRUB_CPU_INT_FLAGS_DEFAULT GRUB_CPU_INT_FLAGS_INTERRUPT -+#else -+#define GRUB_CPU_INT_FLAGS_DEFAULT 0 -+#endif -+ -+struct grub_bios_int_registers -+{ -+ grub_uint32_t eax; -+ grub_uint16_t es; -+ grub_uint16_t ds; -+ grub_uint16_t flags; -+ grub_uint16_t dummy; -+ grub_uint32_t ebx; -+ grub_uint32_t ecx; -+ grub_uint32_t edi; -+ grub_uint32_t esi; -+ grub_uint32_t edx; -+}; -+ -+struct grub_i386_idt -+{ -+ grub_uint16_t limit; -+ grub_uint32_t base; -+} GRUB_PACKED; -+ -+#endif -diff --git a/include/grub/i386/tsc.h b/include/grub/i386/tsc.h -index a0aa2c573..324174ded 100644 ---- a/include/grub/i386/tsc.h -+++ b/include/grub/i386/tsc.h -@@ -54,7 +54,7 @@ grub_get_tsc (void) - static __inline int - grub_cpu_is_tsc_supported (void) - { --#ifndef GRUB_MACHINE_XEN -+#if !defined(GRUB_MACHINE_XEN) && !defined(GRUB_MACHINE_XEN_PVH) - grub_uint32_t a,b,c,d; - if (! grub_cpu_is_cpuid_supported ()) - return 0; -diff --git a/include/grub/i386/xen/hypercall.h b/include/grub/i386/xen/hypercall.h -index 198ee94af..4e4c12a49 100644 ---- a/include/grub/i386/xen/hypercall.h -+++ b/include/grub/i386/xen/hypercall.h -@@ -26,7 +26,10 @@ EXPORT_FUNC (grub_xen_hypercall) (grub_uint32_t callno, grub_uint32_t a0, - grub_uint32_t a1, grub_uint32_t a2, - grub_uint32_t a3, grub_uint32_t a4, - grub_uint32_t a5) --__attribute__ ((regparm (3), cdecl)); -+#ifdef GRUB_MACHINE_XEN -+ __attribute__ ((regparm (3), cdecl)) -+#endif -+ ; - - static inline int - grub_xen_sched_op (int cmd, void *arg) -diff --git a/include/grub/kernel.h b/include/grub/kernel.h -index 20ddf2da2..c17fc6e60 100644 ---- a/include/grub/kernel.h -+++ b/include/grub/kernel.h -@@ -78,7 +78,9 @@ struct grub_module_info64 - #if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) \ - || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_MIPS_QEMU_MIPS) \ - || defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_ARC) \ -- || (defined (__sparc__) && defined (GRUB_MACHINE_IEEE1275)) || defined (GRUB_MACHINE_UBOOT) || defined (GRUB_MACHINE_XEN) -+ || (defined (__sparc__) && defined (GRUB_MACHINE_IEEE1275)) \ -+ || defined (GRUB_MACHINE_UBOOT) || defined (GRUB_MACHINE_XEN) \ -+ || defined(GRUB_MACHINE_XEN_PVH) - /* FIXME: stack is between 2 heap regions. Move it. */ - #define GRUB_KERNEL_PRELOAD_SPACE_REUSABLE 1 - #endif --- -2.21.0 - diff --git a/main/grub/0005-xen-Add-some-dummy-headers-for-PVH-mode.patch b/main/grub/0005-xen-Add-some-dummy-headers-for-PVH-mode.patch deleted file mode 100644 index 80704778cd..0000000000 --- a/main/grub/0005-xen-Add-some-dummy-headers-for-PVH-mode.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 02d764a4469d71a5bc78c1358b0bd62987e2dc8e Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:33 +0100 -Subject: [PATCH 05/20] xen: Add some dummy headers for PVH mode - -With Xen PVH mode adding a new machine type the machine related headers -need to be present for the build to succeed. Most of the headers just -need to include the related common i386 headers. Add those to the tree. - -Note that xen_pvh/int.h needs to include pc/int_types.h instead of -pc/int.h in order to avoid the definition of grub_bios_interrupt(). - -xen_pvh/memory.h needs to include coreboot/memory.h (like some other -<machine>/memory.h do as well) as this contains just the needed stubs. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 408de833bbd1ccad39ad439eaf3cddd528b039b5) ---- - include/grub/i386/xen_pvh/boot.h | 1 + - include/grub/i386/xen_pvh/console.h | 1 + - include/grub/i386/xen_pvh/int.h | 1 + - include/grub/i386/xen_pvh/memory.h | 1 + - include/grub/i386/xen_pvh/time.h | 1 + - 5 files changed, 5 insertions(+) - create mode 100644 include/grub/i386/xen_pvh/boot.h - create mode 100644 include/grub/i386/xen_pvh/console.h - create mode 100644 include/grub/i386/xen_pvh/int.h - create mode 100644 include/grub/i386/xen_pvh/memory.h - create mode 100644 include/grub/i386/xen_pvh/time.h - -diff --git a/include/grub/i386/xen_pvh/boot.h b/include/grub/i386/xen_pvh/boot.h -new file mode 100644 -index 000000000..6cd23aa83 ---- /dev/null -+++ b/include/grub/i386/xen_pvh/boot.h -@@ -0,0 +1 @@ -+#include <grub/i386/pc/boot.h> -diff --git a/include/grub/i386/xen_pvh/console.h b/include/grub/i386/xen_pvh/console.h -new file mode 100644 -index 000000000..305a46d8e ---- /dev/null -+++ b/include/grub/i386/xen_pvh/console.h -@@ -0,0 +1 @@ -+#include <grub/i386/pc/console.h> -diff --git a/include/grub/i386/xen_pvh/int.h b/include/grub/i386/xen_pvh/int.h -new file mode 100644 -index 000000000..0f1f9ee62 ---- /dev/null -+++ b/include/grub/i386/xen_pvh/int.h -@@ -0,0 +1 @@ -+#include <grub/i386/pc/int_types.h> -diff --git a/include/grub/i386/xen_pvh/memory.h b/include/grub/i386/xen_pvh/memory.h -new file mode 100644 -index 000000000..8dd6f7c8c ---- /dev/null -+++ b/include/grub/i386/xen_pvh/memory.h -@@ -0,0 +1 @@ -+#include <grub/i386/coreboot/memory.h> -diff --git a/include/grub/i386/xen_pvh/time.h b/include/grub/i386/xen_pvh/time.h -new file mode 100644 -index 000000000..2298ee8f4 ---- /dev/null -+++ b/include/grub/i386/xen_pvh/time.h -@@ -0,0 +1 @@ -+#include <grub/i386/pc/time.h> --- -2.21.0 - diff --git a/main/grub/0006-xen-Rearrange-xen-init.c-to-prepare-it-for-Xen-PVH-m.patch b/main/grub/0006-xen-Rearrange-xen-init.c-to-prepare-it-for-Xen-PVH-m.patch deleted file mode 100644 index 35673cc065..0000000000 --- a/main/grub/0006-xen-Rearrange-xen-init.c-to-prepare-it-for-Xen-PVH-m.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 56eb459603e458316d93cf5bdf16e4539dbb6a9d Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:34 +0100 -Subject: [PATCH 06/20] xen: Rearrange xen/init.c to prepare it for Xen PVH - mode - -Rearrange grub-core/kern/xen/init.c to prepare adding PVH mode support -to it. This includes putting some code under #ifdef GRUB_MACHINE_XEN -as it will not be used when running as PVH. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit bec9edf53f4d0b629a52a7d1145f38f88df8dd1d) ---- - grub-core/kern/xen/init.c | 60 ++++++++++++++++++++++----------------- - 1 file changed, 34 insertions(+), 26 deletions(-) - -diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c -index 29f5bc23d..10007b411 100644 ---- a/grub-core/kern/xen/init.c -+++ b/grub-core/kern/xen/init.c -@@ -41,9 +41,11 @@ grub_size_t grub_xen_n_allocated_shared_pages; - static grub_xen_mfn_t - grub_xen_ptr2mfn (void *ptr) - { -+#ifdef GRUB_MACHINE_XEN - grub_xen_mfn_t *mfn_list = - (grub_xen_mfn_t *) grub_xen_start_page_addr->mfn_list; - return mfn_list[(grub_addr_t) ptr >> GRUB_XEN_LOG_PAGE_SIZE]; -+#endif - } - - void * -@@ -104,18 +106,6 @@ grub_machine_get_bootlocation (char **device __attribute__ ((unused)), - { - } - --static grub_uint8_t window[GRUB_XEN_PAGE_SIZE] -- __attribute__ ((aligned (GRUB_XEN_PAGE_SIZE))); -- --#ifdef __x86_64__ --#define NUMBER_OF_LEVELS 4 --#else --#define NUMBER_OF_LEVELS 3 --#endif -- --#define LOG_POINTERS_PER_PAGE 9 --#define POINTERS_PER_PAGE (1 << LOG_POINTERS_PER_PAGE) -- - void - grub_xen_store_send (const void *buf_, grub_size_t len) - { -@@ -337,6 +327,19 @@ grub_xen_setup_gnttab (void) - grub_xen_grant_table_op (GNTTABOP_setup_table, &gnttab_setup, 1); - } - -+#ifdef GRUB_MACHINE_XEN -+static grub_uint8_t window[GRUB_XEN_PAGE_SIZE] -+ __attribute__ ((aligned (GRUB_XEN_PAGE_SIZE))); -+ -+#ifdef __x86_64__ -+#define NUMBER_OF_LEVELS 4 -+#else -+#define NUMBER_OF_LEVELS 3 -+#endif -+ -+#define LOG_POINTERS_PER_PAGE 9 -+#define POINTERS_PER_PAGE (1 << LOG_POINTERS_PER_PAGE) -+ - #define MAX_N_UNUSABLE_PAGES 4 - - static int -@@ -529,13 +532,30 @@ map_all_pages (void) - grub_mm_init_region ((void *) heap_start, heap_end - heap_start); - } - -+grub_err_t -+grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data) -+{ -+ grub_uint64_t total_pages = grub_xen_start_page_addr->nr_pages; -+ grub_uint64_t usable_pages = grub_xen_start_page_addr->pt_base >> 12; -+ if (hook (0, page2offset (usable_pages), GRUB_MEMORY_AVAILABLE, hook_data)) -+ return GRUB_ERR_NONE; -+ -+ hook (page2offset (usable_pages), page2offset (total_pages - usable_pages), -+ GRUB_MEMORY_RESERVED, hook_data); -+ -+ return GRUB_ERR_NONE; -+} -+#endif -+ - extern char _end[]; - - void - grub_machine_init (void) - { -+#ifdef GRUB_MACHINE_XEN - #ifdef __i386__ - grub_xen_vm_assist (VMASST_CMD_enable, VMASST_TYPE_pae_extended_cr3); -+#endif - #endif - - grub_modbase = ALIGN_UP ((grub_addr_t) _end -@@ -544,7 +564,9 @@ grub_machine_init (void) - - grub_xen_setup_gnttab (); - -+#ifdef GRUB_MACHINE_XEN - map_all_pages (); -+#endif - - grub_console_init (); - -@@ -571,17 +593,3 @@ grub_machine_fini (int flags __attribute__ ((unused))) - grub_xendisk_fini (); - grub_boot_fini (); - } -- --grub_err_t --grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data) --{ -- grub_uint64_t total_pages = grub_xen_start_page_addr->nr_pages; -- grub_uint64_t usable_pages = grub_xen_start_page_addr->pt_base >> 12; -- if (hook (0, page2offset (usable_pages), GRUB_MEMORY_AVAILABLE, hook_data)) -- return GRUB_ERR_NONE; -- -- hook (page2offset (usable_pages), page2offset (total_pages - usable_pages), -- GRUB_MEMORY_RESERVED, hook_data); -- -- return GRUB_ERR_NONE; --} --- -2.21.0 - diff --git a/main/grub/0007-xen-Modify-grub_xen_ptr2mfn-for-Xen-PVH.patch b/main/grub/0007-xen-Modify-grub_xen_ptr2mfn-for-Xen-PVH.patch deleted file mode 100644 index aa0de2c411..0000000000 --- a/main/grub/0007-xen-Modify-grub_xen_ptr2mfn-for-Xen-PVH.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 9db97a1c63053bc376419e913a19f9f99a3f7b7d Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:35 +0100 -Subject: [PATCH 07/20] xen: Modify grub_xen_ptr2mfn() for Xen PVH - -grub_xen_ptr2mfn() returns the machine frame number for a given pointer -value. For Xen-PVH guests this is just the PFN. Add the PVH specific -variant. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 3b8d09c7742a1890eadad6987852c82947ea5d4a) ---- - grub-core/kern/xen/init.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c -index 10007b411..a23dad633 100644 ---- a/grub-core/kern/xen/init.c -+++ b/grub-core/kern/xen/init.c -@@ -45,6 +45,8 @@ grub_xen_ptr2mfn (void *ptr) - grub_xen_mfn_t *mfn_list = - (grub_xen_mfn_t *) grub_xen_start_page_addr->mfn_list; - return mfn_list[(grub_addr_t) ptr >> GRUB_XEN_LOG_PAGE_SIZE]; -+#else -+ return (grub_addr_t) ptr >> GRUB_XEN_LOG_PAGE_SIZE; - #endif - } - --- -2.21.0 - diff --git a/main/grub/0008-Fix-packed-not-aligned-error-on-GCC-8.patch b/main/grub/0008-Fix-packed-not-aligned-error-on-GCC-8.patch deleted file mode 100644 index 2d09149f72..0000000000 --- a/main/grub/0008-Fix-packed-not-aligned-error-on-GCC-8.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 563b1da6e6ae7af46cc8354cadb5dab416989f0a Mon Sep 17 00:00:00 2001 -From: Michael Chang <mchang@suse.com> -Date: Mon, 26 Mar 2018 16:52:34 +0800 -Subject: Fix packed-not-aligned error on GCC 8 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When building with GCC 8, there are several errors regarding packed-not-aligned. - -./include/grub/gpt_partition.h:79:1: error: alignment 1 of ‘struct grub_gpt_partentry’ is less than 8 [-Werror=packed-not-aligned] - -This patch fixes the build error by cleaning up the ambiguity of placing -aligned structure in a packed one. In "struct grub_btrfs_time" and "struct -grub_gpt_part_type", the aligned attribute seems to be superfluous, and also -has to be packed, to ensure the structure is bit-to-bit mapped to the format -laid on disk. I think we could blame to copy and paste error here for the -mistake. In "struct efi_variable", we have to use grub_efi_packed_guid_t, as -the name suggests. :) - -Signed-off-by: Michael Chang <mchang@suse.com> -Tested-by: Michael Chang <mchang@suse.com> -Tested-by: Paul Menzel <paulepanter@users.sourceforge.net> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> ---- - grub-core/fs/btrfs.c | 2 +- - include/grub/efiemu/runtime.h | 2 +- - include/grub/gpt_partition.h | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 4849c1ceb..be195448d 100644 ---- a/grub-core/fs/btrfs.c -+++ b/grub-core/fs/btrfs.c -@@ -175,7 +175,7 @@ struct grub_btrfs_time - { - grub_int64_t sec; - grub_uint32_t nanosec; --} __attribute__ ((aligned (4))); -+} GRUB_PACKED; - - struct grub_btrfs_inode - { -diff --git a/include/grub/efiemu/runtime.h b/include/grub/efiemu/runtime.h -index 9b6b729f4..36d2dedf4 100644 ---- a/include/grub/efiemu/runtime.h -+++ b/include/grub/efiemu/runtime.h -@@ -29,7 +29,7 @@ struct grub_efiemu_ptv_rel - - struct efi_variable - { -- grub_efi_guid_t guid; -+ grub_efi_packed_guid_t guid; - grub_uint32_t namelen; - grub_uint32_t size; - grub_efi_uint32_t attributes; -diff --git a/include/grub/gpt_partition.h b/include/grub/gpt_partition.h -index 1b32f6725..9668a68c3 100644 ---- a/include/grub/gpt_partition.h -+++ b/include/grub/gpt_partition.h -@@ -28,7 +28,7 @@ struct grub_gpt_part_type - grub_uint16_t data2; - grub_uint16_t data3; - grub_uint8_t data4[8]; --} __attribute__ ((aligned(8))); -+} GRUB_PACKED; - typedef struct grub_gpt_part_type grub_gpt_part_type_t; - - #define GRUB_GPT_PARTITION_TYPE_EMPTY \ --- -cgit v1.1-33-g03f6 - diff --git a/main/grub/0008-xen-Add-PVH-specific-defines-to-offset.h.patch b/main/grub/0008-xen-Add-PVH-specific-defines-to-offset.h.patch deleted file mode 100644 index b98eb163a4..0000000000 --- a/main/grub/0008-xen-Add-PVH-specific-defines-to-offset.h.patch +++ /dev/null @@ -1,63 +0,0 @@ -From d0a9f803262b4702c0509d39820b2262d5bd916d Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:36 +0100 -Subject: [PATCH 08/20] xen: Add PVH specific defines to offset.h - -include/grub/offsets.h needs some defines for Xen PVH mode. - -Add them. While at it line up the values in the surrounding lines to -start at the same column. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 53a92dea8b675afb3f46aed15c04528695d46d59) ---- - include/grub/offsets.h | 21 ++++++++++++--------- - 1 file changed, 12 insertions(+), 9 deletions(-) - -diff --git a/include/grub/offsets.h b/include/grub/offsets.h -index c88c86d4d..8c784a57d 100644 ---- a/include/grub/offsets.h -+++ b/include/grub/offsets.h -@@ -36,9 +36,10 @@ - #define GRUB_DECOMPRESSOR_I386_PC_MAX_DECOMPRESSOR_SIZE (0x9000-0x8200) - - /* The segment where the kernel is loaded. */ --#define GRUB_BOOT_I386_PC_KERNEL_SEG 0x800 -+#define GRUB_BOOT_I386_PC_KERNEL_SEG 0x800 - --#define GRUB_KERNEL_I386_PC_LINK_ADDR 0x9000 -+#define GRUB_KERNEL_I386_PC_LINK_ADDR 0x9000 -+#define GRUB_KERNEL_I386_XEN_PVH_LINK_ADDR 0x100000 - - /* The upper memory area (starting at 640 kiB). */ - #define GRUB_MEMORY_I386_PC_UPPER 0xa0000 -@@ -101,15 +102,17 @@ - #define GRUB_KERNEL_I386_MULTIBOOT_MOD_ALIGN GRUB_KERNEL_I386_COREBOOT_MOD_ALIGN - - #define GRUB_KERNEL_X86_64_XEN_MOD_ALIGN 0x8 --#define GRUB_KERNEL_I386_XEN_MOD_ALIGN 0x8 -+#define GRUB_KERNEL_I386_XEN_MOD_ALIGN 0x8 -+#define GRUB_KERNEL_I386_XEN_PVH_MOD_ALIGN 0x8 - - /* Non-zero value is only needed for PowerMacs. */ --#define GRUB_KERNEL_X86_64_XEN_MOD_GAP 0x0 --#define GRUB_KERNEL_I386_XEN_MOD_GAP 0x0 --#define GRUB_KERNEL_I386_IEEE1275_MOD_GAP 0x0 --#define GRUB_KERNEL_I386_COREBOOT_MOD_GAP 0x0 --#define GRUB_KERNEL_SPARC64_IEEE1275_MOD_GAP 0x0 --#define GRUB_KERNEL_ARM_UBOOT_MOD_GAP 0x0 -+#define GRUB_KERNEL_X86_64_XEN_MOD_GAP 0x0 -+#define GRUB_KERNEL_I386_XEN_MOD_GAP 0x0 -+#define GRUB_KERNEL_I386_XEN_PVH_MOD_GAP 0x0 -+#define GRUB_KERNEL_I386_IEEE1275_MOD_GAP 0x0 -+#define GRUB_KERNEL_I386_COREBOOT_MOD_GAP 0x0 -+#define GRUB_KERNEL_SPARC64_IEEE1275_MOD_GAP 0x0 -+#define GRUB_KERNEL_ARM_UBOOT_MOD_GAP 0x0 - - #define GRUB_KERNEL_POWERPC_IEEE1275_MOD_ALIGN 0x1000 - #define GRUB_KERNEL_SPARC64_IEEE1275_LOG_MOD_ALIGN 3 --- -2.21.0 - diff --git a/main/grub/0009-xen-Add-basic-hooks-for-PVH-in-current-code.patch b/main/grub/0009-xen-Add-basic-hooks-for-PVH-in-current-code.patch deleted file mode 100644 index 2c663bc551..0000000000 --- a/main/grub/0009-xen-Add-basic-hooks-for-PVH-in-current-code.patch +++ /dev/null @@ -1,267 +0,0 @@ -From 6f19a6f001e182b9716ea850ce39bb2545c558cb Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:37 +0100 -Subject: [PATCH 09/20] xen: Add basic hooks for PVH in current code - -Add the hooks to current code needed for Xen PVH. They will be filled -with code later when the related functionality is being added. - -loader/i386/linux.c needs to include machine/kernel.h now as it needs -to get GRUB_KERNEL_USE_RSDP_ADDR from there. This in turn requires to -add an empty kernel.h header for some i386 platforms (efi, coreboot, -ieee1275, xen) and for x86_64 efi. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 0b3e4eb2d2e1875e6045e838962f769f2ce161dd) ---- - grub-core/Makefile.am | 6 +++++ - grub-core/kern/i386/xen/pvh.c | 37 +++++++++++++++++++++++++++ - grub-core/kern/i386/xen/startup_pvh.S | 29 +++++++++++++++++++++ - grub-core/kern/xen/init.c | 4 +++ - grub-core/loader/i386/linux.c | 1 + - include/grub/i386/coreboot/kernel.h | 0 - include/grub/i386/efi/kernel.h | 0 - include/grub/i386/ieee1275/kernel.h | 0 - include/grub/i386/xen/kernel.h | 0 - include/grub/i386/xen_pvh/kernel.h | 30 ++++++++++++++++++++++ - include/grub/x86_64/efi/kernel.h | 0 - include/grub/xen.h | 5 ++++ - 12 files changed, 112 insertions(+) - create mode 100644 grub-core/kern/i386/xen/pvh.c - create mode 100644 grub-core/kern/i386/xen/startup_pvh.S - create mode 100644 include/grub/i386/coreboot/kernel.h - create mode 100644 include/grub/i386/efi/kernel.h - create mode 100644 include/grub/i386/ieee1275/kernel.h - create mode 100644 include/grub/i386/xen/kernel.h - create mode 100644 include/grub/i386/xen_pvh/kernel.h - create mode 100644 include/grub/x86_64/efi/kernel.h - -diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index 04e9395fd..e36c109e2 100644 ---- a/grub-core/Makefile.am -+++ b/grub-core/Makefile.am -@@ -102,6 +102,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h - endif - - if COND_i386_efi -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h -@@ -111,6 +112,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pmtimer.h - endif - - if COND_i386_coreboot -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/coreboot/lbio.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h -@@ -122,6 +124,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h - endif - - if COND_i386_multiboot -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h - endif -@@ -132,6 +135,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h - endif - - if COND_i386_ieee1275 -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h -@@ -140,6 +144,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h - endif - - if COND_i386_xen -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h -@@ -158,6 +163,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h - endif - - if COND_x86_64_efi -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h -diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c -new file mode 100644 -index 000000000..4f629b15e ---- /dev/null -+++ b/grub-core/kern/i386/xen/pvh.c -@@ -0,0 +1,37 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2018 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <grub/kernel.h> -+#include <grub/misc.h> -+#include <grub/memory.h> -+#include <grub/mm.h> -+#include <grub/xen.h> -+#include <xen/hvm/start_info.h> -+#include <grub/machine/kernel.h> -+ -+grub_uint64_t grub_rsdp_addr; -+ -+void -+grub_xen_setup_pvh (void) -+{ -+} -+ -+grub_err_t -+grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data) -+{ -+} -diff --git a/grub-core/kern/i386/xen/startup_pvh.S b/grub-core/kern/i386/xen/startup_pvh.S -new file mode 100644 -index 000000000..69b8fdcca ---- /dev/null -+++ b/grub-core/kern/i386/xen/startup_pvh.S -@@ -0,0 +1,29 @@ -+/* startup.S - bootstrap GRUB itself */ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2018 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <config.h> -+#include <grub/symbol.h> -+ -+ .file "startup_pvh.S" -+ .text -+ -+/* Saved pointer to start info structure. */ -+ .globl pvh_start_info -+pvh_start_info: -+ .long 0 -diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c -index a23dad633..782ca7295 100644 ---- a/grub-core/kern/xen/init.c -+++ b/grub-core/kern/xen/init.c -@@ -564,6 +564,10 @@ grub_machine_init (void) - + GRUB_KERNEL_MACHINE_MOD_GAP, - GRUB_KERNEL_MACHINE_MOD_ALIGN); - -+#ifdef GRUB_MACHINE_XEN_PVH -+ grub_xen_setup_pvh (); -+#endif -+ - grub_xen_setup_gnttab (); - - #ifdef GRUB_MACHINE_XEN -diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c -index 7d6d5d499..e0825cb21 100644 ---- a/grub-core/loader/i386/linux.c -+++ b/grub-core/loader/i386/linux.c -@@ -35,6 +35,7 @@ - #include <grub/i18n.h> - #include <grub/lib/cmdline.h> - #include <grub/linux.h> -+#include <grub/machine/kernel.h> - - GRUB_MOD_LICENSE ("GPLv3+"); - -diff --git a/include/grub/i386/coreboot/kernel.h b/include/grub/i386/coreboot/kernel.h -new file mode 100644 -index 000000000..e69de29bb -diff --git a/include/grub/i386/efi/kernel.h b/include/grub/i386/efi/kernel.h -new file mode 100644 -index 000000000..e69de29bb -diff --git a/include/grub/i386/ieee1275/kernel.h b/include/grub/i386/ieee1275/kernel.h -new file mode 100644 -index 000000000..e69de29bb -diff --git a/include/grub/i386/xen/kernel.h b/include/grub/i386/xen/kernel.h -new file mode 100644 -index 000000000..e69de29bb -diff --git a/include/grub/i386/xen_pvh/kernel.h b/include/grub/i386/xen_pvh/kernel.h -new file mode 100644 -index 000000000..2b7b8a129 ---- /dev/null -+++ b/include/grub/i386/xen_pvh/kernel.h -@@ -0,0 +1,30 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2018 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#ifndef GRUB_KERNEL_MACHINE_HEADER -+#define GRUB_KERNEL_MACHINE_HEADER 1 -+ -+#ifndef ASM_FILE -+ -+#define GRUB_KERNEL_USE_RSDP_ADDR 1 -+ -+extern grub_uint64_t EXPORT_VAR(grub_rsdp_addr); -+ -+#endif /* ! ASM_FILE */ -+ -+#endif /* GRUB_KERNEL_MACHINE_HEADER */ -diff --git a/include/grub/x86_64/efi/kernel.h b/include/grub/x86_64/efi/kernel.h -new file mode 100644 -index 000000000..e69de29bb -diff --git a/include/grub/xen.h b/include/grub/xen.h -index c31cc10c7..91cb7cf81 100644 ---- a/include/grub/xen.h -+++ b/include/grub/xen.h -@@ -95,6 +95,11 @@ typedef grub_uint64_t grub_xen_mfn_t; - typedef grub_uint32_t grub_xen_mfn_t; - #endif - typedef unsigned int grub_xen_evtchn_t; -+ -+#ifdef GRUB_MACHINE_XEN_PVH -+extern struct hvm_start_info *pvh_start_info; -+void grub_xen_setup_pvh (void); -+#endif - #endif - - #endif --- -2.21.0 - diff --git a/main/grub/0009-xfs-Accept-filesystem-with-sparse-inodes.patch b/main/grub/0009-xfs-Accept-filesystem-with-sparse-inodes.patch deleted file mode 100644 index 6c6a750b42..0000000000 --- a/main/grub/0009-xfs-Accept-filesystem-with-sparse-inodes.patch +++ /dev/null @@ -1,60 +0,0 @@ -From cda0a857dd7a27cd5d621747464bfe71e8727fff Mon Sep 17 00:00:00 2001 -From: Daniel Kiper <daniel.kiper@oracle.com> -Date: Tue, 29 May 2018 16:16:02 +0200 -Subject: xfs: Accept filesystem with sparse inodes - -The sparse inode metadata format became a mkfs.xfs default in -xfsprogs-4.16.0, and such filesystems are now rejected by grub as -containing an incompatible feature. - -In essence, this feature allows xfs to allocate inodes into fragmented -freespace. (Without this feature, if xfs could not allocate contiguous -space for 64 new inodes, inode creation would fail.) - -In practice, the disk format change is restricted to the inode btree, -which as far as I can tell is not used by grub. If all you're doing -today is parsing a directory, reading an inode number, and converting -that inode number to a disk location, then ignoring this feature -should be fine, so I've added it to XFS_SB_FEAT_INCOMPAT_SUPPORTED - -I did some brief testing of this patch by hacking up the regression -tests to completely fragment freespace on the test xfs filesystem, and -then write a large-ish number of inodes to consume any existing -contiguous 64-inode chunk. This way any files the grub tests add and -traverse would be in such a fragmented inode allocation. Tests passed, -but I'm not sure how to cleanly integrate that into the test harness. - -Signed-off-by: Eric Sandeen <sandeen@redhat.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Chris Murphy <lists@colorremedies.com> ---- - grub-core/fs/xfs.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c -index c6031bd..3b00c74 100644 ---- a/grub-core/fs/xfs.c -+++ b/grub-core/fs/xfs.c -@@ -79,9 +79,18 @@ GRUB_MOD_LICENSE ("GPLv3+"); - #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ - #define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2) /* metadata UUID */ - --/* We do not currently verify metadata UUID so it is safe to read such filesystem */ -+/* -+ * Directory entries with ftype are explicitly handled by GRUB code. -+ * -+ * We do not currently read the inode btrees, so it is safe to read filesystems -+ * with the XFS_SB_FEAT_INCOMPAT_SPINODES feature. -+ * -+ * We do not currently verify metadata UUID, so it is safe to read filesystems -+ * with the XFS_SB_FEAT_INCOMPAT_META_UUID feature. -+ */ - #define XFS_SB_FEAT_INCOMPAT_SUPPORTED \ - (XFS_SB_FEAT_INCOMPAT_FTYPE | \ -+ XFS_SB_FEAT_INCOMPAT_SPINODES | \ - XFS_SB_FEAT_INCOMPAT_META_UUID) - - struct grub_xfs_sblock --- -cgit v1.0-41-gc330 - diff --git a/main/grub/0010-xen-Add-PVH-boot-entry-code.patch b/main/grub/0010-xen-Add-PVH-boot-entry-code.patch deleted file mode 100644 index 33c520f2d8..0000000000 --- a/main/grub/0010-xen-Add-PVH-boot-entry-code.patch +++ /dev/null @@ -1,86 +0,0 @@ -From da39673d5d194e66c9ad70ad4de4e90ee69f0886 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:38 +0100 -Subject: [PATCH 10/20] xen: Add PVH boot entry code - -Add the code for the Xen PVH mode boot entry. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 1a4d83af2fc1eb0a0951775a2b86860ab074c699) ---- - grub-core/kern/i386/xen/startup_pvh.S | 52 +++++++++++++++++++++++++++ - 1 file changed, 52 insertions(+) - -diff --git a/grub-core/kern/i386/xen/startup_pvh.S b/grub-core/kern/i386/xen/startup_pvh.S -index 69b8fdcca..363c31858 100644 ---- a/grub-core/kern/i386/xen/startup_pvh.S -+++ b/grub-core/kern/i386/xen/startup_pvh.S -@@ -19,11 +19,63 @@ - - #include <config.h> - #include <grub/symbol.h> -+#include <grub/machine/memory.h> - - .file "startup_pvh.S" - .text -+ .globl start, _start -+ .code32 - -+start: -+_start: -+ cld -+ lgdt gdtdesc -+ ljmp $GRUB_MEMORY_MACHINE_PROT_MODE_CSEG, $1f -+1: -+ movl $GRUB_MEMORY_MACHINE_PROT_MODE_DSEG, %eax -+ mov %eax, %ds -+ mov %eax, %es -+ mov %eax, %fs -+ mov %eax, %gs -+ mov %eax, %ss -+ leal LOCAL(stack_end), %esp -+ -+ /* Save address of start info structure. */ -+ mov %ebx, pvh_start_info -+ call EXT_C(grub_main) -+ /* Doesn't return. */ -+ -+ .p2align 3 -+gdt: -+ .word 0, 0 -+ .byte 0, 0, 0, 0 -+ -+ /* -- code segment -- -+ * base = 0x00000000, limit = 0xFFFFF (4 KiB Granularity), present -+ * type = 32bit code execute/read, DPL = 0 -+ */ -+ .word 0xFFFF, 0 -+ .byte 0, 0x9A, 0xCF, 0 -+ -+ /* -- data segment -- -+ * base = 0x00000000, limit 0xFFFFF (4 KiB Granularity), present -+ * type = 32 bit data read/write, DPL = 0 -+ */ -+ .word 0xFFFF, 0 -+ .byte 0, 0x92, 0xCF, 0 -+ -+ .p2align 3 -+/* this is the GDT descriptor */ -+gdtdesc: -+ .word 0x17 /* limit */ -+ .long gdt /* addr */ -+ -+ .p2align 2 - /* Saved pointer to start info structure. */ - .globl pvh_start_info - pvh_start_info: - .long 0 -+ -+ .bss -+ .space GRUB_MEMORY_MACHINE_PROT_STACK_SIZE -+LOCAL(stack_end): --- -2.21.0 - diff --git a/main/grub/0011-xen-Setup-hypercall-page-for-PVH.patch b/main/grub/0011-xen-Setup-hypercall-page-for-PVH.patch deleted file mode 100644 index 41051ddd61..0000000000 --- a/main/grub/0011-xen-Setup-hypercall-page-for-PVH.patch +++ /dev/null @@ -1,145 +0,0 @@ -From 5f462874a5ee6471faa55f05d3a09369a5dcff2d Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:39 +0100 -Subject: [PATCH 11/20] xen: Setup hypercall page for PVH -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add the needed code to setup the hypercall page for calling into the -Xen hypervisor. - -Import the XEN_HVM_DEBUGCONS_IOPORT define from Xen unstable into -include/xen/arch-x86/xen.h - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit da81e42a7ccb545513368ec7488cdf5019c1c2ba) ---- - grub-core/kern/i386/xen/pvh.c | 80 +++++++++++++++++++++++++++++++++++ - include/xen/arch-x86/xen.h | 7 +++ - 2 files changed, 87 insertions(+) - -diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c -index 4f629b15e..a2554fb1d 100644 ---- a/grub-core/kern/i386/xen/pvh.c -+++ b/grub-core/kern/i386/xen/pvh.c -@@ -20,15 +20,95 @@ - #include <grub/misc.h> - #include <grub/memory.h> - #include <grub/mm.h> -+#include <grub/i386/cpuid.h> -+#include <grub/i386/io.h> - #include <grub/xen.h> - #include <xen/hvm/start_info.h> - #include <grub/machine/kernel.h> - - grub_uint64_t grub_rsdp_addr; - -+static char hypercall_page[GRUB_XEN_PAGE_SIZE] -+ __attribute__ ((aligned (GRUB_XEN_PAGE_SIZE))); -+ -+static grub_uint32_t xen_cpuid_base; -+ -+static void -+grub_xen_cons_msg (const char *msg) -+{ -+ const char *c; -+ -+ for (c = msg; *c; c++) -+ grub_outb (*c, XEN_HVM_DEBUGCONS_IOPORT); -+} -+ -+static void -+grub_xen_panic (const char *msg) -+{ -+ grub_xen_cons_msg (msg); -+ grub_xen_cons_msg ("System halted!\n"); -+ -+ asm volatile ("cli"); -+ -+ while (1) -+ { -+ asm volatile ("hlt"); -+ } -+} -+ -+static void -+grub_xen_cpuid_base (void) -+{ -+ grub_uint32_t base, eax, signature[3]; -+ -+ for (base = 0x40000000; base < 0x40010000; base += 0x100) -+ { -+ grub_cpuid (base, eax, signature[0], signature[1], signature[2]); -+ if (!grub_memcmp ("XenVMMXenVMM", signature, 12) && (eax - base) >= 2) -+ { -+ xen_cpuid_base = base; -+ return; -+ } -+ } -+ -+ grub_xen_panic ("Found no Xen signature!\n"); -+} -+ -+static void -+grub_xen_setup_hypercall_page (void) -+{ -+ grub_uint32_t msr, addr, eax, ebx, ecx, edx; -+ -+ /* Get base address of Xen-specific MSRs. */ -+ grub_cpuid (xen_cpuid_base + 2, eax, ebx, ecx, edx); -+ msr = ebx; -+ addr = (grub_uint32_t) (&hypercall_page); -+ -+ /* Specify hypercall page address for Xen. */ -+ asm volatile ("wrmsr" : : "c" (msr), "a" (addr), "d" (0) : "memory"); -+} -+ -+int -+grub_xen_hypercall (grub_uint32_t callno, grub_uint32_t a0, -+ grub_uint32_t a1, grub_uint32_t a2, -+ grub_uint32_t a3, grub_uint32_t a4, -+ grub_uint32_t a5 __attribute__ ((unused))) -+{ -+ grub_uint32_t res; -+ -+ asm volatile ("call *%[callno]" -+ : "=a" (res), "+b" (a0), "+c" (a1), "+d" (a2), -+ "+S" (a3), "+D" (a4) -+ : [callno] "a" (&hypercall_page[callno * 32]) -+ : "memory"); -+ return res; -+} -+ - void - grub_xen_setup_pvh (void) - { -+ grub_xen_cpuid_base (); -+ grub_xen_setup_hypercall_page (); - } - - grub_err_t -diff --git a/include/xen/arch-x86/xen.h b/include/xen/arch-x86/xen.h -index f35804b88..56be26cb6 100644 ---- a/include/xen/arch-x86/xen.h -+++ b/include/xen/arch-x86/xen.h -@@ -260,6 +260,13 @@ typedef struct arch_shared_info arch_shared_info_t; - #define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" - #endif - -+/* -+ * Debug console IO port, also called "port E9 hack". Each character written -+ * to this IO port will be printed on the hypervisor console, subject to log -+ * level restrictions. -+ */ -+#define XEN_HVM_DEBUGCONS_IOPORT 0xe9 -+ - #endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */ - - /* --- -2.21.0 - diff --git a/main/grub/0012-xen-Get-memory-map-from-hypervisor-for-PVH.patch b/main/grub/0012-xen-Get-memory-map-from-hypervisor-for-PVH.patch deleted file mode 100644 index cdab0c08bf..0000000000 --- a/main/grub/0012-xen-Get-memory-map-from-hypervisor-for-PVH.patch +++ /dev/null @@ -1,144 +0,0 @@ -From 4acff24f747e43c3f9bb0551c7d09114355c7d3a Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:40 +0100 -Subject: [PATCH 12/20] xen: Get memory map from hypervisor for PVH - -Retrieve the memory map from the hypervisor and normalize it to contain -no overlapping entries and to be sorted by address. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 2b7a21afd319b829941a928f5763e017d1cc2951) ---- - grub-core/kern/i386/xen/pvh.c | 94 +++++++++++++++++++++++++++++++++++ - 1 file changed, 94 insertions(+) - -diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c -index a2554fb1d..2b68ac333 100644 ---- a/grub-core/kern/i386/xen/pvh.c -+++ b/grub-core/kern/i386/xen/pvh.c -@@ -24,7 +24,12 @@ - #include <grub/i386/io.h> - #include <grub/xen.h> - #include <xen/hvm/start_info.h> -+#include <grub/i386/linux.h> - #include <grub/machine/kernel.h> -+#include <grub/machine/memory.h> -+#include <xen/memory.h> -+ -+#define XEN_MEMORY_MAP_SIZE 128 - - grub_uint64_t grub_rsdp_addr; - -@@ -32,6 +37,8 @@ static char hypercall_page[GRUB_XEN_PAGE_SIZE] - __attribute__ ((aligned (GRUB_XEN_PAGE_SIZE))); - - static grub_uint32_t xen_cpuid_base; -+static struct grub_e820_mmap_entry map[XEN_MEMORY_MAP_SIZE]; -+static unsigned int nr_map_entries; - - static void - grub_xen_cons_msg (const char *msg) -@@ -104,11 +111,98 @@ grub_xen_hypercall (grub_uint32_t callno, grub_uint32_t a0, - return res; - } - -+static void -+grub_xen_sort_mmap (void) -+{ -+ grub_uint64_t from, to; -+ unsigned int i; -+ struct grub_e820_mmap_entry tmp; -+ -+ /* Align map entries to page boundaries. */ -+ for (i = 0; i < nr_map_entries; i++) -+ { -+ from = map[i].addr; -+ to = from + map[i].len; -+ if (map[i].type == GRUB_MEMORY_AVAILABLE) -+ { -+ from = ALIGN_UP (from, GRUB_XEN_PAGE_SIZE); -+ to = ALIGN_DOWN (to, GRUB_XEN_PAGE_SIZE); -+ } -+ else -+ { -+ from = ALIGN_DOWN (from, GRUB_XEN_PAGE_SIZE); -+ to = ALIGN_UP (to, GRUB_XEN_PAGE_SIZE); -+ } -+ map[i].addr = from; -+ map[i].len = to - from; -+ } -+ -+ again: -+ /* Sort entries by start address. */ -+ for (i = 1; i < nr_map_entries; i++) -+ { -+ if (map[i].addr >= map[i - 1].addr) -+ continue; -+ tmp = map[i]; -+ map[i] = map[i - 1]; -+ map[i - 1] = tmp; -+ i = 0; -+ } -+ -+ /* Detect overlapping areas. */ -+ for (i = 1; i < nr_map_entries; i++) -+ { -+ if (map[i].addr >= map[i - 1].addr + map[i - 1].len) -+ continue; -+ tmp = map[i - 1]; -+ map[i - 1].len = map[i].addr - map[i - 1].addr; -+ if (map[i].addr + map[i].len >= tmp.addr + tmp.len) -+ continue; -+ if (nr_map_entries < ARRAY_SIZE (map)) -+ { -+ map[nr_map_entries].addr = map[i].addr + map[i].len; -+ map[nr_map_entries].len = tmp.addr + tmp.len - map[nr_map_entries].addr; -+ map[nr_map_entries].type = tmp.type; -+ nr_map_entries++; -+ goto again; -+ } -+ } -+ -+ /* Merge adjacent entries. */ -+ for (i = 1; i < nr_map_entries; i++) -+ { -+ if (map[i].type == map[i - 1].type && -+ map[i].addr == map[i - 1].addr + map[i - 1].len) -+ { -+ map[i - 1].len += map[i].len; -+ map[i] = map[nr_map_entries - 1]; -+ nr_map_entries--; -+ goto again; -+ } -+ } -+} -+ -+static void -+grub_xen_get_mmap (void) -+{ -+ struct xen_memory_map memmap; -+ -+ memmap.nr_entries = ARRAY_SIZE (map); -+ set_xen_guest_handle (memmap.buffer, map); -+ if (grub_xen_hypercall (__HYPERVISOR_memory_op, XENMEM_memory_map, -+ (grub_uint32_t) (&memmap), 0, 0, 0, 0)) -+ grub_xen_panic ("Could not get memory map from Xen!\n"); -+ nr_map_entries = memmap.nr_entries; -+ -+ grub_xen_sort_mmap (); -+} -+ - void - grub_xen_setup_pvh (void) - { - grub_xen_cpuid_base (); - grub_xen_setup_hypercall_page (); -+ grub_xen_get_mmap (); - } - - grub_err_t --- -2.21.0 - diff --git a/main/grub/0013-xen-Setup-Xen-specific-data-for-PVH.patch b/main/grub/0013-xen-Setup-Xen-specific-data-for-PVH.patch deleted file mode 100644 index 8559b6d73d..0000000000 --- a/main/grub/0013-xen-Setup-Xen-specific-data-for-PVH.patch +++ /dev/null @@ -1,194 +0,0 @@ -From 49ff2168260da6223ca90342d681d8b40909ae5b Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:41 +0100 -Subject: [PATCH 13/20] xen: Setup Xen specific data for PVH -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Initialize the needed Xen specific data. This is: - -- the Xen start of day page containing the console and Xenstore ring - page PFN and event channel -- the grant table -- the shared info page - -Write back the possibly modified memory map to the hypervisor in case -the guest is reading it from there again. - -Set the RSDP address for the guest from the start_info page passed -as boot parameter. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 4c9b4a7c92c9373315fd8b0f8f889275814bba41) ---- - grub-core/kern/i386/xen/pvh.c | 123 ++++++++++++++++++++++++++++++++++ - 1 file changed, 123 insertions(+) - -diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c -index 2b68ac333..472085ed1 100644 ---- a/grub-core/kern/i386/xen/pvh.c -+++ b/grub-core/kern/i386/xen/pvh.c -@@ -27,6 +27,7 @@ - #include <grub/i386/linux.h> - #include <grub/machine/kernel.h> - #include <grub/machine/memory.h> -+#include <xen/hvm/params.h> - #include <xen/memory.h> - - #define XEN_MEMORY_MAP_SIZE 128 -@@ -37,6 +38,7 @@ static char hypercall_page[GRUB_XEN_PAGE_SIZE] - __attribute__ ((aligned (GRUB_XEN_PAGE_SIZE))); - - static grub_uint32_t xen_cpuid_base; -+static struct start_info grub_xen_start_page; - static struct grub_e820_mmap_entry map[XEN_MEMORY_MAP_SIZE]; - static unsigned int nr_map_entries; - -@@ -111,6 +113,36 @@ grub_xen_hypercall (grub_uint32_t callno, grub_uint32_t a0, - return res; - } - -+static grub_uint32_t -+grub_xen_get_param (int idx) -+{ -+ struct xen_hvm_param xhv; -+ int r; -+ -+ xhv.domid = DOMID_SELF; -+ xhv.index = idx; -+ r = grub_xen_hypercall (__HYPERVISOR_hvm_op, HVMOP_get_param, -+ (grub_uint32_t) (&xhv), 0, 0, 0, 0); -+ if (r < 0) -+ grub_xen_panic ("Could not get parameter from Xen!\n"); -+ return xhv.value; -+} -+ -+static void * -+grub_xen_add_physmap (unsigned int space, void *addr) -+{ -+ struct xen_add_to_physmap xatp; -+ -+ xatp.domid = DOMID_SELF; -+ xatp.idx = 0; -+ xatp.space = space; -+ xatp.gpfn = (grub_addr_t) addr >> GRUB_XEN_LOG_PAGE_SIZE; -+ if (grub_xen_hypercall (__HYPERVISOR_memory_op, XENMEM_add_to_physmap, -+ (grub_uint32_t) (&xatp), 0, 0, 0, 0)) -+ grub_xen_panic ("Memory_op hypercall failed!\n"); -+ return addr; -+} -+ - static void - grub_xen_sort_mmap (void) - { -@@ -197,12 +229,103 @@ grub_xen_get_mmap (void) - grub_xen_sort_mmap (); - } - -+static void -+grub_xen_set_mmap (void) -+{ -+ struct xen_foreign_memory_map memmap; -+ -+ memmap.domid = DOMID_SELF; -+ memmap.map.nr_entries = nr_map_entries; -+ set_xen_guest_handle (memmap.map.buffer, map); -+ grub_xen_hypercall (__HYPERVISOR_memory_op, XENMEM_set_memory_map, -+ (grub_uint32_t) (&memmap), 0, 0, 0, 0); -+} -+ -+static grub_uint64_t -+grub_xen_find_page (grub_uint64_t start) -+{ -+ unsigned int i, j; -+ grub_uint64_t last = start; -+ -+ /* -+ * Try to find a e820 map hole below 4G. -+ * Relies on page-aligned entries (addr and len) and input (start). -+ */ -+ -+ for (i = 0; i < nr_map_entries; i++) -+ { -+ if (last > map[i].addr + map[i].len) -+ continue; -+ if (last < map[i].addr) -+ return last; -+ if ((map[i].addr >> 32) || ((map[i].addr + map[i].len) >> 32)) -+ break; -+ last = map[i].addr + map[i].len; -+ } -+ if (i == nr_map_entries) -+ return last; -+ -+ /* No hole found, use the highest RAM page below 4G and reserve it. */ -+ if (nr_map_entries == ARRAY_SIZE (map)) -+ grub_xen_panic ("Memory map size limit reached!\n"); -+ for (i = 0, j = 0; i < nr_map_entries; i++) -+ { -+ if (map[i].type != GRUB_MEMORY_AVAILABLE) -+ continue; -+ if (map[i].addr >> 32) -+ break; -+ j = i; -+ if ((map[i].addr + map[i].len) >> 32) -+ break; -+ } -+ if (map[j].type != GRUB_MEMORY_AVAILABLE) -+ grub_xen_panic ("No free memory page found!\n"); -+ if ((map[j].addr + map[j].len) >> 32) -+ last = (1ULL << 32) - GRUB_XEN_PAGE_SIZE; -+ else -+ last = map[j].addr + map[j].len - GRUB_XEN_PAGE_SIZE; -+ map[nr_map_entries].addr = last; -+ map[nr_map_entries].len = GRUB_XEN_PAGE_SIZE; -+ map[nr_map_entries].type = GRUB_MEMORY_RESERVED; -+ nr_map_entries++; -+ grub_xen_sort_mmap (); -+ -+ return last; -+} -+ - void - grub_xen_setup_pvh (void) - { -+ grub_addr_t par; -+ - grub_xen_cpuid_base (); - grub_xen_setup_hypercall_page (); - grub_xen_get_mmap (); -+ -+ /* Setup Xen data. */ -+ grub_xen_start_page_addr = &grub_xen_start_page; -+ -+ par = grub_xen_get_param (HVM_PARAM_CONSOLE_PFN); -+ grub_xen_start_page_addr->console.domU.mfn = par; -+ grub_xen_xcons = (void *) (grub_addr_t) (par << GRUB_XEN_LOG_PAGE_SIZE); -+ par = grub_xen_get_param (HVM_PARAM_CONSOLE_EVTCHN); -+ grub_xen_start_page_addr->console.domU.evtchn = par; -+ -+ par = grub_xen_get_param (HVM_PARAM_STORE_PFN); -+ grub_xen_start_page_addr->store_mfn = par; -+ grub_xen_xenstore = (void *) (grub_addr_t) (par << GRUB_XEN_LOG_PAGE_SIZE); -+ par = grub_xen_get_param (HVM_PARAM_STORE_EVTCHN); -+ grub_xen_start_page_addr->store_evtchn = par; -+ -+ par = grub_xen_find_page (0); -+ grub_xen_grant_table = grub_xen_add_physmap (XENMAPSPACE_grant_table, -+ (void *) par); -+ par = grub_xen_find_page (par + GRUB_XEN_PAGE_SIZE); -+ grub_xen_shared_info = grub_xen_add_physmap (XENMAPSPACE_shared_info, -+ (void *) par); -+ grub_xen_set_mmap (); -+ -+ grub_rsdp_addr = pvh_start_info->rsdp_paddr; - } - - grub_err_t --- -2.21.0 - diff --git a/main/grub/0014-xen-Init-memory-regions-for-PVH.patch b/main/grub/0014-xen-Init-memory-regions-for-PVH.patch deleted file mode 100644 index 3476868ea2..0000000000 --- a/main/grub/0014-xen-Init-memory-regions-for-PVH.patch +++ /dev/null @@ -1,79 +0,0 @@ -From c411fd781843b50bfb00b83dd039cdf8eb93d2f6 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:42 +0100 -Subject: [PATCH 14/20] xen: Init memory regions for PVH - -Add all usable memory regions to grub memory management and add the -needed mmap iterate code, which will be used by grub core (e.g. -grub-core/lib/relocator.c or grub-core/mmap/mmap.c). - -As we are running in 32-bit mode don't add memory above 4GB. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 1d2473a024a9e1f46a7caa75d5c8186ed2cdb6e1) ---- - grub-core/kern/i386/xen/pvh.c | 35 +++++++++++++++++++++++++++++++++++ - 1 file changed, 35 insertions(+) - -diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c -index 472085ed1..91fbca859 100644 ---- a/grub-core/kern/i386/xen/pvh.c -+++ b/grub-core/kern/i386/xen/pvh.c -@@ -241,6 +241,30 @@ grub_xen_set_mmap (void) - (grub_uint32_t) (&memmap), 0, 0, 0, 0); - } - -+static void -+grub_xen_mm_init_regions (void) -+{ -+ grub_uint64_t modend, from, to; -+ unsigned int i; -+ -+ modend = grub_modules_get_end (); -+ -+ for (i = 0; i < nr_map_entries; i++) -+ { -+ if (map[i].type != GRUB_MEMORY_AVAILABLE) -+ continue; -+ from = map[i].addr; -+ to = from + map[i].len; -+ if (from < modend) -+ from = modend; -+ if (from >= to || from >= (1ULL << 32)) -+ continue; -+ if (to > (1ULL << 32)) -+ to = 1ULL << 32; -+ grub_mm_init_region ((void *) (grub_addr_t) from, to - from); -+ } -+} -+ - static grub_uint64_t - grub_xen_find_page (grub_uint64_t start) - { -@@ -325,10 +349,21 @@ grub_xen_setup_pvh (void) - (void *) par); - grub_xen_set_mmap (); - -+ grub_xen_mm_init_regions (); -+ - grub_rsdp_addr = pvh_start_info->rsdp_paddr; - } - - grub_err_t - grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data) - { -+ unsigned int i; -+ -+ for (i = 0; i < nr_map_entries; i++) -+ { -+ if (map[i].len && hook (map[i].addr, map[i].len, map[i].type, hook_data)) -+ break; -+ } -+ -+ return GRUB_ERR_NONE; - } --- -2.21.0 - diff --git a/main/grub/0015-xen_pvh-Add-build-runes-for-grub-core.patch b/main/grub/0015-xen_pvh-Add-build-runes-for-grub-core.patch deleted file mode 100644 index 9fb4d5253c..0000000000 --- a/main/grub/0015-xen_pvh-Add-build-runes-for-grub-core.patch +++ /dev/null @@ -1,245 +0,0 @@ -From 5b988dcabbab55b6a0c71dab2dad798ff2224d11 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:43 +0100 -Subject: [PATCH 15/20] xen_pvh: Add build runes for grub-core - -Add the modifications to the build system needed to build a xen_pvh -grub. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 9c062ad42c32a42b677da4b066cb33debf1dfe30) ---- - gentpl.py | 4 ++-- - grub-core/Makefile.am | 12 ++++++++++++ - grub-core/Makefile.core.def | 35 +++++++++++++++++++++++++++++++++++ - 3 files changed, 49 insertions(+), 2 deletions(-) - -diff --git a/gentpl.py b/gentpl.py -index f08bcc404..24d890895 100644 ---- a/gentpl.py -+++ b/gentpl.py -@@ -28,7 +28,7 @@ import re - - GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", - "i386_multiboot", "i386_ieee1275", "x86_64_efi", -- "i386_xen", "x86_64_xen", -+ "i386_xen", "x86_64_xen", "i386_xen_pvh", - "mips_loongson", "sparc64_ieee1275", - "powerpc_ieee1275", "mips_arc", "ia64_efi", - "mips_qemu_mips", "arm_uboot", "arm_efi", "arm64_efi" ] -@@ -69,7 +69,7 @@ GROUPS["videomodules"] = GRUB_PLATFORMS[:]; - for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i) - - # Similar for terminfo --GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"]; -+GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips", "i386_xen_pvh" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"]; - GROUPS["terminfomodule"] = GRUB_PLATFORMS[:]; - for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i) - -diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index e36c109e2..06f620a87 100644 ---- a/grub-core/Makefile.am -+++ b/grub-core/Makefile.am -@@ -101,6 +101,18 @@ KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h - endif - -+if COND_i386_xen_pvh -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h -+endif -+ - if COND_i386_efi - KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h -diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 2dfa22a92..391ace18e 100644 ---- a/grub-core/Makefile.core.def -+++ b/grub-core/Makefile.core.def -@@ -79,6 +79,8 @@ kernel = { - i386_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0'; - x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)'; - x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0'; -+ i386_xen_pvh_ldflags = '$(TARGET_IMG_LDFLAGS)'; -+ i386_xen_pvh_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x100000'; - - mips_loongson_ldflags = '-Wl,-Ttext,0x80200000'; - powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000'; -@@ -98,6 +100,7 @@ kernel = { - x86_64_efi_startup = kern/x86_64/efi/startup.S; - i386_xen_startup = kern/i386/xen/startup.S; - x86_64_xen_startup = kern/x86_64/xen/startup.S; -+ i386_xen_pvh_startup = kern/i386/xen/startup_pvh.S; - i386_qemu_startup = kern/i386/qemu/startup.S; - i386_ieee1275_startup = kern/i386/ieee1275/startup.S; - i386_coreboot_startup = kern/i386/coreboot/startup.S; -@@ -159,6 +162,7 @@ kernel = { - - i386 = kern/i386/dl.c; - i386_xen = kern/i386/dl.c; -+ i386_xen_pvh = kern/i386/dl.c; - - i386_coreboot = kern/i386/coreboot/init.c; - i386_multiboot = kern/i386/coreboot/init.c; -@@ -204,6 +208,14 @@ kernel = { - xen = disk/xen/xendisk.c; - xen = commands/boot.c; - -+ i386_xen_pvh = commands/boot.c; -+ i386_xen_pvh = disk/xen/xendisk.c; -+ i386_xen_pvh = kern/i386/tsc.c; -+ i386_xen_pvh = kern/i386/xen/tsc.c; -+ i386_xen_pvh = kern/i386/xen/pvh.c; -+ i386_xen_pvh = kern/xen/init.c; -+ i386_xen_pvh = term/xen/console.c; -+ - ia64_efi = kern/ia64/efi/startup.S; - ia64_efi = kern/ia64/efi/init.c; - ia64_efi = kern/ia64/dl.c; -@@ -775,6 +787,7 @@ module = { - name = cpuid; - common = commands/i386/cpuid.c; - enable = x86; -+ enable = i386_xen_pvh; - enable = i386_xen; - enable = x86_64_xen; - }; -@@ -834,6 +847,7 @@ module = { - i386_coreboot = lib/i386/halt.c; - i386_qemu = lib/i386/halt.c; - xen = lib/xen/halt.c; -+ i386_xen_pvh = lib/xen/halt.c; - efi = lib/efi/halt.c; - ieee1275 = lib/ieee1275/halt.c; - emu = lib/emu/halt.c; -@@ -854,6 +868,7 @@ module = { - mips_loongson = lib/mips/loongson/reboot.c; - mips_qemu_mips = lib/mips/qemu_mips/reboot.c; - xen = lib/xen/reboot.c; -+ i386_xen_pvh = lib/xen/reboot.c; - uboot = lib/uboot/reboot.c; - common = commands/reboot.c; - }; -@@ -1517,12 +1532,18 @@ module = { - x86 = lib/i386/relocator16.S; - x86 = lib/i386/relocator32.S; - x86 = lib/i386/relocator64.S; -+ i386_xen_pvh = lib/i386/relocator16.S; -+ i386_xen_pvh = lib/i386/relocator32.S; -+ i386_xen_pvh = lib/i386/relocator64.S; - i386 = lib/i386/relocator_asm.S; -+ i386_xen_pvh = lib/i386/relocator_asm.S; - x86_64 = lib/x86_64/relocator_asm.S; - i386_xen = lib/i386/relocator_asm.S; - x86_64_xen = lib/x86_64/relocator_asm.S; - x86 = lib/i386/relocator.c; - x86 = lib/i386/relocator_common_c.c; -+ i386_xen_pvh = lib/i386/relocator.c; -+ i386_xen_pvh = lib/i386/relocator_common_c.c; - ieee1275 = lib/ieee1275/relocator.c; - efi = lib/efi/relocator.c; - mips = lib/mips/relocator_asm.S; -@@ -1541,6 +1562,7 @@ module = { - enable = mips; - enable = powerpc; - enable = x86; -+ enable = i386_xen_pvh; - enable = xen; - }; - -@@ -1554,6 +1576,7 @@ module = { - sparc64_ieee1275 = lib/ieee1275/cmos.c; - powerpc_ieee1275 = lib/ieee1275/cmos.c; - xen = lib/xen/datetime.c; -+ i386_xen_pvh = lib/xen/datetime.c; - - mips_arc = lib/arc/datetime.c; - enable = noemu; -@@ -1640,6 +1663,7 @@ module = { - common = lib/cmdline.c; - common = loader/multiboot_mbi2.c; - enable = x86; -+ enable = i386_xen_pvh; - enable = mips; - }; - -@@ -1648,8 +1672,10 @@ module = { - common = loader/multiboot.c; - common = lib/cmdline.c; - x86 = loader/i386/multiboot_mbi.c; -+ i386_xen_pvh = loader/i386/multiboot_mbi.c; - extra_dist = loader/multiboot_elfxx.c; - enable = x86; -+ enable = i386_xen_pvh; - }; - - module = { -@@ -1662,8 +1688,10 @@ module = { - module = { - name = linux; - x86 = loader/i386/linux.c; -+ i386_xen_pvh = loader/i386/linux.c; - xen = loader/i386/xen.c; - i386_pc = lib/i386/pc/vesa_modes_table.c; -+ i386_xen_pvh = lib/i386/pc/vesa_modes_table.c; - mips = loader/mips/linux.c; - powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c; - sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c; -@@ -1749,6 +1777,8 @@ module = { - common = mmap/mmap.c; - x86 = mmap/i386/uppermem.c; - x86 = mmap/i386/mmap.c; -+ i386_xen_pvh = mmap/i386/uppermem.c; -+ i386_xen_pvh = mmap/i386/mmap.c; - - i386_pc = mmap/i386/pc/mmap.c; - i386_pc = mmap/i386/pc/mmap_helper.S; -@@ -1758,6 +1788,7 @@ module = { - mips = mmap/mips/uppermem.c; - - enable = x86; -+ enable = i386_xen_pvh; - enable = ia64_efi; - enable = arm_efi; - enable = arm64_efi; -@@ -1991,6 +2022,7 @@ module = { - name = legacy_password_test; - common = tests/legacy_password_test.c; - enable = i386_pc; -+ enable = i386_xen_pvh; - enable = i386_efi; - enable = x86_64_efi; - enable = emu; -@@ -2189,6 +2221,7 @@ module = { - xen = lib/i386/pc/vesa_modes_table.c; - - enable = i386_pc; -+ enable = i386_xen_pvh; - enable = i386_efi; - enable = x86_64_efi; - enable = emu; -@@ -2232,10 +2265,12 @@ module = { - module = { - name = backtrace; - x86 = lib/i386/backtrace.c; -+ i386_xen_pvh = lib/i386/backtrace.c; - i386_xen = lib/i386/backtrace.c; - x86_64_xen = lib/i386/backtrace.c; - common = lib/backtrace.c; - enable = x86; -+ enable = i386_xen_pvh; - enable = i386_xen; - enable = x86_64_xen; - }; --- -2.21.0 - diff --git a/main/grub/0016-grub-module-verifier-Ignore-all_video-for-xen_pvh.patch b/main/grub/0016-grub-module-verifier-Ignore-all_video-for-xen_pvh.patch deleted file mode 100644 index 9a0e52dfb0..0000000000 --- a/main/grub/0016-grub-module-verifier-Ignore-all_video-for-xen_pvh.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 98b8fb8b1e8baf5573adf31aca9d64aab0a86e67 Mon Sep 17 00:00:00 2001 -From: Hans van Kranenburg <hans@knorrie.org> -Date: Fri, 7 Dec 2018 13:11:44 +0100 -Subject: [PATCH 16/20] grub-module-verifier: Ignore all_video for xen_pvh - -This solves the build failing with "Error: no symbol table and no -.moddeps section" - -Also see: -- 6371e9c10433578bb236a8284ddb9ce9e201eb59 -- https://savannah.gnu.org/bugs/?49012 - -Signed-off-by: Hans van Kranenburg <hans@knorrie.org> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit a40b219e269ac407c10a569ce6b0c5d7f419d127) ---- - util/grub-module-verifier.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c -index 9179285a5..968eb135d 100644 ---- a/util/grub-module-verifier.c -+++ b/util/grub-module-verifier.c -@@ -128,6 +128,7 @@ struct platform_whitelist { - - static struct platform_whitelist whitelists[] = { - {"i386", "xen", (const char *[]) {"all_video", 0}}, -+ {"i386", "xen_pvh", (const char *[]) {"all_video", 0}}, - {"x86_64", "xen", (const char *[]) {"all_video", 0}}, - {"sparc64", "ieee1275", (const char *[]) {"all_video", 0}}, - --- -2.21.0 - diff --git a/main/grub/0017-xen-Use-elfnote-defines-instead-of-plain-numbers.patch b/main/grub/0017-xen-Use-elfnote-defines-instead-of-plain-numbers.patch deleted file mode 100644 index eff71cf901..0000000000 --- a/main/grub/0017-xen-Use-elfnote-defines-instead-of-plain-numbers.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 688cab35a913ba61f39439f6071381bc3201fcda Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:45 +0100 -Subject: [PATCH 17/20] xen: Use elfnote defines instead of plain numbers - -In order to avoid using plain integers for the ELF notes use the -available Xen include instead. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 9bce25213a44553c71527776f65fabc3b729c2f3) ---- - util/grub-mkimagexx.c | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) - -diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c -index e63f148e4..e7b8cf161 100644 ---- a/util/grub-mkimagexx.c -+++ b/util/grub-mkimagexx.c -@@ -48,6 +48,8 @@ - #include <grub/util/install.h> - #include <grub/util/mkimage.h> - -+#include <xen/elfnote.h> -+ - #pragma GCC diagnostic ignored "-Wcast-align" - - /* These structures are defined according to the CHRP binding to IEEE1275, -@@ -312,7 +314,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - note_ptr = (Elf_Nhdr *) ptr; - note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME)); - note_ptr->n_descsz = grub_host_to_target32 (sizeof (PACKAGE_NAME)); -- note_ptr->n_type = grub_host_to_target32 (6); -+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_GUEST_OS); - ptr += sizeof (Elf_Nhdr); - memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME)); - ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4); -@@ -323,7 +325,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - note_ptr = (Elf_Nhdr *) ptr; - note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME)); - note_ptr->n_descsz = grub_host_to_target32 (sizeof ("generic")); -- note_ptr->n_type = grub_host_to_target32 (8); -+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_LOADER); - ptr += sizeof (Elf_Nhdr); - memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME)); - ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4); -@@ -334,7 +336,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - note_ptr = (Elf_Nhdr *) ptr; - note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME)); - note_ptr->n_descsz = grub_host_to_target32 (sizeof ("xen-3.0")); -- note_ptr->n_type = grub_host_to_target32 (5); -+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_XEN_VERSION); - ptr += sizeof (Elf_Nhdr); - memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME)); - ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4); -@@ -345,7 +347,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - note_ptr = (Elf_Nhdr *) ptr; - note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME)); - note_ptr->n_descsz = grub_host_to_target32 (image_target->voidp_sizeof); -- note_ptr->n_type = grub_host_to_target32 (1); -+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_ENTRY); - ptr += sizeof (Elf_Nhdr); - memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME)); - ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4); -@@ -356,7 +358,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - note_ptr = (Elf_Nhdr *) ptr; - note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME)); - note_ptr->n_descsz = grub_host_to_target32 (image_target->voidp_sizeof); -- note_ptr->n_type = grub_host_to_target32 (3); -+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_VIRT_BASE); - ptr += sizeof (Elf_Nhdr); - memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME)); - ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4); -@@ -369,7 +371,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - note_ptr = (Elf_Nhdr *) ptr; - note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME)); - note_ptr->n_descsz = grub_host_to_target32 (sizeof ("yes,bimodal")); -- note_ptr->n_type = grub_host_to_target32 (9); -+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_PAE_MODE); - ptr += sizeof (Elf_Nhdr); - memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME)); - ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4); --- -2.21.0 - diff --git a/main/grub/0018-xen_pvh-Support-building-a-standalone-image.patch b/main/grub/0018-xen_pvh-Support-building-a-standalone-image.patch deleted file mode 100644 index 1d1b43f33d..0000000000 --- a/main/grub/0018-xen_pvh-Support-building-a-standalone-image.patch +++ /dev/null @@ -1,199 +0,0 @@ -From f8edde763ef26a2eb9cab40998d97e8bc50bf7ef Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:46 +0100 -Subject: [PATCH 18/20] xen_pvh: Support building a standalone image - -Support mkimage for xen_pvh. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 78899c42d74d638a48c9b3f0f25f39445b3c1d4c) ---- - include/grub/util/mkimage.h | 3 ++- - util/grub-mkimage32.c | 4 +++- - util/grub-mkimage64.c | 4 +++- - util/grub-mkimagexx.c | 44 +++++++++++++++++++++++++++++++++---- - util/mkimage.c | 23 ++++++++++++++++++- - 5 files changed, 70 insertions(+), 8 deletions(-) - -diff --git a/include/grub/util/mkimage.h b/include/grub/util/mkimage.h -index 1a18708a8..776c58581 100644 ---- a/include/grub/util/mkimage.h -+++ b/include/grub/util/mkimage.h -@@ -71,7 +71,8 @@ struct grub_install_image_target_desc - IMAGE_I386_IEEE1275, - IMAGE_LOONGSON_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH, - IMAGE_FULOONG2F_FLASH, IMAGE_I386_PC_PXE, IMAGE_MIPS_ARC, -- IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO -+ IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO, -+ IMAGE_XEN_PVH - } id; - enum - { -diff --git a/util/grub-mkimage32.c b/util/grub-mkimage32.c -index 9b31397bc..b2a4be7e6 100644 ---- a/util/grub-mkimage32.c -+++ b/util/grub-mkimage32.c -@@ -17,6 +17,8 @@ - # define ELF_R_SYM(val) ELF32_R_SYM(val) - # define ELF_R_TYPE(val) ELF32_R_TYPE(val) - # define ELF_ST_TYPE(val) ELF32_ST_TYPE(val) --#define XEN_NOTE_SIZE 132 -+ -+#define XEN_NOTE_SIZE 132 -+#define XEN_PVH_NOTE_SIZE 20 - - #include "grub-mkimagexx.c" -diff --git a/util/grub-mkimage64.c b/util/grub-mkimage64.c -index d83345924..aef033743 100644 ---- a/util/grub-mkimage64.c -+++ b/util/grub-mkimage64.c -@@ -17,6 +17,8 @@ - # define ELF_R_SYM(val) ELF64_R_SYM(val) - # define ELF_R_TYPE(val) ELF64_R_TYPE(val) - # define ELF_ST_TYPE(val) ELF64_ST_TYPE(val) --#define XEN_NOTE_SIZE 120 -+ -+#define XEN_NOTE_SIZE 120 -+#define XEN_PVH_NOTE_SIZE 24 - - #include "grub-mkimagexx.c" -diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c -index e7b8cf161..bf8f9bf9c 100644 ---- a/util/grub-mkimagexx.c -+++ b/util/grub-mkimagexx.c -@@ -208,12 +208,12 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - phnum++; - footer_size += sizeof (struct grub_ieee1275_note); - } -- if (image_target->id == IMAGE_XEN) -+ if (image_target->id == IMAGE_XEN || image_target->id == IMAGE_XEN_PVH) - { - phnum++; - shnum++; - string_size += sizeof (".xen"); -- footer_size += XEN_NOTE_SIZE; -+ footer_size += (image_target->id == IMAGE_XEN) ? XEN_NOTE_SIZE : XEN_PVH_NOTE_SIZE; - } - header_size = ALIGN_UP (sizeof (*ehdr) + phnum * sizeof (*phdr) - + shnum * sizeof (*shdr) + string_size, align); -@@ -392,6 +392,39 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - phdr->p_offset = grub_host_to_target32 (header_size + program_size); - } - -+ if (image_target->id == IMAGE_XEN_PVH) -+ { -+ char *note_start = (elf_img + program_size + header_size); -+ Elf_Nhdr *note_ptr; -+ char *ptr = (char *) note_start; -+ -+ grub_util_info ("adding XEN NOTE segment"); -+ -+ /* Phys32 Entry. */ -+ note_ptr = (Elf_Nhdr *) ptr; -+ note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME)); -+ note_ptr->n_descsz = grub_host_to_target32 (image_target->voidp_sizeof); -+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_PHYS32_ENTRY); -+ ptr += sizeof (Elf_Nhdr); -+ memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME)); -+ ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4); -+ memset (ptr, 0, image_target->voidp_sizeof); -+ *(grub_uint32_t *) ptr = GRUB_KERNEL_I386_XEN_PVH_LINK_ADDR; -+ ptr += image_target->voidp_sizeof; -+ -+ assert (XEN_PVH_NOTE_SIZE == (ptr - note_start)); -+ -+ phdr++; -+ phdr->p_type = grub_host_to_target32 (PT_NOTE); -+ phdr->p_flags = grub_host_to_target32 (PF_R); -+ phdr->p_align = grub_host_to_target32 (image_target->voidp_sizeof); -+ phdr->p_vaddr = 0; -+ phdr->p_paddr = 0; -+ phdr->p_filesz = grub_host_to_target32 (XEN_PVH_NOTE_SIZE); -+ phdr->p_memsz = 0; -+ phdr->p_offset = grub_host_to_target32 (header_size + program_size); -+ } -+ - if (note) - { - int note_size = sizeof (struct grub_ieee1275_note); -@@ -467,7 +500,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - shdr->sh_entsize = grub_host_to_target32 (0); - shdr++; - -- if (image_target->id == IMAGE_XEN) -+ if (image_target->id == IMAGE_XEN || image_target->id == IMAGE_XEN_PVH) - { - memcpy (ptr, ".xen", sizeof (".xen")); - shdr->sh_name = grub_host_to_target32 (ptr - str_start); -@@ -475,7 +508,10 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - shdr->sh_type = grub_host_to_target32 (SHT_PROGBITS); - shdr->sh_addr = grub_host_to_target_addr (target_addr + kernel_size); - shdr->sh_offset = grub_host_to_target_addr (program_size + header_size); -- shdr->sh_size = grub_host_to_target32 (XEN_NOTE_SIZE); -+ if (image_target->id == IMAGE_XEN) -+ shdr->sh_size = grub_host_to_target32 (XEN_NOTE_SIZE); -+ else -+ shdr->sh_size = grub_host_to_target32 (XEN_PVH_NOTE_SIZE); - shdr->sh_link = grub_host_to_target32 (0); - shdr->sh_info = grub_host_to_target32 (0); - shdr->sh_addralign = grub_host_to_target32 (image_target->voidp_sizeof); -diff --git a/util/mkimage.c b/util/mkimage.c -index 9ad4cfe42..c3bd23479 100644 ---- a/util/mkimage.c -+++ b/util/mkimage.c -@@ -132,6 +132,24 @@ static const struct grub_install_image_target_desc image_targets[] = - .link_addr = GRUB_KERNEL_I386_PC_LINK_ADDR, - .default_compression = GRUB_COMPRESSION_LZMA - }, -+ { -+ .dirname = "i386-xen_pvh", -+ .names = { "i386-xen_pvh", NULL }, -+ .voidp_sizeof = 4, -+ .bigendian = 0, -+ .id = IMAGE_XEN_PVH, -+ .flags = PLATFORM_FLAGS_NONE, -+ .total_module_size = TARGET_NO_FIELD, -+ .decompressor_compressed_size = TARGET_NO_FIELD, -+ .decompressor_uncompressed_size = TARGET_NO_FIELD, -+ .decompressor_uncompressed_addr = TARGET_NO_FIELD, -+ .elf_target = EM_386, -+ .section_align = 1, -+ .vaddr_offset = 0, -+ .link_addr = GRUB_KERNEL_I386_XEN_PVH_LINK_ADDR, -+ .mod_align = GRUB_KERNEL_I386_XEN_PVH_MOD_ALIGN, -+ .link_align = 4 -+ }, - { - .dirname = "i386-pc", - .names = { "i386-pc-pxe", NULL }, -@@ -816,7 +834,8 @@ grub_install_generate_image (const char *dir, const char *prefix, - else - kernel_img = grub_mkimage_load_image64 (kernel_path, total_module_size, - &layout, image_target); -- if (image_target->id == IMAGE_XEN && layout.align < 4096) -+ if ((image_target->id == IMAGE_XEN || image_target->id == IMAGE_XEN_PVH) && -+ layout.align < 4096) - layout.align = 4096; - - if ((image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS) -@@ -1046,6 +1065,7 @@ grub_install_generate_image (const char *dir, const char *prefix, - case IMAGE_MIPS_ARC: - case IMAGE_QEMU_MIPS_FLASH: - case IMAGE_XEN: -+ case IMAGE_XEN_PVH: - break; - case IMAGE_SPARC64_AOUT: - case IMAGE_SPARC64_RAW: -@@ -1622,6 +1642,7 @@ grub_install_generate_image (const char *dir, const char *prefix, - case IMAGE_LOONGSON_ELF: - case IMAGE_PPC: - case IMAGE_XEN: -+ case IMAGE_XEN_PVH: - case IMAGE_COREBOOT: - case IMAGE_I386_IEEE1275: - { --- -2.21.0 - diff --git a/main/grub/0019-xen_pvh-Support-grub-install-for-xen_pvh.patch b/main/grub/0019-xen_pvh-Support-grub-install-for-xen_pvh.patch deleted file mode 100644 index 0eb9fc4caa..0000000000 --- a/main/grub/0019-xen_pvh-Support-grub-install-for-xen_pvh.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 733c4c99b6cf66fe0413e1baa84400bd00663e8b Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:47 +0100 -Subject: [PATCH 19/20] xen_pvh: Support grub-install for xen_pvh - -Add xen_pvh support to grub-install. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit 90b7b14fa5293c83c0645bfdcf4ef0cdac230d09) ---- - include/grub/util/install.h | 1 + - util/grub-install-common.c | 1 + - util/grub-install.c | 7 +++++++ - 3 files changed, 9 insertions(+) - -diff --git a/include/grub/util/install.h b/include/grub/util/install.h -index 5ca4811cd..eafb3c360 100644 ---- a/include/grub/util/install.h -+++ b/include/grub/util/install.h -@@ -98,6 +98,7 @@ enum grub_install_plat - GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS, - GRUB_INSTALL_PLATFORM_I386_XEN, - GRUB_INSTALL_PLATFORM_X86_64_XEN, -+ GRUB_INSTALL_PLATFORM_I386_XEN_PVH, - GRUB_INSTALL_PLATFORM_ARM64_EFI, - GRUB_INSTALL_PLATFORM_MAX - }; -diff --git a/util/grub-install-common.c b/util/grub-install-common.c -index 452b230da..e4a3bb5cb 100644 ---- a/util/grub-install-common.c -+++ b/util/grub-install-common.c -@@ -655,6 +655,7 @@ static struct - [GRUB_INSTALL_PLATFORM_X86_64_EFI] = { "x86_64", "efi" }, - [GRUB_INSTALL_PLATFORM_I386_XEN] = { "i386", "xen" }, - [GRUB_INSTALL_PLATFORM_X86_64_XEN] = { "x86_64", "xen" }, -+ [GRUB_INSTALL_PLATFORM_I386_XEN_PVH] = { "i386", "xen_pvh" }, - [GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON] = { "mipsel", "loongson" }, - [GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS] = { "mipsel", "qemu_mips" }, - [GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS] = { "mips", "qemu_mips" }, -diff --git a/util/grub-install.c b/util/grub-install.c -index 9074d3e9e..454d97835 100644 ---- a/util/grub-install.c -+++ b/util/grub-install.c -@@ -495,6 +495,7 @@ have_bootdev (enum grub_install_plat pl) - - case GRUB_INSTALL_PLATFORM_I386_XEN: - case GRUB_INSTALL_PLATFORM_X86_64_XEN: -+ case GRUB_INSTALL_PLATFORM_I386_XEN_PVH: - return 0; - - /* pacify warning. */ -@@ -907,6 +908,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_ARM_UBOOT: - case GRUB_INSTALL_PLATFORM_I386_XEN: - case GRUB_INSTALL_PLATFORM_X86_64_XEN: -+ case GRUB_INSTALL_PLATFORM_I386_XEN_PVH: - break; - - case GRUB_INSTALL_PLATFORM_I386_QEMU: -@@ -952,6 +954,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS: - case GRUB_INSTALL_PLATFORM_I386_XEN: - case GRUB_INSTALL_PLATFORM_X86_64_XEN: -+ case GRUB_INSTALL_PLATFORM_I386_XEN_PVH: - free (install_device); - install_device = NULL; - break; -@@ -1458,6 +1461,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_ARM_UBOOT: - case GRUB_INSTALL_PLATFORM_I386_XEN: - case GRUB_INSTALL_PLATFORM_X86_64_XEN: -+ case GRUB_INSTALL_PLATFORM_I386_XEN_PVH: - grub_util_warn ("%s", _("no hints available for your platform. Expect reduced performance")); - break; - /* pacify warning. */ -@@ -1547,6 +1551,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275: - case GRUB_INSTALL_PLATFORM_I386_XEN: - case GRUB_INSTALL_PLATFORM_X86_64_XEN: -+ case GRUB_INSTALL_PLATFORM_I386_XEN_PVH: - core_name = "core.elf"; - snprintf (mkimage_target, sizeof (mkimage_target), - "%s-%s", -@@ -1638,6 +1643,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275: - case GRUB_INSTALL_PLATFORM_I386_XEN: - case GRUB_INSTALL_PLATFORM_X86_64_XEN: -+ case GRUB_INSTALL_PLATFORM_I386_XEN_PVH: - break; - /* pacify warning. */ - case GRUB_INSTALL_PLATFORM_MAX: -@@ -1895,6 +1901,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_I386_QEMU: - case GRUB_INSTALL_PLATFORM_I386_XEN: - case GRUB_INSTALL_PLATFORM_X86_64_XEN: -+ case GRUB_INSTALL_PLATFORM_I386_XEN_PVH: - grub_util_warn ("%s", - _("WARNING: no platform-specific install was performed")); - break; --- -2.21.0 - diff --git a/main/grub/0020-xen_pvh-Add-support-to-configure.patch b/main/grub/0020-xen_pvh-Add-support-to-configure.patch deleted file mode 100644 index 29059700b0..0000000000 --- a/main/grub/0020-xen_pvh-Add-support-to-configure.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 7dbb1b71c029f192273c46589d5b28f390929618 Mon Sep 17 00:00:00 2001 -From: Juergen Gross <jgross@suse.com> -Date: Fri, 7 Dec 2018 13:11:48 +0100 -Subject: [PATCH 20/20] xen_pvh: Add support to configure - -Support platform i386/xen_pvh in configure. - -Signed-off-by: Juergen Gross <jgross@suse.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> -Tested-by: Hans van Kranenburg <hans@knorrie.org> -(cherry picked from commit d789e70e26340bd35b36d595a948dbc399b9ffba) ---- - configure.ac | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/configure.ac b/configure.ac -index edd184154..ad1903e66 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -147,6 +147,7 @@ case "$target_cpu"-"$platform" in - i386-efi) ;; - x86_64-efi) ;; - i386-xen) ;; -+ i386-xen_pvh) ;; - x86_64-xen) ;; - i386-pc) ;; - i386-multiboot) ;; -@@ -213,6 +214,7 @@ case "$platform" in - multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;; - efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;; - xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;; -+ xen_pvh) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN_PVH=1" ;; - ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;; - uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;; - qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;; -@@ -1893,6 +1895,7 @@ AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = - AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot]) - AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi]) - AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen]) -+AM_CONDITIONAL([COND_i386_xen_pvh], [test x$target_cpu = xi386 -a x$platform = xxen_pvh]) - AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen]) - AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson]) - AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips]) --- -2.21.0 - diff --git a/main/grub/2.02_beta3-mkconfig-alpine.patch b/main/grub/2.02_beta3-mkconfig-alpine.patch deleted file mode 100644 index 7472d410a9..0000000000 --- a/main/grub/2.02_beta3-mkconfig-alpine.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index de9044c..60f36be 100644 ---- a/util/grub.d/10_linux.in -+++ b/util/grub.d/10_linux.in -@@ -21,8 +21,13 @@ prefix="@prefix@" - exec_prefix="@exec_prefix@" - datarootdir="@datarootdir@" - -+if [ -f /etc/update-extlinux.conf ]; then -+ . /etc/update-extlinux.conf -+ GRUB_CMDLINE_LINUX_DEFAULT="modules=${modules} ${default_kernel_opts} ${GRUB_CMDLINE_LINUX_DEFAULT}" -+fi - . "$pkgdatadir/grub-mkconfig_lib" - -+ - export TEXTDOMAIN=@PACKAGE@ - export TEXTDOMAINDIR="@localedir@" - -@@ -31,7 +36,11 @@ CLASS="--class gnu-linux --class gnu --class os" - if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then - OS=GNU/Linux - else -- OS="${GRUB_DISTRIBUTOR} GNU/Linux" -+ if [ "x${GRUB_DISTRIBUTOR}" = "xAlpine" ]; then -+ OS="${GRUB_DISTRIBUTOR} Linux" -+ else -+ OS="${GRUB_DISTRIBUTOR} GNU/Linux" -+ fi - CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}" - fi - -@@ -187,12 +196,14 @@ while [ "x$list" != "x" ] ; do - version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` - alt_version=`echo $version | sed -e "s,\.old$,,g"` - linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" -+ tag="$(basename ${rel_dirname}/${basename} | cut -b9-)" - - initrd= - for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \ - "initrd-${version}" "initramfs-${version}.img" \ - "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ - "initrd-${alt_version}" "initramfs-${alt_version}.img" \ -+ "initramfs-${tag}" \ - "initramfs-genkernel-${version}" \ - "initramfs-genkernel-${alt_version}" \ - "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ diff --git a/main/grub/APKBUILD b/main/grub/APKBUILD index 032cd12d17..e10d4034b6 100644 --- a/main/grub/APKBUILD +++ b/main/grub/APKBUILD @@ -1,8 +1,8 @@ # Contributor: Carlo Landmeter <clandmeter@gmail.com> # Maintainer: Timo Teräs <timo.teras@iki.fi> pkgname=grub -pkgver=2.02 -pkgrel=20 +pkgver=2.04 +pkgrel=0 pkgdesc="Bootloader with support for Linux, Multiboot and more" url="https://www.gnu.org/software/grub/" arch="all !s390x" @@ -34,42 +34,9 @@ done source="https://ftp.gnu.org/gnu/grub/grub-$pkgver.tar.xz fix-gcc-no-pie-specs.patch - grub2-accept-empty-module.patch grub-xen-host_grub.cfg - 2.02_beta3-mkconfig-alpine.patch - 0008-Fix-packed-not-aligned-error-on-GCC-8.patch - 0009-xfs-Accept-filesystem-with-sparse-inodes.patch - x86-64-Treat-R_X86_64_PLT32-as-R_X86_64_PC32.patch - alpine-use-uuid.patch - f2fs-support.patch - alpine-intel-ucode.patch - alpine-xen-initramfs.patch + alpine-mkconfig.patch lang-C.UTF-8.patch - - 0001-xen-Add-some-Xen-headers.patch - 0002-loader-linux-Support-passing-RSDP-address-via-boot-p.patch - 0003-xen-Carve-out-grant-tab-initialization-into-dedicate.patch - 0004-xen-Prepare-common-code-for-Xen-PVH-support.patch - 0005-xen-Add-some-dummy-headers-for-PVH-mode.patch - 0006-xen-Rearrange-xen-init.c-to-prepare-it-for-Xen-PVH-m.patch - 0007-xen-Modify-grub_xen_ptr2mfn-for-Xen-PVH.patch - 0008-xen-Add-PVH-specific-defines-to-offset.h.patch - 0009-xen-Add-basic-hooks-for-PVH-in-current-code.patch - 0010-xen-Add-PVH-boot-entry-code.patch - 0011-xen-Setup-hypercall-page-for-PVH.patch - 0012-xen-Get-memory-map-from-hypervisor-for-PVH.patch - 0013-xen-Setup-Xen-specific-data-for-PVH.patch - 0014-xen-Init-memory-regions-for-PVH.patch - 0015-xen_pvh-Add-build-runes-for-grub-core.patch - 0016-grub-module-verifier-Ignore-all_video-for-xen_pvh.patch - 0017-xen-Use-elfnote-defines-instead-of-plain-numbers.patch - 0018-xen_pvh-Support-building-a-standalone-image.patch - 0019-xen_pvh-Support-grub-install-for-xen_pvh.patch - 0020-xen_pvh-Add-support-to-configure.patch - - 0001-util-grub.d-20_linux_xen.in-Add-xen_boot-command-sup.patch - 0002-Fix-util-grub.d-20_linux_xen.in-Add-xen_boot-command.patch - 0003-Use-grub-file-to-figure-out-whether-multiboot2-shoul.patch " builddir="$srcdir/grub-$pkgver" @@ -236,39 +203,8 @@ emu() { mv $pkgdir/usr/lib/grub/*-emu $subpkgdir/usr/lib/grub/ } -sha512sums="cc6eb0a42b5c8df2f671cc128ff725afb3ff1f8832a196022e433cf0d3b75decfca2316d0aa5fabea75747d55e88f3d021dd93508563f8ca80fd7b9e7fe1f088 grub-2.02.tar.xz +sha512sums="9c15c42d0cf5d61446b752194e3b628bb04be0fe6ea0240ab62b3d753784712744846e1f7c3651d8e0968d22012e6d713c38c44936d4004ded3ca4d4007babbb grub-2.04.tar.xz f2a7d9ab6c445f4e402e790db56378cecd6631b5c367451aa6ce5c01cd95b95c83c3dd24d6d4b857f8f42601eba82c855607513eb6ce5b2af6bd6c71f046e288 fix-gcc-no-pie-specs.patch -098a1742aef131c85d63b934a9815879b991f2e73030cb90ac4b5dcd07d249fa0dd0a281e52ada0e10f05d59223493bd416eb47543242bf0ba336a0ebc9b2a1a grub2-accept-empty-module.patch 4e7394e0fff6772c89683039ccf81099ebbfe4f498e6df408977a1488fd59389b6e19afdbf0860ec271e2b2aea0df7216243dcc8235d1ca3af0e7f4d0a9d60a4 grub-xen-host_grub.cfg -065453d336d3c6a2943690faab7d05c09ac307bc360957976a08d88d6a57742dd068a6839bcb31c7dbb703d3ef19ae2f7f44844f1bef2a1a6c19a871544bddb5 2.02_beta3-mkconfig-alpine.patch -088455205f2f397d60e43eab19ed73994880ea1f442661f7975846cceaf2b112d92fd1341119d7dbfad3af2174dfd4d4721f31dead1ac35f4a3cb7c0d92f8a04 0008-Fix-packed-not-aligned-error-on-GCC-8.patch -4723c5dd9fd6e9b6c8677e32e4906c7995d695c7e85e834b1b29eb1d9a024678f8fa75846c7b929d1db9b5911b604c69c1b0379cb3b9adc98d5bb6d6719eb2c4 0009-xfs-Accept-filesystem-with-sparse-inodes.patch -e11f62b5012ecc8abf9d4912db12a263470887671b05ccb4de54981fb3b32a52d4557439a160e69e0654e35a57fdb0afd5fe801709b8037a6ea4a50d8b8455ec x86-64-Treat-R_X86_64_PLT32-as-R_X86_64_PC32.patch -ce788fa909bb89a3ccabbc144bb46226373cf846ffe1f315b0bf8b02403220d95c8fe67baf3c37c4e12cb36f22d70f62bbd2d0c5ff6b7230f05e5964b5c548ac alpine-use-uuid.patch -e4e7716cef9f183810eade57751617595c5d5fac740223a5ac3ed13e2215bbb38781328a3f8da3d4c71dd39ffec55d27d3e55b55c189dce55748e9a8512d4b41 f2fs-support.patch -ef30930acf817cb2d3721c78f89976a706b502419843ecbf938983a2076ee6a812fb914eb8d74014054b356325c0a72ae3f4416c4b22e5e86ebd8200304446d5 alpine-intel-ucode.patch -e683a647757956349c25e3c4e0be8d2e4f78287ba588c497f21942677b207f33a33fa4293cbe71665760dd31b752af02e1353896858cdb2f8d4368116878d5b1 alpine-xen-initramfs.patch -f23702741f2a37c83d0cbf16a000a6229dfd433cd583f3254d523ce35b3668c1db2d8a704a75013e74655ec4f9da5db6b630aa92e3ca5cc47df44cc9e41d1806 lang-C.UTF-8.patch -9daf00b36108852a7443ce4b5b1114d2e87cbfc72148b7847508965ff0dfab14b3f56980a0110c82170f5c2b75ef7a337a15398f59a4cb7e6404227499bffd9a 0001-xen-Add-some-Xen-headers.patch -33505273a8525aa4b44acba69f1b7f0dbee144809fb86626879895d44ce7eed889abf442644fc96536b4ebf86ab7c84a982749fc1181976e89e59a5cf7f7944e 0002-loader-linux-Support-passing-RSDP-address-via-boot-p.patch -1e446051930a96078e2b22831f53e939affdcee371e35e45d87efb8bdf02e2eea03247b7636525daf7d9306ec47cd4351e4d74abe357d19658b0b3fc884f9343 0003-xen-Carve-out-grant-tab-initialization-into-dedicate.patch -ceba427cdfc7e4566a0b9ba7ab1f7d52136510938a3789f0bddbabd45f7b3ccdd39e143d2b19a39ceae2348f08a0af92fd8297788828565571ec1a2491c11768 0004-xen-Prepare-common-code-for-Xen-PVH-support.patch -d185926d2e70cfa4d78a929d05932e2603cf9fa728c1afae7119bd26a9d60d9a769a560bab79b65b0733c7861e2907424542352019b3c6edf0a58be367573ba9 0005-xen-Add-some-dummy-headers-for-PVH-mode.patch -501cea14809a88ff11c81a325063b04c4f75efb490b7acaf6ca1435d98d24b3bcd8fd3b0df76a3e7200561c5020d299bb4ffb178f85f3e88bd18ba4ec656260f 0006-xen-Rearrange-xen-init.c-to-prepare-it-for-Xen-PVH-m.patch -8afefbecce41fb67a47c04fc3a068f3fae36f424746bd09298cbf774620dcf8493f366e66cd554c9112bbc18d31a09be5b5f6ed78d422d861873cf03755b7ddd 0007-xen-Modify-grub_xen_ptr2mfn-for-Xen-PVH.patch -e18e0e58ff325f2e50bf1625d4befe42e9e66d271563bbeabe7f0abacd3499b858ff2a827256cf0726f629d8a944a60dcd1d620a5f0823f44613d88f86cd41ed 0008-xen-Add-PVH-specific-defines-to-offset.h.patch -5337a029b5ae11d04a8c821baf15c360f35bf49892ff3c97e1c4b36775e4918feea6188850ecb99275ebf2cd4630ea887007e568a0743661f31663d5b9a4e3dd 0009-xen-Add-basic-hooks-for-PVH-in-current-code.patch -cc84a610e07180d732691163c08fc8de3252a6f23af4ec739ef18192c9bd8cdee60252bebcf2c224ef296f3accc86f9d57dde0f2069536ce1d4c203ab56166e2 0010-xen-Add-PVH-boot-entry-code.patch -0bc6becfd10c2948980e305268906d009729fb0795b9f7ef3a80ae169728461faa2582444cfad40f2c6063dd3a82ee5a030be092cba65833a7ab30feba147e43 0011-xen-Setup-hypercall-page-for-PVH.patch -49e146a955fb41e8dbb8cef9c1d321737d2646d0f4ac686a054a0e70db05879367e0110ee74690cff3357791397f1c86262311335a41fd81de15db722fe0f58d 0012-xen-Get-memory-map-from-hypervisor-for-PVH.patch -47b8572a1778ccf5221a5a0b7880e4f4bd86a03b5716b13444b5e8f7a4059c9b5cd6a01ddd29ca78fe89c0599d7ee018728979bce4771e7ca4420c14f8855dd7 0013-xen-Setup-Xen-specific-data-for-PVH.patch -e7f1311ed679dfd969225af91293a046fced7c046afcaa716f54b8cb18dbbe364d471e6b493d686cf8b63651e7e3a89b8c31ddc7457581117ebacafce3ceaea9 0014-xen-Init-memory-regions-for-PVH.patch -45d14b87a949ce5f1d63ba5cd0048205d94359d23d3f230017b7f6de6e5d25388b2d1af06b8f32fe187adfde2d3ef30e7100e6624f6201cb9d8365bd0a742ddb 0015-xen_pvh-Add-build-runes-for-grub-core.patch -fe7ea6eeab330c0fdfd0b2a858acdff88c68f69d80b9abb21b4c3cd1d18f8717ab7c47729e28857c564c4c1427d9b1ce6b9b93643507717a8f5ec2d99c843c70 0016-grub-module-verifier-Ignore-all_video-for-xen_pvh.patch -3e78cd3cd1c70236d8e9e3a536eb2f887283b5d257f60533d22d093df76c1c3c60e490acae4b738301c87edbac2e27398fce6ddbbeb9b2f193191c76afb9bd8b 0017-xen-Use-elfnote-defines-instead-of-plain-numbers.patch -c8a16db1224c9fb4a26ef39fbd8c36bf26ff68d45d88fb4e2530369c5bccadf0208551c34c0d16e9ee4a3102d67edad26a46e7b8388222f530310762246df8ef 0018-xen_pvh-Support-building-a-standalone-image.patch -b00cb9146cadc1f48586dcab31ac4605d9591d860283000accf709a489f136bf5c8fe3351dbefe51f9e27407ca3f1ce5dd7bc2ac64ac826f593183ef5d3a9759 0019-xen_pvh-Support-grub-install-for-xen_pvh.patch -78bc31b69cde95a29b365b43898caf69238c036683a26e5448d66cd48c7a4906d2a9eff065f082c5300b72616d6e63033891fd75d59ce724759dc998d9942a37 0020-xen_pvh-Add-support-to-configure.patch -9eb4d168824d863791040e7d288dfa2bd5314c34389adb92683b6335c5bd5426f74ec98257bcfde6ab89836ae33954ac1ad2e1caf451c2d6ab4540a4f394c985 0001-util-grub.d-20_linux_xen.in-Add-xen_boot-command-sup.patch -b0ab04fff0d998a78d5de7610544de14912dc5ac27f99d74e86df7ef59db02ad4a45620030d1ff640d7c09d1f3aecaf7506dfb21dc01377f6a1f3d5a95c2978b 0002-Fix-util-grub.d-20_linux_xen.in-Add-xen_boot-command.patch -34518e3917bd3fd8e5944fcb6d208515ff4f2ae2e74736eb451a532bc116a63232b8fed28ca91c2417e815d179d438795ccbf6735edcaed2c0760555635d595e 0003-Use-grub-file-to-figure-out-whether-multiboot2-shoul.patch" +84d9694af384336c0846faad968a63b154e2bd957671fa7c0163c36e20fd086a8d5b67ddf5eb983a11a69f65dac52668d0f51537e7cfe9a1ea9bca7aba91f20b alpine-mkconfig.patch +f23702741f2a37c83d0cbf16a000a6229dfd433cd583f3254d523ce35b3668c1db2d8a704a75013e74655ec4f9da5db6b630aa92e3ca5cc47df44cc9e41d1806 lang-C.UTF-8.patch" diff --git a/main/grub/alpine-intel-ucode.patch b/main/grub/alpine-intel-ucode.patch deleted file mode 100644 index fe3453330f..0000000000 --- a/main/grub/alpine-intel-ucode.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/util/grub.d/10_linux.in -+++ b/util/grub.d/10_linux.in -@@ -144,9 +144,13 @@ - if test -n "${initrd}" ; then - # TRANSLATORS: ramdisk isn't identifier. Should be translated. - message="$(gettext_printf "Loading initial ramdisk ...")" -+ initrd_line="${rel_dirname}/${initrd}" -+ if [ -f "/boot/intel-ucode.img" ]; then -+ initrd_line="${rel_dirname}/intel-ucode.img $initrd_line" -+ fi - sed "s/^/$submenu_indentation/" << EOF - echo '$(echo "$message" | grub_quote)' -- initrd ${rel_dirname}/${initrd} -+ initrd ${initrd_line} - EOF - fi - sed "s/^/$submenu_indentation/" << EOF diff --git a/main/grub/alpine-mkconfig.patch b/main/grub/alpine-mkconfig.patch new file mode 100644 index 0000000000..276f8abdda --- /dev/null +++ b/main/grub/alpine-mkconfig.patch @@ -0,0 +1,70 @@ +diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in +index 4532266..42e0248 100644 +--- a/util/grub.d/10_linux.in ++++ b/util/grub.d/10_linux.in +@@ -21,17 +21,22 @@ prefix="@prefix@" + exec_prefix="@exec_prefix@" + datarootdir="@datarootdir@" + ++if [ -f /etc/update-extlinux.conf ]; then ++ . /etc/update-extlinux.conf ++ GRUB_CMDLINE_LINUX_DEFAULT="modules=${modules} ${default_kernel_opts} ${GRUB_CMDLINE_LINUX_DEFAULT}" ++fi + . "$pkgdatadir/grub-mkconfig_lib" + ++ + export TEXTDOMAIN=@PACKAGE@ + export TEXTDOMAINDIR="@localedir@" + + CLASS="--class gnu-linux --class gnu --class os" + + if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then +- OS=GNU/Linux ++ OS="$( . /etc/os-release; echo "$PRETTY_NAME")" + else +- OS="${GRUB_DISTRIBUTOR} GNU/Linux" ++ OS="${GRUB_DISTRIBUTOR}" + CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}" + fi + +@@ -52,8 +57,6 @@ GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true} + if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \ + || ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ + && [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \ +- || ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ +- && ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \ + || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then + LINUX_ROOT_DEVICE=${GRUB_DEVICE} + elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \ +@@ -215,6 +218,7 @@ while [ "x$list" != "x" ] ; do + "initrd-${version}" "initramfs-${version}.img" \ + "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ + "initrd-${alt_version}" "initramfs-${alt_version}.img" \ ++ "initramfs-${version}" \ + "initramfs-genkernel-${version}" \ + "initramfs-genkernel-${alt_version}" \ + "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ +diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in +index 96179ea..6c4c411 100644 +--- a/util/grub.d/20_linux_xen.in ++++ b/util/grub.d/20_linux_xen.in +@@ -29,9 +29,9 @@ export TEXTDOMAINDIR="@localedir@" + CLASS="--class gnu-linux --class gnu --class os --class xen" + + if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then +- OS=GNU/Linux ++ OS="$( . /etc/os-release; echo "$PRETTY_NAME")" + else +- OS="${GRUB_DISTRIBUTOR} GNU/Linux" ++ OS="${GRUB_DISTRIBUTOR}" + CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}" + fi + +@@ -256,6 +256,7 @@ while [ "x${xen_list}" != "x" ] ; do + "initrd-${version}" "initramfs-${version}.img" \ + "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ + "initrd-${alt_version}" "initramfs-${alt_version}.img" \ ++ "initramfs-${version}" \ + "initramfs-genkernel-${version}" \ + "initramfs-genkernel-${alt_version}" \ + "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ diff --git a/main/grub/alpine-use-uuid.patch b/main/grub/alpine-use-uuid.patch deleted file mode 100644 index cf5750bdf5..0000000000 --- a/main/grub/alpine-use-uuid.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 60f36be..dbef9bf 100644 ---- a/util/grub.d/10_linux.in -+++ b/util/grub.d/10_linux.in -@@ -55,7 +55,6 @@ esac - # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter - # and mounting btrfs requires user space scanning, so force UUID in this case. - if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -- || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ - || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} - else diff --git a/main/grub/alpine-xen-initramfs.patch b/main/grub/alpine-xen-initramfs.patch deleted file mode 100644 index 1e1c7a02ac..0000000000 --- a/main/grub/alpine-xen-initramfs.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/util/grub.d/20_linux_xen.in -+++ b/util/grub.d/20_linux_xen.in -@@ -221,6 +221,7 @@ - "initrd-${version}" "initramfs-${version}.img" \ - "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ - "initrd-${alt_version}" "initramfs-${alt_version}.img" \ -+ "initramfs-${version}" \ - "initramfs-genkernel-${version}" \ - "initramfs-genkernel-${alt_version}" \ - "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ diff --git a/main/grub/f2fs-support.patch b/main/grub/f2fs-support.patch deleted file mode 100644 index 44d7d94fe3..0000000000 --- a/main/grub/f2fs-support.patch +++ /dev/null @@ -1,1513 +0,0 @@ -From 71f9e4ac44142af52c3fc1860436cf9e432bf764 Mon Sep 17 00:00:00 2001 -From: Jaegeuk Kim <jaegeuk@kernel.org> -Date: Thu, 29 Mar 2018 16:37:39 +0100 -Subject: fs: Add F2FS support - -"F2FS (Flash-Friendly File System) is flash-friendly file system which was merged -into Linux kernel v3.8 in 2013. - -The motive for F2FS was to build a file system that from the start, takes into -account the characteristics of NAND flash memory-based storage devices (such as -solid-state disks, eMMC, and SD cards). - -F2FS was designed on a basis of a log-structured file system approach, which -remedies some known issues of the older log structured file systems, such as -the snowball effect of wandering trees and high cleaning overhead. In addition, -since a NAND-based storage device shows different characteristics according to -its internal geometry or flash memory management scheme (such as the Flash -Translation Layer or FTL), it supports various parameters not only for -configuring on-disk layout, but also for selecting allocation and cleaning -algorithm.", quote by https://en.wikipedia.org/wiki/F2FS. - -The source codes for F2FS are available from: - -http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs.git -http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.git - -This patch has been integrated in OpenMandriva Lx 3. - https://www.openmandriva.org/ - -Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> -Signed-off-by: Pete Batard <pete@akeo.ie> -Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> ---- - Makefile.util.def | 7 + - docs/grub.texi | 7 +- - grub-core/Makefile.core.def | 5 + - grub-core/fs/f2fs.c | 1314 ++++++++++++++++++++++++++++++++++++++++++ - po/exclude.pot | 1 + - tests/f2fs_test.in | 19 + - tests/util/grub-fs-tester.in | 10 +- - 7 files changed, 1358 insertions(+), 5 deletions(-) - create mode 100644 grub-core/fs/f2fs.c - create mode 100644 tests/f2fs_test.in - -diff --git a/Makefile.util.def b/Makefile.util.def -index f9caccb..3180ac8 100644 ---- a/Makefile.util.def -+++ b/Makefile.util.def -@@ -99,6 +99,7 @@ library = { - common = grub-core/fs/ext2.c; - common = grub-core/fs/fat.c; - common = grub-core/fs/exfat.c; -+ common = grub-core/fs/f2fs.c; - common = grub-core/fs/fshelp.c; - common = grub-core/fs/hfs.c; - common = grub-core/fs/hfsplus.c; -@@ -776,6 +777,12 @@ script = { - - script = { - testcase; -+ name = f2fs_test; -+ common = tests/f2fs_test.in; -+}; -+ -+script = { -+ testcase; - name = nilfs2_test; - common = tests/nilfs2_test.in; - }; -diff --git a/docs/grub.texi b/docs/grub.texi -index 65b4bbe..0f2ab91 100644 ---- a/docs/grub.texi -+++ b/docs/grub.texi -@@ -360,8 +360,9 @@ blocklist notation. The currently supported filesystem types are @dfn{Amiga - Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS}, - @dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo), - @dfn{cpio} (little- and big-endian bin, odc and newc variants), --@dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, @dfn{exFAT}, @dfn{HFS}, --@dfn{HFS+}, @dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files), -+@dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, -+@dfn{exFAT}, @dfn{F2FS}, @dfn{HFS}, @dfn{HFS+}, -+@dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files), - @dfn{JFS}, @dfn{Minix fs} (versions 1, 2 and 3), @dfn{nilfs2}, - @dfn{NTFS} (including compression), @dfn{ReiserFS}, @dfn{ROMFS}, - @dfn{Amiga Smart FileSystem (SFS)}, @dfn{Squash4}, @dfn{tar}, @dfn{UDF}, -@@ -5375,7 +5376,7 @@ NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of - ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read - as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix, - minix2, minix3, ROMFS, ReiserFS, XFS, ext2, ext3, ext4, FAT (short names), --RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed -+F2FS, RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed - to be UTF-8. This might be false on systems configured with legacy charset - but as long as the charset used is superset of ASCII you should be able to - access ASCII-named files. And it's recommended to configure your system to use -diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 2c1d62c..fc4767f 100644 ---- a/grub-core/Makefile.core.def -+++ b/grub-core/Makefile.core.def -@@ -1315,6 +1315,11 @@ module = { - }; - - module = { -+ name = f2fs; -+ common = fs/f2fs.c; -+}; -+ -+module = { - name = fshelp; - common = fs/fshelp.c; - }; -diff --git a/grub-core/fs/f2fs.c b/grub-core/fs/f2fs.c -new file mode 100644 -index 0000000..1cad261 ---- /dev/null -+++ b/grub-core/fs/f2fs.c -@@ -0,0 +1,1314 @@ -+/* -+ * f2fs.c - Flash-Friendly File System -+ * -+ * Written by Jaegeuk Kim <jaegeuk@kernel.org> -+ * -+ * Copyright (C) 2015 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <grub/err.h> -+#include <grub/file.h> -+#include <grub/mm.h> -+#include <grub/misc.h> -+#include <grub/disk.h> -+#include <grub/dl.h> -+#include <grub/types.h> -+#include <grub/charset.h> -+#include <grub/fshelp.h> -+ -+GRUB_MOD_LICENSE ("GPLv3+"); -+ -+/* F2FS Magic Number. */ -+#define F2FS_SUPER_MAGIC 0xf2f52010 -+ -+#define CHECKSUM_OFFSET 4092 /* Must be aligned 4 bytes. */ -+#define U32_CHECKSUM_OFFSET (CHECKSUM_OFFSET >> 2) -+#define CRCPOLY_LE 0xedb88320 -+ -+/* Byte-size offset. */ -+#define F2FS_SUPER_OFFSET ((grub_disk_addr_t)1024) -+#define F2FS_SUPER_OFFSET0 (F2FS_SUPER_OFFSET >> GRUB_DISK_SECTOR_BITS) -+#define F2FS_SUPER_OFFSET1 ((F2FS_SUPER_OFFSET + F2FS_BLKSIZE) >> \ -+ GRUB_DISK_SECTOR_BITS) -+ -+/* 9 bits for 512 bytes. */ -+#define F2FS_MIN_LOG_SECTOR_SIZE 9 -+ -+/* Support only 4KB block. */ -+#define F2FS_BLK_BITS 12 -+#define F2FS_BLKSIZE (1 << F2FS_BLK_BITS) -+#define F2FS_BLK_SEC_BITS (F2FS_BLK_BITS - GRUB_DISK_SECTOR_BITS) -+ -+#define VERSION_LEN 256 -+#define F2FS_MAX_EXTENSION 64 -+ -+#define CP_COMPACT_SUM_FLAG 0x00000004 -+#define CP_UMOUNT_FLAG 0x00000001 -+ -+#define MAX_ACTIVE_LOGS 16 -+#define MAX_ACTIVE_NODE_LOGS 8 -+#define MAX_ACTIVE_DATA_LOGS 8 -+#define NR_CURSEG_DATA_TYPE 3 -+#define NR_CURSEG_NODE_TYPE 3 -+#define NR_CURSEG_TYPE (NR_CURSEG_DATA_TYPE + NR_CURSEG_NODE_TYPE) -+ -+#define ENTRIES_IN_SUM 512 -+#define SUMMARY_SIZE 7 -+#define SUM_FOOTER_SIZE 5 -+#define JENTRY_SIZE (sizeof(struct grub_f2fs_nat_jent)) -+#define SUM_ENTRIES_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM) -+#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE - SUM_ENTRIES_SIZE) -+#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) / JENTRY_SIZE) -+#define NAT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) % JENTRY_SIZE) -+ -+#define NAT_ENTRY_SIZE (sizeof(struct grub_f2fs_nat_entry)) -+#define NAT_ENTRY_PER_BLOCK (F2FS_BLKSIZE / NAT_ENTRY_SIZE) -+ -+#define F2FS_NAME_LEN 255 -+#define F2FS_SLOT_LEN 8 -+#define NR_DENTRY_IN_BLOCK 214 -+#define SIZE_OF_DIR_ENTRY 11 /* By byte. */ -+#define BITS_PER_BYTE 8 -+#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \ -+ BITS_PER_BYTE) -+#define SIZE_OF_RESERVED (F2FS_BLKSIZE - \ -+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ -+ NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP)) -+ -+#define F2FS_INLINE_XATTR_ADDRS 50 /* 200 bytes for inline xattrs. */ -+#define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode. */ -+ -+#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block. */ -+#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block. */ -+#define NODE_DIR1_BLOCK (DEF_ADDRS_PER_INODE + 1) -+#define NODE_DIR2_BLOCK (DEF_ADDRS_PER_INODE + 2) -+#define NODE_IND1_BLOCK (DEF_ADDRS_PER_INODE + 3) -+#define NODE_IND2_BLOCK (DEF_ADDRS_PER_INODE + 4) -+#define NODE_DIND_BLOCK (DEF_ADDRS_PER_INODE + 5) -+ -+#define MAX_INLINE_DATA (4 * (DEF_ADDRS_PER_INODE - \ -+ F2FS_INLINE_XATTR_ADDRS - 1)) -+#define NR_INLINE_DENTRY (MAX_INLINE_DATA * BITS_PER_BYTE / \ -+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ -+ BITS_PER_BYTE + 1)) -+#define INLINE_DENTRY_BITMAP_SIZE ((NR_INLINE_DENTRY + BITS_PER_BYTE - 1) / \ -+ BITS_PER_BYTE) -+#define INLINE_RESERVED_SIZE (MAX_INLINE_DATA - \ -+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ -+ NR_INLINE_DENTRY + \ -+ INLINE_DENTRY_BITMAP_SIZE)) -+#define CURSEG_HOT_DATA 0 -+ -+#define CKPT_FLAG_SET(ckpt, f) (ckpt)->ckpt_flags & \ -+ grub_cpu_to_le32_compile_time (f) -+ -+#define F2FS_INLINE_XATTR 0x01 /* File inline xattr flag. */ -+#define F2FS_INLINE_DATA 0x02 /* File inline data flag. */ -+#define F2FS_INLINE_DENTRY 0x04 /* File inline dentry flag. */ -+#define F2FS_DATA_EXIST 0x08 /* File inline data exist flag. */ -+#define F2FS_INLINE_DOTS 0x10 /* File having implicit dot dentries. */ -+ -+#define MAX_VOLUME_NAME 512 -+ -+enum FILE_TYPE -+{ -+ F2FS_FT_UNKNOWN, -+ F2FS_FT_REG_FILE = 1, -+ F2FS_FT_DIR = 2, -+ F2FS_FT_SYMLINK = 7 -+}; -+ -+struct grub_f2fs_superblock -+{ -+ grub_uint32_t magic; -+ grub_uint16_t dummy1[2]; -+ grub_uint32_t log_sectorsize; -+ grub_uint32_t log_sectors_per_block; -+ grub_uint32_t log_blocksize; -+ grub_uint32_t log_blocks_per_seg; -+ grub_uint32_t segs_per_sec; -+ grub_uint32_t secs_per_zone; -+ grub_uint32_t checksum_offset; -+ grub_uint8_t dummy2[40]; -+ grub_uint32_t cp_blkaddr; -+ grub_uint32_t sit_blkaddr; -+ grub_uint32_t nat_blkaddr; -+ grub_uint32_t ssa_blkaddr; -+ grub_uint32_t main_blkaddr; -+ grub_uint32_t root_ino; -+ grub_uint32_t node_ino; -+ grub_uint32_t meta_ino; -+ grub_uint8_t uuid[16]; -+ grub_uint16_t volume_name[MAX_VOLUME_NAME]; -+ grub_uint32_t extension_count; -+ grub_uint8_t extension_list[F2FS_MAX_EXTENSION][8]; -+ grub_uint32_t cp_payload; -+ grub_uint8_t version[VERSION_LEN]; -+ grub_uint8_t init_version[VERSION_LEN]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_checkpoint -+{ -+ grub_uint64_t checkpoint_ver; -+ grub_uint64_t user_block_count; -+ grub_uint64_t valid_block_count; -+ grub_uint32_t rsvd_segment_count; -+ grub_uint32_t overprov_segment_count; -+ grub_uint32_t free_segment_count; -+ grub_uint32_t cur_node_segno[MAX_ACTIVE_NODE_LOGS]; -+ grub_uint16_t cur_node_blkoff[MAX_ACTIVE_NODE_LOGS]; -+ grub_uint32_t cur_data_segno[MAX_ACTIVE_DATA_LOGS]; -+ grub_uint16_t cur_data_blkoff[MAX_ACTIVE_DATA_LOGS]; -+ grub_uint32_t ckpt_flags; -+ grub_uint32_t cp_pack_total_block_count; -+ grub_uint32_t cp_pack_start_sum; -+ grub_uint32_t valid_node_count; -+ grub_uint32_t valid_inode_count; -+ grub_uint32_t next_free_nid; -+ grub_uint32_t sit_ver_bitmap_bytesize; -+ grub_uint32_t nat_ver_bitmap_bytesize; -+ grub_uint32_t checksum_offset; -+ grub_uint64_t elapsed_time; -+ grub_uint8_t alloc_type[MAX_ACTIVE_LOGS]; -+ grub_uint8_t sit_nat_version_bitmap[3900]; -+ grub_uint32_t checksum; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_entry { -+ grub_uint8_t version; -+ grub_uint32_t ino; -+ grub_uint32_t block_addr; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_jent -+{ -+ grub_uint32_t nid; -+ struct grub_f2fs_nat_entry ne; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_journal { -+ grub_uint16_t n_nats; -+ struct grub_f2fs_nat_jent entries[NAT_JOURNAL_ENTRIES]; -+ grub_uint8_t reserved[NAT_JOURNAL_RESERVED]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_block { -+ struct grub_f2fs_nat_entry ne[NAT_ENTRY_PER_BLOCK]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_dir_entry -+{ -+ grub_uint32_t hash_code; -+ grub_uint32_t ino; -+ grub_uint16_t name_len; -+ grub_uint8_t file_type; -+} GRUB_PACKED; -+ -+struct grub_f2fs_inline_dentry -+{ -+ grub_uint8_t dentry_bitmap[INLINE_DENTRY_BITMAP_SIZE]; -+ grub_uint8_t reserved[INLINE_RESERVED_SIZE]; -+ struct grub_f2fs_dir_entry dentry[NR_INLINE_DENTRY]; -+ grub_uint8_t filename[NR_INLINE_DENTRY][F2FS_SLOT_LEN]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_dentry_block { -+ grub_uint8_t dentry_bitmap[SIZE_OF_DENTRY_BITMAP]; -+ grub_uint8_t reserved[SIZE_OF_RESERVED]; -+ struct grub_f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK]; -+ grub_uint8_t filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_inode -+{ -+ grub_uint16_t i_mode; -+ grub_uint8_t i_advise; -+ grub_uint8_t i_inline; -+ grub_uint32_t i_uid; -+ grub_uint32_t i_gid; -+ grub_uint32_t i_links; -+ grub_uint64_t i_size; -+ grub_uint64_t i_blocks; -+ grub_uint64_t i_atime; -+ grub_uint64_t i_ctime; -+ grub_uint64_t i_mtime; -+ grub_uint32_t i_atime_nsec; -+ grub_uint32_t i_ctime_nsec; -+ grub_uint32_t i_mtime_nsec; -+ grub_uint32_t i_generation; -+ grub_uint32_t i_current_depth; -+ grub_uint32_t i_xattr_nid; -+ grub_uint32_t i_flags; -+ grub_uint32_t i_pino; -+ grub_uint32_t i_namelen; -+ grub_uint8_t i_name[F2FS_NAME_LEN]; -+ grub_uint8_t i_dir_level; -+ grub_uint8_t i_ext[12]; -+ grub_uint32_t i_addr[DEF_ADDRS_PER_INODE]; -+ grub_uint32_t i_nid[5]; -+} GRUB_PACKED; -+ -+struct grub_direct_node { -+ grub_uint32_t addr[ADDRS_PER_BLOCK]; -+} GRUB_PACKED; -+ -+struct grub_indirect_node { -+ grub_uint32_t nid[NIDS_PER_BLOCK]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_node -+{ -+ union -+ { -+ struct grub_f2fs_inode i; -+ struct grub_direct_node dn; -+ struct grub_indirect_node in; -+ /* Should occupy F2FS_BLKSIZE totally. */ -+ char buf[F2FS_BLKSIZE - 40]; -+ }; -+ grub_uint8_t dummy[40]; -+} GRUB_PACKED; -+ -+struct grub_fshelp_node -+{ -+ struct grub_f2fs_data *data; -+ struct grub_f2fs_node inode; -+ grub_uint32_t ino; -+ int inode_read; -+}; -+ -+struct grub_f2fs_data -+{ -+ struct grub_f2fs_superblock sblock; -+ struct grub_f2fs_checkpoint ckpt; -+ -+ grub_uint32_t root_ino; -+ grub_uint32_t blocks_per_seg; -+ grub_uint32_t cp_blkaddr; -+ grub_uint32_t nat_blkaddr; -+ -+ struct grub_f2fs_nat_journal nat_j; -+ char *nat_bitmap; -+ -+ grub_disk_t disk; -+ struct grub_f2fs_node *inode; -+ struct grub_fshelp_node diropen; -+}; -+ -+struct grub_f2fs_dir_iter_ctx -+{ -+ struct grub_f2fs_data *data; -+ grub_fshelp_iterate_dir_hook_t hook; -+ void *hook_data; -+ grub_uint8_t *bitmap; -+ grub_uint8_t (*filename)[F2FS_SLOT_LEN]; -+ struct grub_f2fs_dir_entry *dentry; -+ int max; -+}; -+ -+struct grub_f2fs_dir_ctx -+{ -+ grub_fs_dir_hook_t hook; -+ void *hook_data; -+ struct grub_f2fs_data *data; -+}; -+ -+static grub_dl_t my_mod; -+ -+static int -+grub_f2fs_test_bit_le (int nr, const grub_uint8_t *addr) -+{ -+ return addr[nr >> 3] & (1 << (nr & 7)); -+} -+ -+static char * -+get_inline_addr (struct grub_f2fs_inode *inode) -+{ -+ return (char *) &inode->i_addr[1]; -+} -+ -+static grub_uint64_t -+grub_f2fs_file_size (struct grub_f2fs_inode *inode) -+{ -+ return grub_le_to_cpu64 (inode->i_size); -+} -+ -+static grub_uint32_t -+start_cp_addr (struct grub_f2fs_data *data) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ grub_uint32_t start_addr = data->cp_blkaddr; -+ -+ if (!(ckpt->checkpoint_ver & grub_cpu_to_le64_compile_time(1))) -+ return start_addr + data->blocks_per_seg; -+ -+ return start_addr; -+} -+ -+static grub_uint32_t -+start_sum_block (struct grub_f2fs_data *data) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ -+ return start_cp_addr (data) + grub_le_to_cpu32 (ckpt->cp_pack_start_sum); -+} -+ -+static grub_uint32_t -+sum_blk_addr (struct grub_f2fs_data *data, int base, int type) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ -+ return start_cp_addr (data) + -+ grub_le_to_cpu32 (ckpt->cp_pack_total_block_count) - -+ (base + 1) + type; -+} -+ -+static void * -+nat_bitmap_ptr (struct grub_f2fs_data *data) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ grub_uint32_t offset; -+ -+ if (grub_le_to_cpu32 (data->sblock.cp_payload) > 0) -+ return ckpt->sit_nat_version_bitmap; -+ -+ offset = grub_le_to_cpu32 (ckpt->sit_ver_bitmap_bytesize); -+ -+ return ckpt->sit_nat_version_bitmap + offset; -+} -+ -+static grub_uint32_t -+get_node_id (struct grub_f2fs_node *rn, int off, int inode_block) -+{ -+ if (inode_block) -+ return grub_le_to_cpu32 (rn->i.i_nid[off - NODE_DIR1_BLOCK]); -+ -+ return grub_le_to_cpu32 (rn->in.nid[off]); -+} -+ -+static grub_err_t -+grub_f2fs_block_read (struct grub_f2fs_data *data, grub_uint32_t blkaddr, -+ void *buf) -+{ -+ return grub_disk_read (data->disk, -+ ((grub_disk_addr_t)blkaddr) << F2FS_BLK_SEC_BITS, -+ 0, F2FS_BLKSIZE, buf); -+} -+ -+/* CRC32 */ -+static grub_uint32_t -+grub_f2fs_cal_crc32 (const void *buf, const grub_uint32_t len) -+{ -+ grub_uint32_t crc = F2FS_SUPER_MAGIC; -+ unsigned char *p = (unsigned char *)buf; -+ grub_uint32_t tmp = len; -+ int i; -+ -+ while (tmp--) -+ { -+ crc ^= *p++; -+ for (i = 0; i < 8; i++) -+ crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); -+ } -+ -+ return crc; -+} -+ -+static int -+grub_f2fs_crc_valid (grub_uint32_t blk_crc, void *buf, const grub_uint32_t len) -+{ -+ grub_uint32_t cal_crc = 0; -+ -+ cal_crc = grub_f2fs_cal_crc32 (buf, len); -+ -+ return (cal_crc == blk_crc) ? 1 : 0; -+} -+ -+static int -+grub_f2fs_test_bit (grub_uint32_t nr, const char *p) -+{ -+ int mask; -+ -+ p += (nr >> 3); -+ mask = 1 << (7 - (nr & 0x07)); -+ -+ return mask & *p; -+} -+ -+static int -+grub_f2fs_sanity_check_sb (struct grub_f2fs_superblock *sb) -+{ -+ grub_uint32_t log_sectorsize, log_sectors_per_block; -+ -+ if (sb->magic != grub_cpu_to_le32_compile_time (F2FS_SUPER_MAGIC)) -+ return -1; -+ -+ if (sb->log_blocksize != grub_cpu_to_le32_compile_time (F2FS_BLK_BITS)) -+ return -1; -+ -+ log_sectorsize = grub_le_to_cpu32 (sb->log_sectorsize); -+ log_sectors_per_block = grub_le_to_cpu32 (sb->log_sectors_per_block); -+ -+ if (log_sectorsize > F2FS_BLK_BITS) -+ return -1; -+ -+ if (log_sectorsize < F2FS_MIN_LOG_SECTOR_SIZE) -+ return -1; -+ -+ if (log_sectors_per_block + log_sectorsize != F2FS_BLK_BITS) -+ return -1; -+ -+ return 0; -+} -+ -+static int -+grub_f2fs_read_sb (struct grub_f2fs_data *data, grub_disk_addr_t offset) -+{ -+ grub_disk_t disk = data->disk; -+ grub_err_t err; -+ -+ /* Read first super block. */ -+ err = grub_disk_read (disk, offset, 0, sizeof (data->sblock), &data->sblock); -+ if (err) -+ return -1; -+ -+ return grub_f2fs_sanity_check_sb (&data->sblock); -+} -+ -+static void * -+validate_checkpoint (struct grub_f2fs_data *data, grub_uint32_t cp_addr, -+ grub_uint64_t *version) -+{ -+ grub_uint32_t *cp_page_1, *cp_page_2; -+ struct grub_f2fs_checkpoint *cp_block; -+ grub_uint64_t cur_version = 0, pre_version = 0; -+ grub_uint32_t crc = 0; -+ grub_uint32_t crc_offset; -+ grub_err_t err; -+ -+ /* Read the 1st cp block in this CP pack. */ -+ cp_page_1 = grub_malloc (F2FS_BLKSIZE); -+ if (!cp_page_1) -+ return NULL; -+ -+ err = grub_f2fs_block_read (data, cp_addr, cp_page_1); -+ if (err) -+ goto invalid_cp1; -+ -+ cp_block = (struct grub_f2fs_checkpoint *)cp_page_1; -+ crc_offset = grub_le_to_cpu32 (cp_block->checksum_offset); -+ if (crc_offset != CHECKSUM_OFFSET) -+ goto invalid_cp1; -+ -+ crc = grub_le_to_cpu32 (*(cp_page_1 + U32_CHECKSUM_OFFSET)); -+ if (!grub_f2fs_crc_valid (crc, cp_block, crc_offset)) -+ goto invalid_cp1; -+ -+ pre_version = grub_le_to_cpu64 (cp_block->checkpoint_ver); -+ -+ /* Read the 2nd cp block in this CP pack. */ -+ cp_page_2 = grub_malloc (F2FS_BLKSIZE); -+ if (!cp_page_2) -+ goto invalid_cp1; -+ -+ cp_addr += grub_le_to_cpu32 (cp_block->cp_pack_total_block_count) - 1; -+ -+ err = grub_f2fs_block_read (data, cp_addr, cp_page_2); -+ if (err) -+ goto invalid_cp2; -+ -+ cp_block = (struct grub_f2fs_checkpoint *)cp_page_2; -+ crc_offset = grub_le_to_cpu32 (cp_block->checksum_offset); -+ if (crc_offset != CHECKSUM_OFFSET) -+ goto invalid_cp2; -+ -+ crc = grub_le_to_cpu32 (*(cp_page_2 + U32_CHECKSUM_OFFSET)); -+ if (!grub_f2fs_crc_valid (crc, cp_block, crc_offset)) -+ goto invalid_cp2; -+ -+ cur_version = grub_le_to_cpu64 (cp_block->checkpoint_ver); -+ if (cur_version == pre_version) -+ { -+ *version = cur_version; -+ grub_free (cp_page_2); -+ -+ return cp_page_1; -+ } -+ -+ invalid_cp2: -+ grub_free (cp_page_2); -+ -+ invalid_cp1: -+ grub_free (cp_page_1); -+ -+ return NULL; -+} -+ -+static grub_err_t -+grub_f2fs_read_cp (struct grub_f2fs_data *data) -+{ -+ void *cp1, *cp2, *cur_page; -+ grub_uint64_t cp1_version = 0, cp2_version = 0; -+ grub_uint64_t cp_start_blk_no; -+ -+ /* -+ * Finding out valid cp block involves read both -+ * sets (cp pack1 and cp pack 2). -+ */ -+ cp_start_blk_no = data->cp_blkaddr; -+ cp1 = validate_checkpoint (data, cp_start_blk_no, &cp1_version); -+ if (!cp1 && grub_errno) -+ return grub_errno; -+ -+ /* The second checkpoint pack should start at the next segment. */ -+ cp_start_blk_no += data->blocks_per_seg; -+ cp2 = validate_checkpoint (data, cp_start_blk_no, &cp2_version); -+ if (!cp2 && grub_errno) -+ { -+ grub_free (cp1); -+ return grub_errno; -+ } -+ -+ if (cp1 && cp2) -+ cur_page = (cp2_version > cp1_version) ? cp2 : cp1; -+ else if (cp1) -+ cur_page = cp1; -+ else if (cp2) -+ cur_page = cp2; -+ else -+ return grub_error (GRUB_ERR_BAD_FS, "no checkpoints"); -+ -+ grub_memcpy (&data->ckpt, cur_page, F2FS_BLKSIZE); -+ -+ grub_free (cp1); -+ grub_free (cp2); -+ -+ return 0; -+} -+ -+static grub_err_t -+get_nat_journal (struct grub_f2fs_data *data) -+{ -+ grub_uint32_t block; -+ char *buf; -+ grub_err_t err; -+ -+ buf = grub_malloc (F2FS_BLKSIZE); -+ if (!buf) -+ return grub_errno; -+ -+ if (CKPT_FLAG_SET(&data->ckpt, CP_COMPACT_SUM_FLAG)) -+ block = start_sum_block (data); -+ else if (CKPT_FLAG_SET (&data->ckpt, CP_UMOUNT_FLAG)) -+ block = sum_blk_addr (data, NR_CURSEG_TYPE, CURSEG_HOT_DATA); -+ else -+ block = sum_blk_addr (data, NR_CURSEG_DATA_TYPE, CURSEG_HOT_DATA); -+ -+ err = grub_f2fs_block_read (data, block, buf); -+ if (err) -+ goto fail; -+ -+ if (CKPT_FLAG_SET (&data->ckpt, CP_COMPACT_SUM_FLAG)) -+ grub_memcpy (&data->nat_j, buf, SUM_JOURNAL_SIZE); -+ else -+ grub_memcpy (&data->nat_j, buf + SUM_ENTRIES_SIZE, SUM_JOURNAL_SIZE); -+ -+ fail: -+ grub_free (buf); -+ -+ return err; -+} -+ -+static grub_uint32_t -+get_blkaddr_from_nat_journal (struct grub_f2fs_data *data, grub_uint32_t nid) -+{ -+ grub_uint16_t n = grub_le_to_cpu16 (data->nat_j.n_nats); -+ grub_uint32_t blkaddr = 0; -+ grub_uint16_t i; -+ -+ for (i = 0; i < n; i++) -+ { -+ if (grub_le_to_cpu32 (data->nat_j.entries[i].nid) == nid) -+ { -+ blkaddr = grub_le_to_cpu32 (data->nat_j.entries[i].ne.block_addr); -+ break; -+ } -+ } -+ -+ return blkaddr; -+} -+ -+static grub_uint32_t -+get_node_blkaddr (struct grub_f2fs_data *data, grub_uint32_t nid) -+{ -+ struct grub_f2fs_nat_block *nat_block; -+ grub_uint32_t seg_off, block_off, entry_off, block_addr; -+ grub_uint32_t blkaddr; -+ grub_err_t err; -+ -+ blkaddr = get_blkaddr_from_nat_journal (data, nid); -+ if (blkaddr) -+ return blkaddr; -+ -+ nat_block = grub_malloc (F2FS_BLKSIZE); -+ if (!nat_block) -+ return 0; -+ -+ block_off = nid / NAT_ENTRY_PER_BLOCK; -+ entry_off = nid % NAT_ENTRY_PER_BLOCK; -+ -+ seg_off = block_off / data->blocks_per_seg; -+ block_addr = data->nat_blkaddr + -+ ((seg_off * data->blocks_per_seg) << 1) + -+ (block_off & (data->blocks_per_seg - 1)); -+ -+ if (grub_f2fs_test_bit (block_off, data->nat_bitmap)) -+ block_addr += data->blocks_per_seg; -+ -+ err = grub_f2fs_block_read (data, block_addr, nat_block); -+ if (err) -+ { -+ grub_free (nat_block); -+ return 0; -+ } -+ -+ blkaddr = grub_le_to_cpu32 (nat_block->ne[entry_off].block_addr); -+ -+ grub_free (nat_block); -+ -+ return blkaddr; -+} -+ -+static int -+grub_get_node_path (struct grub_f2fs_inode *inode, grub_uint32_t block, -+ grub_uint32_t offset[4], grub_uint32_t noffset[4]) -+{ -+ grub_uint32_t direct_blks = ADDRS_PER_BLOCK; -+ grub_uint32_t dptrs_per_blk = NIDS_PER_BLOCK; -+ grub_uint32_t indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK; -+ grub_uint32_t dindirect_blks = indirect_blks * NIDS_PER_BLOCK; -+ grub_uint32_t direct_index = DEF_ADDRS_PER_INODE; -+ int n = 0; -+ int level = 0; -+ -+ if (inode->i_inline & F2FS_INLINE_XATTR) -+ direct_index -= F2FS_INLINE_XATTR_ADDRS; -+ -+ noffset[0] = 0; -+ -+ if (block < direct_index) -+ { -+ offset[n] = block; -+ goto got; -+ } -+ -+ block -= direct_index; -+ if (block < direct_blks) -+ { -+ offset[n++] = NODE_DIR1_BLOCK; -+ noffset[n] = 1; -+ offset[n] = block; -+ level = 1; -+ goto got; -+ } -+ -+ block -= direct_blks; -+ if (block < direct_blks) -+ { -+ offset[n++] = NODE_DIR2_BLOCK; -+ noffset[n] = 2; -+ offset[n] = block; -+ level = 1; -+ goto got; -+ } -+ -+ block -= direct_blks; -+ if (block < indirect_blks) -+ { -+ offset[n++] = NODE_IND1_BLOCK; -+ noffset[n] = 3; -+ offset[n++] = block / direct_blks; -+ noffset[n] = 4 + offset[n - 1]; -+ offset[n] = block % direct_blks; -+ level = 2; -+ goto got; -+ } -+ -+ block -= indirect_blks; -+ if (block < indirect_blks) -+ { -+ offset[n++] = NODE_IND2_BLOCK; -+ noffset[n] = 4 + dptrs_per_blk; -+ offset[n++] = block / direct_blks; -+ noffset[n] = 5 + dptrs_per_blk + offset[n - 1]; -+ offset[n] = block % direct_blks; -+ level = 2; -+ goto got; -+ } -+ -+ block -= indirect_blks; -+ if (block < dindirect_blks) -+ { -+ offset[n++] = NODE_DIND_BLOCK; -+ noffset[n] = 5 + (dptrs_per_blk * 2); -+ offset[n++] = block / indirect_blks; -+ noffset[n] = 6 + (dptrs_per_blk * 2) + -+ offset[n - 1] * (dptrs_per_blk + 1); -+ offset[n++] = (block / direct_blks) % dptrs_per_blk; -+ noffset[n] = 7 + (dptrs_per_blk * 2) + -+ offset[n - 2] * (dptrs_per_blk + 1) + offset[n - 1]; -+ offset[n] = block % direct_blks; -+ level = 3; -+ goto got; -+ } -+ -+ got: -+ return level; -+} -+ -+static grub_err_t -+grub_f2fs_read_node (struct grub_f2fs_data *data, -+ grub_uint32_t nid, struct grub_f2fs_node *np) -+{ -+ grub_uint32_t blkaddr; -+ -+ blkaddr = get_node_blkaddr (data, nid); -+ if (!blkaddr) -+ return grub_errno; -+ -+ return grub_f2fs_block_read (data, blkaddr, np); -+} -+ -+static struct grub_f2fs_data * -+grub_f2fs_mount (grub_disk_t disk) -+{ -+ struct grub_f2fs_data *data; -+ grub_err_t err; -+ -+ data = grub_malloc (sizeof (*data)); -+ if (!data) -+ return NULL; -+ -+ data->disk = disk; -+ -+ if (grub_f2fs_read_sb (data, F2FS_SUPER_OFFSET0)) -+ { -+ if (grub_f2fs_read_sb (data, F2FS_SUPER_OFFSET1)) -+ { -+ if (grub_errno == GRUB_ERR_NONE) -+ grub_error (GRUB_ERR_BAD_FS, -+ "not a F2FS filesystem (no superblock)"); -+ goto fail; -+ } -+ } -+ -+ data->root_ino = grub_le_to_cpu32 (data->sblock.root_ino); -+ data->cp_blkaddr = grub_le_to_cpu32 (data->sblock.cp_blkaddr); -+ data->nat_blkaddr = grub_le_to_cpu32 (data->sblock.nat_blkaddr); -+ data->blocks_per_seg = 1 << -+ grub_le_to_cpu32 (data->sblock.log_blocks_per_seg); -+ -+ err = grub_f2fs_read_cp (data); -+ if (err) -+ goto fail; -+ -+ data->nat_bitmap = nat_bitmap_ptr (data); -+ -+ err = get_nat_journal (data); -+ if (err) -+ goto fail; -+ -+ data->diropen.data = data; -+ data->diropen.ino = data->root_ino; -+ data->diropen.inode_read = 1; -+ data->inode = &data->diropen.inode; -+ -+ err = grub_f2fs_read_node (data, data->root_ino, data->inode); -+ if (err) -+ goto fail; -+ -+ return data; -+ -+ fail: -+ grub_free (data); -+ -+ return NULL; -+} -+ -+/* Guarantee inline_data was handled by caller. */ -+static grub_disk_addr_t -+grub_f2fs_get_block (grub_fshelp_node_t node, grub_disk_addr_t block_ofs) -+{ -+ struct grub_f2fs_data *data = node->data; -+ struct grub_f2fs_inode *inode = &node->inode.i; -+ grub_uint32_t offset[4], noffset[4], nids[4]; -+ struct grub_f2fs_node *node_block; -+ grub_uint32_t block_addr = -1; -+ int level, i; -+ -+ level = grub_get_node_path (inode, block_ofs, offset, noffset); -+ if (level == 0) -+ return grub_le_to_cpu32 (inode->i_addr[offset[0]]); -+ -+ node_block = grub_malloc (F2FS_BLKSIZE); -+ if (!node_block) -+ return -1; -+ -+ nids[1] = get_node_id (&node->inode, offset[0], 1); -+ -+ /* Get indirect or direct nodes. */ -+ for (i = 1; i <= level; i++) -+ { -+ grub_f2fs_read_node (data, nids[i], node_block); -+ if (grub_errno) -+ goto fail; -+ -+ if (i < level) -+ nids[i + 1] = get_node_id (node_block, offset[i], 0); -+ } -+ -+ block_addr = grub_le_to_cpu32 (node_block->dn.addr[offset[level]]); -+ -+ fail: -+ grub_free (node_block); -+ -+ return block_addr; -+} -+ -+static grub_ssize_t -+grub_f2fs_read_file (grub_fshelp_node_t node, -+ grub_disk_read_hook_t read_hook, void *read_hook_data, -+ grub_off_t pos, grub_size_t len, char *buf) -+{ -+ struct grub_f2fs_inode *inode = &node->inode.i; -+ grub_off_t filesize = grub_f2fs_file_size (inode); -+ char *inline_addr = get_inline_addr (inode); -+ -+ if (inode->i_inline & F2FS_INLINE_DATA) -+ { -+ if (filesize > MAX_INLINE_DATA) -+ return -1; -+ -+ if (len > filesize - pos) -+ len = filesize - pos; -+ -+ grub_memcpy (buf, inline_addr + pos, len); -+ return len; -+ } -+ -+ return grub_fshelp_read_file (node->data->disk, node, -+ read_hook, read_hook_data, -+ pos, len, buf, grub_f2fs_get_block, -+ filesize, -+ F2FS_BLK_SEC_BITS, 0); -+} -+ -+static char * -+grub_f2fs_read_symlink (grub_fshelp_node_t node) -+{ -+ char *symlink; -+ struct grub_fshelp_node *diro = node; -+ grub_uint64_t filesize; -+ -+ if (!diro->inode_read) -+ { -+ grub_f2fs_read_node (diro->data, diro->ino, &diro->inode); -+ if (grub_errno) -+ return 0; -+ } -+ -+ filesize = grub_f2fs_file_size(&diro->inode.i); -+ -+ symlink = grub_malloc (filesize + 1); -+ if (!symlink) -+ return 0; -+ -+ grub_f2fs_read_file (diro, 0, 0, 0, filesize, symlink); -+ if (grub_errno) -+ { -+ grub_free (symlink); -+ return 0; -+ } -+ -+ symlink[filesize] = '\0'; -+ -+ return symlink; -+} -+ -+static int -+grub_f2fs_check_dentries (struct grub_f2fs_dir_iter_ctx *ctx) -+{ -+ struct grub_fshelp_node *fdiro; -+ int i; -+ -+ for (i = 0; i < ctx->max;) -+ { -+ char *filename; -+ enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN; -+ enum FILE_TYPE ftype; -+ int name_len; -+ int ret; -+ -+ if (grub_f2fs_test_bit_le (i, ctx->bitmap) == 0) -+ { -+ i++; -+ continue; -+ } -+ -+ ftype = ctx->dentry[i].file_type; -+ name_len = grub_le_to_cpu16 (ctx->dentry[i].name_len); -+ filename = grub_malloc (name_len + 1); -+ if (!filename) -+ return 0; -+ -+ grub_memcpy (filename, ctx->filename[i], name_len); -+ filename[name_len] = 0; -+ -+ fdiro = grub_malloc (sizeof (struct grub_fshelp_node)); -+ if (!fdiro) -+ { -+ grub_free(filename); -+ return 0; -+ } -+ -+ if (ftype == F2FS_FT_DIR) -+ type = GRUB_FSHELP_DIR; -+ else if (ftype == F2FS_FT_SYMLINK) -+ type = GRUB_FSHELP_SYMLINK; -+ else if (ftype == F2FS_FT_REG_FILE) -+ type = GRUB_FSHELP_REG; -+ -+ fdiro->data = ctx->data; -+ fdiro->ino = grub_le_to_cpu32 (ctx->dentry[i].ino); -+ fdiro->inode_read = 0; -+ -+ ret = ctx->hook (filename, type, fdiro, ctx->hook_data); -+ grub_free(filename); -+ if (ret) -+ return 1; -+ -+ i += (name_len + F2FS_SLOT_LEN - 1) / F2FS_SLOT_LEN; -+ } -+ -+ return 0; -+} -+ -+static int -+grub_f2fs_iterate_inline_dir (struct grub_f2fs_inode *dir, -+ struct grub_f2fs_dir_iter_ctx *ctx) -+{ -+ struct grub_f2fs_inline_dentry *de_blk; -+ -+ de_blk = (struct grub_f2fs_inline_dentry *) get_inline_addr (dir); -+ -+ ctx->bitmap = de_blk->dentry_bitmap; -+ ctx->dentry = de_blk->dentry; -+ ctx->filename = de_blk->filename; -+ ctx->max = NR_INLINE_DENTRY; -+ -+ return grub_f2fs_check_dentries (ctx); -+} -+ -+static int -+grub_f2fs_iterate_dir (grub_fshelp_node_t dir, -+ grub_fshelp_iterate_dir_hook_t hook, void *hook_data) -+{ -+ struct grub_fshelp_node *diro = (struct grub_fshelp_node *) dir; -+ struct grub_f2fs_inode *inode; -+ struct grub_f2fs_dir_iter_ctx ctx = { -+ .data = diro->data, -+ .hook = hook, -+ .hook_data = hook_data -+ }; -+ grub_off_t fpos = 0; -+ -+ if (!diro->inode_read) -+ { -+ grub_f2fs_read_node (diro->data, diro->ino, &diro->inode); -+ if (grub_errno) -+ return 0; -+ } -+ -+ inode = &diro->inode.i; -+ -+ if (inode->i_inline & F2FS_INLINE_DENTRY) -+ return grub_f2fs_iterate_inline_dir (inode, &ctx); -+ -+ while (fpos < grub_f2fs_file_size (inode)) -+ { -+ struct grub_f2fs_dentry_block *de_blk; -+ char *buf; -+ int ret; -+ -+ buf = grub_zalloc (F2FS_BLKSIZE); -+ if (!buf) -+ return 0; -+ -+ grub_f2fs_read_file (diro, 0, 0, fpos, F2FS_BLKSIZE, buf); -+ if (grub_errno) -+ { -+ grub_free (buf); -+ return 0; -+ } -+ -+ de_blk = (struct grub_f2fs_dentry_block *) buf; -+ -+ ctx.bitmap = de_blk->dentry_bitmap; -+ ctx.dentry = de_blk->dentry; -+ ctx.filename = de_blk->filename; -+ ctx.max = NR_DENTRY_IN_BLOCK; -+ -+ ret = grub_f2fs_check_dentries (&ctx); -+ grub_free (buf); -+ if (ret) -+ return 1; -+ -+ fpos += F2FS_BLKSIZE; -+ } -+ -+ return 0; -+} -+ -+static int -+grub_f2fs_dir_iter (const char *filename, enum grub_fshelp_filetype filetype, -+ grub_fshelp_node_t node, void *data) -+{ -+ struct grub_f2fs_dir_ctx *ctx = data; -+ struct grub_dirhook_info info; -+ -+ grub_memset (&info, 0, sizeof (info)); -+ if (!node->inode_read) -+ { -+ grub_f2fs_read_node (ctx->data, node->ino, &node->inode); -+ if (!grub_errno) -+ node->inode_read = 1; -+ grub_errno = GRUB_ERR_NONE; -+ } -+ if (node->inode_read) -+ { -+ info.mtimeset = 1; -+ info.mtime = grub_le_to_cpu64 (node->inode.i.i_mtime); -+ } -+ -+ info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); -+ grub_free (node); -+ -+ return ctx->hook (filename, &info, ctx->hook_data); -+} -+ -+static grub_err_t -+grub_f2fs_dir (grub_device_t device, const char *path, -+ grub_fs_dir_hook_t hook, void *hook_data) -+{ -+ struct grub_f2fs_dir_ctx ctx = { -+ .hook = hook, -+ .hook_data = hook_data -+ }; -+ struct grub_fshelp_node *fdiro = 0; -+ -+ grub_dl_ref (my_mod); -+ -+ ctx.data = grub_f2fs_mount (device->disk); -+ if (!ctx.data) -+ goto fail; -+ -+ grub_fshelp_find_file (path, &ctx.data->diropen, &fdiro, -+ grub_f2fs_iterate_dir, grub_f2fs_read_symlink, -+ GRUB_FSHELP_DIR); -+ if (grub_errno) -+ goto fail; -+ -+ grub_f2fs_iterate_dir (fdiro, grub_f2fs_dir_iter, &ctx); -+ -+ fail: -+ if (fdiro != &ctx.data->diropen) -+ grub_free (fdiro); -+ grub_free (ctx.data); -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+/* Open a file named NAME and initialize FILE. */ -+static grub_err_t -+grub_f2fs_open (struct grub_file *file, const char *name) -+{ -+ struct grub_f2fs_data *data = NULL; -+ struct grub_fshelp_node *fdiro = 0; -+ struct grub_f2fs_inode *inode; -+ -+ grub_dl_ref (my_mod); -+ -+ data = grub_f2fs_mount (file->device->disk); -+ if (!data) -+ goto fail; -+ -+ grub_fshelp_find_file (name, &data->diropen, &fdiro, -+ grub_f2fs_iterate_dir, grub_f2fs_read_symlink, -+ GRUB_FSHELP_REG); -+ if (grub_errno) -+ goto fail; -+ -+ if (!fdiro->inode_read) -+ { -+ grub_f2fs_read_node (data, fdiro->ino, &fdiro->inode); -+ if (grub_errno) -+ goto fail; -+ } -+ -+ grub_memcpy (data->inode, &fdiro->inode, sizeof (*data->inode)); -+ grub_free (fdiro); -+ -+ inode = &(data->inode->i); -+ file->size = grub_f2fs_file_size (inode); -+ file->data = data; -+ file->offset = 0; -+ -+ if (inode->i_inline & F2FS_INLINE_DATA && file->size > MAX_INLINE_DATA) -+ grub_error (GRUB_ERR_BAD_FS, "corrupted inline_data: need fsck"); -+ -+ return 0; -+ -+ fail: -+ if (fdiro != &data->diropen) -+ grub_free (fdiro); -+ grub_free (data); -+ -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+static grub_ssize_t -+grub_f2fs_read (grub_file_t file, char *buf, grub_size_t len) -+{ -+ struct grub_f2fs_data *data = (struct grub_f2fs_data *) file->data; -+ -+ return grub_f2fs_read_file (&data->diropen, -+ file->read_hook, file->read_hook_data, -+ file->offset, len, buf); -+} -+ -+static grub_err_t -+grub_f2fs_close (grub_file_t file) -+{ -+ struct grub_f2fs_data *data = (struct grub_f2fs_data *) file->data; -+ -+ grub_free (data); -+ -+ grub_dl_unref (my_mod); -+ -+ return GRUB_ERR_NONE; -+} -+ -+static grub_uint8_t * -+grub_f2fs_utf16_to_utf8 (grub_uint16_t *in_buf_le) -+{ -+ grub_uint16_t in_buf[MAX_VOLUME_NAME]; -+ grub_uint8_t *out_buf; -+ int len = 0; -+ -+ out_buf = grub_malloc (MAX_VOLUME_NAME * GRUB_MAX_UTF8_PER_UTF16 + 1); -+ if (!out_buf) -+ return NULL; -+ -+ while (*in_buf_le != 0 && len < MAX_VOLUME_NAME) { -+ in_buf[len] = grub_le_to_cpu16 (in_buf_le[len]); -+ len++; -+ } -+ -+ *grub_utf16_to_utf8 (out_buf, in_buf, len) = '\0'; -+ -+ return out_buf; -+} -+ -+static grub_err_t -+grub_f2fs_label (grub_device_t device, char **label) -+{ -+ struct grub_f2fs_data *data; -+ grub_disk_t disk = device->disk; -+ -+ grub_dl_ref (my_mod); -+ -+ data = grub_f2fs_mount (disk); -+ if (data) -+ *label = (char *) grub_f2fs_utf16_to_utf8 (data->sblock.volume_name); -+ else -+ *label = NULL; -+ -+ grub_free (data); -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+static grub_err_t -+grub_f2fs_uuid (grub_device_t device, char **uuid) -+{ -+ struct grub_f2fs_data *data; -+ grub_disk_t disk = device->disk; -+ -+ grub_dl_ref (my_mod); -+ -+ data = grub_f2fs_mount (disk); -+ if (data) -+ { -+ *uuid = -+ grub_xasprintf -+ ("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", -+ data->sblock.uuid[0], data->sblock.uuid[1], -+ data->sblock.uuid[2], data->sblock.uuid[3], -+ data->sblock.uuid[4], data->sblock.uuid[5], -+ data->sblock.uuid[6], data->sblock.uuid[7], -+ data->sblock.uuid[8], data->sblock.uuid[9], -+ data->sblock.uuid[10], data->sblock.uuid[11], -+ data->sblock.uuid[12], data->sblock.uuid[13], -+ data->sblock.uuid[14], data->sblock.uuid[15]); -+ } -+ else -+ *uuid = NULL; -+ -+ grub_free (data); -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+static struct grub_fs grub_f2fs_fs = { -+ .name = "f2fs", -+ .dir = grub_f2fs_dir, -+ .open = grub_f2fs_open, -+ .read = grub_f2fs_read, -+ .close = grub_f2fs_close, -+ .label = grub_f2fs_label, -+ .uuid = grub_f2fs_uuid, -+#ifdef GRUB_UTIL -+ .reserved_first_sector = 1, -+ .blocklist_install = 0, -+#endif -+ .next = 0 -+}; -+ -+GRUB_MOD_INIT (f2fs) -+{ -+ grub_fs_register (&grub_f2fs_fs); -+ my_mod = mod; -+} -+ -+GRUB_MOD_FINI (f2fs) -+{ -+ grub_fs_unregister (&grub_f2fs_fs); -+} -diff --git a/po/exclude.pot b/po/exclude.pot -index 0a9b215..816089c 100644 ---- a/po/exclude.pot -+++ b/po/exclude.pot -@@ -1214,6 +1214,7 @@ msgstr "" - - #: grub-core/commands/xnu_uuid.c:75 grub-core/fs/jfs.c:924 - #: grub-core/fs/nilfs2.c:1135 -+#: grub-core/fs/f2fs.c:1259 - #, c-format - msgid "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" - msgstr "" -diff --git a/tests/f2fs_test.in b/tests/f2fs_test.in -new file mode 100644 -index 0000000..1ea77c8 ---- /dev/null -+++ b/tests/f2fs_test.in -@@ -0,0 +1,19 @@ -+#!/bin/sh -+ -+set -e -+ -+if [ "x$EUID" = "x" ] ; then -+ EUID=`id -u` -+fi -+ -+if [ "$EUID" != 0 ] ; then -+ exit 77 -+fi -+ -+if ! which mkfs.f2fs >/dev/null 2>&1; then -+ echo "mkfs.f2fs not installed; cannot test f2fs." -+ exit 77 -+fi -+ -+ -+"@builddir@/grub-fs-tester" f2fs -diff --git a/tests/util/grub-fs-tester.in b/tests/util/grub-fs-tester.in -index 15969d7..26bd57a 100644 ---- a/tests/util/grub-fs-tester.in -+++ b/tests/util/grub-fs-tester.in -@@ -172,7 +172,7 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do - xsquash*) - MINBLKSIZE=4096 - MAXBLKSIZE=1048576;; -- xxfs) -+ xxfs|xf2fs) - MINBLKSIZE=$SECSIZE - # OS Limitation: GNU/Linux doesn't accept > 4096 - MAXBLKSIZE=4096;; -@@ -299,6 +299,10 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do - x"btrfs"*) - FSLABEL="grub_;/testé莭莽😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoi";; - -+ # FS LIMITATION: f2fs label is at most 512 UTF-16 chars -+ x"f2fs") -+ FSLABEL="grub_;/testé䏌䐓䏕киритiurewfceniuewruewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoirvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoircreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoiq";; -+ - # FS LIMITATION: exfat is at most 15 UTF-16 chars - x"exfat") - FSLABEL="géт ;/莭莽😁кир";; -@@ -508,7 +512,7 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do - # FIXME: Not sure about BtrFS, NTFS, JFS, AFS, UDF and SFS. Check it. - # FS LIMITATION: as far as I know those FS don't store their last modification date. - x"jfs_caseins" | x"jfs" | x"xfs" | x"xfs_crc" | x"btrfs"* | x"reiserfs_old" | x"reiserfs" \ -- | x"bfs" | x"afs" \ -+ | x"bfs" | x"afs" | x"f2fs" \ - | x"tarfs" | x"cpio_"* | x"minix" | x"minix2" \ - | x"minix3" | x"ntfs"* | x"udf" | x"sfs"*) - NOFSTIME=y;; -@@ -792,6 +796,8 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do - MOUNTDEVICE="/dev/mapper/grub_test-testvol" - MOUNTFS=ext2 - "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; -+ xf2fs) -+ "mkfs.f2fs" -l "$FSLABEL" -q "${LODEVICES[0]}" ;; - xnilfs2) - "mkfs.nilfs2" -L "$FSLABEL" -b $BLKSIZE -q "${MOUNTDEVICE}" ;; - xext2_old) --- -cgit v1.0-41-gc330 - diff --git a/main/grub/grub2-accept-empty-module.patch b/main/grub/grub2-accept-empty-module.patch deleted file mode 100644 index d3d75457dc..0000000000 --- a/main/grub/grub2-accept-empty-module.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Michael Matz <matz@suse.com> - -Accept empty modules - -For the Xen platform the all_video.mod module is empty. -With old binutils the .symtab section remained (containing -only section symbols), so the check didn't trigger, but starting -with binutils 2.27 not even a .symtab remains. As there are -also no relocations that's no problem (and that is checked -independendly). ---- grub-2.02~beta3/util/grub-module-verifierXX.c.mm 2016-02-11 10:57:41.000000000 +0000 -+++ grub-2.02~beta3/util/grub-module-verifierXX.c 2016-08-31 15:26:36.000000000 +0000 -@@ -199,7 +199,8 @@ check_symbols (const struct grub_module_ - Elf_Shdr *s = find_section (arch, e, ".moddeps"); - - if (!s) -- grub_util_error ("no symbol table and no .moddeps section"); -+ /*grub_util_error ("no symbol table and no .moddeps section");*/ -+ return; /* An empty module happens for all_video.module for Xen */ - - if (!s->sh_size) - grub_util_error ("no symbol table and empty .moddeps section"); diff --git a/main/grub/x86-64-Treat-R_X86_64_PLT32-as-R_X86_64_PC32.patch b/main/grub/x86-64-Treat-R_X86_64_PLT32-as-R_X86_64_PC32.patch deleted file mode 100644 index 4f2716e9a7..0000000000 --- a/main/grub/x86-64-Treat-R_X86_64_PLT32-as-R_X86_64_PC32.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 842c390469e2c2e10b5aa36700324cd3bde25875 Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" <hjl.tools@gmail.com> -Date: Sat, 17 Feb 2018 06:47:28 -0800 -Subject: x86-64: Treat R_X86_64_PLT32 as R_X86_64_PC32 - -Starting from binutils commit bd7ab16b4537788ad53521c45469a1bdae84ad4a: - -https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=bd7ab16b4537788ad53521c45469a1bdae84ad4a - -x86-64 assembler generates R_X86_64_PLT32, instead of R_X86_64_PC32, for -32-bit PC-relative branches. Grub2 should treat R_X86_64_PLT32 as -R_X86_64_PC32. - -Signed-off-by: H.J. Lu <hjl.tools@gmail.com> -Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> ---- - grub-core/efiemu/i386/loadcore64.c | 1 + - grub-core/kern/x86_64/dl.c | 1 + - util/grub-mkimagexx.c | 1 + - util/grub-module-verifier.c | 1 + - 4 files changed, 4 insertions(+) - -diff --git a/grub-core/efiemu/i386/loadcore64.c b/grub-core/efiemu/i386/loadcore64.c -index e49d0b6..18facf4 100644 ---- a/grub-core/efiemu/i386/loadcore64.c -+++ b/grub-core/efiemu/i386/loadcore64.c -@@ -98,6 +98,7 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs, - break; - - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - err = grub_efiemu_write_value (addr, - *addr32 + rel->r_addend - + sym.off -diff --git a/grub-core/kern/x86_64/dl.c b/grub-core/kern/x86_64/dl.c -index 4406906..3a73e6e 100644 ---- a/grub-core/kern/x86_64/dl.c -+++ b/grub-core/kern/x86_64/dl.c -@@ -70,6 +70,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr, - break; - - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - { - grub_int64_t value; - value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value - -diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c -index a2bb054..39d7efb 100644 ---- a/util/grub-mkimagexx.c -+++ b/util/grub-mkimagexx.c -@@ -841,6 +841,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, - break; - - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - { - grub_uint32_t *t32 = (grub_uint32_t *) target; - *t32 = grub_host_to_target64 (grub_target_to_host32 (*t32) -diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c -index 9179285..a79271f 100644 ---- a/util/grub-module-verifier.c -+++ b/util/grub-module-verifier.c -@@ -19,6 +19,7 @@ struct grub_module_verifier_arch archs[] = { - -1 - }, (int[]){ - R_X86_64_PC32, -+ R_X86_64_PLT32, - -1 - } - }, --- -cgit v1.0-41-gc330 - |