diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8b53b42..edf1a81 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,7 +32,7 @@
 
 add_subdirectory($ENV{ROOTDIR}/sw/pigweed pw)
 
-set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/springbok/springbok.ld" CACHE PATH "Linker script for springbok")
+set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/springbok/springbok_no_wmmu.ld" CACHE PATH "Linker script for springbok")
 
 set(TEST_RUNNER "${CMAKE_CURRENT_SOURCE_DIR}/scripts/test_runner.py" CACHE PATH "Test runner script path")
 
diff --git a/hello_vec/Makefile b/hello_vec/Makefile
index c006178..3b000db 100644
--- a/hello_vec/Makefile
+++ b/hello_vec/Makefile
@@ -24,7 +24,7 @@
 LDFLAGS  += -Wl,--gc-sections
 LDFLAGS  += -Wl,--print-memory-usage
 LDFLAGS  += -Wl,-Map=${BUILDDIR}/hello_vec.map
-LDFLAGS  += -T${ROOTDIR}/springbok/springbok.ld
+LDFLAGS  += -T${ROOTDIR}/springbok/springbok_no_wmmu.ld
 
 CC       := ${SHODANROOTDIR}/cache/toolchain_vp/bin/riscv32-unknown-elf-gcc
 CPP      := ${SHODANROOTDIR}/cache/toolchain_vp/bin/riscv32-unknown-elf-g++
diff --git a/springbok/crt0.S b/springbok/crt0.S
index 822fac7..21240c0 100644
--- a/springbok/crt0.S
+++ b/springbok/crt0.S
@@ -22,6 +22,8 @@
         ###############################################
         la   sp, _stack_ptr
         la   gp, _global_pointer
+        la   s0, _sheap
+        sw   s0, _heap_ptr, s1
         mv   tp, zero
         mv   t1, zero
         mv   t2, zero
diff --git a/springbok/springbok.ld b/springbok/springbok.ld
index 8b68fd1..a3ddc65 100644
--- a/springbok/springbok.ld
+++ b/springbok/springbok.ld
@@ -15,16 +15,20 @@
  */
 
 TCM_LENGTH  = DEFINED(__tcm_length__)  ? __tcm_length__  : 4M;
+WINDOW_LENGTH = 0x1000000;
 
 MEMORY
 {
-        TCM (rw) : ORIGIN = 0x34000000, LENGTH = TCM_LENGTH
+        TEXT (rx) : ORIGIN = 0x80000000, LENGTH = TCM_LENGTH
+        CONSTANT_DATA (r) : ORIGIN = 0x80000000 + WINDOW_LENGTH, LENGTH = TCM_LENGTH
+        MODEL_OUTPUT (rw) : ORIGIN = 0x80000000 + 2*WINDOW_LENGTH, LENGTH = TCM_LENGTH
+        STATIC_DATA (rw) : ORIGIN = 0x80000000 + 3*WINDOW_LENGTH, LENGTH = TCM_LENGTH
+        MODEL_INPUT (r) : ORIGIN = 0x80000000 + 4*WINDOW_LENGTH, LENGTH = TCM_LENGTH
+        TEMPORARY_DATA (rw) : ORIGIN = 0x80000000 + 5*WINDOW_LENGTH, LENGTH = TCM_LENGTH
 }
 
+HEAP_SIZE = DEFINED(HEADP_SIZE) ? HEAP_SIZE : DEFINED(__heap_size__) ? __heap_size__ : 1M;
 STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x2000;
-PROVIDE( _stack_ptr = ORIGIN(TCM) + LENGTH(TCM) - 64 );
-PROVIDE( _stack_start_sentinel = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE );
-PROVIDE( _stack_end_sentinel = ORIGIN(TCM) + LENGTH(TCM) - 64 );
 
 ENTRY(_start)
 
@@ -36,7 +40,7 @@
                 KEEP(*(.text._start))
                 *(.text*)
                 _etext = .;
