Use magic string to exit on sonata-simulator.

This means we no longer need the brittle and broken model output files and can simplify the run-sonata-sim script considerably.
The testing-model-output xmake option is also redundant.
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index cfc36a8..3530074 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -27,7 +27,7 @@
             build-flags: --debug-loader=n --debug-scheduler=n --debug-allocator=n -m release --stack-usage-check-allocator=y --stack-usage-check-scheduler=y
           - board: sonata-simulator
             build-type: release
-            build-flags: --debug-loader=n --debug-scheduler=n --debug-allocator=n -m release --stack-usage-check-allocator=y --stack-usage-check-scheduler=y --testing-model-output=y
+            build-flags: --debug-loader=n --debug-scheduler=n --debug-allocator=n -m release --stack-usage-check-allocator=y --stack-usage-check-scheduler=y
             sonata: true
       fail-fast: false
     runs-on: ubuntu-latest
diff --git a/scripts/model_output/sonata-simulator/examples/audit.txt b/scripts/model_output/sonata-simulator/examples/audit.txt
deleted file mode 100644
index f2abe0c..0000000
--- a/scripts/model_output/sonata-simulator/examples/audit.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Producer: Encrypting message 'Hello, World!'
-Entry compartment: Received encrypted message: 'Ifmmp-!Xpsme"' (13 bytes)
-Consumer: Decrypted message: 'Hello, World!'
diff --git a/scripts/model_output/sonata-simulator/examples/error_handling.txt b/scripts/model_output/sonata-simulator/examples/error_handling.txt
deleted file mode 100644
index ed3cf77..0000000
--- a/scripts/model_output/sonata-simulator/examples/error_handling.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-UART compartment: Message provided by caller: hello
-UART compartment: Detected BoundsViolation(0x1) trying to write to UART.  Register CS0(0x8) contained invalid value: 0x101b10 (v:1 0x101b0b-0x101b10 l:0x5 o:0x0 p: - RWcgml -- ---)
-UART compartment: Message provided by caller: 
-UART compartment: Detected PermitLoadViolation(0x12) trying to write to UART.  Register CS0(0x8) contained invalid value: 0x101b0b (v:1 0x101b0b-0x101b10 l:0x5 o:0x0 p: - -W---- -- ---)
-UART compartment: Message provided by caller: Non-malicious string
diff --git a/scripts/model_output/sonata-simulator/examples/hello_compartment.txt b/scripts/model_output/sonata-simulator/examples/hello_compartment.txt
deleted file mode 100644
index 31e3a2a..0000000
--- a/scripts/model_output/sonata-simulator/examples/hello_compartment.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-UART compartment: Hello world
-UART compartment: Hello from the stack
diff --git a/scripts/model_output/sonata-simulator/examples/hello_safe_compartment.txt b/scripts/model_output/sonata-simulator/examples/hello_safe_compartment.txt
deleted file mode 100644
index 0ec9819..0000000
--- a/scripts/model_output/sonata-simulator/examples/hello_safe_compartment.txt
+++ /dev/null
Binary files differ
diff --git a/scripts/model_output/sonata-simulator/examples/hello_world.txt b/scripts/model_output/sonata-simulator/examples/hello_world.txt
deleted file mode 100644
index bcb68d3..0000000
--- a/scripts/model_output/sonata-simulator/examples/hello_world.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello world compartment: Hello world
diff --git a/scripts/model_output/sonata-simulator/examples/javascript.txt b/scripts/model_output/sonata-simulator/examples/javascript.txt
deleted file mode 100644
index 6fc8329..0000000
--- a/scripts/model_output/sonata-simulator/examples/javascript.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Hello, World!
-array[0] = 2
-array[1] = 4
-array[2] = 6
-array[3] = 8
-array[4] = 10
-JavaScript hello compartment: Microvium is using 0x1a6 bytes of memory, including 0x60 bytes of heap
-JavaScript hello compartment: Running GC
-JavaScript hello compartment: Microvium is using 0x86 bytes of memory, including 0x14 bytes of heap
-JavaScript hello compartment: Peak heap used: 0x60 bytes, peak stack used: 0x32 bytes
diff --git a/scripts/model_output/sonata-simulator/examples/memory_safety.txt b/scripts/model_output/sonata-simulator/examples/memory_safety.txt
deleted file mode 100644
index 4ebed1f..0000000
--- a/scripts/model_output/sonata-simulator/examples/memory_safety.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-Memory safety compartment: Demonstrate memory safety
-Memory safety compartment: Trigger stack linear overflow
-Memory safety compartment: Detected error in instruction 0x107cac (v:0 0x107820-0x108820 l:0x1000 o:0x0 p: G R-cgm- X- ---)
-Memory safety compartment: Detected BoundsViolation(0x1): Register CA1(0xb) contained invalid value: 0x101ad0 (v:1 0x101ad0-0x101b10 l:0x40 o:0x0 p: - RWcgml -- ---)
-Memory safety compartment: Trigger heap linear overflow
-Memory safety compartment: Detected error in instruction 0x107ab2 (v:0 0x107820-0x108820 l:0x1000 o:0x0 p: G R-cgm- X- ---)
-Memory safety compartment: Detected BoundsViolation(0x1): Register CA0(0xa) contained invalid value: 0x109910 (v:1 0x109910-0x109a10 l:0x100 o:0x0 p: G RWcgm- -- ---)
-Memory safety compartment: Trigger heap nonlinear overflow
-Memory safety compartment: Detected error in instruction 0x107b0c (v:0 0x107820-0x108820 l:0x1000 o:0x0 p: G R-cgm- X- ---)
-Memory safety compartment: Detected BoundsViolation(0x1): Register CA0(0xa) contained invalid value: 0x109a18 (v:1 0x109a18-0x109b18 l:0x100 o:0x0 p: G RWcgm- -- ---)
-Memory safety compartment: Trigger heap use after free
-Memory safety compartment: Detected error in instruction 0x107a58 (v:0 0x107820-0x108820 l:0x1000 o:0x0 p: G R-cgm- X- ---)
-Memory safety compartment: Detected TagViolation(0x2): Register CA0(0xa) contained invalid value: 0x109b20 (v:0 0x109b20-0x109c20 l:0x100 o:0x0 p: G RWcgm- -- ---)
-Memory safety compartment: Trigger storing a stack pointer 0x101ad0 (v:1 0x101ad0-0x101ae0 l:0x10 o:0x0 p: - RWcgml -- ---) into global
-Memory safety compartment: tmp: 0x101ad0 (v:0 0x101ad0-0x101ae0 l:0x10 o:0x0 p: - RWcgml -- ---)
-Memory safety compartment: Detected error in instruction 0x107a28 (v:0 0x107820-0x108820 l:0x1000 o:0x0 p: G R-cgm- X- ---)
-Memory safety compartment: Detected TagViolation(0x2): Register CS0(0x8) contained invalid value: 0x101ad0 (v:0 0x101ad0-0x101ae0 l:0x10 o:0x0 p: - RWcgml -- ---)
diff --git a/scripts/model_output/sonata-simulator/examples/producer-consumer.txt b/scripts/model_output/sonata-simulator/examples/producer-consumer.txt
deleted file mode 100644
index 7a77111..0000000
--- a/scripts/model_output/sonata-simulator/examples/producer-consumer.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-Consumer: Queue set to 0x10a720 (v:1 0x10a720-0x10a778 l:0x58 o:0xb p: G RWcgm- -- ---)
-Producer: Starting producer loop
-Consumer: Waiting for messages
-Consumer: Read 1 from queue
-Consumer: Read 2 from queue
-Consumer: Read 3 from queue
-Consumer: Read 4 from queue
-Consumer: Read 5 from queue
-Consumer: Read 6 from queue
-Consumer: Read 7 from queue
-Consumer: Read 8 from queue
-Consumer: Read 9 from queue
-Consumer: Read 10 from queue
-Consumer: Read 11 from queue
-Consumer: Read 12 from queue
-Consumer: Read 13 from queue
-Consumer: Read 14 from queue
-Consumer: Read 15 from queue
-Consumer: Read 16 from queue
-Consumer: Read 17 from queue
-Consumer: Read 18 from queue
-Consumer: Read 19 from queue
-Consumer: Read 20 from queue
-Consumer: Read 21 from queue
-Consumer: Read 22 from queue
-Consumer: Read 23 from queue
-Consumer: Read 24 from queue
-Consumer: Read 25 from queue
-Consumer: Read 26 from queue
-Consumer: Read 27 from queue
-Consumer: Read 28 from queue
-Consumer: Read 29 from queue
-Consumer: Read 30 from queue
-Consumer: Read 31 from queue
-Consumer: Read 32 from queue
-Consumer: Read 33 from queue
-Consumer: Read 34 from queue
-Consumer: Read 35 from queue
-Consumer: Read 36 from queue
-Consumer: Read 37 from queue
-Consumer: Read 38 from queue
-Consumer: Read 39 from queue
-Consumer: Read 40 from queue
-Consumer: Read 41 from queue
-Consumer: Read 42 from queue
-Consumer: Read 43 from queue
-Consumer: Read 44 from queue
-Consumer: Read 45 from queue
-Consumer: Read 46 from queue
-Consumer: Read 47 from queue
-Consumer: Read 48 from queue
-Consumer: Read 49 from queue
-Consumer: Read 50 from queue
-Consumer: Read 51 from queue
-Consumer: Read 52 from queue
-Consumer: Read 53 from queue
-Consumer: Read 54 from queue
-Consumer: Read 55 from queue
-Consumer: Read 56 from queue
-Consumer: Read 57 from queue
-Consumer: Read 58 from queue
-Consumer: Read 59 from queue
-Consumer: Read 60 from queue
-Consumer: Read 61 from queue
-Consumer: Read 62 from queue
-Consumer: Read 63 from queue
-Consumer: Read 64 from queue
-Consumer: Read 65 from queue
-Consumer: Read 66 from queue
-Consumer: Read 67 from queue
-Consumer: Read 68 from queue
-Consumer: Read 69 from queue
-Consumer: Read 70 from queue
-Consumer: Read 71 from queue
-Consumer: Read 72 from queue
-Consumer: Read 73 from queue
-Consumer: Read 74 from queue
-Consumer: Read 75 from queue
-Consumer: Read 76 from queue
-Consumer: Read 77 from queue
-Consumer: Read 78 from queue
-Consumer: Read 79 from queue
-Consumer: Read 80 from queue
-Consumer: Read 81 from queue
-Consumer: Read 82 from queue
-Consumer: Read 83 from queue
-Consumer: Read 84 from queue
-Consumer: Read 85 from queue
-Consumer: Read 86 from queue
-Consumer: Read 87 from queue
-Consumer: Read 88 from queue
-Consumer: Read 89 from queue
-Consumer: Read 90 from queue
-Consumer: Read 91 from queue
-Consumer: Read 92 from queue
-Consumer: Read 93 from queue
-Consumer: Read 94 from queue
-Consumer: Read 95 from queue
-Consumer: Read 96 from queue
-Consumer: Read 97 from queue
-Consumer: Read 98 from queue
-Consumer: Read 99 from queue
-Consumer: Read 100 from queue
-Consumer: Read 101 from queue
-Consumer: Read 102 from queue
-Consumer: Read 103 from queue
-Consumer: Read 104 from queue
-Consumer: Read 105 from queue
-Consumer: Read 106 from queue
-Consumer: Read 107 from queue
-Consumer: Read 108 from queue
-Consumer: Read 109 from queue
-Consumer: Read 110 from queue
-Consumer: Read 111 from queue
-Consumer: Read 112 from queue
-Consumer: Read 113 from queue
-Consumer: Read 114 from queue
-Consumer: Read 115 from queue
-Consumer: Read 116 from queue
-Consumer: Read 117 from queue
-Consumer: Read 118 from queue
-Consumer: Read 119 from queue
-Consumer: Read 120 from queue
-Consumer: Read 121 from queue
-Consumer: Read 122 from queue
-Consumer: Read 123 from queue
-Consumer: Read 124 from queue
-Consumer: Read 125 from queue
-Consumer: Read 126 from queue
-Consumer: Read 127 from queue
-Consumer: Read 128 from queue
-Consumer: Read 129 from queue
-Consumer: Read 130 from queue
-Consumer: Read 131 from queue
-Consumer: Read 132 from queue
-Consumer: Read 133 from queue
-Consumer: Read 134 from queue
-Consumer: Read 135 from queue
-Consumer: Read 136 from queue
-Consumer: Read 137 from queue
-Consumer: Read 138 from queue
-Consumer: Read 139 from queue
-Consumer: Read 140 from queue
-Consumer: Read 141 from queue
-Consumer: Read 142 from queue
-Consumer: Read 143 from queue
-Consumer: Read 144 from queue
-Consumer: Read 145 from queue
-Consumer: Read 146 from queue
-Consumer: Read 147 from queue
-Consumer: Read 148 from queue
-Consumer: Read 149 from queue
-Consumer: Read 150 from queue
-Consumer: Read 151 from queue
-Consumer: Read 152 from queue
-Consumer: Read 153 from queue
-Consumer: Read 154 from queue
-Consumer: Read 155 from queue
-Consumer: Read 156 from queue
-Consumer: Read 157 from queue
-Consumer: Read 158 from queue
-Consumer: Read 159 from queue
-Consumer: Read 160 from queue
-Consumer: Read 161 from queue
-Consumer: Read 162 from queue
-Consumer: Read 163 from queue
-Consumer: Read 164 from queue
-Consumer: Read 165 from queue
-Consumer: Read 166 from queue
-Consumer: Read 167 from queue
-Consumer: Read 168 from queue
-Consumer: Read 169 from queue
-Consumer: Read 170 from queue
-Consumer: Read 171 from queue
-Consumer: Read 172 from queue
-Consumer: Read 173 from queue
-Consumer: Read 174 from queue
-Consumer: Read 175 from queue
-Consumer: Read 176 from queue
-Consumer: Read 177 from queue
-Consumer: Read 178 from queue
-Consumer: Read 179 from queue
-Consumer: Read 180 from queue
-Consumer: Read 181 from queue
-Consumer: Read 182 from queue
-Producer: Producer sent all messages to consumer
-Consumer: Read 183 from queue
-Consumer: Read 184 from queue
-Consumer: Read 185 from queue
-Consumer: Read 186 from queue
-Consumer: Read 187 from queue
-Consumer: Read 188 from queue
-Consumer: Read 189 from queue
-Consumer: Read 190 from queue
-Consumer: Read 191 from queue
-Consumer: Read 192 from queue
-Consumer: Read 193 from queue
-Consumer: Read 194 from queue
-Consumer: Read 195 from queue
-Consumer: Read 196 from queue
-Consumer: Read 197 from queue
-Consumer: Read 198 from queue
-Consumer: Read 199 from queue
diff --git a/scripts/model_output/sonata-simulator/examples/sealing.txt b/scripts/model_output/sonata-simulator/examples/sealing.txt
deleted file mode 100644
index f6d7fd9..0000000
--- a/scripts/model_output/sonata-simulator/examples/sealing.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Identifier service: Allocated identifier, sealed capability: 0x109410 (v:1 0x109410-0x109420 l:0x10 o:0xb p: G RWcgm- -- ---)
-unsealed capability: 0x109418 (v:1 0x109418-0x109420 l:0x8 o:0x0 p: G RWcgm- -- ---)
-Caller compartment: Allocated identifier to hold the value 42: 0x109410 (v:1 0x109410-0x109420 l:0x10 o:0xb p: G RWcgm- -- ---)
-Caller compartment: Value is 42
-Caller compartment: Dangling pointer: 0x109410 (v:0 0x109410-0x109420 l:0x10 o:0xb p: G RWcgm- -- ---)
diff --git a/scripts/model_output/sonata-simulator/examples/temporal_safety.txt b/scripts/model_output/sonata-simulator/examples/temporal_safety.txt
deleted file mode 100644
index 37f990e..0000000
--- a/scripts/model_output/sonata-simulator/examples/temporal_safety.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-Allocating compartment: ----- Simple Case -----
-Allocating compartment: Allocated: 0x109910 (v:1 0x109910-0x109940 l:0x30 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Use after free: 0x109910 (v:0 0x109910-0x109940 l:0x30 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: ----- Sub object -----
-Allocating compartment: Allocated : 0x109948 (v:1 0x109948-0x1099b0 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x109961 (v:1 0x109961-0x109993 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 3984
-Allocating compartment: After free of sub object
-Allocating compartment: Allocated : 0x109948 (v:1 0x109948-0x1099b0 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x109961 (v:1 0x109961-0x109993 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 3984
-Allocating compartment: After free of allocation
-Allocating compartment: Allocated : 0x109948 (v:0 0x109948-0x1099b0 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x109961 (v:0 0x109961-0x109993 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 4096
-Allocating compartment: ----- Sub object with a claim -----
-Allocating compartment: Allocated : 0x1099b8 (v:1 0x1099b8-0x109a20 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x1099d1 (v:1 0x1099d1-0x109a03 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 3984
-Allocating compartment: heap quota after claim: 3968
-Allocating compartment: After free of allocation
-Allocating compartment: Allocated : 0x1099b8 (v:1 0x1099b8-0x109a20 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x1099d1 (v:1 0x1099d1-0x109a03 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 3968
-Allocating compartment: After free of sub object
-Allocating compartment: Allocated : 0x1099b8 (v:0 0x1099b8-0x109a20 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x1099d1 (v:0 0x1099d1-0x109a03 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 4096
-Allocating compartment: ----- Sub object with a fast claim -----
-Allocating compartment: Allocated : 0x109a38 (v:1 0x109a38-0x109aa0 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x109a51 (v:1 0x109a51-0x109a83 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 3984
-Allocating compartment: After free
-Allocating compartment: Allocated : 0x109a38 (v:0 0x109a38-0x109aa0 l:0x68 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: Sub Object: 0x109a51 (v:0 0x109a51-0x109a83 l:0x32 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 4096
-Allocating compartment: ----- Claim in another compartment -----
-Allocating compartment: Allocated : 0x109aa8 (v:1 0x109aa8-0x109ab8 l:0x10 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 4072
-Claimant compartment: Initial quota: 4096
-Claimant compartment: Make Claim : 0x109aa8 (v:1 0x109aa8-0x109ab8 l:0x10 o:0x0 p: G RWcgm- -- ---)
-Claimant compartment: heap quota: 4056
-Allocating compartment: After free: 0x109aa8 (v:1 0x109aa8-0x109ab8 l:0x10 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: heap quota: 4096
-Claimant compartment: Show Claim : 0x109aa8 (v:1 0x109aa8-0x109ab8 l:0x10 o:0x0 p: G RWcgm- -- ---)
-Claimant compartment: Initial quota: 4056
-Claimant compartment: Make Claim : 0x109ad0 (v:1 0x109ad0-0x109ae0 l:0x10 o:0x0 p: G RWcgm- -- ---)
-Claimant compartment: heap quota: 4056
-Allocating compartment: After make claim
-Allocating compartment: x: 0x109aa8 (v:0 0x109aa8-0x109ab8 l:0x10 o:0x0 p: G RWcgm- -- ---)
-Allocating compartment: y: 0x109ad0 (v:1 0x109ad0-0x109ae0 l:0x10 o:0x0 p: G RWcgm- -- ---)
-Claimant compartment: Show Claim : 0x109ad0 (v:1 0x109ad0-0x109ae0 l:0x10 o:0x0 p: G RWcgm- -- ---)
diff --git a/scripts/run-sonata-sim.sh b/scripts/run-sonata-sim.sh
index 1b4c1a3..8602bb1 100755
--- a/scripts/run-sonata-sim.sh
+++ b/scripts/run-sonata-sim.sh
@@ -25,27 +25,14 @@
 # Remove old uart log
 rm -f "${SONATA_SIMULATOR_UART_LOG}"
 
-# If a second argument is provided, check content of UART log.
-if [ -n "$2" ] ; then
-	# Run the simulator in the background.
-	${SONATA_SIMULATOR} -E "${SONATA_SIMULATOR_BOOT_STUB}" -E "$1" &
-	LOOP_TRACKER=0
-	while (( LOOP_TRACKER <= 60 ))
-	do
-		sleep 1s
-		# Returns 0 if found and 1 if not.
-		MATCH_FOUND=$(grep -q -F -f "$2" "${SONATA_SIMULATOR_UART_LOG}"; echo $?)
-		if (( MATCH_FOUND == 0 )) ; then
-			# Match was found so exit with success
-			pkill -P $$
-			exit 0
-		fi
-		LOOP_TRACKER=$((LOOP_TRACKER+1))
-	done
-	# Timeout was hit so no success.
-	pkill -P $$
+if ! ${SONATA_SIMULATOR} -E "${SONATA_SIMULATOR_BOOT_STUB}" -E "$1"; then
+	echo "Simulator exited with failure! UART output:"
+	cat "${SONATA_SIMULATOR_UART_LOG}"
 	exit 4
-else
-	# If there is no second argument, run simulator in foreground.
-	${SONATA_SIMULATOR} -E "${SONATA_SIMULATOR_BOOT_STUB}" -E "$1"
+fi
+
+# Check to see if the output indicates failure
+if grep -i failure "${SONATA_SIMULATOR_UART_LOG}"; then
+	echo "Log output contained 'failure'"
+	exit 5
 fi
diff --git a/sdk/include/platform/sunburst/platform-simulation_exit.hh b/sdk/include/platform/sunburst/platform-simulation_exit.hh
new file mode 100644
index 0000000..a158585
--- /dev/null
+++ b/sdk/include/platform/sunburst/platform-simulation_exit.hh
@@ -0,0 +1,30 @@
+// Copyright Microsoft and CHERIoT Contributors.
+// SPDX-License-Identifier: MIT
+
+#pragma once
+
+#ifdef SIMULATION
+#	include <stdint.h>
+#	include <platform-uart.hh>
+#	include <string_view>
+
+static void platform_simulation_exit(uint32_t code)
+{
+	auto uart =
+#	if DEVICE_EXISTS(uart0)
+	  MMIO_CAPABILITY(Uart, uart0);
+#	elif DEVICE_EXISTS(uart)
+	  MMIO_CAPABILITY(Uart, uart);
+#	else
+#		error No UART found in platform_simulation_exit
+#	endif
+	// Writing the following magic string to the UART will cause the sonata
+	// simulator to exit.
+	const char *magicString =
+	  "Safe to exit simulator.\xd8\xaf\xfb\xa0\xc7\xe1\xa9\xd7";
+	while (char ch = *magicString++)
+	{
+		uart->blocking_write(ch);
+	}
+}
+#endif
diff --git a/sdk/xmake.lua b/sdk/xmake.lua
index 9e8002b..d4e2411 100644
--- a/sdk/xmake.lua
+++ b/sdk/xmake.lua
@@ -423,16 +423,6 @@
 		firmware = path.filename(firmware)
 		local run = function(simulator)
 			local simargs = { firmware }
-			if get_config("testing-model-output") then
-				modeldir = path.join(scriptdir,
-				                     "..",
-				                     "scripts",
-				                     "model_output",
-				                     path.basename(target:values("board")),
-				                     "examples")
-				local modelout = path.join(modeldir, firmware .. ".txt")
-				simargs[#simargs+1] = modelout
-			end
 			os.execv(simulator, simargs, { curdir = directory })
 		end
 		-- Try executing the simulator from the sdk directory, if it's there.