| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2010 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can | 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * be found in the LICENSE file. | 4 * found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 void unfixed_code(void); | 9 void unfixed_code(void); |
| 10 | 10 |
| 11 #if defined(__i386__) || defined(__x86_64__) | 11 #if defined(__i386__) || defined(__x86_64__) |
| 12 __asm__("unfixed_code: ret\n"); | 12 __asm__("unfixed_code: ret\n"); |
| 13 #elif defined(__mips__) |
| 14 /* |
| 15 * We need to mark unfixed_code as global, otherwise linker can not resolve pic |
| 16 * CALL16 relocation against local symbol unfixed_code. |
| 17 */ |
| 18 __asm__(".global unfixed_code\n" |
| 19 "unfixed_code: jr $ra\n" |
| 20 "nop\n"); |
| 13 #else | 21 #else |
| 14 # error "Unsupported architecture" | 22 # error "Unsupported architecture" |
| 15 #endif | 23 #endif |
| 16 | 24 |
| 17 /* Test a large number of validator errors. This is a regression test | 25 /* Test a large number of validator errors. This is a regression test |
| 18 for a bug in which the validator would only stub out the first 100 | 26 for a bug in which the validator would only stub out the first 100 |
| 19 bad instructions. | 27 bad instructions. |
| 20 See http://code.google.com/p/nativeclient/issues/detail?id=1194. | 28 See http://code.google.com/p/nativeclient/issues/detail?id=1194. |
| 21 The assembler does not provide an obvious repeat/loop construct, so | 29 The assembler does not provide an obvious repeat/loop construct, so |
| 22 we use ".fill" with a numeric value to generate an instruction many | 30 we use ".fill" with a numeric value to generate an instruction many |
| 23 times. */ | 31 times. */ |
| 24 #if defined(__i386__) | 32 #if defined(__i386__) |
| 25 __asm__(".p2align 5\n" | 33 __asm__(".p2align 5\n" |
| 26 /* "cd 80" disassembles to "int $0x80". */ | 34 /* "cd 80" disassembles to "int $0x80". */ |
| 27 ".fill 1000, 2, 0x80cd\n" | 35 ".fill 1000, 2, 0x80cd\n" |
| 28 ".p2align 5\n"); | 36 ".p2align 5\n"); |
| 29 #elif defined(__x86_64__) | 37 #elif defined(__x86_64__) |
| 30 __asm__(".p2align 5\n" | 38 __asm__(".p2align 5\n" |
| 31 /* "0f 05" disassembles to "syscall". */ | 39 /* "0f 05" disassembles to "syscall". */ |
| 32 ".fill 1000, 2, 0x050f\n" | 40 ".fill 1000, 2, 0x050f\n" |
| 33 ".p2align 5\n"); | 41 ".p2align 5\n"); |
| 42 #elif defined(__mips__) |
| 43 __asm__(".p2align 4\n" |
| 44 /* "0xc" disassembles to "syscall". */ |
| 45 ".fill 1000, 4, 0x0000000c\n" |
| 46 ".p2align 4\n"); |
| 34 #else | 47 #else |
| 35 # error "Unsupported architecture" | 48 # error "Unsupported architecture" |
| 36 #endif | 49 #endif |
| 37 | 50 |
| 38 int main(void) { | 51 int main(void) { |
| 39 printf("Before non-validating instruction\n"); | 52 printf("Before non-validating instruction\n"); |
| 40 fflush(stdout); | 53 fflush(stdout); |
| 41 unfixed_code(); | 54 unfixed_code(); |
| 42 printf("After non-validating instruction\n"); | 55 printf("After non-validating instruction\n"); |
| 43 return 0; | 56 return 0; |
| 44 } | 57 } |
| OLD | NEW |