[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Lost] [Patch] bool-Rückgabe in mem_free
Der Kernel gibt mit diesem Patch einen boolean in SYSCALL_MEM_FREE
zurück. Standardverhalten bei Fehlern ist jetzt, FALSE zurückzugeben.
abort_task wird nur noch bei gesetztem debug=p (PEDANTIC) ausgeführt.
Index: src/kernel/src/syscall.c
===================================================================
--- src/kernel/src/syscall.c (Revision 618)
+++ src/kernel/src/syscall.c (Arbeitskopie)
@@ -33,6 +33,8 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <stdint.h>
+
#include "console.h"
#include "syscall.h"
#include "kprintf.h"
@@ -65,6 +67,22 @@
dword debug_last_syscall_data[DEBUG_LAST_SYSCALL_DATA_SIZE] = { 0 };
#endif
+/**
+ * Prueft, ob ein Speicherbereich komplett gemappt ist und PTE_U gesetzt
+ * hat.
+ *
+ * FIXME Tut sie in dieser Form natuerlich nicht
+ */
+bool is_userspace(vaddr_t start, dword len)
+{
+ if (start + len < start) {
+ return FALSE;
+ }
+
+ return ((uintptr_t) start >= USER_MEM_START)
+ && ((uintptr_t) start + len <= USER_MEM_END);
+}
+
void syscall(struct int_stack_frame ** esp)
{
struct int_stack_frame * isf = *esp;
@@ -197,9 +215,26 @@
if((dword)address % PAGE_SIZE != 0)
{
- abort_task("SYSCALL_MEM_FREE: Der Task versucht eine nicht ausgerichtete Adresse freizugeben: 0x%08x", address);
+ if (debug_test_flag(DEBUG_FLAG_PEDANTIC)) {
+ abort_task("SYSCALL_MEM_FREE: Der Task versucht eine "
+ "nicht ausgerichtete Adresse freizugeben: 0x%08x",
+ address);
+ }
+ isf->eax = FALSE;
+ break;
}
+ if (!is_userspace(address, pages * PAGE_SIZE))
+ {
+ if (debug_test_flag(DEBUG_FLAG_PEDANTIC)) {
+ abort_task("SYSCALL_MEM_FREE: Der Task versucht eine "
+ "Adresse freizugeben, die nicht fuer ihn reserviert "
+ "ist: 0x%08x (+0x%x)", address, pages * PAGE_SIZE);
+ }
+ isf->eax = FALSE;
+ break;
+ }
+
for (; pages; pages--) {
paddr_t paddress = resolve_vaddr((page_directory_t) current_task->cr3, address);
@@ -215,6 +250,7 @@
address += PAGE_SIZE;
}
+ isf->eax = TRUE;
break;
}
Index: src/modules/include/syscall.h
===================================================================
--- src/modules/include/syscall.h (Revision 618)
+++ src/modules/include/syscall.h (Arbeitskopie)
@@ -23,7 +23,7 @@
void* mem_allocate(dword size, dword flags);
void *mem_allocate_physical(dword size, dword position, dword flags);
dma_mem_ptr_t mem_dma_allocate(dword size, dword flags);
-void mem_free(void* address, dword size);
+bool mem_free(void* address, dword size);
void mem_free_physical(void* address, dword size);
memory_info_t memory_info();
Index: src/modules/lib/syscalls/mem_allocate.c
===================================================================
--- src/modules/lib/syscalls/mem_allocate.c (Revision 618)
+++ src/modules/lib/syscalls/mem_allocate.c (Arbeitskopie)
@@ -39,15 +39,18 @@
return ptr.virt;
}
-void mem_free(void* address, dword size)
+bool mem_free(void* address, dword size)
{
+ dword result;
asm(
+ "pushl %3;"
"pushl %2;"
- "pushl %1;"
- "mov %0, %%eax;"
+ "mov %1, %%eax;"
"int $0x30;"
"add $0x8, %%esp;"
- : : "i" (SYSCALL_MEM_FREE), "r" (address), "r" (size));
+ : "=a" (result) : "i" (SYSCALL_MEM_FREE), "r" (address), "r" (size));
+
+ return result;
}
void mem_free_physical(void* address, dword size)