improving io.asm and isr.asm

This commit is contained in:
Gregory Kenneth Bowne 2024-02-09 14:51:51 -08:00
parent e6ad2dbc20
commit 19b61da1af
6 changed files with 151 additions and 79 deletions

BIN
.vscode/browse.vc.db vendored

Binary file not shown.

Binary file not shown.

View File

@ -1,14 +1,24 @@
section .text
global inb
global outb
section .text
; Read a byte from the specified port
; Input: DX = port number
; Output: AL = data read from the port
inb:
MOV DX, WORD [ESP + 16]
IN AL, DX
PUSH DX ; Preserve DX
IN AL, DX ; Read from port
POP DX ; Restore DX
RET
; Write a byte to the specified port
; Input: DX = port number, AL = data to write
outb:
MOV DX, WORD [ESP + 16]
MOV AL, BYTE [ESP + 24]
OUT DX, AL
PUSH DX ; Preserve DX
PUSH AX ; Preserve AX
MOV DX, [ESP + 4] ; Get port number from stack
MOV AL, [ESP + 6] ; Get data from stack
OUT DX, AL ; Write to port
POP AX ; Restore AX
POP DX ; Restore DX
RET

View File

@ -7,5 +7,7 @@
void init_heap(void *start, size_t size);
void *kmalloc(size_t size);
void kfree(void *ptr);
void *malloc(size_t size); // Adding malloc and free declarations
void free(void *ptr);
#endif /* MEMORY_H */

View File

@ -1,11 +1,50 @@
section .text
global isr_handler
global _isr_stub
_isr_stub:
PUSH DWORD [ESP + 8]
PUSH DWORD [ESP + 8]
; Save context
PUSHAD ; Preserve all general-purpose registers
; Disable interrupts to handle nested interrupts
CLI
; Align stack to 16-byte boundary for performance (if needed)
; AND ESP, 0xFFFFFFF0
; Check if an error code is present (typically in EAX)
; This is just a placeholder, actual implementation depends on your IDT setup
CMP BYTE [ISR_HAS_ERROR_CODE], 1
JNE no_error_code
PUSH DWORD [ESP + 32] ; Push error code
JMP done_pushing_error_code
no_error_code:
PUSH DWORD 0 ; Push a dummy error code
done_pushing_error_code:
; Push interrupt number onto the stack
MOV EAX, [ESP + 36] ; Move interrupt number to EAX (accounting for the dummy/error code)
PUSH EAX ; Interrupt number
; Call isr_handler
CALL isr_handler
ADD ESP, 8
; Send EOI to PIC only if it's a hardware interrupt
; This is just a placeholder, actual implementation depends on your IDT setup
CMP BYTE [ISR_IS_HARDWARE_INTERRUPT], 1
JNE skip_eoi
MOV AL, 0x20
OUT 0x20, AL
skip_eoi:
; Enable interrupts
STI
; Clean up the stack
ADD ESP, 8 ; Remove error code and interrupt number
; Restore context
POPAD ; Restore all general-purpose registers
; Return from interrupt
IRETD

View File

@ -40,6 +40,27 @@ void *kmalloc(size_t size)
return ptr;
}
// Implementing a simple malloc-like function
void *malloc(size_t size)
{
// Round up the size to a multiple of 4 bytes
size = (size + 3) & ~3;
// Call kmalloc to allocate memory from the heap
return kmalloc(size);
}
// Implementing a simple free-like function
void free(void *ptr)
{
// Check if the pointer is within the heap
if ((uint8_t *)ptr >= heap_start && ptr < (void *)heap_end)
{
// Call kfree to deallocate the memory
kfree(ptr);
}
}
void kfree(void *ptr)
{
/* Check if the pointer is within the heap */