ARM: Integrate SkyEye faster "dyncom" interpreter.
Fixed typo (make protected member public) Added license header back in. I originally removed this because I mostly rewrote the file, but meh ARM: Fixed a type error in dyncom interpreter. ARM: Updated dyncom to use unique_ptr for internal ARM state.
This commit is contained in:
parent
b5e6524594
commit
53a22b84da
20 changed files with 8230 additions and 75 deletions
|
@ -99,5 +99,7 @@ enum arm_regno{
|
|||
MAX_REG_NUM,
|
||||
};
|
||||
|
||||
#define VFP_OFFSET(x) (x - VFP_BASE)
|
||||
#define CP15(idx) (idx - CP15_BASE)
|
||||
#define VFP_OFFSET(x) (x - VFP_BASE)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,16 +20,13 @@
|
|||
|
||||
#ifndef __ARM_CPU_H__
|
||||
#define __ARM_CPU_H__
|
||||
//#include <skyeye_thread.h>
|
||||
//#include <skyeye_obj.h>
|
||||
//#include <skyeye_mach.h>
|
||||
//#include <skyeye_exec.h>
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "common/thread.h"
|
||||
|
||||
#include "core/arm/skyeye_common/armdefs.h"
|
||||
|
||||
typedef struct ARM_CPU_State_s {
|
||||
ARMul_State * core;
|
||||
|
|
|
@ -15,14 +15,7 @@
|
|||
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;
|
||||
#include <stdint.h>
|
||||
|
||||
#if FAST_MEMORY
|
||||
/* in user mode, mmap_base will be on initial brk,
|
||||
|
|
|
@ -108,4 +108,6 @@ typedef struct generic_arch_s
|
|||
align_t alignment;
|
||||
} generic_arch_t;
|
||||
|
||||
#endif
|
||||
typedef u32 addr_t;
|
||||
|
||||
#endif
|
||||
|
|
55
src/core/arm/skyeye_common/skyeye_types.h
Normal file
55
src/core/arm/skyeye_common/skyeye_types.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
skyeye_types.h - some data types definition for skyeye debugger
|
||||
Copyright (C) 2003 Skyeye Develop Group
|
||||
for help please send mail to <skyeye-developer@lists.sf.linuxforum.net>
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
/*
|
||||
* 12/16/2006 Michael.Kang <blackfin.kang@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __SKYEYE_TYPES_H
|
||||
#define __SKYEYE_TYPES_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*default machine word length */
|
||||
|
||||
#ifndef __BEOS__
|
||||
/* To avoid the type conflict with the qemu */
|
||||
#ifndef QEMU
|
||||
typedef uint8_t uint8;
|
||||
typedef uint16_t uint16;
|
||||
typedef uint32_t uint32;
|
||||
typedef uint64_t uint64;
|
||||
|
||||
typedef int8_t sint8;
|
||||
typedef int16_t sint16;
|
||||
typedef int32_t sint32;
|
||||
typedef int64_t sint64;
|
||||
#endif
|
||||
|
||||
typedef uint32_t address_t;
|
||||
typedef uint32_t uinteger_t;
|
||||
typedef int32_t integer_t;
|
||||
|
||||
typedef uint32_t physical_address_t;
|
||||
typedef uint32_t generic_address_t;
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -3709,7 +3709,7 @@ VFPLABEL_INST:
|
|||
{
|
||||
fault = check_address_validity(cpu, addr, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d], 32);
|
||||
fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d, cpu->ExtReg[inst_cream->d]);
|
||||
}
|
||||
|
@ -3719,13 +3719,13 @@ VFPLABEL_INST:
|
|||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
/* Check endianness */
|
||||
fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d*2], 32);
|
||||
fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d*2], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = check_address_validity(cpu, addr + 4, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = interpreter_write_memory(core, addr + 4, phys_addr, cpu->ExtReg[inst_cream->d*2+1], 32);
|
||||
fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[inst_cream->d*2+1], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, inst_cream->d*2+1, inst_cream->d*2, cpu->ExtReg[inst_cream->d*2+1], cpu->ExtReg[inst_cream->d*2]);
|
||||
}
|
||||
|
@ -3926,7 +3926,7 @@ VFPLABEL_INST:
|
|||
{
|
||||
fault = check_address_validity(cpu, addr, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]);
|
||||
addr += 4;
|
||||
|
@ -3936,12 +3936,12 @@ VFPLABEL_INST:
|
|||
/* Careful of endianness, little by default */
|
||||
fault = check_address_validity(cpu, addr, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = check_address_validity(cpu, addr + 4, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_write_memory(core, addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]);
|
||||
addr += 8;
|
||||
|
@ -4048,7 +4048,7 @@ int DYNCOM_TRANS(vfpinstr)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc
|
|||
{
|
||||
if (single)
|
||||
{
|
||||
//fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
//fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
#if 0
|
||||
phys_addr = get_phys_addr(cpu, bb, Addr, 0);
|
||||
bb = cpu->dyncom_engine->bb;
|
||||
|
@ -4166,7 +4166,7 @@ VFPLABEL_INST: /* encoding 1 */
|
|||
fault = check_address_validity(cpu, addr, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]);
|
||||
addr += 4;
|
||||
|
@ -4177,13 +4177,13 @@ VFPLABEL_INST: /* encoding 1 */
|
|||
fault = check_address_validity(cpu, addr, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = check_address_validity(cpu, addr + 4, &phys_addr, 0);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = interpreter_write_memory(core, addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]);
|
||||
addr += 8;
|
||||
|
@ -4304,7 +4304,7 @@ int DYNCOM_TRANS(vfpinstr)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc
|
|||
if (single)
|
||||
{
|
||||
|
||||
//fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
//fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
/* if R(i) is R15? */
|
||||
#if 0
|
||||
phys_addr = get_phys_addr(cpu, bb, Addr, 0);
|
||||
|
@ -4321,7 +4321,7 @@ int DYNCOM_TRANS(vfpinstr)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc
|
|||
else
|
||||
{
|
||||
|
||||
//fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
//fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
#if 0
|
||||
phys_addr = get_phys_addr(cpu, bb, Addr, 0);
|
||||
bb = cpu->dyncom_engine->bb;
|
||||
|
@ -4332,7 +4332,7 @@ int DYNCOM_TRANS(vfpinstr)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc
|
|||
bb = cpu->dyncom_engine->bb;
|
||||
//if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
//fault = interpreter_write_memory(core, addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
//fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
#if 0
|
||||
phys_addr = get_phys_addr(cpu, bb, ADD(Addr, CONST(4)), 0);
|
||||
bb = cpu->dyncom_engine->bb;
|
||||
|
@ -4431,7 +4431,7 @@ VFPLABEL_INST:
|
|||
fault = check_address_validity(cpu, addr, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = interpreter_read_memory(core, addr, phys_addr, value1, 32);
|
||||
fault = interpreter_read_memory(addr, phys_addr, value1, 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\ts%d <= [%x] addr[%x]\n", inst_cream->d+i, value1, addr);
|
||||
cpu->ExtReg[inst_cream->d+i] = value1;
|
||||
|
@ -4443,13 +4443,13 @@ VFPLABEL_INST:
|
|||
fault = check_address_validity(cpu, addr, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = interpreter_read_memory(core, addr, phys_addr, value1, 32);
|
||||
fault = interpreter_read_memory(addr, phys_addr, value1, 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = check_address_validity(cpu, addr + 4, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = interpreter_read_memory(core, addr + 4, phys_addr, value2, 32);
|
||||
fault = interpreter_read_memory(addr + 4, phys_addr, value2, 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\ts[%d-%d] <= [%x-%x] addr[%x-%x]\n", (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, value2, value1, addr+4, addr);
|
||||
cpu->ExtReg[(inst_cream->d+i)*2] = value1;
|
||||
|
@ -4682,7 +4682,7 @@ VFPLABEL_INST:
|
|||
{
|
||||
fault = check_address_validity(cpu, addr, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_read_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d], 32);
|
||||
fault = interpreter_read_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\ts%d <= [%x] addr[%x]\n", inst_cream->d, cpu->ExtReg[inst_cream->d], addr);
|
||||
}
|
||||
|
@ -4691,12 +4691,12 @@ VFPLABEL_INST:
|
|||
unsigned int word1, word2;
|
||||
fault = check_address_validity(cpu, addr, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_read_memory(core, addr, phys_addr, word1, 32);
|
||||
fault = interpreter_read_memory(addr, phys_addr, word1, 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = check_address_validity(cpu, addr + 4, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_read_memory(core, addr + 4, phys_addr, word2, 32);
|
||||
fault = interpreter_read_memory(addr + 4, phys_addr, word2, 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
/* Check endianness */
|
||||
cpu->ExtReg[inst_cream->d*2] = word1;
|
||||
|
@ -4923,7 +4923,7 @@ VFPLABEL_INST:
|
|||
{
|
||||
fault = check_address_validity(cpu, addr, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_read_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
fault = interpreter_read_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\ts%d <= [%x] addr[%x]\n", inst_cream->d+i, cpu->ExtReg[inst_cream->d+i], addr);
|
||||
addr += 4;
|
||||
|
@ -4933,12 +4933,12 @@ VFPLABEL_INST:
|
|||
/* Careful of endianness, little by default */
|
||||
fault = check_address_validity(cpu, addr, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_read_memory(core, addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
fault = interpreter_read_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
|
||||
fault = check_address_validity(cpu, addr + 4, &phys_addr, 1);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
fault = interpreter_read_memory(core, addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
fault = interpreter_read_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
if (fault) goto MMU_EXCEPTION;
|
||||
DBG("\ts[%d-%d] <= [%x-%x] addr[%x-%x]\n", (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2], addr+4, addr);
|
||||
addr += 8;
|
||||
|
@ -5058,7 +5058,7 @@ int DYNCOM_TRANS(vfpinstr)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc
|
|||
if (single)
|
||||
{
|
||||
|
||||
//fault = interpreter_write_memory(core, addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
//fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32);
|
||||
/* if R(i) is R15? */
|
||||
#if 0
|
||||
phys_addr = get_phys_addr(cpu, bb, Addr, 1);
|
||||
|
@ -5095,7 +5095,7 @@ int DYNCOM_TRANS(vfpinstr)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc
|
|||
val = new LoadInst(cpu->dyncom_engine->read_value, "", false, bb);
|
||||
LETFPS((d + i) * 2 + 1, FPBITCAST32(val));
|
||||
|
||||
//fault = interpreter_write_memory(core, addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
//fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32);
|
||||
//DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]);
|
||||
//addr += 8;
|
||||
Addr = ADD(Addr, CONST(8));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue