#include <asm/mmu_context.h>
#include <asm/debugreg.h>
-#ifdef CONFIG_XEN
-
-/* In the case of Xen, override hypervisor functions to be able to create
- * a regular identity mapping page table...
- */
-
-#include <xen/interface/kexec.h>
-#include <xen/interface/memory.h>
-
-#define x__pmd(x) ((pmd_t) { (x) } )
-#define x__pud(x) ((pud_t) { (x) } )
-#define x__pgd(x) ((pgd_t) { (x) } )
-
-#define x_pmd_val(x) ((x).pmd)
-#define x_pud_val(x) ((x).pud)
-#define x_pgd_val(x) ((x).pgd)
-
-static inline void x_set_pmd(pmd_t *dst, pmd_t val)
-{
- x_pmd_val(*dst) = x_pmd_val(val);
-}
-
-static inline void x_set_pud(pud_t *dst, pud_t val)
-{
- x_pud_val(*dst) = phys_to_machine(x_pud_val(val));
-}
-
-static inline void x_pud_clear (pud_t *pud)
-{
- x_pud_val(*pud) = 0;
-}
-
-static inline void x_set_pgd(pgd_t *dst, pgd_t val)
-{
- x_pgd_val(*dst) = phys_to_machine(x_pgd_val(val));
-}
-
-static inline void x_pgd_clear (pgd_t * pgd)
-{
- x_pgd_val(*pgd) = 0;
-}
-
-#define X__PAGE_KERNEL_LARGE_EXEC \
- _PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_PSE
-#define X_KERNPG_TABLE _PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY
-
-#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
-
-#if PAGES_NR > KEXEC_XEN_NO_PAGES
-#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
-#endif
-
-#if PA_CONTROL_PAGE != 0
-#error PA_CONTROL_PAGE is non zero - Xen support will break
-#endif
-
-void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
-{
- void *control_page;
- void *table_page;
-
- memset(xki->page_list, 0, sizeof(xki->page_list));
-
- control_page = page_address(image->control_code_page) + PAGE_SIZE;
- memcpy(control_page, relocate_kernel, PAGE_SIZE);
-
- table_page = page_address(image->control_code_page);
-
- xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
- xki->page_list[PA_TABLE_PAGE] = __ma(table_page);
-
- if (image->type == KEXEC_TYPE_DEFAULT)
- xki->page_list[PA_SWAP_PAGE] = page_to_phys(image->swap_page);
-}
-
-int __init machine_kexec_setup_resources(struct resource *hypervisor,
- struct resource *phys_cpus,
- int nr_phys_cpus)
-{
- int k;
-
- /* The per-cpu crash note resources belong to the hypervisor resource */
- for (k = 0; k < nr_phys_cpus; k++)
- request_resource(hypervisor, phys_cpus + k);
-
- return 0;
-}
-
-#else /* CONFIG_XEN */
-
-#define x__pmd(x) __pmd(x)
-#define x__pud(x) __pud(x)
-#define x__pgd(x) __pgd(x)
-
-#define x_set_pmd(x, y) set_pmd(x, y)
-#define x_set_pud(x, y) set_pud(x, y)
-#define x_set_pgd(x, y) set_pgd(x, y)
-
-#define x_pud_clear(x) pud_clear(x)
-#define x_pgd_clear(x) pgd_clear(x)
-
-#define X__PAGE_KERNEL_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC
-#define X_KERNPG_TABLE _KERNPG_TABLE
-
-#endif /* CONFIG_XEN */
-
static int init_one_level2_page(struct kimage *image, pgd_t *pgd,
unsigned long addr)
{
}
pmd = pmd_offset(pud, addr);
if (!pmd_present(*pmd))
- x_set_pmd(pmd, x__pmd(addr | X__PAGE_KERNEL_LARGE_EXEC));
+ set_pmd(pmd, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
result = 0;
out:
return result;
addr &= PAGE_MASK;
end_addr = addr + PUD_SIZE;
while (addr < end_addr) {
- x_set_pmd(level2p++, x__pmd(addr | X__PAGE_KERNEL_LARGE_EXEC));
+ set_pmd(level2p++, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
addr += PMD_SIZE;
}
}
}
level2p = (pmd_t *)page_address(page);
init_level2_page(level2p, addr);
- x_set_pud(level3p++, x__pud(__pa(level2p) | X_KERNPG_TABLE));
+ set_pud(level3p++, __pud(__pa(level2p) | _KERNPG_TABLE));
addr += PUD_SIZE;
}
/* clear the unused entries */
while (addr < end_addr) {
- x_pud_clear(level3p++);
+ pud_clear(level3p++);
addr += PUD_SIZE;
}
out:
result = init_level3_page(image, level3p, addr, last_addr);
if (result)
goto out;
- x_set_pgd(level4p++, x__pgd(__pa(level3p) | X_KERNPG_TABLE));
+ set_pgd(level4p++, __pgd(__pa(level3p) | _KERNPG_TABLE));
addr += PGDIR_SIZE;
}
/* clear the unused entries */
while (addr < end_addr) {
- x_pgd_clear(level4p++);
+ pgd_clear(level4p++);
addr += PGDIR_SIZE;
}
out:
{
pgd_t *level4p;
int result;
- unsigned long x_max_pfn = max_pfn;
-
-#ifdef CONFIG_XEN
- x_max_pfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
-#endif
-
level4p = (pgd_t *)__va(start_pgtable);
- result = init_level4_page(image, level4p, 0, x_max_pfn << PAGE_SHIFT);
+ result = init_level4_page(image, level4p, 0, max_pfn << PAGE_SHIFT);
if (result)
return result;
/*
free_transition_pgtable(image);
}
-#ifndef CONFIG_XEN
/*
* Do not allocate memory (or fail in any way) in machine_kexec().
* We are past the point of no return, committed to rebooting now.
__ftrace_enabled_restore(save_ftrace_enabled);
}
-#endif
void arch_crash_save_vmcoreinfo(void)
{
-#ifndef CONFIG_XEN /* could really be CONFIG_RELOCATABLE */
VMCOREINFO_SYMBOL(phys_base);
-#endif
VMCOREINFO_SYMBOL(init_level4_pgt);
#ifdef CONFIG_NUMA