Fixed memory corruption

This commit is contained in:
notsomeidiot123 2026-07-11 15:08:34 -04:00
parent 10bb61b738
commit 739b0d8c71
6 changed files with 39 additions and 49 deletions

View File

@ -34,23 +34,6 @@ void sysinit(){
else{
mlog("KERNEL", "ERROR: Initrc could not be located!\n", MLOG_PRINT);
}
vfile_t *disk_dir = fopen("/dev/disk");
if(disk_dir == 0){
mlog("KERNEL", "Error: /dev/disk does not exist\n", MLOG_PRINT);
}
char *dir_data = kmalloc(1);
uint32_t byte_count = fread(disk_dir, dir_data, 0, 4096);
uint32_t file_count = byte_count/sizeof(vfile_t);
for(uint32_t i = 0; i < byte_count; i++){
if(dir_data[i] > 32 && dir_data[i] < 127){
printf("%c", dir_data[i]);
}
else{
printf("%d", dir_data[i]);
}
// vfs_detect_partitions(dir_data[i]);
}
// dispatch_message(0);
printf("Bleh\n");
//why did i stop working on this? what was wrong with this?

View File

@ -21,6 +21,21 @@ inline uint32_t strcmp(char *str1, char *str2){
if(str1[i] == str2[i]) return 0;
else return 1;
}
inline void memclr(char *ptr, uint32_t count){
if(count % 4 == 0){
uint32_t *intptr = (uint32_t *)ptr;
for(uint32_t i = 0; i < count/4; i++){
intptr[i] = 0;
}
return;
}
for(uint32_t i = 0; i < count; i++){
ptr[i] = 0;
}
return;
}
char *strtok(char *str, char delim);
void strcpy(char *src, char *dest);
void memcpy(char *src, char *dest, uint32_t c);

View File

@ -1,5 +1,6 @@
#include "elf.h"
#include "../shared/kstdlib.h"
#include "../shared/string.h"
#include "../shared/memory.h"
#define MODULE_NAME "ELFLOAD"
@ -14,21 +15,9 @@ void *load_segment(program_entry_t entry, void *file_data, void *base_segment, u
// printf("Base: %x\n", base_segment);
if(entry.type == 1){
if(((elf_header_t *)(file_data))->type == ELF_TYPE_SHARED){
//Overwrites data when sees free memory block; re-write to allocate before call
if(base_segment == 0){
segment = kmalloc(entry.msize/4096 + 1);
base_segment = segment;
}
else{
segment = base_segment + (entry.vaddr & 0xfffff000);
uint32_t count = 1;
count += ((entry.vaddr+entry.msize) - entry.vaddr) ? 1 : 0;
count += entry.msize/4096 + 1;
printf("%x\n", segment);
for(uint32_t i = 0; i < count; i++){
map(segment + (i << 12)/4, (void *)pm_alloc(), PT_PRESENT | map_flags);
}
}
segment = base_segment + (entry.vaddr & 0xfffff000);
memclr(segment, entry.msize);
for(uint32_t i = 0; i < entry.fsize/sizeof(uint32_t) + 1; i++){
segment[i] = ((uint32_t *)(file_data))[i + entry.data_offset/sizeof(uint32_t)];
}
@ -42,6 +31,7 @@ void *load_segment(program_entry_t entry, void *file_data, void *base_segment, u
//What is this for?
//TODO: Find out how to handle Dynamic sections
}
// printf("data_offset: %x\n", data_offset);
return base_segment;
}
@ -55,7 +45,12 @@ void *load_elf(void *file_data, uint32_t map_flags){
program_entry_t *program_header = file_data + header->program_header_offset;
uint32_t program_header_count = header->program_entry_count;
mlog(MODULE_NAME, "PROGRAM ENTRIES: %d\n", MLOG_PRINT, program_header_count);
void *base_segment = 0;
uint32_t size_pages = 0;
for(uint32_t i = 0; i < program_header_count; i++){
size_pages += (program_header[i].msize + PAGE_SIZE_BYTES - 1) / PAGE_SIZE_BYTES;
}
// printf("Requires %d pages\n", size_pages)
void *base_segment = kmalloc(size_pages);
for(uint32_t i = 0; i < program_header_count; i++){
base_segment = load_segment(program_header[i], file_data, base_segment, map_flags);
}

View File

@ -22,18 +22,15 @@ void ramfs_init(){
mlog(MODULE_NAME, "Initializing VFS\n", MLOG_PRINT);
root_dir.private = 0;
root_dir.size = 0;
// printf("Sizeof VFILE_T: %d", sizeof(vfile_t));
}
vfile_t *search_dir(char *subname, vfile_t *directory){
printf("Searching for: %s\n", subname);
if(!directory) return 0;
vfile_t **children = (vfile_t **)directory->private;
if(!children){
return 0;
}
for(int i = 0; i < directory->size / sizeof(vfile_t *); i++){
printf("Child name: %s\n", children[i]->name);
if(children[i] && !strcmp(children[i]->name, subname)){
return children[i];
}
@ -120,7 +117,6 @@ int ramfs_resize(vfile_t *file, uint32_t new_size_bytes){
file->private = new_ptr;
}while(0);
file->size = new_size_bytes;
// printf("New file size for file: %s, %d\n", file->name, file->size);
return new_size_bytes;
}
@ -137,7 +133,6 @@ vfile_t *ramfs_create(vfile_t *root, char *path, FS_FILE_FLAGS flags){
return 0;
}
char *new_name = path;
// printf("%d\n", parent->size);
vfile_t **dirents = (vfile_t **)parent->private;
uint32_t insert_index = 0;
for(uint32_t i = 0; i < parent->size/sizeof(vfile_t *); i++){
@ -166,18 +161,15 @@ vfile_t *ramfs_create(vfile_t *root, char *path, FS_FILE_FLAGS flags){
dirents[parent->size/(sizeof(vfile_t*)) - 1] = new_file;
new_file->fileops = &ramfs_ops;
path--;
// printf("Returning file with name: %s\n", new_file->name);
return new_file;
}
int ramfs_translate_dir(vfile_t *file, void *buffer, uint32_t offset, uint32_t count){
uint32_t dirents_requested = count / sizeof(vfile_t);
uint32_t dirents_availible = file->size / sizeof(vfile_t *);
printf("Sizeof vfile_t %d with %d entries fitting in buffer, and %d entries in file %s\n", sizeof(vfile_t), dirents_requested, dirents_availible, file->name);
uint32_t to_copy = unsigned_min(dirents_availible, dirents_requested);
vfile_t **dirents = (vfile_t **)file->private;
for(uint32_t i = 0; i < to_copy; i++){
// printf("From: %x to %x\n", dirents[i], buffer + i * sizeof(vfile_t));
memcpy(dirents[i], buffer + i * sizeof(vfile_t), sizeof(vfile_t));
}
return to_copy * sizeof(vfile_t);

View File

@ -23,13 +23,11 @@ vfile_t *fcreate(char *path, FS_FILE_FLAGS flags){
// return 0;
spinlock_acquire(vfs_lock);
vfile_t *returnable = vfcreate(get_root_dir(), path, flags);
printf("Making file: %s, %x\n", path, returnable);
spinlock_release(vfs_lock);
return returnable;
}
vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){
// printf("%s\n", relpath);
if(!relpath){
return 0;
}
@ -49,10 +47,8 @@ vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){
name_index++;
}
name[name_index] = 0;
// printf("%d, %s,", subpath_start, name + subpath_start);
if(name_index >= name_length){//if there is no other directory
// printf("Creating file; name: %s\n", name);
new_file = parent_dir->fileops->create(parent_dir, name, flags);
}
else{
@ -62,12 +58,10 @@ vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){
kfree(name);
return 0;
}
// printf("%s", new_parent->name);
new_file = vfcreate(new_parent, name+name_index+1, flags);
// fclose(new_parent);
}
kfree(name);
// printf("Returning new file!\n");
return new_file;
// return 0;
}
@ -116,7 +110,6 @@ vfile_t *fopen(char *name){
if(!strcmp(name, "/")){
return root;
}
printf("Opening file: %s\n", name + (name[0] == '/'));
return root->fileops->rfopen(name + (name[0] == '/'), root);
}

View File

@ -8,6 +8,17 @@
KOS_MAPI_FP api;
int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count);
int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count);
fileops_t ide_fileops = {
0,
0,
ata_write,
ata_read,
0,
0,
};
/*
TODO:
Register module
@ -534,7 +545,8 @@ uint8_t ata_identify(uint32_t index, uint16_t disk){
//
// new_file->read = ata_read;
// new_file->write = ata_write;
// new_file->id = index;
new_file->id = index;
new_file->fileops = &ide_fileops;
puts(api, "KIDM", "Valid Drive!\n");
return 0;
}