Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update by Sept.20th, 2020
Implemented many essential instructions.
Implemented Memory Virtualization.
  • Loading branch information
Zero Tang committed Sep 19, 2020
1 parent 6b20460 commit 9896d14
Show file tree
Hide file tree
Showing 13 changed files with 1,030 additions and 17 deletions.
3 changes: 3 additions & 0 deletions .gitattributes
@@ -1,2 +1,5 @@
# Auto detect text files and perform LF normalization
* text=auto
*.c linguist-language=C
*.h linguist-language=C
*.asm linguist-language=Assembly
2 changes: 1 addition & 1 deletion LICENSE
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2019 Zero Tang
Copyright (c) 2019-2020 Zero Tang

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -11,6 +11,8 @@ To virtualize the processor, we implement the VMCB structure. VMCB is the acrony
- Register File, including GPR and FPU
- Execution Control, controlling the behavior of vCPU

Duly note that mipsivm simulates in LE byte order.

### Glossary of Processor Virtualization
| Acronyms | Abbreviated for | Explanation |
| --------- | ----------------------------- | --------------------------------- |
Expand Down
10 changes: 8 additions & 2 deletions compchk_win7x64.bat
Expand Up @@ -14,9 +14,15 @@ pause
echo ============Start Compiling============
%ddkpath%\amd64\cl.exe .\src\entry.c /I"%incpath%\api" /I"%incpath%\crt" /I".\src\include" /Zi /nologo /W3 /WX /Od /D"_msvc" /D"_amd64" /Zc:wchar_t /Zc:forScope /FAcs /Fa"%objpath%\entry.cod" /Fo"%objpath%\entry.obj" /Fd"%objpath%\vc90.pdb" /GS- /Gd /TC /c /errorReport:queue

%ddkpath%\amd64\cl.exe .\src\vcpu.c /I".\src\include" /Zi /nologo /W3 /WX /Oi /Od /D"_msvc" /D"_amd64" /Zc:wchar_t /Zc:forScope /FAcs /Fa"%objpath%\vcpu.cod" /Fo"%objpath%\vcpu.obj" /Fd"%objpath%\vc90.pdb" /GS- /Gd /TC /c /errorReport:queue
%ddkpath%\amd64\cl.exe .\src\vcpu.c /I".\src\include" /Zi /nologo /W3 /WX /Oi /Od /D"_msvc" /D"_amd64" /D"_mips_hvm" /Zc:wchar_t /Zc:forScope /FAcs /Fa"%objpath%\vcpu.cod" /Fo"%objpath%\vcpu.obj" /Fd"%objpath%\vc90.pdb" /GS- /Gd /TC /c /errorReport:queue

%ddkpath%\amd64\cl.exe .\src\sim-r.c /I".\src\include" /Zi /nologo /W3 /WX /Oi /Od /D"_msvc" /D"_amd64" /D"_mips_simr" /Zc:wchar_t /Zc:forScope /FAcs /Fa"%objpath%\sim-r.cod" /Fo"%objpath%\sim-r.obj" /Fd"%objpath%\vc90.pdb" /GS- /Gd /TC /c /errorReport:queue

%ddkpath%\amd64\cl.exe .\src\sim-i.c /I".\src\include" /Zi /nologo /W3 /WX /Oi /Od /D"_msvc" /D"_amd64" /D"_mips_simi" /Zc:wchar_t /Zc:forScope /FAcs /Fa"%objpath%\sim-i.cod" /Fo"%objpath%\sim-i.obj" /Fd"%objpath%\vc90.pdb" /GS- /Gd /TC /c /errorReport:queue

%ddkpath%\amd64\cl.exe .\src\sim-j.c /I".\src\include" /Zi /nologo /W3 /WX /Oi /Od /D"_msvc" /D"_amd64" /D"_mips_simj" /Zc:wchar_t /Zc:forScope /FAcs /Fa"%objpath%\sim-j.cod" /Fo"%objpath%\sim-j.obj" /Fd"%objpath%\vc90.pdb" /GS- /Gd /TC /c /errorReport:queue

