Add simple NVMe module and switch to NVMe emulation
This commit is contained in:
+17
-17
@@ -1,6 +1,6 @@
|
||||
#include "src/kernel/fat16.h"
|
||||
#include "src/kernel/ata.h"
|
||||
#include "src/kernel/fs.h"
|
||||
#include "src/kernel/nvme.h"
|
||||
#include "src/kernel/panic.h"
|
||||
#include "src/kernel/stream.h"
|
||||
#include "src/lib/memory.h"
|
||||
@@ -135,7 +135,7 @@ static void ensure_bpb() {
|
||||
}
|
||||
|
||||
uint8_t sector[512];
|
||||
ata_read_sectors(FIRST_PARTITION_SECTOR, 1, §or);
|
||||
nvme_read_sectors(FIRST_PARTITION_SECTOR, 1, §or);
|
||||
bpb = memory_allocate(sizeof(fat16_bpb_t));
|
||||
memory_copy(sector + 11, sizeof(fat16_bpb_t), bpb);
|
||||
data_start = FIRST_PARTITION_SECTOR + bpb->reserved_sectors + bpb->sectors_per_fat * bpb->fats_count +
|
||||
@@ -152,7 +152,7 @@ static void ensure_fat() {
|
||||
ASSERT(bpb->sectors_per_fat < 256, "ensure_fat: big FAT not implemented");
|
||||
|
||||
fat = memory_allocate(bpb->sectors_per_fat * SECTOR_SIZE);
|
||||
ata_read_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors, (uint8_t)bpb->sectors_per_fat, fat);
|
||||
nvme_read_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors, (uint8_t)bpb->sectors_per_fat, fat);
|
||||
}
|
||||
|
||||
static uint16_t allocate_cluster() {
|
||||
@@ -168,7 +168,7 @@ static uint16_t allocate_cluster() {
|
||||
|
||||
static void flush_fat() {
|
||||
ensure_fat();
|
||||
ata_write_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors, (uint8_t)bpb->sectors_per_fat, fat);
|
||||
nvme_write_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors, (uint8_t)bpb->sectors_per_fat, fat);
|
||||
}
|
||||
|
||||
static uint16_t read_directory(uint16_t dir_cluster, fat16_dir_entry_t **entries) {
|
||||
@@ -177,7 +177,7 @@ static uint16_t read_directory(uint16_t dir_cluster, fat16_dir_entry_t **entries
|
||||
if (!dir_cluster) {
|
||||
uint8_t sectors = (uint8_t)((sizeof(fat16_dir_entry_t) * bpb->root_entry_count + SECTOR_SIZE - 1) / SECTOR_SIZE);
|
||||
*entries = memory_allocate(sectors * SECTOR_SIZE);
|
||||
ata_read_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors + bpb->fats_count * bpb->sectors_per_fat, sectors, *entries);
|
||||
nvme_read_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors + bpb->fats_count * bpb->sectors_per_fat, sectors, *entries);
|
||||
return bpb->root_entry_count;
|
||||
} else {
|
||||
ensure_fat();
|
||||
@@ -193,7 +193,7 @@ static uint16_t read_directory(uint16_t dir_cluster, fat16_dir_entry_t **entries
|
||||
uint8_t *chunk = (uint8_t *)*entries;
|
||||
next_cluster = dir_cluster;
|
||||
while (next_cluster < 0xFFF8) {
|
||||
ata_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, chunk);
|
||||
nvme_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, chunk);
|
||||
chunk += bpb->sectors_per_cluster * SECTOR_SIZE;
|
||||
next_cluster = fat[next_cluster];
|
||||
}
|
||||
@@ -223,15 +223,15 @@ static void write_directory(uint16_t dir_cluster, const fat16_dir_entry_t *entri
|
||||
"write_directory: entries must be aligned to clusters");
|
||||
|
||||
if (!dir_cluster) {
|
||||
ata_write_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors + bpb->fats_count * bpb->sectors_per_fat,
|
||||
(uint8_t)((sizeof(fat16_dir_entry_t) * bpb->root_entry_count + SECTOR_SIZE - 1) / SECTOR_SIZE), entries);
|
||||
nvme_write_sectors(FIRST_PARTITION_SECTOR + bpb->reserved_sectors + bpb->fats_count * bpb->sectors_per_fat,
|
||||
(uint8_t)((sizeof(fat16_dir_entry_t) * bpb->root_entry_count + SECTOR_SIZE - 1) / SECTOR_SIZE), entries);
|
||||
} else {
|
||||
ensure_fat();
|
||||
|
||||
uint8_t *chunk = (uint8_t *)entries;
|
||||
uint16_t next_cluster = dir_cluster;
|
||||
while (count) {
|
||||
ata_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, chunk);
|
||||
nvme_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, chunk);
|
||||
chunk += bpb->sectors_per_cluster * SECTOR_SIZE;
|
||||
count -= bpb->sectors_per_cluster * SECTOR_SIZE / sizeof(fat16_dir_entry_t);
|
||||
if (count && fat[next_cluster] >= 0xFFF8) {
|
||||
@@ -418,7 +418,7 @@ uint64_t fat16_read(const fs_node_t *file, uint32_t offset, uint32_t bytes, void
|
||||
uint8_t *cursor = to;
|
||||
|
||||
uint8_t *tmp = memory_allocate(cluster_size);
|
||||
ata_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
nvme_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
uint32_t prefix_size = bytes <= cluster_size - offset ? bytes : cluster_size - offset;
|
||||
memory_copy(tmp + offset, prefix_size, cursor);
|
||||
bytes -= prefix_size;
|
||||
@@ -427,7 +427,7 @@ uint64_t fat16_read(const fs_node_t *file, uint32_t offset, uint32_t bytes, void
|
||||
next_cluster = fat[next_cluster];
|
||||
|
||||
while (bytes >= cluster_size) {
|
||||
ata_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, cursor);
|
||||
nvme_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, cursor);
|
||||
bytes -= cluster_size;
|
||||
readden += cluster_size;
|
||||
cursor += cluster_size;
|
||||
@@ -435,7 +435,7 @@ uint64_t fat16_read(const fs_node_t *file, uint32_t offset, uint32_t bytes, void
|
||||
}
|
||||
|
||||
if (bytes) {
|
||||
ata_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
nvme_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
memory_copy(tmp, bytes, cursor);
|
||||
readden += bytes;
|
||||
}
|
||||
@@ -489,17 +489,17 @@ uint64_t fat16_write(fs_node_t *file, uint32_t offset, const void *from, uint32_
|
||||
const uint8_t *cursor = from;
|
||||
|
||||
uint8_t *tmp = memory_allocate(cluster_size);
|
||||
ata_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
nvme_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
uint32_t prefix_size = bytes <= cluster_size - offset ? bytes : cluster_size - offset;
|
||||
memory_copy(cursor, prefix_size, tmp + offset);
|
||||
ata_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
nvme_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
bytes -= prefix_size;
|
||||
written += prefix_size;
|
||||
cursor += prefix_size;
|
||||
next_cluster = fat[next_cluster];
|
||||
|
||||
while (bytes >= cluster_size) {
|
||||
ata_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, cursor);
|
||||
nvme_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, cursor);
|
||||
bytes -= cluster_size;
|
||||
written += cluster_size;
|
||||
cursor += cluster_size;
|
||||
@@ -507,9 +507,9 @@ uint64_t fat16_write(fs_node_t *file, uint32_t offset, const void *from, uint32_
|
||||
}
|
||||
|
||||
if (bytes) {
|
||||
ata_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
nvme_read_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
memory_copy(cursor, bytes, tmp);
|
||||
ata_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
nvme_write_sectors(data_start + bpb->sectors_per_cluster * (next_cluster - 2), bpb->sectors_per_cluster, tmp);
|
||||
written += bytes;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user