aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/src/arm/interpreter/armos.h
blob: 4b58801ad80e3e2c443df22278566331c1929f45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*  armos.h -- ARMulator OS definitions:  ARM6 Instruction Emulator.
    Copyright (C) 1994 Advanced RISC Machines Ltd.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */

//#include "bank_defs.h"
//#include "dyncom/defines.h"

//typedef struct mmap_area{
//	mem_bank_t bank;
//	void *mmap_addr;
//	struct mmap_area *next;
//}mmap_area_t;

#if FAST_MEMORY
/* in user mode, mmap_base will be on initial brk,
   set at the first mmap request */
#define mmap_base -1
#else
#define mmap_base 0x50000000
#endif
static long mmap_next_base = mmap_base;

//static mmap_area_t* new_mmap_area(int sim_addr, int len);
static char mmap_mem_write(short size, int addr, uint32_t value);
static char mmap_mem_read(short size, int addr, uint32_t * value);

/***************************************************************************\
*                               SWI numbers                                 *
\***************************************************************************/

#define SWI_Syscall                0x0
#define SWI_Exit                   0x1
#define SWI_Read                   0x3
#define SWI_Write                  0x4
#define SWI_Open                   0x5
#define SWI_Close                  0x6
#define SWI_Seek                   0x13
#define SWI_Rename                 0x26
#define SWI_Break                  0x11

#define SWI_Times		   0x2b
#define SWI_Brk			   0x2d

#define SWI_Mmap                   0x5a
#define SWI_Munmap                 0x5b
#define SWI_Mmap2                  0xc0

#define SWI_GetUID32               0xc7
#define SWI_GetGID32               0xc8
#define SWI_GetEUID32              0xc9
#define SWI_GetEGID32              0xca

#define SWI_ExitGroup		   0xf8

#if 0
#define SWI_Time                   0xd
#define SWI_Clock                  0x61
#define SWI_Time                   0x63
#define SWI_Remove                 0x64
#define SWI_Rename                 0x65
#define SWI_Flen                   0x6c
#endif

#define SWI_Uname		   0x7a
#define SWI_Fcntl                  0xdd 
#define SWI_Fstat64  		   0xc5
#define SWI_Gettimeofday           0x4e
#define SWI_Set_tls                0xf0005

#define SWI_Breakpoint             0x180000	/* see gdb's tm-arm.h */

/***************************************************************************\
*                             SWI structures                                *
\***************************************************************************/

/* Arm binaries (for now) only support 32 bit, and expect to receive
   32-bit compliant structure in return of a systen call. Because
   we use host system calls to emulate system calls, the returned
   structure can be 32-bit compliant or 64-bit compliant, depending
   on the OS running skyeye. Therefore, we need a fixed size structure
   adapted to arm.*/

/* Borrowed from qemu */
struct target_stat64 {
	unsigned short	st_dev;
	unsigned char	__pad0[10];
	uint32_t	__st_ino;
	unsigned int	st_mode;
	unsigned int	st_nlink;
	uint32_t	st_uid;
	uint32_t	st_gid;
	unsigned short	st_rdev;
	unsigned char	__pad3[10];
	unsigned char	__pad31[4];
	long long	st_size;
	uint32_t	st_blksize;
	unsigned char	__pad32[4];
	uint32_t	st_blocks;
	uint32_t	__pad4;
	uint32_t	st32_atime;
	uint32_t	__pad5;
	uint32_t	st32_mtime;
	uint32_t	__pad6;
	uint32_t	st32_ctime;
	uint32_t	__pad7;
	unsigned long long	st_ino;
};// __attribute__((packed));

struct target_tms32 {
    uint32_t tms_utime;
    uint32_t tms_stime;
    uint32_t tms_cutime;
    uint32_t tms_cstime;
};

struct target_timeval32 {
	uint32_t tv_sec;     /* seconds */
	uint32_t tv_usec;    /* microseconds */
};

struct target_timezone32 {
	int32_t tz_minuteswest;     /* minutes west of Greenwich */
	int32_t tz_dsttime;         /* type of DST correction */
};