echo ============Start Linking============
%ddkpath%\amd64\link.exe "%objpath%\vcpu.obj" "%objpath%\entry.obj" /LIBPATH:"%libpath%\win7\amd64" /LIBPATH:"%libpath%\Crt\amd64" /NODEFAULTLIB "msvcrt.lib" /NOLOGO /DEBUG /PDB:"%objpath%\mipsivm.pdb" /INCREMENTAL:NO /OUT:"%binpath%\mipsivm.exe" /SUBSYSTEM:CONSOLE /ENTRY:"main" /Machine:X64 /ERRORREPORT:QUEUE
%ddkpath%\amd64\link.exe "%objpath%\vcpu.obj" "%objpath%\entry.obj" "%objpath%\sim-r.obj" "%objpath%\sim-i.obj" "%objpath%\sim-j.obj" /LIBPATH:"%libpath%\win7\amd64" /LIBPATH:"%libpath%\Crt\amd64" /NODEFAULTLIB "msvcrt.lib" /NOLOGO /DEBUG /PDB:"%objpath%\mipsivm.pdb" /INCREMENTAL:NO /OUT:"%binpath%\mipsivm.exe" /SUBSYSTEM:CONSOLE /ENTRY:"main" /Machine:X64 /ERRORREPORT:QUEUE

pause
7 changes: 5 additions & 2 deletions src/entry.c
@@ -1,22 +1,25 @@
/*
mipsivm - MIPS Interpreting Virtual Machine
Copyright 2018-2019, Yaotian "Zero" Tang. All rights reserved.
Copyright 2018-2020, Yaotian "Zero" Tang. All rights reserved.
This file is the entry module of mipsivm program.
This program is distributed in the hope that it will be useful, but
without any warranty (no matter implied warranty or merchantability
or fitness for a particular purpose, etc.).
File Location: /include/entry.c
File Location: /entry.c
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

void main()
{
printf("Welcome to mipsivm!\n");
printf("Powered by Yaotian \"Zero\" Tang. All rights reserved.\n");
system("pause");
}
2 changes: 1 addition & 1 deletion src/include/midef.h
@@ -1,7 +1,7 @@
/*
mipsivm - MIPS Interpreting Virtual Machine
Copyright 2018-2019, Yaotian "Zero" Tang. All rights reserved.
Copyright 2018-2020, Yaotian "Zero" Tang. All rights reserved.
This file defines basic types, constants, etc.
Expand Down
12 changes: 10 additions & 2 deletions src/include/mipsdef.h
@@ -1,7 +1,7 @@
/*
mipsivm - MIPS Interpreting Virtual Machine
Copyright 2018-2019, Yaotian "Zero" Tang. All rights reserved.
Copyright 2018-2020, Yaotian "Zero" Tang. All rights reserved.
This file defines instructions of MIPS.
Expand Down Expand Up @@ -69,6 +69,7 @@ typedef union _mips_instruction
#define j_format 3
#define f_format 4

#if defined(_mips_hvm)
u8 mips_opcode_class[64]=
{
r_format, // 0x00
Expand Down Expand Up @@ -376,4 +377,11 @@ char* mips_fpu_funct_string[64]=
"c.nge.f", // 0x3D
"c.le.f", // 0x3E
"c.ngt.f" // 0x3F
};
};
#else
extern u8* mips_opcode_class;
extern char** mips_gpr_string;
extern char** mips_cpu_opcode_string;
extern char** mips_cpu_funct_string;
extern char** mips_fpu_funct_string;
#endif
225 changes: 225 additions & 0 deletions src/include/simulation.h
@@ -0,0 +1,225 @@
/*
mipsivm - MIPS Interpreting Virtual Machine
Copyright 2018-2020, Yaotian "Zero" Tang. All rights reserved.
This file declares all simulated procedures.
This program is distributed in the hope that it will be useful, but
without any warranty (no matter implied warranty or merchantability
or fitness for a particular purpose, etc.).
File Location: /include/simulation.h
*/

