69 lines
2.1 KiB
C
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;
|
|
} |