-        } > TCM
+        } > TEXT
 
         .rodata :
         {
@@ -44,14 +48,14 @@
                 _srodata = .;
                 *(.rodata*)
                 _erodata = .;
-        } > TCM
+        } > CONSTANT_DATA
 
         .preinit_array :
         {
                 PROVIDE(__preinit_array_start = .);
                 KEEP(*(.preinit_array))
                 PROVIDE(__preinit_array_end = .);
-        } > TCM
+        } > CONSTANT_DATA
 
         .init_array :
         {
@@ -59,7 +63,7 @@
                 KEEP(*(SORT(.init_array.*)))
                 KEEP(*(.init_array))
                 PROVIDE(__init_array_end = .);
-        } > TCM
+        } > CONSTANT_DATA
 
         .fini_array :
         {
@@ -67,7 +71,15 @@
                 KEEP(*(SORT(.fini_array.*)))
                 KEEP(*(.fini_array))
                 PROVIDE(__fini_array_end = .);
-        } > TCM
+        } > CONSTANT_DATA
+
+        .model_output :
+        {
+                . = ALIGN(64);
+                _smodel_output = .;
+                *(.model_output*)
+                _emodel_output = .;
+        } > MODEL_OUTPUT
 
         .data :
         {
@@ -76,7 +88,7 @@
                 _sdata = .;
                 *(.data*)
                 _edata = .;
-        } > TCM
+        } > STATIC_DATA
 
         .bss (NOLOAD) :
         {
@@ -85,24 +97,28 @@
                 *(.bss*)
                 *(COMMON)
                 _ebss = .;
-        } > TCM
+        } > TEMPORARY_DATA
 
         .heap (NOLOAD) :
         {
                 . = ALIGN(64);
                 _sheap = .;
-                . = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE - 63;
+                . = . + HEAP_SIZE;
                 . = ALIGN(64);
                 _eheap = .;
-        } > TCM
+        } > TEMPORARY_DATA
 
-        .stack ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE (NOLOAD) :
+        .stack (NOLOAD) :
         {
                 _sstack = .;
+                PROVIDE(_stack_start_sentinel = .);
                 . = . + STACK_SIZE;
+                PROVIDE(_stack_ptr = .);
+                PROVIDE(_stack_end_sentinel = .);
                 . = ALIGN(64);
+                . = . + 64;
                 _estack = .;
-        } > TCM
+        } > TEMPORARY_DATA
 
         _end = .;
 }
diff --git a/springbok/springbok_gloss.cpp b/springbok/springbok_gloss.cpp
index 0f55e64..8f83415 100644
--- a/springbok/springbok_gloss.cpp
+++ b/springbok/springbok_gloss.cpp
@@ -20,18 +20,23 @@
 
 #include <springbok_intrinsics.h>
 
-void* __dso_handle = (void*) &__dso_handle;
+void *__dso_handle = reinterpret_cast<void *>(&__dso_handle);
+
+char *_heap_ptr;  // Set to _sheap in crt0.S
 
 extern "C" void *_sbrk(int nbytes) {
   extern char _sheap, _eheap;
-  static char *_heap_ptr = &_sheap;
 
   if ((nbytes < 0) ||
       (_heap_ptr + nbytes > &_eheap)) {
-    springbok_simprint(SPRINGBOK_SIMPRINT_ERROR, "_sbrk failed to allocate memory. Number of bytes requested:", nbytes);
-    springbok_simprint(SPRINGBOK_SIMPRINT_ERROR, "Number of unallocated bytes remaining:", static_cast<int32_t>(&_eheap - _heap_ptr));
+    springbok_simprint(
+        SPRINGBOK_SIMPRINT_ERROR,
+        "_sbrk failed to allocate memory. Number of bytes requested:", nbytes);
+    springbok_simprint(SPRINGBOK_SIMPRINT_ERROR,
+                       "Number of unallocated bytes remaining:",
+                       static_cast<int32_t>(&_eheap - _heap_ptr));
     errno = ENOMEM;
-    return (void *)-1;
+    return reinterpret_cast<void *>(-1);
   }
 
   void *base = _heap_ptr;
@@ -67,7 +72,8 @@
   }
 
   const int buffer_num   = (file == STDOUT_FILENO)? 0 : 1;