#include "midef.h"

typedef void (*mips_interpreter_procedure)
(
vmcb_p vcpu,
mips_instruction instruction
);

// R-Format Instructions
void mips_interpreter_r_sll(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_srl(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_sra(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_sllv(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_srlv(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_srav(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_jr(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_jalr(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_movz(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_movn(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_syscall(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_break(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_sync(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_mfhi(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_mthi(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_mflo(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_mtlo(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_mult(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_multu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_div(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_divu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_add(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_addu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_sub(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_subu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_and(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_or(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_xor(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_nor(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_slt(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_sltu(vmcb_p vcpu,mips_instruction instruction);

// I-Format Instructions
void mips_interpreter_i_beq(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_bne(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_blez(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_bgtz(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_addi(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_addiu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_slti(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_sltiu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_andi(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_ori(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_xori(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_lui(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_lb(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_lh(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_lw(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_lbu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_lhu(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_sb(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_sh(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_i_sw(vmcb_p vcpu,mips_instruction instruction);

// J-Format Instructions
void mips_interpreter_j_j(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_j_jal(vmcb_p vcpu,mips_instruction instruction);

// Miscellaneous
void mips_interpreter_unhandled_instruction(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_r_format(vmcb_p vcpu,mips_instruction instruction);
void mips_interpreter_fpu(vmcb_p vcpu,mips_instruction instruction);

#if defined(_mips_hvm)
mips_interpreter_procedure cpu_interpreter_by_opcode[64]=
{
mips_interpreter_r_format,
mips_interpreter_unhandled_instruction,
mips_interpreter_j_j,
mips_interpreter_j_jal,
mips_interpreter_i_beq,
mips_interpreter_i_bne,
mips_interpreter_i_blez,
mips_interpreter_i_bgtz,
mips_interpreter_i_addi,
mips_interpreter_i_addiu,
mips_interpreter_i_slti,
mips_interpreter_i_sltiu,
mips_interpreter_i_andi,
mips_interpreter_i_ori,
mips_interpreter_i_xori,
mips_interpreter_i_lui,
mips_interpreter_unhandled_instruction,
mips_interpreter_fpu,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_i_lb,
mips_interpreter_i_lh,
mips_interpreter_unhandled_instruction,
mips_interpreter_i_lw,
mips_interpreter_i_lbu,
mips_interpreter_i_lhu,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_i_sb,
mips_interpreter_i_sh,
mips_interpreter_unhandled_instruction,
mips_interpreter_i_sw,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction
};

mips_interpreter_procedure cpu_interpreter_r_funct[64]=
{
mips_interpreter_r_sll,
mips_interpreter_unhandled_instruction,
mips_interpreter_r_srl,
mips_interpreter_r_sra,
mips_interpreter_r_sllv,
mips_interpreter_unhandled_instruction,
mips_interpreter_r_srlv,
mips_interpreter_r_srav,
mips_interpreter_r_jr,
mips_interpreter_r_jalr,
mips_interpreter_r_movz,
mips_interpreter_r_movn,
mips_interpreter_r_syscall,
mips_interpreter_r_break,
mips_interpreter_unhandled_instruction,
mips_interpreter_r_sync,
mips_interpreter_r_mfhi,
mips_interpreter_r_mthi,
mips_interpreter_r_mflo,
mips_interpreter_r_mtlo,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_r_mult,
mips_interpreter_r_multu,
mips_interpreter_r_div,
mips_interpreter_r_divu,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_r_add,
mips_interpreter_r_addu,
mips_interpreter_r_sub,
mips_interpreter_r_subu,
mips_interpreter_r_and,
mips_interpreter_r_or,
mips_interpreter_r_xor,
mips_interpreter_r_nor,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_r_slt,
mips_interpreter_r_sltu,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction,
mips_interpreter_unhandled_instruction
};

mips_interpreter_procedure fpu_interpreter[64];
#endif

0 comments on commit 9896d14

Please sign in to comment.