From 7cf854e5313327ed9a21d3de3617f556ea6648c7 Mon Sep 17 00:00:00 2001
From: John Hodge <tpg@mutabah.net>
Date: Sun, 11 Aug 2019 17:18:01 +0800
Subject: [PATCH] Usermode loader - Fix link error with over-sized value

---
 Usermode/loader/bin/src/interface.rs | 5 ++---
 Usermode/loader/bin/start.S          | 5 +++++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/Usermode/loader/bin/src/interface.rs b/Usermode/loader/bin/src/interface.rs
index 65b3def4..ef483be5 100644
--- a/Usermode/loader/bin/src/interface.rs
+++ b/Usermode/loader/bin/src/interface.rs
@@ -26,8 +26,7 @@ impl_from! {
 pub extern "C" fn new_process(executable_handle: ::syscalls::vfs::File, process_name: &[u8], args: &[&[u8]]) -> Result<::syscalls::threads::ProtoProcess,loader::Error>
 {
 	extern "C" {
-		static BASE: [u8; 0];
-		static LIMIT: [u8; 0];
+		static limit_and_base: (u64, u64);
 	}
 	
 	kernel_log!("new_process({:?}, ...)", ::std::ffi::OsStr::new(process_name));
@@ -62,7 +61,7 @@ pub extern "C" fn new_process(executable_handle: ::syscalls::vfs::File, process_
 
 		// Spawn new process
 		// SAFE: Just takes the address of the externs statics
-		match ::syscalls::threads::start_process(name, unsafe { BASE.as_ptr() as usize }, unsafe { LIMIT.as_ptr() as usize })
+		match ::syscalls::threads::start_process(name, unsafe { limit_and_base.0 as usize }, unsafe { limit_and_base.1 as usize })
 		{
 		Ok(v) => v,
 		Err(e) => panic!("TODO: new_process - Error '{:?}'", e),
diff --git a/Usermode/loader/bin/start.S b/Usermode/loader/bin/start.S
index 2bc014bd..ac97ea2b 100644
--- a/Usermode/loader/bin/start.S
+++ b/Usermode/loader/bin/start.S
@@ -199,6 +199,11 @@ GLOBAL(image_header)
 	.long init_path_end - init_path
 	DEFPTR start
 
+.section .data
+GLOBAL(limit_and_base)
+	.quad	BASE
+	.quad	LIMIT
+
 .section .bss
 	.space 0x1000	/* Guard page */
 GLOBAL(init_stack_base)
-- 
GitLab