⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
字号:
#include "Utils.h"
#include "Global.h"



static std::string arch_name = "PPC";
static std::string conf_file = "PPC.conf";
static std::string binary_file = "PPC.bin";

void PRE_ROUTINE()
{
	Core::Wukong_Get_System().load_config(arch_name, conf_file);

	Core::Config_File * cf = Core::Wukong_Get_System().get_config();

	std::string cpu_name, board_name,  loader_name;
	cf->read("/cpu/name", cpu_name);
	cf->read("/board/name", board_name);
	cf->read("/loader/name", loader_name);
	Core::Module * cpu = Core::Module_Manager::create_module(cpu_name);
	Core::Module * board = Core::Module_Manager::create_module(board_name);
	g_loader = Core::Module_Manager::create_module(loader_name);

	Core::Wukong_Get_System().install_cpu((Core::Part *)cpu);
	Core::Wukong_Get_System().install_board((Core::Part *)board);
	Core::Wukong_Get_System().install_loader((Core::Binary_Loader *)g_loader);
}

void LOAD_EXE(const std::string &file)
{
	Core::Wukong_Get_System().load_binary((Core::Binary_Loader &)(*g_loader), "PPC", file);
}

void INIT_REGS()
{
	using namespace PPC;

	PPC_CPU *ppc_cpu = (PPC_CPU*)Core::Wukong_Get_System().get_cpu();
	CPPUNIT_ASSERT(ppc_cpu);

	//// To be same as psim's CR
	ppc_cpu->get_register(CR).convert_from_int(0);
	ppc_cpu->get_register(CTR).convert_from_int(0);
	ppc_cpu->get_register(XER).convert_from_int(0);
	ppc_cpu->get_register(LR).convert_from_int(0);

	SET_REGS(0, 16850, 17722, 4984, 
		-23751, -2584, 27295, -24240, 
		-27196, 17738, -26742, -20632, 
		-27311, 13828, 19765, -9363, 
		6230, -28293, -12566, 31822, 
		3066, -22829, -14768, -18170, 
		-23340, 23381, 4946, 5174, 
		-15366, 10768, -2061, 24723);
}

