aboutsummaryrefslogtreecommitdiff
path: root/tests/drivers/code_address_growth_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/drivers/code_address_growth_test.py')
-rw-r--r--tests/drivers/code_address_growth_test.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/tests/drivers/code_address_growth_test.py b/tests/drivers/code_address_growth_test.py
new file mode 100644
index 0000000..a454406
--- /dev/null
+++ b/tests/drivers/code_address_growth_test.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+# native address metadata grows without losing warm translations or rewrite tracking.
+import subprocess
+import sys
+
+source = '''o3 int warmed(int value) { return value + 1; }
+fn main() {
+ put_n(warmed(6)); put_c(32);
+ let code = new(6);
+ code[0] = code + 3; code[3] = 8; code[4] = 15; code[5] = 18;
+ put_n(syscall(9, 9, code + 6, 0) >= code + 6); put_c(32);
+ put_n(code()); put_c(32);
+ fill_w(code + 4, 19, 1); put_n(code()); put_c(32);
+ let replacement = new(1); replacement[0] = 23;
+ copy_w(code + 4, replacement, 1); put_n(code()); put_c(32);
+ gc(); put_n(warmed(8)); put_c(32);
+ put_n(syscall(9, 9, syscall(9, 0, 0, 0) + 1, 0) == -1); put_c(10);
+ return 0;
+}
+'''
+result = subprocess.run(sys.argv[1:], input=source, text=True, capture_output=True, timeout=20)
+assert result.returncode == 0 and result.stdout == '7 1 7 9 11 9 1\n', (result.returncode, result.stdout, result.stderr)
+print('ok new code addresses, warm calls, bulk rewrites, and denied metadata growth')