1/*
2 * Copyright 2013, winocm. <winocm@icloud.com>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 *   Redistributions of source code must retain the above copyright notice, this
9 *   list of conditions and the following disclaimer.
10 *
11 *   Redistributions in binary form must reproduce the above copyright notice, this
12 *   list of conditions and the following disclaimer in the documentation and/or
13 *   other materials provided with the distribution.
14 *
15 *   If you are going to use this software in any form that does not involve
16 *   releasing the source to this project or improving it, let me know beforehand.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
22 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29/*
30 * PE semihosting bringup interface
31 */
32
33#include <arm/arch.h>
34#include <arm/asm_help.h>
35
36#ifndef __LP64__
37.code 16
38#endif
39
40.text
41.align 4
42
43/*
44 * lol buffer
45 */
46.globl _semihost_buffer_ptr
47_semihost_buffer:
48    .space (8192), 0
49_semihost_buffer_ptr:
50    .long _semihost_buffer
51_semihost_buffer_ptr_ptr:
52    .long _semihost_buffer_ptr
53
54#ifdef BOARD_CONFIG_ARMPBA8
55#define SEMIHOSTING_ONLY 1
56#endif
57
58/**
59 * PE_semihost_write_char
60 *
61 * Writes character output to debugger standard out.
62 */
63#ifndef __LP64__
64EnterARM(PE_semihost_write_char)
65#if 0
66#ifndef SEMIHOSTING_ONLY
67    ldr     r1, _semihost_buffer_ptr
68    strb    r0, [r1]
69    add     r1, r1, #1
70    ldr     r2, _semihost_buffer_ptr_ptr
71    str     r1, [r2]
72#else
73    ldr     r1, _semihost_buffer
74    strb    r0, [r1]
75    mov     r0, #0x03       // SYS_WRITEC
76    svc     0x123456
77#endif
78#endif
79    bx      lr
80#else
81.globl _PE_semihost_write_char
82.align 6
83_PE_semihost_write_char:
84    ldr     x1, _semihost_buffer_ptr
85    str     w0, [x1]
86    movz    x0, #0x03
87    hlt     #0xf000
88#endif
89