void CHECK_REGS(Core::u32 r0, Core::u32 r1, Core::u32 r2, Core::u32 r3,
				Core::u32 r4, Core::u32 r5, Core::u32 r6, Core::u32 r7,
				Core::u32 r8, Core::u32 r9, Core::u32 r10, Core::u32 r11,
				Core::u32 r12, Core::u32 r13, Core::u32 r14, Core::u32 r15, 
				Core::u32 r16,
				Core::u32 r17, Core::u32 r18, Core::u32 r19, Core::u32 r20,
				Core::u32 r21, Core::u32 r22, Core::u32 r23, Core::u32 r24,
				Core::u32 r25, Core::u32 r26, Core::u32 r27, Core::u32 r28,
				Core::u32 r29, Core::u32 r30, Core::u32 r31,
				Core::u32 cr, Core::u32 lr, Core::u32 ctr, Core::u32 xer)
{
	using namespace PPC;

	PPC_CPU *cpu = (PPC_CPU*)Core::Wukong_Get_System().get_cpu();
	CPPUNIT_ASSERT(cpu);

	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR0", r0, cpu->get_register(GPR0).convert_to_int());	
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR1", r1, cpu->get_register(GPR1).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR2", r2, cpu->get_register(GPR2).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR3", r3, cpu->get_register(GPR3).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR4", r4, cpu->get_register(GPR4).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR5", r5, cpu->get_register(GPR5).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR6", r6, cpu->get_register(GPR6).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR7", r7, cpu->get_register(GPR7).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR8", r8, cpu->get_register(GPR8).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR9", r9, cpu->get_register(GPR9).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR10", r10, cpu->get_register(GPR10).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR11", r11, cpu->get_register(GPR11).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR12", r12, cpu->get_register(GPR12).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR13", r13, cpu->get_register(GPR13).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR14", r14, cpu->get_register(GPR14).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR15", r15, cpu->get_register(GPR15).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR16", r16, cpu->get_register(GPR16).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR17", r17, cpu->get_register(GPR17).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR18", r18, cpu->get_register(GPR18).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR19", r19, cpu->get_register(GPR19).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR20", r20, cpu->get_register(GPR20).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR21", r21, cpu->get_register(GPR21).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR22", r22, cpu->get_register(GPR22).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR23", r23, cpu->get_register(GPR23).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR24", r24, cpu->get_register(GPR24).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR25", r25, cpu->get_register(GPR25).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR26", r26, cpu->get_register(GPR26).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR27", r27, cpu->get_register(GPR27).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR28", r28, cpu->get_register(GPR28).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR29", r29, cpu->get_register(GPR29).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR30", r30, cpu->get_register(GPR30).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("GPR31", r31, cpu->get_register(GPR31).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("CR", cr, cpu->get_register(CR).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("LR", lr, cpu->get_register(LR).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("CTR", ctr, cpu->get_register(CTR).convert_to_int());
	CPPUNIT_ASSERT_EQUAL_MESSAGE("XER", xer, cpu->get_register(XER).convert_to_int());
}

void SET_REGS(Core::u32 r0, Core::u32 r1, Core::u32 r2, Core::u32 r3,
			  Core::u32 r4, Core::u32 r5, Core::u32 r6, Core::u32 r7,
			  Core::u32 r8, Core::u32 r9, Core::u32 r10, Core::u32 r11,
			  Core::u32 r12, Core::u32 r13, Core::u32 r14, Core::u32 r15, 
			  Core::u32 r16,
			  Core::u32 r17, Core::u32 r18, Core::u32 r19, Core::u32 r20,
			  Core::u32 r21, Core::u32 r22, Core::u32 r23, Core::u32 r24,
			  Core::u32 r25, Core::u32 r26, Core::u32 r27, Core::u32 r28,
			  Core::u32 r29, Core::u32 r30, Core::u32 r31)
{
	using namespace PPC;

	PPC_CPU *cpu = (PPC_CPU*)Core::Wukong_Get_System().get_cpu();
	CPPUNIT_ASSERT(cpu);

	cpu->get_register(GPR0).convert_from_int(r0);
	cpu->get_register(GPR1).convert_from_int(r1);
	cpu->get_register(GPR2).convert_from_int(r2);
	cpu->get_register(GPR3).convert_from_int(r3);
	cpu->get_register(GPR4).convert_from_int(r4);
	cpu->get_register(GPR5).convert_from_int(r5);
	cpu->get_register(GPR6).convert_from_int(r6);
	cpu->get_register(GPR7).convert_from_int(r7);
	cpu->get_register(GPR8).convert_from_int(r8);
	cpu->get_register(GPR9).convert_from_int(r9);
	cpu->get_register(GPR10).convert_from_int(r10);
	cpu->get_register(GPR11).convert_from_int(r11);
	cpu->get_register(GPR12).convert_from_int(r12);
	cpu->get_register(GPR13).convert_from_int(r13);
	cpu->get_register(GPR14).convert_from_int(r14);
	cpu->get_register(GPR15).convert_from_int(r15);
	cpu->get_register(GPR16).convert_from_int(r16);
	cpu->get_register(GPR17).convert_from_int(r17);
	cpu->get_register(GPR18).convert_from_int(r18);
	cpu->get_register(GPR19).convert_from_int(r19);
	cpu->get_register(GPR20).convert_from_int(r20);
	cpu->get_register(GPR21).convert_from_int(r21);
	cpu->get_register(GPR22).convert_from_int(r22);
	cpu->get_register(GPR23).convert_from_int(r23);
	cpu->get_register(GPR24).convert_from_int(r24);
	cpu->get_register(GPR25).convert_from_int(r25);
	cpu->get_register(GPR26).convert_from_int(r26);
	cpu->get_register(GPR27).convert_from_int(r27);
	cpu->get_register(GPR28).convert_from_int(r28);
	cpu->get_register(GPR29).convert_from_int(r29);
	cpu->get_register(GPR30).convert_from_int(r30);
	cpu->get_register(GPR31).convert_from_int(r31);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -