mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	
						commit
						dbff4e5e12
					
				@ -110,13 +110,11 @@ set(HEADERS
 | 
				
			|||||||
            arm/dyncom/arm_dyncom_thumb.h
 | 
					            arm/dyncom/arm_dyncom_thumb.h
 | 
				
			||||||
            arm/interpreter/arm_interpreter.h
 | 
					            arm/interpreter/arm_interpreter.h
 | 
				
			||||||
            arm/skyeye_common/arm_regformat.h
 | 
					            arm/skyeye_common/arm_regformat.h
 | 
				
			||||||
            arm/skyeye_common/armcpu.h
 | 
					 | 
				
			||||||
            arm/skyeye_common/armdefs.h
 | 
					            arm/skyeye_common/armdefs.h
 | 
				
			||||||
            arm/skyeye_common/armemu.h
 | 
					            arm/skyeye_common/armemu.h
 | 
				
			||||||
            arm/skyeye_common/armmmu.h
 | 
					            arm/skyeye_common/armmmu.h
 | 
				
			||||||
            arm/skyeye_common/armos.h
 | 
					            arm/skyeye_common/armos.h
 | 
				
			||||||
            arm/skyeye_common/skyeye_defs.h
 | 
					            arm/skyeye_common/skyeye_defs.h
 | 
				
			||||||
            arm/skyeye_common/skyeye_types.h
 | 
					 | 
				
			||||||
            arm/skyeye_common/vfp/asm_vfp.h
 | 
					            arm/skyeye_common/vfp/asm_vfp.h
 | 
				
			||||||
            arm/skyeye_common/vfp/vfp.h
 | 
					            arm/skyeye_common/vfp/vfp.h
 | 
				
			||||||
            arm/skyeye_common/vfp/vfp_helper.h
 | 
					            arm/skyeye_common/vfp/vfp_helper.h
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
// Licensed under GPLv2 or any later version
 | 
					// Licensed under GPLv2 or any later version
 | 
				
			||||||
// Refer to the license.txt file included.
 | 
					// Refer to the license.txt file included.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "core/arm/skyeye_common/armcpu.h"
 | 
					 | 
				
			||||||
#include "core/arm/skyeye_common/armemu.h"
 | 
					#include "core/arm/skyeye_common/armemu.h"
 | 
				
			||||||
#include "core/arm/skyeye_common/vfp/vfp.h"
 | 
					#include "core/arm/skyeye_common/vfp/vfp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,14 +6,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define BITS(a,b)   ((instr >> (a)) & ((1 << (1+(b)-(a)))-1))
 | 
					#define BITS(a,b)   ((instr >> (a)) & ((1 << (1+(b)-(a)))-1))
 | 
				
			||||||
#define BIT(n)      ((instr >> (n)) & 1)
 | 
					#define BIT(n)      ((instr >> (n)) & 1)
 | 
				
			||||||
#define BAD         do { printf("meet BAD at %s, instr is %x\n", __FUNCTION__, instr ); } while(0);
 | 
					 | 
				
			||||||
#define ptr_N       cpu->ptr_N
 | 
					 | 
				
			||||||
#define ptr_Z       cpu->ptr_Z
 | 
					 | 
				
			||||||
#define ptr_C       cpu->ptr_C
 | 
					 | 
				
			||||||
#define ptr_V       cpu->ptr_V
 | 
					 | 
				
			||||||
#define ptr_I       cpu->ptr_I
 | 
					 | 
				
			||||||
#define ptr_T       cpu->ptr_T
 | 
					 | 
				
			||||||
#define ptr_CPSR    cpu->ptr_gpr[16]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// For MUL instructions
 | 
					// For MUL instructions
 | 
				
			||||||
#define RDHi        ((instr >> 16) & 0xF)
 | 
					#define RDHi        ((instr >> 16) & 0xF)
 | 
				
			||||||
@ -49,24 +41,6 @@
 | 
				
			|||||||
#define SBIT        BIT(20)
 | 
					#define SBIT        BIT(20)
 | 
				
			||||||
#define DESTReg     (BITS (12, 15))
 | 
					#define DESTReg     (BITS (12, 15))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// They are in unused state, give a corrent value when using
 | 
					 | 
				
			||||||
#define IS_V5E 0
 | 
					 | 
				
			||||||
#define IS_V5  0
 | 
					 | 
				
			||||||
#define IS_V6  0
 | 
					 | 
				
			||||||
#define LHSReg 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Temp define the using the pc reg need implement a flow
 | 
					 | 
				
			||||||
#define STORE_CHECK_RD_PC   ADD(R(RD), CONST(INSTR_SIZE * 2))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define OPERAND             operand(cpu,instr,bb,NULL)
 | 
					 | 
				
			||||||
#define SCO_OPERAND(sco)    operand(cpu,instr,bb,sco)
 | 
					 | 
				
			||||||
#define BOPERAND            boperand(instr)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CHECK_RN_PC         (RN == 15 ? ADD(AND(R(RN), CONST(~0x1)), CONST(INSTR_SIZE * 2)) : R(RN))
 | 
					 | 
				
			||||||
#define CHECK_RN_PC_WA      (RN == 15 ? ADD(AND(R(RN), CONST(~0x3)), CONST(INSTR_SIZE * 2)) : R(RN))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GET_USER_MODE()     (OR(ICMP_EQ(R(MODE_REG), CONST(USER32MODE)), ICMP_EQ(R(MODE_REG), CONST(SYSTEM32MODE))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int decode_arm_instr(uint32_t instr, int32_t *idx);
 | 
					int decode_arm_instr(uint32_t instr, int32_t *idx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum DECODE_STATUS {
 | 
					enum DECODE_STATUS {
 | 
				
			||||||
@ -83,23 +57,8 @@ struct instruction_set_encoding_item {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct instruction_set_encoding_item ISEITEM;
 | 
					typedef struct instruction_set_encoding_item ISEITEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RECORD_WB(value, flag) { cpu->dyncom_engine->wb_value = value;cpu->dyncom_engine->wb_flag = flag; }
 | 
					// ARM versions
 | 
				
			||||||
#define INIT_WB(wb_value, wb_flag) RECORD_WB(wb_value, wb_flag)
 | 
					enum {
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EXECUTE_WB(base_reg) { if(cpu->dyncom_engine->wb_flag) LET(base_reg, cpu->dyncom_engine->wb_value); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline int get_reg_count(uint32_t instr) {
 | 
					 | 
				
			||||||
    int i = BITS(0, 15);
 | 
					 | 
				
			||||||
    int count = 0;
 | 
					 | 
				
			||||||
    while (i) {
 | 
					 | 
				
			||||||
        if (i & 1)
 | 
					 | 
				
			||||||
            count++;
 | 
					 | 
				
			||||||
        i = i >> 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return count;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum ARMVER {
 | 
					 | 
				
			||||||
    INVALID = 0,
 | 
					    INVALID = 0,
 | 
				
			||||||
    ARMALL,
 | 
					    ARMALL,
 | 
				
			||||||
    ARMV4,
 | 
					    ARMV4,
 | 
				
			||||||
 | 
				
			|||||||
@ -16,10 +16,7 @@
 | 
				
			|||||||
*
 | 
					*
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __ARM_DYNCOM_RUN__
 | 
					#pragma once
 | 
				
			||||||
#define __ARM_DYNCOM_RUN__
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "core/arm/skyeye_common/skyeye_types.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void switch_mode(arm_core_t *core, uint32_t mode);
 | 
					void switch_mode(arm_core_t *core, uint32_t mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -51,5 +48,3 @@ static inline addr_t CHECK_READ_REG15_WA(arm_core_t* core, int Rn) {
 | 
				
			|||||||
static inline u32 CHECK_READ_REG15(arm_core_t* core, int Rn) {
 | 
					static inline u32 CHECK_READ_REG15(arm_core_t* core, int Rn) {
 | 
				
			||||||
    return (Rn == 15)? ((core->Reg[15] & ~0x1) + GET_INST_SIZE(core) * 2) : core->Reg[Rn];
 | 
					    return (Rn == 15)? ((core->Reg[15] & ~0x1) + GET_INST_SIZE(core) * 2) : core->Reg[Rn];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -24,11 +24,9 @@
 | 
				
			|||||||
* @date 2011-11-07
 | 
					* @date 2011-11-07
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __ARM_DYNCOM_THUMB_H__
 | 
					#pragma once
 | 
				
			||||||
#define __ARM_DYNCOM_THUMB_H__
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "core/arm/skyeye_common/armdefs.h"
 | 
					#include "core/arm/skyeye_common/armdefs.h"
 | 
				
			||||||
#include "core/arm/skyeye_common/skyeye_types.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum tdstate {
 | 
					enum tdstate {
 | 
				
			||||||
    t_undefined,    // Undefined Thumb instruction
 | 
					    t_undefined,    // Undefined Thumb instruction
 | 
				
			||||||
@ -47,5 +45,3 @@ static inline u32 get_thumb_instr(u32 instr, addr_t pc) {
 | 
				
			|||||||
        tinstr = instr & 0xFFFF;
 | 
					        tinstr = instr & 0xFFFF;
 | 
				
			||||||
    return tinstr;
 | 
					    return tinstr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
#ifndef __ARM_REGFORMAT_H__
 | 
					#pragma once
 | 
				
			||||||
#define __ARM_REGFORMAT_H__
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum arm_regno{
 | 
					enum {
 | 
				
			||||||
    R0 = 0,
 | 
					    R0 = 0,
 | 
				
			||||||
    R1,
 | 
					    R1,
 | 
				
			||||||
    R2,
 | 
					    R2,
 | 
				
			||||||
@ -20,7 +19,7 @@ enum arm_regno{
 | 
				
			|||||||
    R15, //PC,
 | 
					    R15, //PC,
 | 
				
			||||||
    CPSR_REG,
 | 
					    CPSR_REG,
 | 
				
			||||||
    SPSR_REG,
 | 
					    SPSR_REG,
 | 
				
			||||||
#if 1
 | 
					
 | 
				
			||||||
    PHYS_PC,
 | 
					    PHYS_PC,
 | 
				
			||||||
    R13_USR,
 | 
					    R13_USR,
 | 
				
			||||||
    R14_USR,
 | 
					    R14_USR,
 | 
				
			||||||
@ -95,11 +94,9 @@ enum arm_regno{
 | 
				
			|||||||
    VFP_FPSID = VFP_BASE,
 | 
					    VFP_FPSID = VFP_BASE,
 | 
				
			||||||
    VFP_FPSCR,
 | 
					    VFP_FPSCR,
 | 
				
			||||||
    VFP_FPEXC,
 | 
					    VFP_FPEXC,
 | 
				
			||||||
#endif    
 | 
					
 | 
				
			||||||
    MAX_REG_NUM,
 | 
					    MAX_REG_NUM,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CP15(idx)       (idx - CP15_BASE)
 | 
					#define CP15(idx)       (idx - CP15_BASE)
 | 
				
			||||||
#define VFP_OFFSET(x)   (x - VFP_BASE)
 | 
					#define VFP_OFFSET(x)   (x - VFP_BASE)
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,78 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 *    arm
 | 
					 | 
				
			||||||
 *    armcpu.h
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *    Copyright (C) 2003, 2004 Sebastian Biallas (sb@biallas.net)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *    This program is free software; you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 *    it under the terms of the GNU General Public License version 2 as
 | 
					 | 
				
			||||||
 *    published by the Free Software Foundation.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *    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., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __ARM_CPU_H__
 | 
					 | 
				
			||||||
#define __ARM_CPU_H__
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stddef.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "core/arm/skyeye_common/armdefs.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct ARM_CPU_State_s {
 | 
					 | 
				
			||||||
    ARMul_State * core;
 | 
					 | 
				
			||||||
    uint32_t core_num;
 | 
					 | 
				
			||||||
    /* The core id that boot from
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint32_t boot_core_id;
 | 
					 | 
				
			||||||
}ARM_CPU_State;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//static ARM_CPU_State* get_current_cpu(){
 | 
					 | 
				
			||||||
//    machine_config_t* mach = get_current_mach();
 | 
					 | 
				
			||||||
//    /* Casting a conf_obj_t to ARM_CPU_State type */
 | 
					 | 
				
			||||||
//    ARM_CPU_State* cpu = (ARM_CPU_State*)mach->cpu_data->obj;
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    return cpu;
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
* @brief Get the core instance boot from
 | 
					 | 
				
			||||||
*
 | 
					 | 
				
			||||||
* @return
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
//static ARMul_State* get_boot_core(){
 | 
					 | 
				
			||||||
//    ARM_CPU_State* cpu = get_current_cpu();
 | 
					 | 
				
			||||||
//    return &cpu->core[cpu->boot_core_id];
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
* @brief Get the instance of running core
 | 
					 | 
				
			||||||
*
 | 
					 | 
				
			||||||
* @return the core instance
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
//static ARMul_State* get_current_core(){
 | 
					 | 
				
			||||||
//    /* Casting a conf_obj_t to ARM_CPU_State type */
 | 
					 | 
				
			||||||
//    int id = Common::CurrentThreadId();
 | 
					 | 
				
			||||||
//    /* If thread is not in running mode, we should give the boot core */
 | 
					 | 
				
			||||||
//    if(get_thread_state(id) != Running_state){
 | 
					 | 
				
			||||||
//        return get_boot_core();
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
//    /* Judge if we are running in paralell or sequenial */
 | 
					 | 
				
			||||||
//    if(thread_exist(id)){
 | 
					 | 
				
			||||||
//        conf_object_t* conf_obj = get_current_exec_priv(id);
 | 
					 | 
				
			||||||
//        return (ARMul_State*)get_cast_conf_obj(conf_obj, "arm_core_t");
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    return NULL;
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CURRENT_CORE get_current_core()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ -14,14 +14,10 @@
 | 
				
			|||||||
    You should have received a copy of the GNU General Public License
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
    along with this program; if not, write to the Free Software
 | 
					    along with this program; if not, write to the Free Software
 | 
				
			||||||
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 | 
					    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 | 
				
			||||||
#ifndef __ARMEMU_H__
 | 
					 | 
				
			||||||
#define __ARMEMU_H__
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "core/arm/skyeye_common/armdefs.h"
 | 
					#include "core/arm/skyeye_common/armdefs.h"
 | 
				
			||||||
//#include "skyeye.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//extern ARMword isize;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Shift Opcodes.  */
 | 
					/* Shift Opcodes.  */
 | 
				
			||||||
#define LSL 0
 | 
					#define LSL 0
 | 
				
			||||||
@ -625,6 +621,3 @@ extern unsigned DSPCDP5 (ARMul_State *, unsigned, ARMword);
 | 
				
			|||||||
extern unsigned DSPMCR6 (ARMul_State *, unsigned, ARMword, ARMword);
 | 
					extern unsigned DSPMCR6 (ARMul_State *, unsigned, ARMword, ARMword);
 | 
				
			||||||
extern unsigned DSPMRC6 (ARMul_State *, unsigned, ARMword, ARMword *);
 | 
					extern unsigned DSPMRC6 (ARMul_State *, unsigned, ARMword, ARMword *);
 | 
				
			||||||
extern unsigned DSPCDP6 (ARMul_State *, unsigned, ARMword);
 | 
					extern unsigned DSPCDP6 (ARMul_State *, unsigned, ARMword);
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -18,19 +18,10 @@
 | 
				
			|||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _ARMMMU_H_
 | 
					#pragma once
 | 
				
			||||||
#define _ARMMMU_H_
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Register numbers in the MMU
 | 
				
			||||||
#define WORD_SHT			2
 | 
					enum
 | 
				
			||||||
#define WORD_SIZE			(1<<WORD_SHT)
 | 
					 | 
				
			||||||
/* The MMU is accessible with MCR and MRC operations to copro 15: */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MMU_COPRO			(15)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Register numbers in the MMU: */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum mmu_regnum_t
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	MMU_ID = 0,
 | 
						MMU_ID = 0,
 | 
				
			||||||
	MMU_CONTROL = 1,
 | 
						MMU_CONTROL = 1,
 | 
				
			||||||
@ -44,94 +35,22 @@ typedef enum mmu_regnum_t
 | 
				
			|||||||
	MMU_TLB_LOCKDOWN = 10,
 | 
						MMU_TLB_LOCKDOWN = 10,
 | 
				
			||||||
	MMU_PID = 13,
 | 
						MMU_PID = 13,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*MMU_V4 */
 | 
						// MMU_V4
 | 
				
			||||||
	MMU_V4_CACHE_OPS = 7,
 | 
						MMU_V4_CACHE_OPS = 7,
 | 
				
			||||||
	MMU_V4_TLB_OPS = 8,
 | 
						MMU_V4_TLB_OPS = 8,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*MMU_V3 */
 | 
						// MMU_V3
 | 
				
			||||||
	MMU_V3_FLUSH_TLB = 5,
 | 
						MMU_V3_FLUSH_TLB = 5,
 | 
				
			||||||
	MMU_V3_FLUSH_TLB_ENTRY = 6,
 | 
						MMU_V3_FLUSH_TLB_ENTRY = 6,
 | 
				
			||||||
	MMU_V3_FLUSH_CACHE = 7,
 | 
						MMU_V3_FLUSH_CACHE = 7,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*MMU Intel SA-1100 */
 | 
						// MMU Intel SA-1100
 | 
				
			||||||
	MMU_SA_RB_OPS = 9,
 | 
						MMU_SA_RB_OPS = 9,
 | 
				
			||||||
	MMU_SA_DEBUG = 14,
 | 
						MMU_SA_DEBUG = 14,
 | 
				
			||||||
	MMU_SA_CP15_R15 = 15,
 | 
						MMU_SA_CP15_R15 = 15,
 | 
				
			||||||
	//chy 2003-08-24
 | 
					
 | 
				
			||||||
	/*Intel xscale CP15 */
 | 
						// Intel xscale CP15
 | 
				
			||||||
	XSCALE_CP15_CACHE_TYPE = 0,
 | 
						XSCALE_CP15_CACHE_TYPE = 0,
 | 
				
			||||||
	XSCALE_CP15_AUX_CONTROL = 1,
 | 
						XSCALE_CP15_AUX_CONTROL = 1,
 | 
				
			||||||
	XSCALE_CP15_COPRO_ACCESS = 15,
 | 
						XSCALE_CP15_COPRO_ACCESS = 15,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
} mmu_regnum_t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Bits in the control register */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CONTROL_MMU			(1<<0)
 | 
					 | 
				
			||||||
#define CONTROL_ALIGN_FAULT		(1<<1)
 | 
					 | 
				
			||||||
#define CONTROL_CACHE			(1<<2)
 | 
					 | 
				
			||||||
#define CONTROL_DATA_CACHE		(1<<2)
 | 
					 | 
				
			||||||
#define CONTROL_WRITE_BUFFER		(1<<3)
 | 
					 | 
				
			||||||
#define CONTROL_BIG_ENDIAN		(1<<7)
 | 
					 | 
				
			||||||
#define CONTROL_SYSTEM			(1<<8)
 | 
					 | 
				
			||||||
#define CONTROL_ROM			(1<<9)
 | 
					 | 
				
			||||||
#define CONTROL_UNDEFINED               (1<<10)
 | 
					 | 
				
			||||||
#define CONTROL_BRANCH_PREDICT          (1<<11)
 | 
					 | 
				
			||||||
#define CONTROL_INSTRUCTION_CACHE       (1<<12)
 | 
					 | 
				
			||||||
#define CONTROL_VECTOR                  (1<<13)
 | 
					 | 
				
			||||||
#define CONTROL_RR                      (1<<14)
 | 
					 | 
				
			||||||
#define CONTROL_L4                      (1<<15)
 | 
					 | 
				
			||||||
#define CONTROL_XP                      (1<<23)
 | 
					 | 
				
			||||||
#define CONTROL_EE                      (1<<25)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*Macro defines for MMU state*/
 | 
					 | 
				
			||||||
#define MMU_CTL (state->mmu.control)
 | 
					 | 
				
			||||||
#define MMU_Enabled (state->mmu.control & CONTROL_MMU)
 | 
					 | 
				
			||||||
#define MMU_Disabled (!(MMU_Enabled))
 | 
					 | 
				
			||||||
#define MMU_Aligned (state->mmu.control & CONTROL_ALIGN_FAULT)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MMU_ICacheEnabled (MMU_CTL & CONTROL_INSTRUCTION_CACHE)
 | 
					 | 
				
			||||||
#define MMU_ICacheDisabled (!(MMU_ICacheDisabled))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MMU_DCacheEnabled (MMU_CTL & CONTROL_DATA_CACHE)
 | 
					 | 
				
			||||||
#define MMU_DCacheDisabled (!(MMU_DCacheEnabled))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MMU_CacheEnabled (MMU_CTL & CONTROL_CACHE)
 | 
					 | 
				
			||||||
#define MMU_CacheDisabled (!(MMU_CacheEnabled))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MMU_WBEnabled (MMU_CTL & CONTROL_WRITE_BUFFER)
 | 
					 | 
				
			||||||
#define MMU_WBDisabled (!(MMU_WBEnabled))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*virt_addr exchange according to CP15.R13(process id virtul mapping)*/
 | 
					 | 
				
			||||||
#define PID_VA_MAP_MASK	0xfe000000
 | 
					 | 
				
			||||||
//#define mmu_pid_va_map(va) ({\
 | 
					 | 
				
			||||||
//	ARMword ret; \
 | 
					 | 
				
			||||||
//	if ((va) & PID_VA_MAP_MASK)\
 | 
					 | 
				
			||||||
//		ret = (va); \
 | 
					 | 
				
			||||||
//	else \
 | 
					 | 
				
			||||||
//		ret = ((va) | (state->mmu.process_id & PID_VA_MAP_MASK));\
 | 
					 | 
				
			||||||
//	ret;\
 | 
					 | 
				
			||||||
//})
 | 
					 | 
				
			||||||
#define mmu_pid_va_map(va) ((va) & PID_VA_MAP_MASK) ? (va) : ((va) | (state->mmu.process_id & PID_VA_MAP_MASK))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* FS[3:0] in the fault status register: */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum fault_t
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	NO_FAULT = 0x0,
 | 
					 | 
				
			||||||
	ALIGNMENT_FAULT = 0x1,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	SECTION_TRANSLATION_FAULT = 0x5,
 | 
					 | 
				
			||||||
	PAGE_TRANSLATION_FAULT = 0x7,
 | 
					 | 
				
			||||||
	SECTION_DOMAIN_FAULT = 0x9,
 | 
					 | 
				
			||||||
	PAGE_DOMAIN_FAULT = 0xB,
 | 
					 | 
				
			||||||
	SECTION_PERMISSION_FAULT = 0xD,
 | 
					 | 
				
			||||||
	SUBPAGE_PERMISSION_FAULT = 0xF,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* defined by skyeye */
 | 
					 | 
				
			||||||
	TLB_READ_MISS = 0x30,
 | 
					 | 
				
			||||||
	TLB_WRITE_MISS = 0x40,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} fault_t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _ARMMMU_H_ */
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,38 +1,24 @@
 | 
				
			|||||||
/*  armos.h -- ARMulator OS definitions:  ARM6 Instruction Emulator.
 | 
					/*  armos.h -- ARMulator OS definitions:  ARM6 Instruction Emulator.
 | 
				
			||||||
    Copyright (C) 1994 Advanced RISC Machines Ltd.
 | 
					    Copyright (C) 1994 Advanced RISC Machines Ltd.
 | 
				
			||||||
 
 | 
					
 | 
				
			||||||
    This program is free software; you can redistribute it and/or modify
 | 
					    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
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
    the Free Software Foundation; either version 2 of the License, or
 | 
					    the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
    (at your option) any later version.
 | 
					    (at your option) any later version.
 | 
				
			||||||
 
 | 
					
 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
    GNU General Public License for more details.
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 
 | 
					
 | 
				
			||||||
    You should have received a copy of the GNU General Public License
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
    along with this program; if not, write to the Free Software
 | 
					    along with this program; if not, write to the Free Software
 | 
				
			||||||
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 | 
					    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					//
 | 
				
			||||||
 | 
					// SWI Numbers
 | 
				
			||||||
#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_Syscall                0x0
 | 
				
			||||||
#define SWI_Exit                   0x1
 | 
					#define SWI_Exit                   0x1
 | 
				
			||||||
@ -44,8 +30,8 @@ static char mmap_mem_read(short size, int addr, uint32_t * value);
 | 
				
			|||||||
#define SWI_Rename                 0x26
 | 
					#define SWI_Rename                 0x26
 | 
				
			||||||
#define SWI_Break                  0x11
 | 
					#define SWI_Break                  0x11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SWI_Times		   0x2b
 | 
					#define SWI_Times                  0x2b
 | 
				
			||||||
#define SWI_Brk			   0x2d
 | 
					#define SWI_Brk                    0x2d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SWI_Mmap                   0x5a
 | 
					#define SWI_Mmap                   0x5a
 | 
				
			||||||
#define SWI_Munmap                 0x5b
 | 
					#define SWI_Munmap                 0x5b
 | 
				
			||||||
@ -56,76 +42,13 @@ static char mmap_mem_read(short size, int addr, uint32_t * value);
 | 
				
			|||||||
#define SWI_GetEUID32              0xc9
 | 
					#define SWI_GetEUID32              0xc9
 | 
				
			||||||
#define SWI_GetEGID32              0xca
 | 
					#define SWI_GetEGID32              0xca
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SWI_ExitGroup		   0xf8
 | 
					#define SWI_ExitGroup              0xf8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
					#define SWI_Uname                  0x7a
 | 
				
			||||||
#define SWI_Time                   0xd
 | 
					#define SWI_Fcntl                  0xdd
 | 
				
			||||||
#define SWI_Clock                  0x61
 | 
					#define SWI_Fstat64                0xc5
 | 
				
			||||||
#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_Gettimeofday           0x4e
 | 
				
			||||||
#define SWI_Set_tls                0xf0005
 | 
					#define SWI_Set_tls                0xf0005
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SWI_Breakpoint             0x180000	/* see gdb's tm-arm.h */
 | 
					#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 */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,31 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
        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>
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#pragma once
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <cstdint>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef uint32_t address_t;
 | 
					 | 
				
			||||||
typedef uint32_t physical_address_t;
 | 
					 | 
				
			||||||
typedef uint32_t generic_address_t;
 | 
					 | 
				
			||||||
@ -5,6 +5,8 @@
 | 
				
			|||||||
 * First, the standard VFP set.
 | 
					 * First, the standard VFP set.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FPSID			cr0
 | 
					#define FPSID			cr0
 | 
				
			||||||
#define FPSCR			cr1
 | 
					#define FPSCR			cr1
 | 
				
			||||||
#define MVFR1			cr6
 | 
					#define MVFR1			cr6
 | 
				
			||||||
 | 
				
			|||||||
@ -18,8 +18,7 @@
 | 
				
			|||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __VFP_H__
 | 
					#pragma once
 | 
				
			||||||
#define __VFP_H__
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "core/arm/skyeye_common/vfp/vfp_helper.h" /* for references to cdp SoftFloat functions */
 | 
					#include "core/arm/skyeye_common/vfp/vfp_helper.h" /* for references to cdp SoftFloat functions */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -109,5 +108,3 @@ int VLDR(ARMul_State * state, int type, ARMword instr, ARMword value);
 | 
				
			|||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -30,8 +30,7 @@
 | 
				
			|||||||
 * published by the Free Software Foundation.
 | 
					 * published by the Free Software Foundation.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __VFP_HELPER_H__
 | 
					#pragma once
 | 
				
			||||||
#define __VFP_HELPER_H__
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Custom edit */
 | 
					/* Custom edit */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -536,5 +535,3 @@ u32 vfp_double_normaliseroundintern(ARMul_State* state, struct vfp_double *vd, u
 | 
				
			|||||||
u32 vfp_double_multiply(struct vfp_double *vdd, struct vfp_double *vdn, struct vfp_double *vdm, u32 fpscr);
 | 
					u32 vfp_double_multiply(struct vfp_double *vdd, struct vfp_double *vdn, struct vfp_double *vdm, u32 fpscr);
 | 
				
			||||||
u32 vfp_double_add(struct vfp_double *vdd, struct vfp_double *vdn, struct vfp_double *vdm, u32 fpscr);
 | 
					u32 vfp_double_add(struct vfp_double *vdd, struct vfp_double *vdn, struct vfp_double *vdm, u32 fpscr);
 | 
				
			||||||
u32 vfp_double_fcvtsinterncutting(ARMul_State* state, int sd, struct vfp_double* dm, u32 fpscr);
 | 
					u32 vfp_double_fcvtsinterncutting(ARMul_State* state, int sd, struct vfp_double* dm, u32 fpscr);
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user