[haiku-commits] Change in haiku[master]: sparc: fill in kernel entry code

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 31 Dec 2020 23:47:37 +0000

From Adrien Destugues <pulkomandy@xxxxxxxxx>:

Adrien Destugues has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/3578 ;)


Change subject: sparc: fill in kernel entry code
......................................................................

sparc: fill in kernel entry code

- Fix elf32 vs elf64 (copied from EFI)
- Write the kernel start code (works well enough to freeze the machine
  somewhere, I don't know if it's inside the kernel or if it failed
  before getting there)
---
M src/system/boot/platform/openfirmware/arch/sparc/arch_start_kernel.S
M src/system/boot/platform/openfirmware/start.cpp
2 files changed, 50 insertions(+), 8 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/78/3578/1

diff --git 
a/src/system/boot/platform/openfirmware/arch/sparc/arch_start_kernel.S 
b/src/system/boot/platform/openfirmware/arch/sparc/arch_start_kernel.S
index 54bc658..6fd29d5 100644
--- a/src/system/boot/platform/openfirmware/arch/sparc/arch_start_kernel.S
+++ b/src/system/boot/platform/openfirmware/arch/sparc/arch_start_kernel.S
@@ -8,9 +8,37 @@
 /*     status_t arch_start_kernel(struct kernel_args *kernelArgs,
                addr_t kernelEntry, addr_t kernelStackTop);

-       r3      - kernelArgs
-       r4      - kernelEntry
-       r5      - kernelStackTop
+       o0      - kernelArgs
+       o1      - kernelEntry
+       o2      - kernelStackTop
 */
 FUNCTION(arch_start_kernel):
-       return
+
+       // Save the old stack
+       mov %sp, %g5
+
+       // Set the stack
+       sub %o2, 2047, %sp // apply stack bias
+
+       mov %o1, %o2 // Move the kernelEntry as we need o1 for something else
+
+       // o0 is already the kernel args, leave it there
+
+       // Set up "current cpu" argument to kernel _start
+       mov %g0, %o1
+
+       // Jump into the kernel, do not store return address
+       jmpl %o2, %o7
+       nop // branch delay slot...
+
+       // We should never get here, but in case the kernel return, attempt to
+       // exit cleanly (unlikely to work if the kernel has used g5 for 
something
+       // else... we should rather use a proper save/restore and keep things in
+       // our local registers)
+
+       // Restore the bootloader stack
+       mov %g5, %sp
+
+       // Exit the function
+       retl
+       nop // branch delay slot...
diff --git a/src/system/boot/platform/openfirmware/start.cpp 
b/src/system/boot/platform/openfirmware/start.cpp
index 5728dd6..c854e18 100644
--- a/src/system/boot/platform/openfirmware/start.cpp
+++ b/src/system/boot/platform/openfirmware/start.cpp
@@ -45,13 +45,27 @@
 }


+static addr_t
+get_kernel_entry(void)
+{
+       if (gKernelArgs.kernel_image->elf_class == ELFCLASS64) {
+               preloaded_elf64_image *image = 
static_cast<preloaded_elf64_image *>(
+                       gKernelArgs.kernel_image.Pointer());
+               return image->elf_header.e_entry;
+       } else if (gKernelArgs.kernel_image->elf_class == ELFCLASS32) {
+               preloaded_elf32_image *image = 
static_cast<preloaded_elf32_image *>(
+                       gKernelArgs.kernel_image.Pointer());
+               return image->elf_header.e_entry;
+       }
+       panic("Unknown kernel format! Not 32-bit or 64-bit!");
+       return 0;
+}
+
+
 extern "C" void
 platform_start_kernel(void)
 {
-       preloaded_elf32_image* image = static_cast<preloaded_elf32_image*>(
-               gKernelArgs.kernel_image.Pointer());
-
-       addr_t kernelEntry = image->elf_header.e_entry;
+       addr_t kernelEntry = get_kernel_entry();
        addr_t stackTop = gKernelArgs.cpu_kstack[0].start
                + gKernelArgs.cpu_kstack[0].size;


--
To view, visit https://review.haiku-os.org/c/haiku/+/3578
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I6133185681307ecabc617b47b36551e52f9ac2c9
Gerrit-Change-Number: 3578
Gerrit-PatchSet: 1
Gerrit-Owner: Adrien Destugues <pulkomandy@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: sparc: fill in kernel entry code - Gerrit