| Index: src/trusted/service_runtime/arch/arm/nacl_text_pad_test.S
|
| ===================================================================
|
| --- src/trusted/service_runtime/arch/arm/nacl_text_pad_test.S (revision 0)
|
| +++ src/trusted/service_runtime/arch/arm/nacl_text_pad_test.S (revision 0)
|
| @@ -0,0 +1,226 @@
|
| +/*
|
| + * Copyright 2010 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.
|
| + */
|
| +#include "native_client/src/trusted/service_runtime/include/bits/nacl_syscalls.h"
|
| +#include "native_client/src/trusted/service_runtime/nacl_config.h"
|
| +
|
| + /*
|
| + * Code to test various address layout boundary conditions.
|
| + * This is a translation from the x86-{32,64} code, and is
|
| + * not intended to be super efficent, just good enough to
|
| + * print out the values that are designed, while maintaining
|
| + * strict control over the address space layout.
|
| + */
|
| +
|
| + .cpu cortex-a8
|
| +
|
| + .text
|
| +start_of_text:
|
| + /*
|
| + * write_num_10 omitted. __aeabi_udivmod is too long/complex
|
| + * to replicate, we cannot link against glibc to get _udivsi3.o
|
| + * and pick up transitive dependencies. Plus, we don't actually
|
| + * use decimal output (yet).
|
| + *
|
| + * One alternative would be to link using:
|
| + *
|
| + * ${LD} --native-client -e _start -Ttext 0x20000 -o ${TARGET} \
|
| + * ${SOURCES} ${GLIBC} ${TEXT_EXTEND}
|
| + *
|
| + * i.e., to load the text pad as a separate .o *after* external
|
| + * references are resolved from glibc, with link-time
|
| + * expansion/computation of the (TEXT_EXTEND - (. - start_of_text))/4
|
| + * fill expression (is that possible?).
|
| + */
|
| +
|
| + /*
|
| + * write_num_16. Write an unsigned value in hex.
|
| + * r0 is descriptor number, r1 is unsigned value to write.
|
| + */
|
| + .p2align 4
|
| +write_num_16:
|
| + push {r4, lr}
|
| + mov r3, sp
|
| + sub sp, sp, #0x10
|
| + bic sp, sp, #0xc0000000
|
| +
|
| + mov r2, #0
|
| +do_digit_16:
|
| + sub r3, r3, #1
|
| + add r2, r2, #1
|
| + and r4, r1, #0xf
|
| +
|
| + add r4, r4, #'0'
|
| + cmp r4, #'9'
|
| + ble do_digit_not_upper
|
| + add r4, r4, #('a'-'0'-10)
|
| +
|
| +do_digit_not_upper:
|
| + bic r3, r3, #0xc0000000
|
| + strb r4, [r3]
|
| + lsrs r1, r1, #4
|
| + bne do_digit_16
|
| +
|
| + mov r1, r3
|
| + movw r3, #:lower16:NACL_SYSCALL_ADDR(NACL_sys_write)
|
| + movt r3, #:upper16:NACL_SYSCALL_ADDR(NACL_sys_write)
|
| + nop
|
| +
|
| + nop
|
| + nop
|
| + bic r3, r3, #0xc000000f
|
| + blx r3
|
| +
|
| + add sp, sp, #0x10
|
| + bic sp, sp, #0xc0000000
|
| + pop {r4, lr}
|
| + nop
|
| +
|
| + bic lr, lr, #0xc000000f
|
| + bx lr
|
| +
|
| + .p2align 4
|
| + /*
|
| + * r0 is descriptor number, r1 is character to write
|
| + */
|
| +write_char:
|
| + push {lr}
|
| + sub sp, sp, #0x10
|
| + bic sp, sp, #0xc0000000
|
| + strb r1, [sp]
|
| +
|
| + mov r1, sp
|
| + mov r2, #1
|
| + movw r3, #:lower16:NACL_SYSCALL_ADDR(NACL_sys_write)
|
| + movt r3, #:upper16:NACL_SYSCALL_ADDR(NACL_sys_write)
|
| +
|
| + nop
|
| + nop
|
| + bic r3, r3, #0xc000000f
|
| + blx r3
|
| +
|
| + add sp, sp, #0x10
|
| + bic sp, sp, #0xc0000000
|
| + pop {lr}
|
| + nop
|
| +
|
| + bic lr, lr, #0xc000000f
|
| + bx lr
|
| +
|
| + .p2align 4
|
| + .globl _start
|
| +_start:
|
| + /* basic I/O test */
|
| + mov r0, #1
|
| + movw r1, #0xbeef
|
| + movt r1, #0xdead
|
| + bl write_num_16
|
| +
|
| + mov r0, #1
|
| + mov r1, #'\n'
|
| + nop
|
| + bl write_char
|
| +
|
| + movw r1, #:lower16:end_of_text
|
| + movt r1, #:upper16:end_of_text
|
| + mov r0, #1
|
| + bl write_num_16
|
| +
|
| + mov r0, #1
|
| + mov r1, #'\n'
|
| + nop
|
| + bl write_char
|
| +
|
| + mov r0, #0
|
| + movw r3, #:lower16:NACL_SYSCALL_ADDR(NACL_sys_sysbrk)
|
| + movt r3, #:upper16:NACL_SYSCALL_ADDR(NACL_sys_sysbrk)
|
| + nop
|
| +
|
| + nop
|
| + nop
|
| + bic r3, r3, #0xc000000f
|
| + blx r3
|
| +
|
| + mov r4, r0 /* save a copy of break addr */
|
| + mov r1, r0
|
| + mov r0, #1
|
| + bl write_num_16
|
| +
|
| + mov r0, #1
|
| + mov r1, #'\n'
|
| + nop
|
| + bl write_char
|
| +
|
| + mov r5, #0 /* r5 holds eventual exit status */
|
| + movw r1, #:lower16:EXPECTED_BREAK
|
| + movt r1, #:upper16:EXPECTED_BREAK
|
| + cmp r1, r4
|
| +
|
| + movne r5, #1
|
| + mov r0, #1 /* r1 still has EXPECTED_BREAK */
|
| + nop
|
| + bl write_num_16
|
| +
|
| + mov r1, #'\n'
|
| + mov r0, #1
|
| + nop
|
| + bl write_char
|
| +
|
| +#if EXPECTED_RODATA != 0
|
| + mov r2, #12
|
| + movw r1, #:lower16:ro_str
|
| + movt r1, #:upper16:ro_str
|
| + mov r0, #1
|
| +
|
| + movw r3, #:lower16:NACL_SYSCALL_ADDR(NACL_sys_write)
|
| + movt r3, #:upper16:NACL_SYSCALL_ADDR(NACL_sys_write)
|
| + bic r3, r3, #0xc000000f
|
| + blx r3
|
| +
|
| + movw r1, #:lower16:ro_str
|
| + movt r1, #:upper16:ro_str
|
| + mov r0, #1
|
| + bl write_num_16
|
| +
|
| + mov r1, #'\n'
|
| + mov r0, #1
|
| + nop
|
| + bl write_char
|
| +
|
| + movw r1, #:lower16:EXPECTED_RODATA
|
| + movt r1, #:upper16:EXPECTED_RODATA
|
| + movw r2, #:lower16:ro_str
|
| + movt r2, #:upper16:ro_str
|
| +
|
| + cmp r1, r2
|
| + movne r5, #1
|
| + mov r0, #1 /* r1 still has EXPECTED_RODATA */
|
| + bl write_num_16
|
| +
|
| + mov r1, #'\n'
|
| + mov r0, #1
|
| + nop
|
| + bl write_char
|
| +#endif
|
| +
|
| + movw r3, #:lower16:NACL_SYSCALL_ADDR(NACL_sys_exit)
|
| + movt r3, #:upper16:NACL_SYSCALL_ADDR(NACL_sys_exit)
|
| + mov r0, #0
|
| + nop
|
| +
|
| + nop
|
| + nop
|
| + bic r3, r3, #0xc000000f
|
| + blx r3
|
| +
|
| + /* use new proper halt */
|
| + .fill (TEXT_EXTEND - (. - start_of_text))/4, 4, 0xe1266676
|
| +end_of_text:
|
| +
|
| +#if EXPECTED_RODATA != 0
|
| + .section .rodata
|
| +ro_str: .ascii "Hello world\n"
|
| + /* 123456789012 */
|
| +#endif
|
|
|
| Property changes on: src/trusted/service_runtime/arch/arm/nacl_text_pad_test.S
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|