quinn-os/ramdisk.c
2015-08-30 21:23:50 +10:00

69 lines
2.1 KiB
C

#include "multiboot.h"
#include "console.h"
#include "string.h"
unsigned long ramdisk_entry;
unsigned long ramdisk_size;
unsigned char ramdisk_enabled;
int init_ramdisk(multiboot_info_t *mbd) {
multiboot_module_t *ramdisk;
if (mbd->mods_count > 0) {
ramdisk = (multiboot_module_t *)mbd->mods_addr;
ramdisk_entry = ramdisk->mod_start;
ramdisk_size = ramdisk->mod_end - ramdisk->mod_start;
kprintf("Found ramdisk @ 0x%p size %d\n", ramdisk_entry, ramdisk_size);
ramdisk_enabled = 1;
return 1;
}
return 0;
}
unsigned char ramdisk_exists() {
return ramdisk_enabled;
}
void ramdisk_write_block(unsigned int blockno, char *source, unsigned int blocksize) {
if (ramdisk_entry + (blockno * blocksize) + blocksize > ramdisk_entry + ramdisk_size) {
kprintf("Ramdisk read out of bounds 0x%x\n", ramdisk_entry + (blockno * blocksize));
} else {
memcpy((char *)(ramdisk_entry + (blockno * blocksize)), source, blocksize);
}
return;
}
void ramdisk_write_blocks(unsigned int blockstart, unsigned int blockcount, char *source, unsigned int blocksize) {
int i;
for (i=0;i<blockcount;i++) {
if (ramdisk_entry + ((blockstart + i) * blocksize) + blocksize > ramdisk_entry + ramdisk_size) {
return;
} else {
memcpy((char *)(ramdisk_entry + ((blockstart + i) * blocksize)), &source[i*blocksize], blocksize);
}
}
return;
}
char *ramdisk_read_block(unsigned int blockno, char *dest, unsigned int blocksize) {
if (ramdisk_entry + (blockno * blocksize) + blocksize > ramdisk_entry + ramdisk_size) {
kprintf("Ramdisk read out of bounds 0x%x\n", ramdisk_entry + (blockno * blocksize));
} else {
memcpy(dest, (char *)(ramdisk_entry + (blockno * blocksize)), blocksize);
}
return dest;
}
int ramdisk_read_blocks(unsigned int blockstart, unsigned int blockcount, char *dest, unsigned int blocksize) {
int i;
for (i=0;i<blockcount;i++) {
if (ramdisk_entry + ((blockstart + i) * blocksize) + blocksize > ramdisk_entry + ramdisk_size) {
return i;
} else {
memcpy(&dest[i*blocksize], (char *)(ramdisk_entry + ((blockstart + i) * blocksize)), blocksize);
}
}
return i;
}