/*  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 <stdint.h>

#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 */
};

