4 changed files with 0 additions and 747 deletions
-
1src/core/CMakeLists.txt
-
1src/core/arm/interpreter/armcopro.cpp
-
3src/core/arm/interpreter/armemu.cpp
-
742src/core/arm/interpreter/armos.cpp
@ -1,742 +0,0 @@ |
|||
/* armos.c -- ARMulator OS interface: 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. */ |
|||
|
|||
/* This file contains a model of Demon, ARM Ltd's Debug Monitor,
|
|||
including all the SWI's required to support the C library. The code in |
|||
it is not really for the faint-hearted (especially the abort handling |
|||
code), but it is a complete example. Defining NOOS will disable all the |
|||
fun, and definign VAILDATE will define SWI 1 to enter SVC mode, and SWI |
|||
0x11 to halt the emulator. */ |
|||
|
|||
//chy 2005-09-12 disable below line
|
|||
//#include "config.h"
|
|||
|
|||
#include <time.h>
|
|||
#include <errno.h>
|
|||
#include <string.h>
|
|||
#include "core/arm/skyeye_common/skyeye_defs.h"
|
|||
#ifndef __USE_LARGEFILE64
|
|||
#define __USE_LARGEFILE64 /* When use 64 bit large file need define it! for stat64*/
|
|||
#endif
|
|||
#include <fcntl.h>
|
|||
#include <sys/stat.h>
|
|||
|
|||
|
|||
#ifndef O_RDONLY
|
|||
#define O_RDONLY 0
|
|||
#endif
|
|||
#ifndef O_WRONLY
|
|||
#define O_WRONLY 1
|
|||
#endif
|
|||
#ifndef O_RDWR
|
|||
#define O_RDWR 2
|
|||
#endif
|
|||
#ifndef O_BINARY
|
|||
#define O_BINARY 0
|
|||
#endif
|
|||
|
|||
#ifdef __STDC__
|
|||
#define unlink(s) remove(s)
|
|||
#endif
|
|||
|
|||
#ifdef HAVE_UNISTD_H
|
|||
#include <unistd.h> /* For SEEK_SET etc */
|
|||
#endif
|
|||
|
|||
#ifdef __riscos
|
|||
extern int _fisatty (FILE *); |
|||
#define isatty_(f) _fisatty(f)
|
|||
#else
|
|||
#ifdef __ZTC__
|
|||
#include <io.h>
|
|||
#define isatty_(f) isatty((f)->_file)
|
|||
#else
|
|||
#ifdef macintosh
|
|||
#include <ioctl.h>
|
|||
#define isatty_(f) (~ioctl ((f)->_file, FIOINTERACTIVE, NULL))
|
|||
#else
|
|||
#define isatty_(f) isatty (fileno (f))
|
|||
#endif
|
|||
#endif
|
|||
#endif
|
|||
|
|||
#include "core/arm/skyeye_common/armdefs.h"
|
|||
#include "core/arm/skyeye_common/armos.h"
|
|||
#include "core/arm/skyeye_common/armemu.h"
|
|||
|
|||
#ifndef NOOS
|
|||
#ifndef VALIDATE
|
|||
/* #ifndef ASIM */ |
|||
//chy 2005-09-12 disable below line
|
|||
//#include "armfpe.h"
|
|||
/* #endif */ |
|||
#endif
|
|||
#endif
|
|||
|
|||
#define DUMP_SYSCALL 0
|
|||
#define dump(...) do { if (DUMP_SYSCALL) printf(__VA_ARGS__); } while(0)
|
|||
//#define debug(...) printf(__VA_ARGS__);
|
|||
#define debug(...) ;
|
|||
|
|||
extern unsigned ARMul_OSHandleSWI (ARMul_State * state, ARMword number); |
|||
|
|||
#ifndef FOPEN_MAX
|
|||
#define FOPEN_MAX 64
|
|||
#endif
|
|||
|
|||
/***************************************************************************\
|
|||
* OS private Information * |
|||
\***************************************************************************/ |
|||
|
|||
unsigned arm_dyncom_SWI(ARMul_State * state, ARMword number) |
|||
{ |
|||
return ARMul_OSHandleSWI(state, number); |
|||
} |
|||
|
|||
//mmap_area_t *mmap_global = NULL;
|
|||
|
|||
static int translate_open_mode[] = { |
|||
O_RDONLY, /* "r" */ |
|||
O_RDONLY + O_BINARY, /* "rb" */ |
|||
O_RDWR, /* "r+" */ |
|||
O_RDWR + O_BINARY, /* "r+b" */ |
|||
O_WRONLY + O_CREAT + O_TRUNC, /* "w" */ |
|||
O_WRONLY + O_BINARY + O_CREAT + O_TRUNC, /* "wb" */ |
|||
O_RDWR + O_CREAT + O_TRUNC, /* "w+" */ |
|||
O_RDWR + O_BINARY + O_CREAT + O_TRUNC, /* "w+b" */ |
|||
O_WRONLY + O_APPEND + O_CREAT, /* "a" */ |
|||
O_WRONLY + O_BINARY + O_APPEND + O_CREAT, /* "ab" */ |
|||
O_RDWR + O_APPEND + O_CREAT, /* "a+" */ |
|||
O_RDWR + O_BINARY + O_APPEND + O_CREAT /* "a+b" */ |
|||
}; |
|||
//
|
|||
//static void
|
|||
//SWIWrite0 (ARMul_State * state, ARMword addr)
|
|||
//{
|
|||
// ARMword temp;
|
|||
//
|
|||
// //while ((temp = ARMul_ReadByte (state, addr++)) != 0)
|
|||
// while(1){
|
|||
// mem_read(8, addr++, &temp);
|
|||
// if(temp != 0)
|
|||
// (void) fputc ((char) temp, stdout);
|
|||
// else
|
|||
// break;
|
|||
// }
|
|||
//}
|
|||
//
|
|||
//static void
|
|||
//WriteCommandLineTo (ARMul_State * state, ARMword addr)
|
|||
//{
|
|||
// ARMword temp;
|
|||
// char *cptr = state->CommandLine;
|
|||
// if (cptr == NULL)
|
|||
// cptr = "\0";
|
|||
// do {
|
|||
// temp = (ARMword) * cptr++;
|
|||
// //ARMul_WriteByte (state, addr++, temp);
|
|||
// mem_write(8, addr++, temp);
|
|||
// }
|
|||
// while (temp != 0);
|
|||
//}
|
|||
//
|
|||
//static void
|
|||
//SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags)
|
|||
//{
|
|||
// char dummy[2000];
|
|||
// int flags;
|
|||
// int i;
|
|||
//
|
|||
// for (i = 0; (dummy[i] = ARMul_ReadByte (state, name + i)); i++);
|
|||
// assert(SWIflags< (sizeof(translate_open_mode)/ sizeof(translate_open_mode[0])));
|
|||
// /* Now we need to decode the Demon open mode */
|
|||
// flags = translate_open_mode[SWIflags];
|
|||
// flags = SWIflags;
|
|||
//
|
|||
// /* Filename ":tt" is special: it denotes stdin/out */
|
|||
// if (strcmp (dummy, ":tt") == 0) {
|
|||
// if (flags == O_RDONLY) /* opening tty "r" */
|
|||
// state->Reg[0] = 0; /* stdin */
|
|||
// else
|
|||
// state->Reg[0] = 1; /* stdout */
|
|||
// }
|
|||
// else {
|
|||
// state->Reg[0] = (int) open (dummy, flags, 0666);
|
|||
// }
|
|||
//}
|
|||
//
|
|||
//static void
|
|||
//SWIread (ARMul_State * state, ARMword f, ARMword ptr, ARMword len)
|
|||
//{
|
|||
// int res;
|
|||
// int i;
|
|||
// char *local = (char*) malloc (len);
|
|||
//
|
|||
// if (local == NULL) {
|
|||
// fprintf (stderr,
|
|||
// "sim: Unable to read 0x%ulx bytes - out of memory\n",
|
|||
// len);
|
|||
// return;
|
|||
// }
|
|||
//
|
|||
// res = read (f, local, len);
|
|||
// if (res > 0)
|
|||
// for (i = 0; i < res; i++)
|
|||
// //ARMul_WriteByte (state, ptr + i, local[i]);
|
|||
// mem_write(8, ptr + i, local[i]);
|
|||
// free (local);
|
|||
// //state->Reg[0] = res == -1 ? -1 : len - res;
|
|||
// state->Reg[0] = res;
|
|||
//}
|
|||
//
|
|||
//static void
|
|||
//SWIwrite (ARMul_State * state, ARMword f, ARMword ptr, ARMword len)
|
|||
//{
|
|||
// int res;
|
|||
// ARMword i;
|
|||
// char *local = malloc (len);
|
|||
//
|
|||
// if (local == NULL) {
|
|||
// fprintf (stderr,
|
|||
// "sim: Unable to write 0x%lx bytes - out of memory\n",
|
|||
// (long unsigned int) len);
|
|||
// return;
|
|||
// }
|
|||
//
|
|||
// for (i = 0; i < len; i++){
|
|||
// //local[i] = ARMul_ReadByte (state, ptr + i);
|
|||
// ARMword data;
|
|||
// mem_read(8, ptr + i, &data);
|
|||
// local[i] = data & 0xFF;
|
|||
// }
|
|||
//
|
|||
// res = write (f, local, len);
|
|||
// //state->Reg[0] = res == -1 ? -1 : len - res;
|
|||
// state->Reg[0] = res;
|
|||
// free (local);
|
|||
//}
|
|||
|
|||
//static void
|
|||
//SWIflen (ARMul_State * state, ARMword fh)
|
|||
//{
|
|||
// ARMword addr;
|
|||
//
|
|||
// if (fh == 0 || fh > FOPEN_MAX) {
|
|||
// state->Reg[0] = -1L;
|
|||
// return;
|
|||
// }
|
|||
//
|
|||
// addr = lseek (fh, 0, SEEK_CUR);
|
|||
//
|
|||
// state->Reg[0] = lseek (fh, 0L, SEEK_END);
|
|||
// (void) lseek (fh, addr, SEEK_SET);
|
|||
//
|
|||
//}
|
|||
|
|||
/***************************************************************************\
|
|||
* The emulator calls this routine when a SWI instruction is encuntered. The * |
|||
* parameter passed is the SWI number (lower 24 bits of the instruction). * |
|||
\***************************************************************************/ |
|||
/* ahe-ykl information is retrieved from elf header and the starting value of
|
|||
brk_static is in sky_info_t */ |
|||
|
|||
/* brk static hold the value of brk */ |
|||
static uint32_t brk_static = -1; |
|||
|
|||
unsigned |
|||
ARMul_OSHandleSWI (ARMul_State * state, ARMword number) |
|||
{ |
|||
number &= 0xfffff; |
|||
ARMword addr, temp; |
|||
|
|||
switch (number) { |
|||
// case SWI_Syscall:
|
|||
// if (state->Reg[7] != 0)
|
|||
// return ARMul_OSHandleSWI(state, state->Reg[7]);
|
|||
// else
|
|||
// return FALSE;
|
|||
// case SWI_Read:
|
|||
// SWIread (state, state->Reg[0], state->Reg[1], state->Reg[2]);
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_GetUID32:
|
|||
// state->Reg[0] = getuid();
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_GetGID32:
|
|||
// state->Reg[0] = getgid();
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_GetEUID32:
|
|||
// state->Reg[0] = geteuid();
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_GetEGID32:
|
|||
// state->Reg[0] = getegid();
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_Write:
|
|||
// SWIwrite (state, state->Reg[0], state->Reg[1], state->Reg[2]);
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_Open:
|
|||
// SWIopen (state, state->Reg[0], state->Reg[1]);
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_Close:
|
|||
// state->Reg[0] = close (state->Reg[0]);
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_Seek:{
|
|||
// /* We must return non-zero for failure */
|
|||
// state->Reg[0] =
|
|||
// lseek (state->Reg[0], state->Reg[1],
|
|||
// SEEK_SET);
|
|||
// return TRUE;
|
|||
// }
|
|||
//
|
|||
// case SWI_ExitGroup:
|
|||
// case SWI_Exit:
|
|||
// {
|
|||
// struct timeval tv;
|
|||
// //gettimeofday(&tv,NULL);
|
|||
// //printf("In %s, %d sec, %d usec\n", __FUNCTION__, tv.tv_sec, tv.tv_usec);
|
|||
// printf("passed %d sec, %lld usec\n", get_clock_sec(), get_clock_us());
|
|||
//
|
|||
// /* quit here */
|
|||
// run_command("quit");
|
|||
// return TRUE;
|
|||
// }
|
|||
// case SWI_Times:{
|
|||
// uint32_t dest = state->Reg[0];
|
|||
// struct tms now;
|
|||
// struct target_tms32 nowret;
|
|||
//
|
|||
// uint32_t ret = times(&now);
|
|||
//
|
|||
// if (ret == -1){
|
|||
// debug("syscall %s error %d\n", "SWI_Times", ret);
|
|||
// state->Reg[0] = ret;
|
|||
// return FALSE;
|
|||
// }
|
|||
//
|
|||
// nowret.tms_cstime = now.tms_cstime;
|
|||
// nowret.tms_cutime = now.tms_cutime;
|
|||
// nowret.tms_stime = now.tms_stime;
|
|||
// nowret.tms_utime = now.tms_utime;
|
|||
//
|
|||
// uint32_t offset;
|
|||
// for (offset = 0; offset < sizeof(nowret); offset++) {
|
|||
// bus_write(8, dest + offset, *((uint8_t *) &nowret + offset));
|
|||
// }
|
|||
//
|
|||
// state->Reg[0] = ret;
|
|||
// return TRUE;
|
|||
// }
|
|||
//
|
|||
// case SWI_Gettimeofday: {
|
|||
// uint32_t dest1 = state->Reg[0];
|
|||
// uint32_t dest2 = state->Reg[1]; // Unsure of this
|
|||
// struct timeval val;
|
|||
// struct timezone zone;
|
|||
// struct target_timeval32 valret;
|
|||
// struct target_timezone32 zoneret;
|
|||
//
|
|||
// uint32_t ret = gettimeofday(&val, &zone);
|
|||
// valret.tv_sec = val.tv_sec;
|
|||
// valret.tv_usec = val.tv_usec;
|
|||
// zoneret.tz_dsttime = zoneret.tz_dsttime;
|
|||
// zoneret.tz_minuteswest = zoneret.tz_minuteswest;
|
|||
//
|
|||
// if (ret == -1){
|
|||
// debug("syscall %s error %d\n", "SWI_Gettimeofday", ret);
|
|||
// state->Reg[0] = ret;
|
|||
// return FALSE;
|
|||
// }
|
|||
//
|
|||
// uint32_t offset;
|
|||
// if (dest1) {
|
|||
// for (offset = 0; offset < sizeof(valret); offset++) {
|
|||
// bus_write(8, dest1 + offset, *((uint8_t *) &valret + offset));
|
|||
// }
|
|||
// state->Reg[0] = ret;
|
|||
// }
|
|||
// if (dest2) {
|
|||
// for (offset = 0; offset < sizeof(zoneret); offset++) {
|
|||
// bus_write(8, dest2 + offset, *((uint8_t *) &zoneret + offset));
|
|||
// }
|
|||
// state->Reg[0] = ret;
|
|||
// }
|
|||
//
|
|||
// return TRUE;
|
|||
// }
|
|||
// case SWI_Brk:
|
|||
// /* initialize brk value */
|
|||
// /* suppose that brk_static doesn't reach 0xffffffff... */
|
|||
// if (brk_static == -1) {
|
|||
// brk_static = (get_skyeye_pref()->info).brk;
|
|||
// }
|
|||
//
|
|||
// /* FIXME there might be a need to do a mmap */
|
|||
//
|
|||
// if(state->Reg[0]){
|
|||
// if (get_skyeye_exec_info()->mmap_access) {
|
|||
// /* if new brk is greater than current brk, allocate memory */
|
|||
// if (state->Reg[0] > brk_static) {
|
|||
// uint32_t ret = mmap( (void *) brk_static, state->Reg[0] - brk_static,
|
|||
// PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0 );
|
|||
// if (ret != MAP_FAILED)
|
|||
// brk_static = ret;
|
|||
// }
|
|||
// }
|
|||
// brk_static = state->Reg[0];
|
|||
// //state->Reg[0] = 0; /* FIXME return value of brk set to be the address on success */
|
|||
// } else {
|
|||
// state->Reg[0] = brk_static;
|
|||
// }
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_Break:
|
|||
// state->Emulate = FALSE;
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_Mmap:{
|
|||
// int addr = state->Reg[0];
|
|||
// int len = state->Reg[1];
|
|||
// int prot = state->Reg[2];
|
|||
// int flag = state->Reg[3];
|
|||
// int fd = state->Reg[4];
|
|||
// int offset = state->Reg[5];
|
|||
// mmap_area_t *area = new_mmap_area(addr, len);
|
|||
// state->Reg[0] = area->bank.addr;
|
|||
// //printf("syscall %d mmap(0x%x,%x,0x%x,0x%x,%d,0x%x) = 0x%x\n",\ |
|||
// SWI_Mmap, addr, len, prot, flag, fd, offset, state->Reg[0]);
|
|||
// return TRUE;
|
|||
// }
|
|||
//
|
|||
// case SWI_Munmap:
|
|||
// state->Reg[0] = 0;
|
|||
// return TRUE;
|
|||
//
|
|||
// case SWI_Mmap2:{
|
|||
// int addr = state->Reg[0];
|
|||
// int len = state->Reg[1];
|
|||
// int prot = state->Reg[2];
|
|||
// int flag = state->Reg[3];
|
|||
// int fd = state->Reg[4];
|
|||
// int offset = state->Reg[5] * 4096; /* page offset */
|
|||
// mmap_area_t *area = new_mmap_area(addr, len);
|
|||
// state->Reg[0] = area->bank.addr;
|
|||
//
|
|||
// return TRUE;
|
|||
// }
|
|||
//
|
|||
// case SWI_Breakpoint:
|
|||
// //chy 2005-09-12 change below line
|
|||
// //state->EndCondition = RDIError_BreakpointReached;
|
|||
// //printf ("SKYEYE: in armos.c : should not come here!!!!\n");
|
|||
// state->EndCondition = 0;
|
|||
// /*modified by ksh to support breakpoiont*/
|
|||
// state->Emulate = STOP;
|
|||
// return (TRUE);
|
|||
// case SWI_Uname:
|
|||
// {
|
|||
// struct utsname *uts = (uintptr_t) state->Reg[0]; /* uname should write data in this address */
|
|||
// struct utsname utsbuf;
|
|||
// //printf("Uname size is %x\n", sizeof(utsbuf));
|
|||
// char *buf;
|
|||
// uintptr_t sp ; /* used as a temporary address */
|
|||
//
|
|||
//#define COPY_UTS_STRING(addr) \ |
|||
// buf = addr; \ |
|||
// while(*buf != NULL) { \ |
|||
// bus_write(8, sp, *buf); \ |
|||
// sp++; \ |
|||
// buf++; \ |
|||
// }
|
|||
//#define COPY_UTS(field) /*printf("%s: %s at %p\n", #field, utsbuf.field, uts->field);*/ \ |
|||
// sp = (uintptr_t) uts->field; \ |
|||
// COPY_UTS_STRING((&utsbuf)->field);
|
|||
//
|
|||
// if (uname(&utsbuf) < 0) {
|
|||
// printf("syscall uname: utsname error\n");
|
|||
// state->Reg[0] = -1;
|
|||
// return FALSE;
|
|||
// }
|
|||
//
|
|||
// /* FIXME for now, this is just the host system call
|
|||
// Some data should be missing, as it depends on
|
|||
// the version of utsname */
|
|||
// COPY_UTS(sysname);
|
|||
// COPY_UTS(nodename);
|
|||
// COPY_UTS(release);
|
|||
// COPY_UTS(version);
|
|||
// COPY_UTS(machine);
|
|||
//
|
|||
// state->Reg[0] = 0;
|
|||
// return TRUE;
|
|||
// }
|
|||
// case SWI_Fcntl:
|
|||
// {
|
|||
// uint32_t fd = state->Reg[0];
|
|||
// uint32_t cmd = state->Reg[1];
|
|||
// uint32_t arg = state->Reg[2];
|
|||
// uint32_t ret;
|
|||
//
|
|||
// switch(cmd){
|
|||
// case (F_GETFD):
|
|||
// {
|
|||
// ret = fcntl(fd, cmd, arg);
|
|||
// //printf("syscall fcntl for getfd not implemented, ret %d\n", ret);
|
|||
// state->Reg[0] = ret;
|
|||
// return FALSE;
|
|||
// }
|
|||
// default:
|
|||
// break;
|
|||
// }
|
|||
//
|
|||
// printf("syscall fcntl unimplemented fd %x cmd %x\n", fd, cmd);
|
|||
// state->Reg[0] = -1;
|
|||
// return FALSE;
|
|||
//
|
|||
// }
|
|||
// case SWI_Fstat64:
|
|||
// {
|
|||
// uint32_t dest = state->Reg[1];
|
|||
// uint32_t fd = state->Reg[0];
|
|||
// struct stat64 statbuf;
|
|||
// struct target_stat64 statret;
|
|||
// memset(&statret, 0, sizeof(struct target_stat64));
|
|||
// uint32_t ret = fstat64(fd, &statbuf);
|
|||
//
|
|||
// if (ret == -1){
|
|||
// printf("syscall %s returned error\n", "SWI_Fstat");
|
|||
// state->Reg[0] = ret;
|
|||
// return FALSE;
|
|||
// }
|
|||
//
|
|||
// /* copy statbuf to the process memory space
|
|||
// FIXME can't say if endian has an effect here */
|
|||
// uint32_t offset;
|
|||
// //printf("Fstat system is size %x\n", sizeof(statbuf));
|
|||
// //printf("Fstat target is size %x\n", sizeof(statret));
|
|||
//
|
|||
// /* we copy system structure data stat64 into arm fixed size structure target_stat64 */
|
|||
// statret.st_dev = statbuf.st_dev;
|
|||
// statret.st_ino = statbuf.st_ino;
|
|||
// statret.st_mode = statbuf.st_mode;
|
|||
// statret.st_nlink = statbuf.st_nlink;
|
|||
// statret.st_uid = statbuf.st_uid;
|
|||
// statret.st_gid = statbuf.st_gid;
|
|||
// statret.st_rdev = statbuf.st_rdev;
|
|||
// statret.st_size = statbuf.st_size;
|
|||
// statret.st_blksize = statbuf.st_blksize;
|
|||
// statret.st_blocks = statbuf.st_blocks;
|
|||
// statret.st32_atime = statbuf.st_atime;
|
|||
// statret.st32_mtime = statbuf.st_mtime;
|
|||
// statret.st32_ctime = statbuf.st_ctime;
|
|||
//
|
|||
// for (offset = 0; offset < sizeof(statret); offset++) {
|
|||
// bus_write(8, dest + offset, *((uint8_t *) &statret + offset));
|
|||
// }
|
|||
//
|
|||
// state->Reg[0] = ret;
|
|||
// return TRUE;
|
|||
// }
|
|||
// case SWI_Set_tls:
|
|||
// {
|
|||
// //printf("syscall set_tls unimplemented\n");
|
|||
// state->mmu.thread_uro_id = state->Reg[0];
|
|||
// state->CP15[CP15_THREAD_URO - CP15_BASE] = state->Reg[0];
|
|||
// state->Reg[0] = 0;
|
|||
// return FALSE;
|
|||
// }
|
|||
//#if 0
|
|||
// case SWI_Clock:
|
|||
// /* return number of centi-seconds... */
|
|||
// state->Reg[0] =
|
|||
//#ifdef CLOCKS_PER_SEC
|
|||
// (CLOCKS_PER_SEC >= 100)
|
|||
// ? (ARMword) (clock () / (CLOCKS_PER_SEC / 100))
|
|||
// : (ARMword) ((clock () * 100) / CLOCKS_PER_SEC);
|
|||
//#else
|
|||
// /* presume unix... clock() returns microseconds */
|
|||
// (ARMword) (clock () / 10000);
|
|||
//#endif
|
|||
// return (TRUE);
|
|||
//
|
|||
// case SWI_Time:
|
|||
// state->Reg[0] = (ARMword) time (NULL);
|
|||
// return (TRUE);
|
|||
// case SWI_Flen:
|
|||
// SWIflen (state, state->Reg[0]);
|
|||
// return (TRUE);
|
|||
//
|
|||
//#endif
|
|||
default: |
|||
|
|||
_dbg_assert_msg_(ARM11, false, "ImplementMe: ARMul_OSHandleSWI!"); |
|||
|
|||
return (FALSE); |
|||
} |
|||
} |
|||
//
|
|||
///**
|
|||
// * @brief For mmap syscall.A mmap_area is a memory bank. Get from ppc.
|
|||
// */
|
|||
//static mmap_area_t* new_mmap_area(int sim_addr, int len){
|
|||
// mmap_area_t *area = (mmap_area_t *)malloc(sizeof(mmap_area_t));
|
|||
// if(area == NULL){
|
|||
// printf("error, failed %s\n",__FUNCTION__);
|
|||
// exit(0);
|
|||
// }
|
|||
//#if FAST_MEMORY
|
|||
// if (mmap_next_base == -1)
|
|||
// {
|
|||
// mmap_next_base = get_skyeye_exec_info()->brk;
|
|||
// }
|
|||
//#endif
|
|||
//
|
|||
// memset(area, 0x0, sizeof(mmap_area_t));
|
|||
// area->bank.addr = mmap_next_base;
|
|||
// area->bank.len = len;
|
|||
// area->bank.bank_write = mmap_mem_write;
|
|||
// area->bank.bank_read = mmap_mem_read;
|
|||
// area->bank.type = MEMTYPE_RAM;
|
|||
// area->bank.objname = "mmap";
|
|||
// addr_mapping(&area->bank);
|
|||
//
|
|||
//#if FAST_MEMORY
|
|||
// if (get_skyeye_exec_info()->mmap_access)
|
|||
// {
|
|||
// /* FIXME check proper flags */
|
|||
// /* FIXME we may delete the need of banks up there */
|
|||
// uint32_t ret = mmap(mmap_next_base, len, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
|||
// mmap_next_base = ret;
|
|||
// }
|
|||
// area->mmap_addr = (uint8_t*)get_dma_addr(mmap_next_base);
|
|||
//#else
|
|||
// area->mmap_addr = malloc(len);
|
|||
// if(area->mmap_addr == NULL){
|
|||
// printf("error mmap malloc\n");
|
|||
// exit(0);
|
|||
// }
|
|||
// memset(area->mmap_addr, 0x0, len);
|
|||
//#endif
|
|||
//
|
|||
// area->next = NULL;
|
|||
// if(mmap_global){
|
|||
// area->next = mmap_global->next;
|
|||
// mmap_global->next = area;
|
|||
// }else{
|
|||
// mmap_global = area;
|
|||
// }
|
|||
// mmap_next_base = mmap_next_base + len;
|
|||
// return area;
|
|||
//}
|
|||
//
|
|||
//static mmap_area_t *get_mmap_area(int addr){
|
|||
// mmap_area_t *tmp = mmap_global;
|
|||
// while(tmp){
|
|||
// if ((tmp->bank.addr <= addr) && (tmp->bank.addr + tmp->bank.len > addr)){
|
|||
// return tmp;
|
|||
// }
|
|||
// tmp = tmp->next;
|
|||
// }
|
|||
// printf("cannot get mmap area:addr=0x%x\n", addr);
|
|||
// return NULL;
|
|||
//}
|
|||
//
|
|||
///**
|
|||
// * @brief the mmap_area bank write function. Get from ppc.
|
|||
// *
|
|||
// * @param size size to write, 8/16/32
|
|||
// * @param addr address to write
|
|||
// * @param value value to write
|
|||
// *
|
|||
// * @return sucess return 1,otherwise 0.
|
|||
// */
|
|||
//static char mmap_mem_write(short size, int addr, uint32_t value){
|
|||
// mmap_area_t *area_tmp = get_mmap_area(addr);
|
|||
// mem_bank_t *bank_tmp = &area_tmp->bank;
|
|||
// int offset = addr - bank_tmp->addr;
|
|||
// switch(size){
|
|||
// case 8:{
|
|||
// //uint8_t value_endian = value;
|
|||
// uint8_t value_endian = (uint8_t)value;
|
|||
// *(uint8_t *)&(((char *)area_tmp->mmap_addr)[offset]) = value_endian;
|
|||
// debug("in %s,size=%d,addr=0x%x,value=0x%x\n",__FUNCTION__,size,addr,value_endian);
|
|||
// break;
|
|||
// }
|
|||
// case 16:{
|
|||
// //uint16_t value_endian = half_to_BE((uint16_t)value);
|
|||
// uint16_t value_endian = ((uint16_t)value);
|
|||
// *(uint16_t *)&(((char *)area_tmp->mmap_addr)[offset]) = value_endian;
|
|||
// debug("in %s,size=%d,addr=0x%x,value=0x%x\n",__FUNCTION__,size,addr,value_endian);
|
|||
// break;
|
|||
// }
|
|||
// case 32:{
|
|||
// //uint32_t value_endian = word_to_BE((uint32_t)value);
|
|||
// uint32_t value_endian = ((uint32_t)value);
|
|||
// *(uint32_t *)&(((char *)area_tmp->mmap_addr)[offset]) = value_endian;
|
|||
// debug("in %s,size=%d,addr=0x%x,value=0x%x\n",__FUNCTION__,size,addr,value_endian);
|
|||
// break;
|
|||
// }
|
|||
// default:
|
|||
// printf("invalid size %d\n",size);
|
|||
// return 0;
|
|||
// }
|
|||
// return 1;
|
|||
//}
|
|||
//
|
|||
///**
|
|||
// * @brief the mmap_area bank read function. Get from ppc.
|
|||
// *
|
|||
// * @param size size to read, 8/16/32
|
|||
// * @param addr address to read
|
|||
// * @param value value to read
|
|||
// *
|
|||
// * @return sucess return 1,otherwise 0.
|
|||
// */
|
|||
//static char mmap_mem_read(short size, int addr, uint32_t * value){
|
|||
// mmap_area_t *area_tmp = get_mmap_area(addr);
|
|||
// mem_bank_t *bank_tmp = &area_tmp->bank;
|
|||
// int offset = addr - bank_tmp->addr;
|
|||
// switch(size){
|
|||
// case 8:{
|
|||
// //*(uint8_t *)value = *(uint8_t *)&(((uint8_t *)area_tmp->mmap_addr)[offset]);
|
|||
// *value = *(uint8_t *)&(((uint8_t *)area_tmp->mmap_addr)[offset]);
|
|||
// debug("in %s,size=%d,addr=0x%x,value=0x%x\n",__FUNCTION__,size,addr,*(uint32_t*)value);
|
|||
// break;
|
|||
// }
|
|||
// case 16:{
|
|||
// //*(uint16_t *)value = half_from_BE(*(uint16_t *)&(((uint8_t *)area_tmp->mmap_addr)[offset]));
|
|||
// *value = (*(uint16_t *)&(((uint8_t *)area_tmp->mmap_addr)[offset]));
|
|||
// debug("in %s,size=%d,addr=0x%x,value=0x%x\n",__FUNCTION__,size,addr,*(uint16_t*)value);
|
|||
// break;
|
|||
// }
|
|||
// case 32:
|
|||
// //*value = (uint32_t)word_from_BE(*(uint32_t *)&(((uint8_t *)area_tmp->mmap_addr)[offset]));
|
|||
// *value = (uint32_t)(*(uint32_t *)&(((uint8_t *)area_tmp->mmap_addr)[offset]));
|
|||
// debug("in %s,size=%d,addr=0x%x,value=0x%x\n",__FUNCTION__,size,addr,*(uint32_t*)value);
|
|||
// break;
|
|||
// default:
|
|||
// printf("invalid size %d\n",size);
|
|||
// return 0;
|
|||
// }
|
|||
// return 1;
|
|||
//}
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue