Index: src/trusted/validator_mips/testdata/test_jmp_imm.S |
diff --git a/src/trusted/validator_mips/testdata/test_jmp_imm.S b/src/trusted/validator_mips/testdata/test_jmp_imm.S |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c74c3b39722a0dee5f010aa15da925a24294f4dc |
--- /dev/null |
+++ b/src/trusted/validator_mips/testdata/test_jmp_imm.S |
@@ -0,0 +1,105 @@ |
+# Copyright 2012 The Native Client Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can |
+# be found in the LICENSE file. |
+# Copyright 2012 MIPS Technologies / RT-RK. |
+ |
+# test cases for jmps/branches |
+# there are several kinds of jmps/branches in regards to destination address |
+# 1. jmps into 0-0x10000, null guard region, where everything is considered OK |
+# 2. jmps into 0x10000-0x20000, trampoline code section, jmps need to be bundle aligned |
Brad Chen
2012/04/13 00:50:52
Please try to stick with 80-columns unless syntact
|
+# 3. jmps into code section, jmps need to be bundle aligned |
+# beside destination address we also check the position of jmp/b and link |
Brad Chen
2012/04/13 00:50:52
Standard capitalization makes the comments more re
|
+# instructions, which need to bundle offset +8 |
+ |
+ |
+.globl _start |
+_start: |
+.align 4 |
+.set noreorder |
+ |
+bundle_b_to_0_0x1000: |
+ b _start - 0x10000 #destination addres is 0x10000 - OK |
+ nop |
Brad Chen
2012/04/13 00:50:52
It looks like the convention you are using is an i
|
+ b _start - 0x1fff4 #destination addres is 0xc (null guard region)- OK |
+ nop |
+ |
+bundle_b_to_0x1000_0x20000: |
+ b _start - 0x10000 # ok - trampoline start |
+ nop |
+ b _start - 0xfff4 # dest_addr = 0x1000c, error (middle of the trampoline) |
+ nop |
+ |
+bundle_b_to_code_area: |
+ b _start + 0x1000 # ok |
+ nop |
+ b _start + 0x1004 # ok, not on pseudo instruction |
+ nop |
+ b _start + 0x10 # ok |
+ nop |
+ b end_of_code # ok |
+ nop |
+ |
+bundle_j_to_0_0x1000: |
+#all is allowed, b/c that is guard region |
+ j 0x0 |
+ nop |
+ j 0x4 |
+ nop |
+ |
+bundle_j_trampoline_area: |
+ j 0x10000 |
+ nop |
+ jal 0x10004 # kProblemUnalignedJumpToTrampoline (not a trampoline start) |
+ nop |
+ |
+ nop |
+ nop |
+ jal 0x10010 # ok - not a trampoline start, but there is a halt, so ok. |
+ nop |
+ |
+ nop |
+ nop |
+ jal 0x10020 # ok |
+ nop |
+ |
+bundle_j_negative: |
+ j -0x4 # ok |
+ nop |
+ j -0x10 # ok |
+ nop |
+ |
+bundle_1st: |
+ and $a0, $a0, $t7 |
+bundle_2nd: |
+ sw $ra, 24($a0) |
+ addiu $v0, $v0, 4 |
+ addiu $v0, $v1, 0 |
+ |
+bl_check: |
+ nop |
+ nop |
+ bal bundle_1st #ok |
+ nop |
+ |
+bundle_check_b_dest_addr: |
+ b bundle_1st # ok |
+ nop |
+ b bundle_2nd # kProblemBranchSplitsPattern |
+ nop |
+ |
+ bal 0x10000 #error misaligned call |
+ nop |
+ jalx 0x3ffffff0 #error, forbidden instruction |
+ nop |
+ |
+ jal 0x10000 #error misaligned call |
+ nop |
+ jal 0x3fffff0 #ok |
+ nop |
+ |
+ b bundle_2nd # kProblemBranchSplitsPattern |
+ nop |
+ nop |
+ nop |
+ |
+end_of_code: |