Move some assembly code to C.
Signed-off-by: Frediano Ziglio <frediano.ziglio@cloud.com>
---
xen/arch/x86/boot/build32.lds.S | 1 +
xen/arch/x86/boot/cmdline.c | 14 ++++++++++++--
xen/arch/x86/boot/head.S | 9 +--------
xen/arch/x86/boot/trampoline.S | 2 +-
xen/arch/x86/include/asm/setup.h | 2 ++
xen/arch/x86/include/boot/xen/cpumask.h | 1 +
xen/arch/x86/include/boot/xen/string.h | 10 ++++++++++
7 files changed, 28 insertions(+), 11 deletions(-)
create mode 100644 xen/arch/x86/include/boot/xen/cpumask.h
create mode 100644 xen/arch/x86/include/boot/xen/string.h
diff --git a/xen/arch/x86/boot/build32.lds.S b/xen/arch/x86/boot/build32.lds.S
index 1726c17c88..652f951e52 100644
--- a/xen/arch/x86/boot/build32.lds.S
+++ b/xen/arch/x86/boot/build32.lds.S
@@ -54,6 +54,7 @@ SECTIONS
DECLARE_IMPORT(multiboot_ptr);
DECLARE_IMPORT(pvh_boot);
DECLARE_IMPORT(pvh_start_info_pa);
+ DECLARE_IMPORT(early_boot_opts);
. = . + GAP;
*(.text)
*(.text.*)
diff --git a/xen/arch/x86/boot/cmdline.c b/xen/arch/x86/boot/cmdline.c
index 196c580e91..7a8a3ed97f 100644
--- a/xen/arch/x86/boot/cmdline.c
+++ b/xen/arch/x86/boot/cmdline.c
@@ -22,6 +22,9 @@
#include <xen/kconfig.h>
#include <xen/macros.h>
#include <xen/types.h>
+#include <xen/multiboot.h>
+
+#include <asm/setup.h>
#include "video.h"
@@ -39,6 +42,8 @@ typedef struct __packed {
#endif
} early_boot_opts_t;
+extern early_boot_opts_t early_boot_opts;
+
/* Avoid pulling in all of ctypes.h for this. */
#define tolower(c) ((c) | 0x20)
@@ -335,10 +340,15 @@ static void vga_parse(const char *cmdline, early_boot_opts_t *ebo)
#endif
/* SAF-1-safe */
-void cmdline_parse_early(const char *cmdline, early_boot_opts_t *ebo)
+void cmdline_parse_early(void)
{
- if ( !cmdline )
+ early_boot_opts_t *ebo = &early_boot_opts;
+ struct multiboot_info *mbi = (void *)multiboot_ptr;
+ const char *cmdline;
+
+ if ( !(mbi->flags & MBI_CMDLINE) || !mbi->cmdline )
return;
+ cmdline = (void *)mbi->cmdline;
ebo->skip_realmode = skip_realmode(cmdline);
ebo->opt_edd = edd_parse(cmdline);
diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
index 510b3cfe6c..49bacee225 100644
--- a/xen/arch/x86/boot/head.S
+++ b/xen/arch/x86/boot/head.S
@@ -675,14 +675,7 @@ trampoline_setup:
cmpb $0, sym_esi(efi_platform)
jnz 1f
- /* Bail if there is no command line to parse. */
- mov sym_esi(multiboot_ptr), %ebx
- testl $MBI_CMDLINE,MB_flags(%ebx)
- jz 1f
-
- lea sym_esi(early_boot_opts), %edx
- mov MB_cmdline(%ebx), %eax
- /* cmdline_parse_early(cmdline/eax, opts/edx) using fastcall. */
+ /* cmdline_parse_early using fastcall. */
call cmdline_parse_early
1:
diff --git a/xen/arch/x86/boot/trampoline.S b/xen/arch/x86/boot/trampoline.S
index 924bda37c1..204c9bc889 100644
--- a/xen/arch/x86/boot/trampoline.S
+++ b/xen/arch/x86/boot/trampoline.S
@@ -255,7 +255,7 @@ trampoline_boot_cpu_entry:
.align 2
/* Keep in sync with cmdline.c:early_boot_opts_t type! */
-early_boot_opts:
+GLOBAL(early_boot_opts)
skip_realmode:
.byte 0
opt_edd:
diff --git a/xen/arch/x86/include/asm/setup.h b/xen/arch/x86/include/asm/setup.h
index 5c2391a868..c461d5d3a7 100644
--- a/xen/arch/x86/include/asm/setup.h
+++ b/xen/arch/x86/include/asm/setup.h
@@ -16,6 +16,8 @@ extern uint64_t boot_tsc_stamp;
extern void *stack_start;
extern unsigned int multiboot_ptr;
+struct domain;
+
void early_cpu_init(bool verbose);
void early_time_init(void);
diff --git a/xen/arch/x86/include/boot/xen/cpumask.h b/xen/arch/x86/include/boot/xen/cpumask.h
new file mode 100644
index 0000000000..046b862b78
--- /dev/null
+++ b/xen/arch/x86/include/boot/xen/cpumask.h
@@ -0,0 +1 @@
+/* Empty. */
diff --git a/xen/arch/x86/include/boot/xen/string.h b/xen/arch/x86/include/boot/xen/string.h
new file mode 100644
index 0000000000..6556d3b4af
--- /dev/null
+++ b/xen/arch/x86/include/boot/xen/string.h
@@ -0,0 +1,10 @@
+#ifndef BOOT__XEN__STRING_H
+#define BOOT__XEN__STRING_H
+
+#include <xen/types.h> /* for size_t */
+
+void *memset(void *s, int c, size_t n);
+void *memcpy(void *dest, const void *src, size_t n);
+void *memmove(void *dest, const void *src, size_t n);
+
+#endif /* BOOT__XEN__STRING_H */
--
2.34.1
On 22.11.2024 10:33, Frediano Ziglio wrote: > Move some assembly code to C. > > Signed-off-by: Frediano Ziglio <frediano.ziglio@cloud.com> > --- > xen/arch/x86/boot/build32.lds.S | 1 + > xen/arch/x86/boot/cmdline.c | 14 ++++++++++++-- > xen/arch/x86/boot/head.S | 9 +-------- > xen/arch/x86/boot/trampoline.S | 2 +- > xen/arch/x86/include/asm/setup.h | 2 ++ > xen/arch/x86/include/boot/xen/cpumask.h | 1 + > xen/arch/x86/include/boot/xen/string.h | 10 ++++++++++ > 7 files changed, 28 insertions(+), 11 deletions(-) > create mode 100644 xen/arch/x86/include/boot/xen/cpumask.h > create mode 100644 xen/arch/x86/include/boot/xen/string.h Again the diffstat doesn't really suggest this is a win. As an upside I can see that the argument passing to the function is somewhat ugly when done from assembly, especially when the function needs new parameters added or ones removed / changed. The downside is that now you're switching to dealing with globals, which generally seems less desirable. > --- a/xen/arch/x86/include/asm/setup.h > +++ b/xen/arch/x86/include/asm/setup.h > @@ -16,6 +16,8 @@ extern uint64_t boot_tsc_stamp; > extern void *stack_start; > extern unsigned int multiboot_ptr; > > +struct domain; > + > void early_cpu_init(bool verbose); > void early_time_init(void); > While I think I can see why this would be needed, personally I think such forward decls belong either immediately past all #include-s or immediately ahead of where they are first needed. > --- /dev/null > +++ b/xen/arch/x86/include/boot/xen/cpumask.h > @@ -0,0 +1 @@ > +/* Empty. */ Are there perhaps better ways to deal with whatever needs dealing with (which sadly isn't obvious and also isn't mentioned anywhere)? At a guess, asm/numa.h may be where the problem is, yet then setup.h includes that just to get a decl of nodeid_t afaics. As we're meaning to split headers into two or perhaps even three parts anyway (to allow reducing dependency chains), maybe we should do so here and introduce e.g. asm/types/numa.h? Jan
© 2016 - 2025 Red Hat, Inc.