Index: src/trusted/validator_arm/testdata-thumb/test_sp_updates.S |
diff --git a/src/trusted/validator_arm/testdata-thumb/test_sp_updates.S b/src/trusted/validator_arm/testdata-thumb/test_sp_updates.S |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7070513f2dea1c479cd2f772a8c8ecd14e0530b3 |
--- /dev/null |
+++ b/src/trusted/validator_arm/testdata-thumb/test_sp_updates.S |
@@ -0,0 +1,59 @@ |
+@ Copyright (c) 2011 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 (c) 2011 Google Inc. |
+ |
+@ |
+@ Tests both legal and illegal variations on SP updates. |
+@ |
+ |
+#define MASK 0xC0000000 |
+ |
+.syntax unified |
+.code 16 |
+.thumb_func |
+.global _start |
+_start: |
+bundle0: |
+ ldr r0, [sp], #4 @ SP post-update is fine. |
+ ldr r0, [sp, #4]! @ SP pre-update is fine. |
+ |
+ ldm sp!, { r0, r1, r2 } @ Update from ldm is fine. |
+ stm sp!, { r0, r1, r2 } @ Update from stm is fine. |
+ nop |
+ nop |
+bundle1: |
+ bic r0, r0, #MASK |
+ mov sp, r0 @ Move-to-SP is not fine preceeded by a mask |
+ |
+ add r0, r0, #1 @ something unexpected (ERROR). |
+ mov sp, r0 @ Move-to-SP not okay when preceeded by else |
+ nop |
+ nop |
+bundle2: |
+ add sp, sp, #12 @ Adding a constant is not fine |
+ ldr r0, [sp] @ immediately followed by deref |
+ @ error |
+ |
+ add sp, sp, #12 |
+ str r0, [sp], #0 @ Or a write. |
+@ @ error |
+ |
+ add sp, sp, #12 @ Not okay when followed by |
+ bic r0, r0, #12 |
+ |
+bundle3: |
+ add sp, r0 |
+ |
+ nop |
+ nop |
+ nop |
+ nop |
+ nop |
+ bic r0, r0, #MASK @ Likewise, move-to-SP cannot be... |
+ |
+bundle4: |
+ mov sp, r0 @ ...broken across bundle (ERROR). |
+ |
+bundle6: |
+ str r0, [sp], #42 @ Update SP using immediate post-inc: should pass. |