x86/xen: Use clear_bss() for Xen PV guests
Instead of clearing the bss area in assembly code, use the clear_bss() function. This requires to pass the start_info address as parameter to xen_start_kernel() in order to avoid the xen_start_info being zeroed again. Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Link: https://lore.kernel.org/r/20220630071441.28576-2-jgross@suse.com
This commit is contained in:
Родитель
03c765b0e3
Коммит
96e8fc5818
|
@ -120,6 +120,9 @@ void *extend_brk(size_t size, size_t align);
|
|||
static char __brk_##name[size]
|
||||
|
||||
extern void probe_roms(void);
|
||||
|
||||
void clear_bss(void);
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
asmlinkage void __init i386_start_kernel(void);
|
||||
|
|
|
@ -426,7 +426,7 @@ void __init do_early_exception(struct pt_regs *regs, int trapnr)
|
|||
|
||||
/* Don't add a printk in there. printk relies on the PDA which is not initialized
|
||||
yet. */
|
||||
static void __init clear_bss(void)
|
||||
void __init clear_bss(void)
|
||||
{
|
||||
memset(__bss_start, 0,
|
||||
(unsigned long) __bss_stop - (unsigned long) __bss_start);
|
||||
|
|
|
@ -1183,15 +1183,19 @@ static void __init xen_domu_set_legacy_features(void)
|
|||
extern void early_xen_iret_patch(void);
|
||||
|
||||
/* First C function to be called on Xen boot */
|
||||
asmlinkage __visible void __init xen_start_kernel(void)
|
||||
asmlinkage __visible void __init xen_start_kernel(struct start_info *si)
|
||||
{
|
||||
struct physdev_set_iopl set_iopl;
|
||||
unsigned long initrd_start = 0;
|
||||
int rc;
|
||||
|
||||
if (!xen_start_info)
|
||||
if (!si)
|
||||
return;
|
||||
|
||||
clear_bss();
|
||||
|
||||
xen_start_info = si;
|
||||
|
||||
__text_gen_insn(&early_xen_iret_patch,
|
||||
JMP32_INSN_OPCODE, &early_xen_iret_patch, &xen_iret,
|
||||
JMP32_INSN_SIZE);
|
||||
|
|
|
@ -48,15 +48,6 @@ SYM_CODE_START(startup_xen)
|
|||
ANNOTATE_NOENDBR
|
||||
cld
|
||||
|
||||
/* Clear .bss */
|
||||
xor %eax,%eax
|
||||
mov $__bss_start, %rdi
|
||||
mov $__bss_stop, %rcx
|
||||
sub %rdi, %rcx
|
||||
shr $3, %rcx
|
||||
rep stosq
|
||||
|
||||
mov %rsi, xen_start_info
|
||||
mov initial_stack(%rip), %rsp
|
||||
|
||||
/* Set up %gs.
|
||||
|
@ -71,6 +62,7 @@ SYM_CODE_START(startup_xen)
|
|||
cdq
|
||||
wrmsr
|
||||
|
||||
mov %rsi, %rdi
|
||||
call xen_start_kernel
|
||||
SYM_CODE_END(startup_xen)
|
||||
__FINIT
|
||||
|
|
Загрузка…
Ссылка в новой задаче