-  const int buffer_level = (file == STDOUT_FILENO)? SPRINGBOK_SIMPRINT_INFO : SPRINGBOK_SIMPRINT_ERROR;
+  const int buffer_level = (file == STDOUT_FILENO) ? SPRINGBOK_SIMPRINT_INFO
+                                                   : SPRINGBOK_SIMPRINT_ERROR;
 
   int bytes_read = 0;
   char c;
@@ -78,7 +84,8 @@
 
     if ((c == '\n') || (c == '\0')) {
       _write_line_buffer[buffer_num][len] = '\0';
-      springbok_simprint(buffer_level, _write_line_buffer[buffer_num], buffer_num);
+      springbok_simprint(buffer_level, _write_line_buffer[buffer_num],
+                         buffer_num);
       len = 0;
     } else {
       _write_line_buffer[buffer_num][len] = c;
@@ -86,7 +93,8 @@
 
       if (len == 255) {
         _write_line_buffer[buffer_num][len] = '\0';
-        springbok_simprint(buffer_level, _write_line_buffer[buffer_num], buffer_num);
+        springbok_simprint(buffer_level, _write_line_buffer[buffer_num],
+                           buffer_num);
         len = 0;
       }
     }
@@ -139,6 +147,6 @@
   free(p);
 }
 
-extern "C" void operator delete(void *p, unsigned long c) noexcept {
+extern "C" void operator delete(void *p, uint32_t c) noexcept {
   operator delete(p);
 }
diff --git a/springbok/springbok_no_wmmu.ld b/springbok/springbok_no_wmmu.ld
new file mode 100644
index 0000000..2f6a194
--- /dev/null
+++ b/springbok/springbok_no_wmmu.ld
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+TCM_LENGTH  = DEFINED(__tcm_length__)  ? __tcm_length__  : 4M;
+
+MEMORY
+{
+        TCM (rw) : ORIGIN = 0x34000000, LENGTH = TCM_LENGTH
+}
+
+STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x2000;
+PROVIDE( _stack_ptr = ORIGIN(TCM) + LENGTH(TCM) - 64 );
+PROVIDE( _stack_start_sentinel = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE );
+PROVIDE( _stack_end_sentinel = ORIGIN(TCM) + LENGTH(TCM) - 64 );
+
+ENTRY(_start)
+
+SECTIONS
+{
+        .text :
+        {
+                _stext = .;
+                KEEP(*(.text._start))
+                *(.text*)
+                _etext = .;
+        } > TCM
+
+        .rodata :
+        {
+                . = ALIGN(64);
+                _srodata = .;
+                *(.rodata*)
+                _erodata = .;
+        } > TCM
+
+        .preinit_array :
+        {
+                PROVIDE(__preinit_array_start = .);
+                KEEP(*(.preinit_array))
+                PROVIDE(__preinit_array_end = .);
+        } > TCM
+
+        .init_array :
+        {
+                PROVIDE(__init_array_start = .);
+                KEEP(*(SORT(.init_array.*)))
+                KEEP(*(.init_array))
+                PROVIDE(__init_array_end = .);
+        } > TCM
+
+        .fini_array :
+        {
+                PROVIDE(__fini_array_start = .);
+                KEEP(*(SORT(.fini_array.*)))
+                KEEP(*(.fini_array))
+                PROVIDE(__fini_array_end = .);
+        } > TCM
+
+
+        .model_output :
+        {
+                . = ALIGN(64);
+                _smodel_output = .;
+                *(.model_output*)
+                _emodel_output = .;
+        } > TCM
+
+        .data :
+        {
+                . = ALIGN(64);
+                _global_pointer = . + 0x800;
+                _sdata = .;
+                *(.data*)
+                _edata = .;
+        } > TCM
+
+        .bss (NOLOAD) :
+        {
+                . = ALIGN(64);
+                _sbss = .;
+                *(.bss*)
+                *(COMMON)
+                _ebss = .;
+        } > TCM
+
+        .heap (NOLOAD) :
+        {
+                . = ALIGN(64);
+                _sheap = .;
+                . = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE - 63;
+                . = ALIGN(64);
+                _eheap = .;
+        } > TCM
+
+        .stack ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE (NOLOAD) :
+        {
+                _sstack = .;
+                . = . + STACK_SIZE;
+                . = ALIGN(64);
+                _estack = .;
+        } > TCM
+
+        _end = .;
+}
