summaryrefslogtreecommitdiff
path: root/kernel/include
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-26 11:52:55 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-26 11:52:55 +0100
commit950649760927a7c33ddecd1944fd0ad20e731ee9 (patch)
tree26c36460a91a128879de7ebf68fbcfcc50ef08fd /kernel/include
parenta362a43899040a3848427c4d1f3bd1d3e53f46ec (diff)
save/restore context from rsp
Diffstat (limited to 'kernel/include')
-rw-r--r--kernel/include/regs.h28
-rw-r--r--kernel/include/x86_64_regs.S16
2 files changed, 44 insertions, 0 deletions
diff --git a/kernel/include/regs.h b/kernel/include/regs.h
index 81b8a69..ec2ed89 100644
--- a/kernel/include/regs.h
+++ b/kernel/include/regs.h
@@ -1,6 +1,8 @@
#ifndef REGS_H
#define REGS_H
+#include <types.h>
+
#define R15_OFF 0x0
#define R14_OFF 0x08
#define R13_OFF 0x10
@@ -24,4 +26,30 @@
#define RSP_OFF 0x100
#define SS_OFF 0x108
+struct regs_t {
+ uint64_t r15;
+ uint64_t r14;
+ uint64_t r13;
+ uint64_t r12;
+ uint64_t rbp;
+ uint64_t rbx;
+ uint64_t seg;
+ uint64_t r11;
+ uint64_t r10;
+ uint64_t r9;
+ uint64_t r8;
+ uint64_t rdi;
+ uint64_t rsi;
+ uint64_t rdx;
+ uint64_t rcx;
+ uint64_t rax;
+ uint64_t error;
+ uint64_t rip;
+ uint64_t cs;
+ uint64_t rflags;
+ uint64_t rsp;
+ uint64_t ss;
+} __attribute__((packed));
+typedef struct regs_t regs_t;
+
#endif
diff --git a/kernel/include/x86_64_regs.S b/kernel/include/x86_64_regs.S
index 4b20539..644f4f8 100644
--- a/kernel/include/x86_64_regs.S
+++ b/kernel/include/x86_64_regs.S
@@ -8,6 +8,22 @@
* else use push/pop_callee_saved with push/pop_caller_saved
*/
+.set R15_OFF, 0x0
+.set R14_OFF, 0x08
+.set R13_OFF, 0x10
+.set R12_OFF, 0x18
+.set RBP_OFF, 0x20
+.set RBX_OFF, 0x28
+.set SEG_OFF, 0x30
+.set R11_OFF, 0x38
+.set R10_OFF, 0x40
+.set R9_OFF, 0x48
+.set R8_OFF, 0x50
+.set RDI_OFF, 0x58
+.set RSI_OFF, 0x60
+.set RDX_OFF, 0x68
+.set RCX_OFF, 0x70
+.set RAX_OFF, 0x78
.set ERROR_OFF, 0x80
.set RIP_OFF, 0x88
.set CS_OFF, 0x90