mirror of
https://github.com/gbowne1/ClassicOS.git
synced 2024-11-22 06:06:52 -08:00
improving io.asm and isr.asm
This commit is contained in:
parent
e6ad2dbc20
commit
19b61da1af
BIN
.vscode/browse.vc.db
vendored
BIN
.vscode/browse.vc.db
vendored
Binary file not shown.
BIN
.vscode/browse.vc.db-shm
vendored
BIN
.vscode/browse.vc.db-shm
vendored
Binary file not shown.
@ -1,14 +1,24 @@
|
|||||||
|
section .text
|
||||||
global inb
|
global inb
|
||||||
global outb
|
global outb
|
||||||
|
|
||||||
section .text
|
; Read a byte from the specified port
|
||||||
|
; Input: DX = port number
|
||||||
|
; Output: AL = data read from the port
|
||||||
inb:
|
inb:
|
||||||
MOV DX, WORD [ESP + 16]
|
PUSH DX ; Preserve DX
|
||||||
IN AL, DX
|
IN AL, DX ; Read from port
|
||||||
|
POP DX ; Restore DX
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
; Write a byte to the specified port
|
||||||
|
; Input: DX = port number, AL = data to write
|
||||||
outb:
|
outb:
|
||||||
MOV DX, WORD [ESP + 16]
|
PUSH DX ; Preserve DX
|
||||||
MOV AL, BYTE [ESP + 24]
|
PUSH AX ; Preserve AX
|
||||||
OUT DX, AL
|
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
|
RET
|
@ -7,5 +7,7 @@
|
|||||||
void init_heap(void *start, size_t size);
|
void init_heap(void *start, size_t size);
|
||||||
void *kmalloc(size_t size);
|
void *kmalloc(size_t size);
|
||||||
void kfree(void *ptr);
|
void kfree(void *ptr);
|
||||||
|
void *malloc(size_t size); // Adding malloc and free declarations
|
||||||
|
void free(void *ptr);
|
||||||
|
|
||||||
#endif /* MEMORY_H */
|
#endif /* MEMORY_H */
|
@ -1,11 +1,50 @@
|
|||||||
|
section .text
|
||||||
global isr_handler
|
global isr_handler
|
||||||
global _isr_stub
|
global _isr_stub
|
||||||
|
|
||||||
_isr_stub:
|
_isr_stub:
|
||||||
PUSH DWORD [ESP + 8]
|
; Save context
|
||||||
PUSH DWORD [ESP + 8]
|
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
|
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
|
IRETD
|
@ -40,6 +40,27 @@ void *kmalloc(size_t size)
|
|||||||
return ptr;
|
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)
|
void kfree(void *ptr)
|
||||||
{
|
{
|
||||||
/* Check if the pointer is within the heap */
|
/* Check if the pointer is within the heap */
|
||||||
|
Loading…
Reference in New Issue
Block a user