Index: src/trusted/service_runtime/arch/x86_64/nacl_text_pad_test.S |
=================================================================== |
--- src/trusted/service_runtime/arch/x86_64/nacl_text_pad_test.S (revision 0) |
+++ src/trusted/service_runtime/arch/x86_64/nacl_text_pad_test.S (revision 0) |
@@ -0,0 +1,188 @@ |
+/* |
+ * 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" |
+ |
+ .text |
+start_of_text: |
+ |
+ .p2align NACLENTRYALIGN |
+write_num_10: |
+ /* rdi has descriptor number, rsi has number to be printed */ |
+ pushq %rbp |
+ movq %rsp, %rbp |
+ naclspadj $-0x20, %r15 /* buffer[0x20] */ |
+ movl %ebp, %r8d /* %r8 = &buffer[0x20] (off the end) */ |
+ xorq %rcx, %rcx /* %ecx = 0; (byte count) */ |
+ |
+ movq %rsi, %rax |
+ |
+ movq $10, %r9 |
+do_digit_10: |
+ xorq %rdx, %rdx |
+ divq %r9 /* %rdx:%rax div_mod 10 */ |
+ addq $'0', %rdx /* *--%r8 = remainder + '0' */ |
+ subl $1, %r8d |
+ movb %dl, (%r15, %r8) |
+ addq $1, %rcx /* ++byte_count */ |
+ andq %rax, %rax |
+ jnz do_digit_10 |
+ |
+ movq %rcx, %rdx |
+ movq %r8, %rsi |
+ /* rdi still has descriptor number */ |
+ call NACL_SYSCALL_ADDR(NACL_sys_write) |
+ |
+ movq %rbp, %rsp |
+ popq %r11 |
+ naclrestbp %r11d, %r15 |
+ popq %r11 |
+ nacljmp %r11d, %r15 |
+ |
+ .p2align NACLENTRYALIGN |
+write_num_16: |
+ pushq %rbp |
+ movq %rsp, %rbp |
+ naclspadj $-0x20, %r15 |
+ movl %ebp, %r8d |
+ xorq %rcx, %rcx |
+do_digit_16: |
+ movq %rsi, %rax |
+ andq $0xf, %rax |
+ addq $'0', %rax |
+ cmpq $(10 + '0'), %rax |
+ jl do_digit_not_upper |
+ addq $('a'-'0'-10), %rax |
+do_digit_not_upper: |
+ subl $1, %r8d |
+ movb %al, (%r15, %r8) |
+ addq $1, %rcx |
+ shrq $4, %rsi |
+ jnz do_digit_16 |
+ |
+ movq %rcx, %rdx |
+ movq %r8, %rsi |
+ /* rdi still has descriptor number */ |
+ call NACL_SYSCALL_ADDR(NACL_sys_write) |
+ |
+ movq %rbp, %rsp |
+ popq %r11 |
+ naclrestbp %r11d, %r15 |
+ popq %r11 |
+ nacljmp %r11d, %r15 |
+ |
+ .p2align NACLENTRYALIGN |
+write_char: |
+ pushq %rbp |
+ movq %rsp, %rbp |
+ subl $0x10, %esp |
+ addq %r15, %rsp |
+ |
+ movl %esp, %r8d |
+ movb %sil, (%r15, %r8) |
+ movq $1, %rdx |
+ movl %esp, %esi |
+ /* %rdi retains value */ |
+ call NACL_SYSCALL_ADDR(NACL_sys_write) |
+ |
+ movq %rbp, %rsp |
+ popq %r11 |
+ naclrestbp %r11d, %r15 |
+ popq %r11 |
+ nacljmp %r11d, %r15 |
+ |
+ .p2align NACLENTRYALIGN |
+ .globl _start |
+_start: |
+ movq $123456789012345, %rsi |
+ movq $1, %rdi |
+ call write_num_10 |
+ |
+ movq $'\n', %rsi |
+ movq $1, %rdi |
+ call write_char |
+ |
+ movq $0xdeadbeefcafebabe, %rsi |
+ movq $1, %rdi |
+ call write_num_16 |
+ |
+ movq $'\n', %rsi |
+ movq $1, %rdi |
+ call write_char |
+ |
+ leaq end_of_text, %rsi |
+ movq $1, %rdi |
+ call write_num_16 |
+ |
+ movq $'\n', %rsi |
+ movq $1, %rdi |
+ call write_char |
+ |
+ movq $0, %rdi |
+ call NACL_SYSCALL_ADDR(NACL_sys_sysbrk) |
+ |
+ xorq %r12, %r12 /* r12 holds our eventual exit status */ |
+ cmpl $EXPECTED_BREAK, %eax |
+ je brk_sane |
+ movq $1, %r12 |
+brk_sane: |
+ |
+ movq %rax, %rsi |
+ movq $1, %rdi |
+ call write_num_16 |
+ |
+ movq $'\n', %rsi |
+ movq $1, %rdi |
+ call write_char |
+ |
+ movq $EXPECTED_BREAK, %rsi |
+ movq $1, %rdi |
+ call write_num_16 |
+ |
+ movq $'\n', %rsi |
+ movq $1, %rdi |
+ call write_char |
+ |
+#if EXPECTED_RODATA != 0 |
+ movq $12, %rdx |
+ movq $ro_str, %rsi |
+ movq $1, %rdi |
+ call NACL_SYSCALL_ADDR(NACL_sys_write) |
+ |
+ movq $ro_str, %rsi |
+ movq $1, %rdi |
+ call write_num_16 |
+ |
+ movq $'\n', %rsi |
+ movq $1, %rdi |
+ call write_char |
+ |
+ leaq ro_str, %rax |
+ cmpq $EXPECTED_RODATA, %rax |
+ je ro_sane |
+ movq $1, %r12 |
+ro_sane: |
+ |
+ leaq ro_str, %rsi |
+ movq $1, %rdi |
+ call write_num_16 |
+ |
+ movq $'\n', %rsi |
+ movq $1, %rdi |
+ call write_char |
+#endif |
+ |
+ movq %r12, %rdi |
+ call NACL_SYSCALL_ADDR(NACL_sys_exit) |
+ |
+ .skip TEXT_EXTEND - (. - start_of_text), 0xf4 |
+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/x86_64/nacl_text_pad_test.S |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |