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