add macro for reading register values

This commit is contained in:
Robert 2023-09-07 20:07:58 +02:00
parent ec082b5050
commit de9684a1d8
2 changed files with 19 additions and 29 deletions

View file

@ -3,13 +3,10 @@
#include <stdint.h> #include <stdint.h>
#define READ_REGISTER_VALUE(var, reg) asm ("mov %%" #reg ", %[" #var "]" : [var]"=m" (var))
inline void outb(uint16_t port, uint8_t val) { inline void outb(uint16_t port, uint8_t val) {
asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory"); asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
} }
inline uint8_t peek(void* addr) {
uint32_t ret = 3;
return ret;
}
#endif // _CLIPPER_IO_H_ #endif // _CLIPPER_IO_H_

View file

@ -3,6 +3,7 @@
#include "internal/text_screen.h" #include "internal/text_screen.h"
#include "stdlib.h" #include "stdlib.h"
#include "string.h" #include "string.h"
#include "internal/io.h"
void capsize() { void capsize() {
print_havarie_msg(); print_havarie_msg();
@ -36,10 +37,8 @@ void dump_stack(uint8_t col, uint8_t row) {
row++; row++;
int esp, ebp; int esp, ebp;
asm("mov %%esp, %[esp]\n" READ_REGISTER_VALUE(esp, esp);
"mov %%ebp, %[ebp]\n" READ_REGISTER_VALUE(ebp, ebp);
: [esp]"=m" (esp), [ebp]"=m" (ebp)
);
int start_address = esp & ~0xF; int start_address = esp & ~0xF;
char tmp[16]; char tmp[16];
@ -87,32 +86,26 @@ void print_havarie_msg() {
int eax, ebx, ecx, edx, esi, edi, esp, ebp; int eax, ebx, ecx, edx, esi, edi, esp, ebp;
asm("mov %%eax, %[eax]\n" READ_REGISTER_VALUE(eax, eax);
"mov %%ebx, %[ebx]\n" READ_REGISTER_VALUE(ebx, ebx);
"mov %%ecx, %[ecx]\n" READ_REGISTER_VALUE(ecx, ecx);
"mov %%edx, %[edx]\n" READ_REGISTER_VALUE(edx, edx);
"mov %%esi, %[esi]\n" READ_REGISTER_VALUE(esi, esi);
"mov %%edi, %[edi]\n" READ_REGISTER_VALUE(edi, edi);
"mov %%esp, %[esp]\n" READ_REGISTER_VALUE(esp, esp);
"mov %%ebp, %[ebp]\n" READ_REGISTER_VALUE(ebp, ebp);
: [eax]"=m" (eax), [ebx]"=m" (ebx), [ecx]"=m" (ecx), [edx]"=m" (edx),
[esi]"=m" (esi), [edi]"=m" (edi), [esp]"=m" (esp), [ebp]"=m" (ebp)
);
tsputs("Registers\n", TEXT_SCREEN_BG_BLACK | TEXT_SCREEN_FG_LIGHT_BLUE); tsputs("Registers\n", TEXT_SCREEN_BG_BLACK | TEXT_SCREEN_FG_LIGHT_BLUE);
tsprintf("eax=0x%08x\nebx=0x%08x\necx=0x%08x\nedx=0x%08x\n\n", eax, ebx, ecx, edx); tsprintf("eax=0x%08x\nebx=0x%08x\necx=0x%08x\nedx=0x%08x\n\n", eax, ebx, ecx, edx);
tsprintf("esi=0x%08x\nedi=0x%08x\nesp=0x%08x\nebp=0x%08x\n\n", esi, edi, esp, ebp); tsprintf("esi=0x%08x\nedi=0x%08x\nesp=0x%08x\nebp=0x%08x\n\n", esi, edi, esp, ebp);
short cs, ds, es, ss, fs, gs; short cs, ds, es, ss, fs, gs;
asm("mov %%cs, %[cs]\n" READ_REGISTER_VALUE(cs, cs);
"mov %%ds, %[ds]\n" READ_REGISTER_VALUE(ds, ds);
"mov %%es, %[es]\n" READ_REGISTER_VALUE(es, es);
"mov %%ss, %[ss]\n" READ_REGISTER_VALUE(ss, ss);
"mov %%fs, %[fs]\n" READ_REGISTER_VALUE(fs, fs);
"mov %%gs, %[gs]\n" READ_REGISTER_VALUE(gs, gs);
: [cs]"=m" (cs), [ds]"=m" (ds), [es]"=m" (es),
[ss]"=m" (ss), [fs]"=m" (fs), [gs]"=m" (gs)
);
tsputs("\nSegments\n", TEXT_SCREEN_BG_BLACK | TEXT_SCREEN_FG_LIGHT_BLUE); tsputs("\nSegments\n", TEXT_SCREEN_BG_BLACK | TEXT_SCREEN_FG_LIGHT_BLUE);
tsprintf("cs=0x%04x\nds=0x%04x\nes=0x%04x\n\n", cs, ds, es); tsprintf("cs=0x%04x\nds=0x%04x\nes=0x%04x\n\n", cs, ds, es);