[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MINI-OS PATCH 02/12] kexec: add final kexec stage



On Fri, Mar 21, 2025 at 5:25 AM Juergen Gross <jgross@xxxxxxxx> wrote:
>
> Add the code and data definitions of the final kexec stage.
>
> Put the code and related data into a dedicated section in order to be
> able to copy it to another location. For this reason there must be no
> absolute relocations being used in the code or data.
>
> Being functionally related, add a function for adding a final kexec
> action.
>
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>

> --- /dev/null
> +++ b/arch/x86/kexec.c
> @@ -0,0 +1,109 @@

> +
> +/*
> + * Final stage of kexec. Copies all data to the final destinations, zeroes
> + * .bss and activates new kernel.
> + * Must be called with interrupts off. Stack, code and data must be
> + * accessible via identity mapped virtual addresses (virt == phys). Copying
> + * and zeroing is done using virtual addresses.
> + * No relocations inside the function are allowed, as it is copied to an
> + * allocated page before being executed.

"page" is stated here.  Do we need an ASSERT later?

> + */

> +void do_kexec(void *kexec_page)
> +{
> +    unsigned long actions;
> +    unsigned long stack;
> +    unsigned long final;
> +    unsigned long phys;
> +
> +    actions = get_kexec_addr(kexec_page, kexec_actions);
> +    stack = get_kexec_addr(kexec_page, kexec_stack + KEXEC_STACK_LONGS);
> +    final = get_kexec_addr(kexec_page, kexec_final);
> +    phys = get_kexec_addr(kexec_page, kexec_phys);
> +
> +    memcpy(kexec_page, _kexec_start, KEXEC_SECSIZE);
> +    asm("cli\n\t"
> +        "mov %0, %%"ASM_SP"\n\t"
> +        "mov %1, %%"ASM_ARG1"\n\t"
> +        "mov %2, %%"ASM_ARG2"\n\t"
> +        "jmp *%3"
> +        :"=m" (stack), "=m" (actions), "=m" (phys)

Aren't these inputs and not outputs?

> +        :"m" (final));
> +}
> +
> +#endif /* CONFIG_KEXEC */


> diff --git a/include/kexec.h b/include/kexec.h
> index 6fd96774..722be456 100644
> --- a/include/kexec.h
> +++ b/include/kexec.h
> @@ -1,7 +1,34 @@

> +
> +int kexec_add_action(int action, void *dest, void *src, unsigned int len);
> +
> +#define KEXEC_SECSIZE ((unsigned long)_kexec_end - (unsigned 
> long)_kexec_start)

Add a build assertion here?  Or maybe the correct amount is allocated
and it doesn't matter.

Generally looks good.

Regards,
Jason



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.