Commit 18eb3b6d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-6.5-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen updates from Juergen Gross:

 - three patches adding missing prototypes

 - a fix for finding the iBFT in a Xen dom0 for supporting diskless
   iSCSI boot

* tag 'for-linus-6.5-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  x86: xen: add missing prototypes
  x86/xen: add prototypes for paravirt mmu functions
  iscsi_ibft: Fix finding the iBFT under Xen Dom 0
  xen: xen_debug_interrupt prototype to global header
parents 6a466769 fb9b7b4b
...@@ -796,7 +796,6 @@ static void __init early_reserve_memory(void) ...@@ -796,7 +796,6 @@ static void __init early_reserve_memory(void)
memblock_x86_reserve_range_setup_data(); memblock_x86_reserve_range_setup_data();
reserve_ibft_region();
reserve_bios_regions(); reserve_bios_regions();
trim_snb_memory(); trim_snb_memory();
} }
...@@ -1032,6 +1031,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -1032,6 +1031,7 @@ void __init setup_arch(char **cmdline_p)
if (efi_enabled(EFI_BOOT)) if (efi_enabled(EFI_BOOT))
efi_init(); efi_init();
reserve_ibft_region();
dmi_setup(); dmi_setup();
/* /*
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/xen/hypercall.h> #include <asm/xen/hypercall.h>
#include "xen-ops.h"
static efi_char16_t vendor[100] __initdata; static efi_char16_t vendor[100] __initdata;
static efi_system_table_t efi_systab_xen __initdata = { static efi_system_table_t efi_systab_xen __initdata = {
......
...@@ -86,6 +86,22 @@ ...@@ -86,6 +86,22 @@
#include "mmu.h" #include "mmu.h"
#include "debugfs.h" #include "debugfs.h"
/*
* Prototypes for functions called via PV_CALLEE_SAVE_REGS_THUNK() in order
* to avoid warnings with "-Wmissing-prototypes".
*/
pteval_t xen_pte_val(pte_t pte);
pgdval_t xen_pgd_val(pgd_t pgd);
pmdval_t xen_pmd_val(pmd_t pmd);
pudval_t xen_pud_val(pud_t pud);
p4dval_t xen_p4d_val(p4d_t p4d);
pte_t xen_make_pte(pteval_t pte);
pgd_t xen_make_pgd(pgdval_t pgd);
pmd_t xen_make_pmd(pmdval_t pmd);
pud_t xen_make_pud(pudval_t pud);
p4d_t xen_make_p4d(p4dval_t p4d);
pte_t xen_make_pte_init(pteval_t pte);
#ifdef CONFIG_X86_VSYSCALL_EMULATION #ifdef CONFIG_X86_VSYSCALL_EMULATION
/* l3 pud for userspace vsyscall mapping */ /* l3 pud for userspace vsyscall mapping */
static pud_t level3_user_vsyscall[PTRS_PER_PUD] __page_aligned_bss; static pud_t level3_user_vsyscall[PTRS_PER_PUD] __page_aligned_bss;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/iscsi_ibft.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/kstrtox.h> #include <linux/kstrtox.h>
#include <linux/mm.h> #include <linux/mm.h>
...@@ -764,17 +765,26 @@ char * __init xen_memory_setup(void) ...@@ -764,17 +765,26 @@ char * __init xen_memory_setup(void)
BUG_ON(memmap.nr_entries == 0); BUG_ON(memmap.nr_entries == 0);
xen_e820_table.nr_entries = memmap.nr_entries; xen_e820_table.nr_entries = memmap.nr_entries;
/* if (xen_initial_domain()) {
* Xen won't allow a 1:1 mapping to be created to UNUSABLE /*
* regions, so if we're using the machine memory map leave the * Xen won't allow a 1:1 mapping to be created to UNUSABLE
* region as RAM as it is in the pseudo-physical map. * regions, so if we're using the machine memory map leave the
* * region as RAM as it is in the pseudo-physical map.
* UNUSABLE regions in domUs are not handled and will need *
* a patch in the future. * UNUSABLE regions in domUs are not handled and will need
*/ * a patch in the future.
if (xen_initial_domain()) */
xen_ignore_unusable(); xen_ignore_unusable();
#ifdef CONFIG_ISCSI_IBFT_FIND
/* Reserve 0.5 MiB to 1 MiB region so iBFT can be found */
xen_e820_table.entries[xen_e820_table.nr_entries].addr = IBFT_START;
xen_e820_table.entries[xen_e820_table.nr_entries].size = IBFT_END - IBFT_START;
xen_e820_table.entries[xen_e820_table.nr_entries].type = E820_TYPE_RESERVED;
xen_e820_table.nr_entries++;
#endif
}
/* Make sure the Xen-supplied memory map is well-ordered. */ /* Make sure the Xen-supplied memory map is well-ordered. */
e820__update_table(&xen_e820_table); e820__update_table(&xen_e820_table);
......
...@@ -2,6 +2,10 @@ ...@@ -2,6 +2,10 @@
#ifndef _XEN_SMP_H #ifndef _XEN_SMP_H
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
void asm_cpu_bringup_and_idle(void);
asmlinkage void cpu_bringup_and_idle(void);
extern void xen_send_IPI_mask(const struct cpumask *mask, extern void xen_send_IPI_mask(const struct cpumask *mask,
int vector); int vector);
extern void xen_send_IPI_mask_allbutself(const struct cpumask *mask, extern void xen_send_IPI_mask_allbutself(const struct cpumask *mask,
......
...@@ -55,7 +55,6 @@ static DEFINE_PER_CPU(struct xen_common_irq, xen_irq_work) = { .irq = -1 }; ...@@ -55,7 +55,6 @@ static DEFINE_PER_CPU(struct xen_common_irq, xen_irq_work) = { .irq = -1 };
static DEFINE_PER_CPU(struct xen_common_irq, xen_pmu_irq) = { .irq = -1 }; static DEFINE_PER_CPU(struct xen_common_irq, xen_pmu_irq) = { .irq = -1 };
static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id); static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id);
void asm_cpu_bringup_and_idle(void);
static void cpu_bringup(void) static void cpu_bringup(void)
{ {
......
...@@ -72,8 +72,6 @@ void xen_restore_time_memory_area(void); ...@@ -72,8 +72,6 @@ void xen_restore_time_memory_area(void);
void xen_init_time_ops(void); void xen_init_time_ops(void);
void xen_hvm_init_time_ops(void); void xen_hvm_init_time_ops(void);
irqreturn_t xen_debug_interrupt(int irq, void *dev_id);
bool xen_vcpu_stolen(int vcpu); bool xen_vcpu_stolen(int vcpu);
void xen_vcpu_setup(int cpu); void xen_vcpu_setup(int cpu);
...@@ -148,9 +146,12 @@ int xen_cpuhp_setup(int (*cpu_up_prepare_cb)(unsigned int), ...@@ -148,9 +146,12 @@ int xen_cpuhp_setup(int (*cpu_up_prepare_cb)(unsigned int),
void xen_pin_vcpu(int cpu); void xen_pin_vcpu(int cpu);
void xen_emergency_restart(void); void xen_emergency_restart(void);
void xen_force_evtchn_callback(void);
#ifdef CONFIG_XEN_PV #ifdef CONFIG_XEN_PV
void xen_pv_pre_suspend(void); void xen_pv_pre_suspend(void);
void xen_pv_post_suspend(int suspend_cancelled); void xen_pv_post_suspend(int suspend_cancelled);
void xen_start_kernel(struct start_info *si);
#else #else
static inline void xen_pv_pre_suspend(void) {} static inline void xen_pv_pre_suspend(void) {}
static inline void xen_pv_post_suspend(int suspend_cancelled) {} static inline void xen_pv_post_suspend(int suspend_cancelled) {}
......
...@@ -42,8 +42,6 @@ static const struct { ...@@ -42,8 +42,6 @@ static const struct {
}; };
#define IBFT_SIGN_LEN 4 #define IBFT_SIGN_LEN 4
#define IBFT_START 0x80000 /* 512kB */
#define IBFT_END 0x100000 /* 1MB */
#define VGA_MEM 0xA0000 /* VGA buffer */ #define VGA_MEM 0xA0000 /* VGA buffer */
#define VGA_SIZE 0x20000 /* 128kB */ #define VGA_SIZE 0x20000 /* 128kB */
...@@ -52,9 +50,9 @@ static const struct { ...@@ -52,9 +50,9 @@ static const struct {
*/ */
void __init reserve_ibft_region(void) void __init reserve_ibft_region(void)
{ {
unsigned long pos; unsigned long pos, virt_pos = 0;
unsigned int len = 0; unsigned int len = 0;
void *virt; void *virt = NULL;
int i; int i;
ibft_phys_addr = 0; ibft_phys_addr = 0;
...@@ -70,13 +68,20 @@ void __init reserve_ibft_region(void) ...@@ -70,13 +68,20 @@ void __init reserve_ibft_region(void)
* so skip that area */ * so skip that area */
if (pos == VGA_MEM) if (pos == VGA_MEM)
pos += VGA_SIZE; pos += VGA_SIZE;
virt = isa_bus_to_virt(pos);
/* Map page by page */
if (offset_in_page(pos) == 0) {
if (virt)
early_memunmap(virt, PAGE_SIZE);
virt = early_memremap_ro(pos, PAGE_SIZE);
virt_pos = pos;
}
for (i = 0; i < ARRAY_SIZE(ibft_signs); i++) { for (i = 0; i < ARRAY_SIZE(ibft_signs); i++) {
if (memcmp(virt, ibft_signs[i].sign, IBFT_SIGN_LEN) == if (memcmp(virt + (pos - virt_pos), ibft_signs[i].sign,
0) { IBFT_SIGN_LEN) == 0) {
unsigned long *addr = unsigned long *addr =
(unsigned long *)isa_bus_to_virt(pos + 4); (unsigned long *)(virt + pos - virt_pos + 4);
len = *addr; len = *addr;
/* if the length of the table extends past 1M, /* if the length of the table extends past 1M,
* the table cannot be valid. */ * the table cannot be valid. */
...@@ -84,9 +89,12 @@ void __init reserve_ibft_region(void) ...@@ -84,9 +89,12 @@ void __init reserve_ibft_region(void)
ibft_phys_addr = pos; ibft_phys_addr = pos;
memblock_reserve(ibft_phys_addr, PAGE_ALIGN(len)); memblock_reserve(ibft_phys_addr, PAGE_ALIGN(len));
pr_info("iBFT found at %pa.\n", &ibft_phys_addr); pr_info("iBFT found at %pa.\n", &ibft_phys_addr);
return; goto out;
} }
} }
} }
} }
out:
early_memunmap(virt, PAGE_SIZE);
} }
...@@ -21,12 +21,20 @@ ...@@ -21,12 +21,20 @@
*/ */
extern phys_addr_t ibft_phys_addr; extern phys_addr_t ibft_phys_addr;
#ifdef CONFIG_ISCSI_IBFT_FIND
/* /*
* Routine used to find and reserve the iSCSI Boot Format Table. The * Routine used to find and reserve the iSCSI Boot Format Table. The
* physical address is set in the ibft_phys_addr variable. * physical address is set in the ibft_phys_addr variable.
*/ */
#ifdef CONFIG_ISCSI_IBFT_FIND
void reserve_ibft_region(void); void reserve_ibft_region(void);
/*
* Physical bounds to search for the iSCSI Boot Format Table.
*/
#define IBFT_START 0x80000 /* 512kB */
#define IBFT_END 0x100000 /* 1MB */
#else #else
static inline void reserve_ibft_region(void) {} static inline void reserve_ibft_region(void) {}
#endif #endif
......
...@@ -138,4 +138,7 @@ int xen_test_irq_shared(int irq); ...@@ -138,4 +138,7 @@ int xen_test_irq_shared(int irq);
/* initialize Xen IRQ subsystem */ /* initialize Xen IRQ subsystem */
void xen_init_IRQ(void); void xen_init_IRQ(void);
irqreturn_t xen_debug_interrupt(int irq, void *dev_id);
#endif /* _XEN_EVENTS_H */ #endif /* _XEN_EVENTS_H */
...@@ -31,6 +31,9 @@ extern uint32_t xen_start_flags; ...@@ -31,6 +31,9 @@ extern uint32_t xen_start_flags;
#include <xen/interface/hvm/start_info.h> #include <xen/interface/hvm/start_info.h>
extern struct hvm_start_info pvh_start_info; extern struct hvm_start_info pvh_start_info;
void xen_prepare_pvh(void);
struct pt_regs;
void xen_pv_evtchn_do_upcall(struct pt_regs *regs);
#ifdef CONFIG_XEN_DOM0 #ifdef CONFIG_XEN_DOM0
#include <xen/interface/xen.h> #include <xen/interface/xen.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment