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>
This commit is contained in:
parent
b85619206a
commit
ef5fcec192
8 changed files with 76 additions and 47 deletions
|
@ -65,7 +65,7 @@ grub_tsc_init (void)
|
||||||
|
|
||||||
tsc_boot_time = grub_get_tsc ();
|
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());
|
(void) (grub_tsc_calibrate_from_xen () || calibrate_tsc_hardcode());
|
||||||
#elif defined (GRUB_MACHINE_EFI)
|
#elif defined (GRUB_MACHINE_EFI)
|
||||||
(void) (grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_pit () || grub_tsc_calibrate_from_efi() || calibrate_tsc_hardcode());
|
(void) (grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_pit () || grub_tsc_calibrate_from_efi() || calibrate_tsc_hardcode());
|
||||||
|
|
|
@ -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_kbin16mb;
|
||||||
extern grub_uint16_t grub_machine_mmaphook_64kbin4gb;
|
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. */
|
/* Helper for preboot. */
|
||||||
static int fill_hook (grub_uint64_t addr, grub_uint64_t size,
|
static int fill_hook (grub_uint64_t addr, grub_uint64_t size,
|
||||||
grub_memory_type_t type, void *data)
|
grub_memory_type_t type, void *data)
|
||||||
|
|
|
@ -44,6 +44,13 @@
|
||||||
|
|
||||||
#include <grub/types.h>
|
#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_upper (void);
|
||||||
grub_uint64_t grub_mmap_get_lower (void);
|
grub_uint64_t grub_mmap_get_lower (void);
|
||||||
grub_uint64_t grub_mmap_get_post64 (void);
|
grub_uint64_t grub_mmap_get_post64 (void);
|
||||||
|
|
|
@ -20,45 +20,11 @@
|
||||||
#define GRUB_INTERRUPT_MACHINE_HEADER 1
|
#define GRUB_INTERRUPT_MACHINE_HEADER 1
|
||||||
|
|
||||||
#include <grub/symbol.h>
|
#include <grub/symbol.h>
|
||||||
#include <grub/types.h>
|
#include <grub/i386/pc/int_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
|
|
||||||
|
|
||||||
void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno,
|
void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno,
|
||||||
struct grub_bios_int_registers *regs)
|
struct grub_bios_int_registers *regs)
|
||||||
__attribute__ ((regparm(3)));
|
__attribute__ ((regparm(3)));
|
||||||
struct grub_i386_idt
|
|
||||||
{
|
|
||||||
grub_uint16_t limit;
|
|
||||||
grub_uint32_t base;
|
|
||||||
} GRUB_PACKED;
|
|
||||||
|
|
||||||
#ifdef GRUB_MACHINE_PCBIOS
|
#ifdef GRUB_MACHINE_PCBIOS
|
||||||
extern struct grub_i386_idt *EXPORT_VAR(grub_realidt);
|
extern struct grub_i386_idt *EXPORT_VAR(grub_realidt);
|
||||||
|
|
59
include/grub/i386/pc/int_types.h
Normal file
59
include/grub/i386/pc/int_types.h
Normal file
|
@ -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
|
|
@ -54,7 +54,7 @@ grub_get_tsc (void)
|
||||||
static __inline int
|
static __inline int
|
||||||
grub_cpu_is_tsc_supported (void)
|
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;
|
grub_uint32_t a,b,c,d;
|
||||||
if (! grub_cpu_is_cpuid_supported ())
|
if (! grub_cpu_is_cpuid_supported ())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -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 a1, grub_uint32_t a2,
|
||||||
grub_uint32_t a3, grub_uint32_t a4,
|
grub_uint32_t a3, grub_uint32_t a4,
|
||||||
grub_uint32_t a5)
|
grub_uint32_t a5)
|
||||||
__attribute__ ((regparm (3), cdecl));
|
#ifdef GRUB_MACHINE_XEN
|
||||||
|
__attribute__ ((regparm (3), cdecl))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
grub_xen_sched_op (int cmd, void *arg)
|
grub_xen_sched_op (int cmd, void *arg)
|
||||||
|
|
|
@ -79,7 +79,9 @@ struct grub_module_info64
|
||||||
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) \
|
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) \
|
||||||
|| defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_MIPS_QEMU_MIPS) \
|
|| defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_MIPS_QEMU_MIPS) \
|
||||||
|| defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_ARC) \
|
|| 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. */
|
/* FIXME: stack is between 2 heap regions. Move it. */
|
||||||
#define GRUB_KERNEL_PRELOAD_SPACE_REUSABLE 1
|
#define GRUB_KERNEL_PRELOAD_SPACE_REUSABLE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue