summaryrefslogtreecommitdiff
path: root/kernel/src/devices/disc.c
blob: 8d34473dab2814517a18592fde12a57cdb5cb1a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <disc.h>
#include <multiboot2.h>
#include <libk/string.h>
#include <paging.h>
#include <libk/math.h>

#define KERNEL_VMA 0xc0000000

disc_sector_t* disc;

void disc_init()
{
	disc = (disc_sector_t*)(uint64_t)ext2_module->mod_start;
	if (disc == NULL) {
		printf("Error opening disc\n");
	}

	uint32_t disc_size = ext2_module->mod_end - ext2_module->mod_start;
	for (size_t i = 0; i < upper_div(disc_size, PAGE_SIZE) + 1; i++) {
		map_addr((uint64_t)((char*)disc + i * PAGE_SIZE), (uint64_t)((char*)disc + i * PAGE_SIZE), FLAG_PRESENT | FLAG_WRITABLE | FLAG_HUGE);
	}
}

void read_sector(size_t sector_num, disc_sector_t* disc_sector)
{
	memcpy(disc_sector, disc + sector_num, SECTOR_SIZE);
}

void write_sector(size_t sector_num, disc_sector_t* disc_sector)
{
	memcpy(disc + sector_num, disc_sector, SECTOR_SIZE);
}