OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2010 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can |
| 4 * be found in the LICENSE file. |
| 5 */ |
| 6 #include "native_client/src/trusted/service_runtime/include/bits/nacl_syscalls.h
" |
| 7 #include "native_client/src/trusted/service_runtime/nacl_config.h" |
| 8 |
| 9 .text |
| 10 start_of_text: |
| 11 |
| 12 .p2align NACLENTRYALIGN |
| 13 write_num_10: |
| 14 /* rdi has descriptor number, rsi has number to be printed */ |
| 15 pushq %rbp |
| 16 movq %rsp, %rbp |
| 17 naclspadj $-0x20, %r15 /* buffer[0x20] */ |
| 18 movl %ebp, %r8d /* %r8 = &buffer[0x20] (off the end) */ |
| 19 xorq %rcx, %rcx /* %ecx = 0; (byte count) */ |
| 20 |
| 21 movq %rsi, %rax |
| 22 |
| 23 movq $10, %r9 |
| 24 do_digit_10: |
| 25 xorq %rdx, %rdx |
| 26 divq %r9 /* %rdx:%rax div_mod 10 */ |
| 27 addq $'0', %rdx /* *--%r8 = remainder + '0' */ |
| 28 subl $1, %r8d |
| 29 movb %dl, (%r15, %r8) |
| 30 addq $1, %rcx /* ++byte_count */ |
| 31 andq %rax, %rax |
| 32 jnz do_digit_10 |
| 33 |
| 34 movq %rcx, %rdx |
| 35 movq %r8, %rsi |
| 36 /* rdi still has descriptor number */ |
| 37 call NACL_SYSCALL_ADDR(NACL_sys_write) |
| 38 |
| 39 movq %rbp, %rsp |
| 40 popq %r11 |
| 41 naclrestbp %r11d, %r15 |
| 42 popq %r11 |
| 43 nacljmp %r11d, %r15 |
| 44 |
| 45 .p2align NACLENTRYALIGN |
| 46 write_num_16: |
| 47 pushq %rbp |
| 48 movq %rsp, %rbp |
| 49 naclspadj $-0x20, %r15 |
| 50 movl %ebp, %r8d |
| 51 xorq %rcx, %rcx |
| 52 do_digit_16: |
| 53 movq %rsi, %rax |
| 54 andq $0xf, %rax |
| 55 addq $'0', %rax |
| 56 cmpq $(10 + '0'), %rax |
| 57 jl do_digit_not_upper |
| 58 addq $('a'-'0'-10), %rax |
| 59 do_digit_not_upper: |
| 60 subl $1, %r8d |
| 61 movb %al, (%r15, %r8) |
| 62 addq $1, %rcx |
| 63 shrq $4, %rsi |
| 64 jnz do_digit_16 |
| 65 |
| 66 movq %rcx, %rdx |
| 67 movq %r8, %rsi |
| 68 /* rdi still has descriptor number */ |
| 69 call NACL_SYSCALL_ADDR(NACL_sys_write) |
| 70 |
| 71 movq %rbp, %rsp |
| 72 popq %r11 |
| 73 naclrestbp %r11d, %r15 |
| 74 popq %r11 |
| 75 nacljmp %r11d, %r15 |
| 76 |
| 77 .p2align NACLENTRYALIGN |
| 78 write_char: |
| 79 pushq %rbp |
| 80 movq %rsp, %rbp |
| 81 subl $0x10, %esp |
| 82 addq %r15, %rsp |
| 83 |
| 84 movl %esp, %r8d |
| 85 movb %sil, (%r15, %r8) |
| 86 movq $1, %rdx |
| 87 movl %esp, %esi |
| 88 /* %rdi retains value */ |
| 89 call NACL_SYSCALL_ADDR(NACL_sys_write) |
| 90 |
| 91 movq %rbp, %rsp |
| 92 popq %r11 |
| 93 naclrestbp %r11d, %r15 |
| 94 popq %r11 |
| 95 nacljmp %r11d, %r15 |
| 96 |
| 97 .p2align NACLENTRYALIGN |
| 98 .globl _start |
| 99 _start: |
| 100 movq $123456789012345, %rsi |
| 101 movq $1, %rdi |
| 102 call write_num_10 |
| 103 |
| 104 movq $'\n', %rsi |
| 105 movq $1, %rdi |
| 106 call write_char |
| 107 |
| 108 movq $0xdeadbeefcafebabe, %rsi |
| 109 movq $1, %rdi |
| 110 call write_num_16 |
| 111 |
| 112 movq $'\n', %rsi |
| 113 movq $1, %rdi |
| 114 call write_char |
| 115 |
| 116 leaq end_of_text, %rsi |
| 117 movq $1, %rdi |
| 118 call write_num_16 |
| 119 |
| 120 movq $'\n', %rsi |
| 121 movq $1, %rdi |
| 122 call write_char |
| 123 |
| 124 movq $0, %rdi |
| 125 call NACL_SYSCALL_ADDR(NACL_sys_sysbrk) |
| 126 |
| 127 xorq %r12, %r12 /* r12 holds our eventual exit status */ |
| 128 cmpl $EXPECTED_BREAK, %eax |
| 129 je brk_sane |
| 130 movq $1, %r12 |
| 131 brk_sane: |
| 132 |
| 133 movq %rax, %rsi |
| 134 movq $1, %rdi |
| 135 call write_num_16 |
| 136 |
| 137 movq $'\n', %rsi |
| 138 movq $1, %rdi |
| 139 call write_char |
| 140 |
| 141 movq $EXPECTED_BREAK, %rsi |
| 142 movq $1, %rdi |
| 143 call write_num_16 |
| 144 |
| 145 movq $'\n', %rsi |
| 146 movq $1, %rdi |
| 147 call write_char |
| 148 |
| 149 #if EXPECTED_RODATA != 0 |
| 150 movq $12, %rdx |
| 151 movq $ro_str, %rsi |
| 152 movq $1, %rdi |
| 153 call NACL_SYSCALL_ADDR(NACL_sys_write) |
| 154 |
| 155 movq $ro_str, %rsi |
| 156 movq $1, %rdi |
| 157 call write_num_16 |
| 158 |
| 159 movq $'\n', %rsi |
| 160 movq $1, %rdi |
| 161 call write_char |
| 162 |
| 163 leaq ro_str, %rax |
| 164 cmpq $EXPECTED_RODATA, %rax |
| 165 je ro_sane |
| 166 movq $1, %r12 |
| 167 ro_sane: |
| 168 |
| 169 leaq ro_str, %rsi |
| 170 movq $1, %rdi |
| 171 call write_num_16 |
| 172 |
| 173 movq $'\n', %rsi |
| 174 movq $1, %rdi |
| 175 call write_char |
| 176 #endif |
| 177 |
| 178 movq %r12, %rdi |
| 179 call NACL_SYSCALL_ADDR(NACL_sys_exit) |
| 180 |
| 181 .skip TEXT_EXTEND - (. - start_of_text), 0xf4 |
| 182 end_of_text: |
| 183 |
| 184 #if EXPECTED_RODATA != 0 |
| 185 .section .rodata |
| 186 ro_str: .ascii "Hello world\n" |
| 187 /* 123456789012 */ |
| 188 #endif |
OLD | NEW |