From 5fd58ac8679189a878609e45b4bce1e78dee4848 Mon Sep 17 00:00:00 2001
Message-Id: <5fd58ac8679189a878609e45b4bce1e78dee4848.1659492818.git.boyoun.park@samsung.com>
From: Boyoun Park <boyoun.park@samsung.com>
Date: Tue, 15 Mar 2022 12:57:59 +0900
Subject: [PATCH v2 1/2] xen: add late init call in start_xen

This patch added late_initcall section in init.data.
The late initcall would be called after initcall
in the start_xen function.

Some initializing works on priority should be run
in do_initcalls and other non-prioritized works
would be run in do_late_initcalls.

To call some functions by late_initcall,
then it is possible by using
__late_initcall(/*Function Name*/);

Signed-off-by: Boyoun Park <boyoun.park@samsung.com>
---
 xen/arch/arm/setup.c   | 2 ++
 xen/arch/arm/xen.lds.S | 2 ++
 xen/arch/x86/setup.c   | 2 ++
 xen/arch/x86/xen.lds.S | 2 ++
 xen/common/kernel.c    | 9 ++++++++-
 xen/include/xen/init.h | 3 +++
 6 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 85ff956..332a207 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -1063,6 +1063,8 @@ void __init start_xen(unsigned long boot_phys_offset,
     /* Hide UART from DOM0 if we're using it */
     serial_endboot();
 
+    do_late_initcalls();
+
     if ( (rc = xsm_set_system_active()) != 0 )
         panic("xsm: unable to switch to SYSTEM_ACTIVE privilege: %d\n", rc);
 
diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S
index 1e986e2..215e2c3 100644
--- a/xen/arch/arm/xen.lds.S
+++ b/xen/arch/arm/xen.lds.S
@@ -163,6 +163,8 @@ SECTIONS
        __presmp_initcall_end = .;
        *(.initcall1.init)
        __initcall_end = .;
+       *(.initcalllate.init)
+       __late_initcall_end = .;
 
        . = ALIGN(4);
        __alt_instructions = .;
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index f08b07b..5dc6654 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -1952,6 +1952,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
 
     setup_io_bitmap(dom0);
 
+    do_late_initcalls();
+
     if ( bsp_delay_spec_ctrl )
     {
         info->spec_ctrl_flags &= ~SCF_use_shadow;
diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S
index 8930e14..c90c7b0 100644
--- a/xen/arch/x86/xen.lds.S
+++ b/xen/arch/x86/xen.lds.S
@@ -250,6 +250,8 @@ SECTIONS
        __presmp_initcall_end = .;
        *(.initcall1.init)
        __initcall_end = .;
+       *(.initcalllate.init)
+       __late_initcall_end = .;
 
        *(.init.data)
        *(.init.data.rel)
diff --git a/xen/common/kernel.c b/xen/common/kernel.c
index f8134d3..5a3d037 100644
--- a/xen/common/kernel.c
+++ b/xen/common/kernel.c
@@ -369,7 +369,7 @@ void add_taint(unsigned int flag)
 }
 
 extern const initcall_t __initcall_start[], __presmp_initcall_end[],
-    __initcall_end[];
+    __initcall_end[], __late_initcall_end[];
 
 void __init do_presmp_initcalls(void)
 {
@@ -385,6 +385,13 @@ void __init do_initcalls(void)
         (*call)();
 }
 
+void __init do_late_initcalls(void)
+{
+    const initcall_t *call;
+    for ( call = __initcall_end; call < __late_initcall_end; call++ )
+        (*call)();
+}
+
 #ifdef CONFIG_HYPFS
 static unsigned int __read_mostly major_version;
 static unsigned int __read_mostly minor_version;
diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h
index 0af0e23..48210ee 100644
--- a/xen/include/xen/init.h
+++ b/xen/include/xen/init.h
@@ -68,11 +68,14 @@ typedef void (*exitcall_t)(void);
     const static initcall_t __initcall_##fn __init_call("presmp") = fn
 #define __initcall(fn) \
     const static initcall_t __initcall_##fn __init_call("1") = fn
+#define __late_initcall(fn) \
+    const static initcall_t __initcall_##fn __init_call("late") = fn
 #define __exitcall(fn) \
     static exitcall_t __exitcall_##fn __exit_call = fn
 
 void do_presmp_initcalls(void);
 void do_initcalls(void);
+void do_late_initcalls(void);
 
 #endif /* __ASSEMBLY__ */
 
-- 
2.7.4

