summaryrefslogtreecommitdiffhomepage
path: root/dev/LibCompiler/AAL/CPU/amd64.h
blob: 34e695593e57e3442a5900be295b43d27a52b83f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* -------------------------------------------

	Copyright (C) 2024 Amlal EL Mahrouss, all rights reserved

------------------------------------------- */

#pragma once

#include <LibCompiler/Defines.h>

// @brief AMD64 support.
// @file CPU/amd64.hpp

#define kAsmOpcodeDecl(__NAME, __OPCODE) {.fName = __NAME, .fOpcode = __OPCODE},

typedef char	 i64_character_t;
typedef uint8_t	 i64_byte_t;
typedef uint16_t i64_hword_t;
typedef uint32_t i64_word_t;

#define kAsmRegisterPrefix "r"

struct CpuOpcodeAMD64
{
	std::string fName;
	i64_byte_t	fPrefixBytes[4];
	i64_hword_t fOpcode;
	i64_hword_t fModReg;
	i64_word_t	fDisplacment;
	i64_word_t	fImmediate;
};

/// these two are edge cases
#define kAsmIntOpcode	 0xCC
#define kasmIntOpcodeAlt 0xCD

#define kAsmJumpOpcode			0x0F80
#define kJumpLimit				30
#define kJumpLimitStandard		0xE3
#define kJumpLimitStandardLimit 0xEB

inline std::vector<CpuOpcodeAMD64> kOpcodesAMD64 = {
	kAsmOpcodeDecl("int", 0xCD)
		kAsmOpcodeDecl("into", 0xCE)
			kAsmOpcodeDecl("intd", 0xF1)
				kAsmOpcodeDecl("int3", 0xC3)
					kAsmOpcodeDecl("iret", 0xCF)
						kAsmOpcodeDecl("retf", 0xCB)
							kAsmOpcodeDecl("retn", 0xC3)
								kAsmOpcodeDecl("ret", 0xC3)
									kAsmOpcodeDecl("sti", 0xfb)
										kAsmOpcodeDecl("cli", 0xfa)
											kAsmOpcodeDecl("hlt", 0xf4)
												kAsmOpcodeDecl("nop", 0x90)
													kAsmOpcodeDecl("mov", 0x48)
														kAsmOpcodeDecl("call", 0xFF)};

#define kAsmRegisterLimit 16