ddb6f8a02a
Semihosting v2 changes are documented here: https://developer.arm.com/docs/100863/latest/ The biggest change is the addition of an extensions mechanism to add more extensions in the future. Signed-off-by: Tamar Christina <tamar.christina@arm.com>
98 lines
3.7 KiB
C
98 lines
3.7 KiB
C
/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
1. Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
3. The name of the company may not be used to endorse or promote
|
|
products derived from this software without specific prior written
|
|
permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
|
|
#include <_ansi.h>
|
|
|
|
/* Now the SWI numbers and reason codes for RDI (Angel) monitors. */
|
|
#define AngelSVC 0xF000
|
|
#define AngelSVCInsn "hlt"
|
|
#define AngelSVCAsm hlt
|
|
|
|
/* The reason codes: */
|
|
#define AngelSVC_Reason_Open 0x01
|
|
#define AngelSVC_Reason_Close 0x02
|
|
#define AngelSVC_Reason_WriteC 0x03
|
|
#define AngelSVC_Reason_Write0 0x04
|
|
#define AngelSVC_Reason_Write 0x05
|
|
#define AngelSVC_Reason_Read 0x06
|
|
#define AngelSVC_Reason_ReadC 0x07
|
|
#define AngelSVC_Reason_IsError 0x08
|
|
#define AngelSVC_Reason_IsTTY 0x09
|
|
#define AngelSVC_Reason_Seek 0x0A
|
|
#define AngelSVC_Reason_FLen 0x0C
|
|
#define AngelSVC_Reason_TmpNam 0x0D
|
|
#define AngelSVC_Reason_Remove 0x0E
|
|
#define AngelSVC_Reason_Rename 0x0F
|
|
#define AngelSVC_Reason_Clock 0x10
|
|
#define AngelSVC_Reason_Time 0x11
|
|
#define AngelSVC_Reason_System 0x12
|
|
#define AngelSVC_Reason_Errno 0x13
|
|
#define AngelSVC_Reason_GetCmdLine 0x15
|
|
#define AngelSVC_Reason_HeapInfo 0x16
|
|
#define AngelSVC_Reason_EnterSVC 0x17
|
|
#define AngelSVC_Reason_ReportException 0x18
|
|
#define AngelSVC_Reason_SyncCacheRange 0x19
|
|
#define AngelSVC_Reason_ReportExceptionExtended 0x20
|
|
#define AngelSVC_Reason_Elapsed 0x30
|
|
#define AngelSVC_Reason_TickFreq 0x31
|
|
#define ADP_Stopped_ApplicationExit ((2 << 16) + 38)
|
|
#define ADP_Stopped_RunTimeError ((2 << 16) + 35)
|
|
|
|
/* Semihosting feature magic numbers. */
|
|
#define NUM_SHFB_MAGIC 4
|
|
#define SHFB_MAGIC_0 0x53
|
|
#define SHFB_MAGIC_1 0x48
|
|
#define SHFB_MAGIC_2 0x46
|
|
#define SHFB_MAGIC_3 0x42
|
|
|
|
/* Semihosting extensions. */
|
|
#define SH_EXT_EXIT_EXTENDED_BITNUM 0x0
|
|
#define SH_EXT_STDOUT_STDERR_BITNUM 0x1
|
|
|
|
#if !defined (__ASSEMBLER__)
|
|
extern int _get_semihosting_exts _PARAMS ((char*, int, int));
|
|
extern int _has_ext_exit_extended _PARAMS ((void));
|
|
extern int _has_ext_stdout_stderr _PARAMS ((void));
|
|
#endif
|
|
|
|
#if defined(ARM_RDI_MONITOR) && !defined(__ASSEMBLER__)
|
|
|
|
/* Type of each entry in a parameter block. */
|
|
typedef long long param_block_t;
|
|
|
|
static inline long long
|
|
do_AngelSVC (int reason, param_block_t * arg)
|
|
{
|
|
long long value;
|
|
asm volatile ("mov w0, %w1; mov x1, %2; " AngelSVCInsn " %3; mov %0, x0"
|
|
: "=r" (value) /* Outputs */
|
|
: "r" (reason), "r" (arg), "n" (AngelSVC) /* Inputs */
|
|
: "x0", "x1", "x2", "x3", "x17", "x30", "memory", "cc"
|
|
/* Clobbers x0 and x1, and lr if in supervisor mode */);
|
|
return value;
|
|
}
|
|
|
|
#endif
|