summaryrefslogtreecommitdiff
path: root/kernel/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/drivers')
-rw-r--r--kernel/src/drivers/disk.cpp2
-rw-r--r--kernel/src/drivers/ext2.cpp74
-rw-r--r--kernel/src/drivers/ext2.hpp4
-rw-r--r--kernel/src/drivers/mbr.hpp2
-rw-r--r--kernel/src/drivers/nvme.cpp6
-rw-r--r--kernel/src/drivers/powerbutton.cpp2
-rw-r--r--kernel/src/drivers/uacpi_kernel_api.cpp2
7 files changed, 63 insertions, 29 deletions
diff --git a/kernel/src/drivers/disk.cpp b/kernel/src/drivers/disk.cpp
index 36742f2..19142b9 100644
--- a/kernel/src/drivers/disk.cpp
+++ b/kernel/src/drivers/disk.cpp
@@ -173,7 +173,7 @@ void drivers::init_disk(disk* new_disk) {
return;
partition_style style = determine_disk_type(new_disk);
- klibc::printf("Disk: Detected %s partition style\r\n", disk_type_to_str(style));
+ log("disk", "detected %s partition style", disk_type_to_str(style));
switch (style)
{
diff --git a/kernel/src/drivers/ext2.cpp b/kernel/src/drivers/ext2.cpp
index 34fdf32..74048f4 100644
--- a/kernel/src/drivers/ext2.cpp
+++ b/kernel/src/drivers/ext2.cpp
@@ -361,7 +361,7 @@ void ext2_free_blocks(ext2_partition* part, uint32_t count, uint64_t* blocks) {
pmm::freelist::free((uint64_t)bitmap - etc::hhdm());
}
-signed long ext2_read(file_descriptor* file, void* buffer, signed long count) {
+signed long ext2_read(file_descriptor* file, void* buffer, std::size_t count) {
if (count <= 0) return 0;
file->vnode.fs->lock.lock();
@@ -387,7 +387,7 @@ signed long ext2_read(file_descriptor* file, void* buffer, signed long count) {
std::uint32_t block_size = 1024 << part->sb->s_log_block_size;
char* temp_block = (char*)(pmm::freelist::alloc_4k() + etc::hhdm());
- signed long total_read = 0;
+ std::size_t total_read = 0;
char* out_ptr = (char*)buffer;
while (total_read < count) {
@@ -506,7 +506,7 @@ void ext2_write_inode(ext2_partition* part, uint64_t ino, ext2_inode* inode) {
pmm::freelist::free((uint64_t)buf - etc::hhdm());
}
-signed long ext2_write(file_descriptor* file, void* buffer, signed long count) {
+signed long ext2_write(file_descriptor* file, void* buffer, std::size_t count) {
if (count <= 0) return 0;
file->vnode.fs->lock.lock();
@@ -515,7 +515,7 @@ signed long ext2_write(file_descriptor* file, void* buffer, signed long count) {
uint32_t block_size = 1024 << part->sb->s_log_block_size;
char* temp_block = (char*)(pmm::freelist::alloc_4k() + etc::hhdm());
- signed long total_written = 0;
+ std::size_t total_written = 0;
const char* in_ptr = (const char*)buffer;
bool inode_dirty = false;
@@ -552,13 +552,17 @@ signed long ext2_write(file_descriptor* file, void* buffer, signed long count) {
return total_written;
}
-std::uint32_t ext2_open(filesystem* fs, void* file_desc, char* path) {
+std::uint32_t ext2_open(filesystem* fs, void* file_desc, char* path, bool is_directory) {
fs->lock.lock();
ext2_inode res;
std::uint64_t inode_num = 0;
std::uint32_t status = ext2_lookup((ext2_partition*)(fs->fs_specific.partition), path, &res, &inode_num);
if(status != 0) { fs->lock.unlock();
return status; }
+
+ if(is_directory && !(res.i_mode & EXT2_S_IFDIR))
+ return -ENOTDIR;
+
file_descriptor* fd = (file_descriptor*)file_desc;
fd->fs_specific.ino = inode_num;
fd->vnode.fs = fs;
@@ -569,6 +573,7 @@ std::uint32_t ext2_open(filesystem* fs, void* file_desc, char* path) {
}
std::int32_t ext2_stat(file_descriptor* file, stat* out) {
+ file->vnode.fs->lock.lock();
std::int32_t status = 0;
ext2_partition* part = (ext2_partition*)(file->vnode.fs->fs_specific.partition);
ext2_inode inode = ext2_get_inode(part, file->fs_specific.ino, &status);
@@ -593,7 +598,30 @@ std::int32_t ext2_stat(file_descriptor* file, stat* out) {
out->st_rdev = 0; // should be filled by vfs
out->st_nlink = inode.i_links_count;
out->st_mode = inode.i_mode;
+ out->st_ino = file->fs_specific.ino;
+ file->vnode.fs->lock.unlock();
+ return 0;
+}
+
+std::int32_t ext2_readlink(filesystem* fs, char* path, char* buffer) {
+ fs->lock.lock();
+ ext2_partition* part = (ext2_partition*)(fs->fs_specific.partition);
+ std::uint64_t inode = 0;
+ ext2_inode node = {};
+ std::int32_t status = ext2_lookup(part, path, &node, &inode);
+
+ if(status != 0) { fs->lock.unlock();
+ return status; }
+
+ if(!(node.i_mode & EXT2_S_IFLNK)) { fs->lock.unlock();
+ return -EINVAL; }
+
+ for(int i = 0;i < 4096 / (1024 << part->sb->s_log_block_size);i++) {
+ ext2_read_block(part, get_phys_block(part, &node, i), buffer);
+ }
+
+ fs->lock.unlock();
return 0;
}
@@ -648,7 +676,7 @@ void drivers::ext2::init(disk* target_disk, std::uint64_t lba_start) {
}
if(sb->revision >= 1) {
- klibc::printf("ext2: detected features %s %s %s\r\n",(sb->s_feature_ro_compat & EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ? "EXT2_FEATURE_RO_COMPAT_LARGE_FILE" : "", (sb->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) ? "EXT4_FEATURE_INCOMPAT_64BIT" : "", (sb->s_feature_incompat & EXT4_FEATURE_INCOMPAT_EXTENTS) ? "EXT4_FEATURE_INCOMPAT_EXTENTS" : "");
+ log("ext2", "detected features %s %s %s",(sb->s_feature_ro_compat & EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ? "EXT2_FEATURE_RO_COMPAT_LARGE_FILE" : "", (sb->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) ? "EXT4_FEATURE_INCOMPAT_64BIT" : "", (sb->s_feature_incompat & EXT4_FEATURE_INCOMPAT_EXTENTS) ? "EXT4_FEATURE_INCOMPAT_EXTENTS" : "");
}
uint32_t groups_count = (ext2_blocks_count(sb) + sb->s_blocks_per_group - 1);
@@ -663,26 +691,28 @@ void drivers::ext2::init(disk* target_disk, std::uint64_t lba_start) {
ext2_load_group_descriptors(part);
- ext2_inode root = ext2_get_inode(part, 2);
- klibc::printf("inode 2 size %lli links count %lli mode 0x%p block_size %lli\r\n",root.i_size, root.i_links_count, root.i_mode, 1024 << part->sb->s_log_block_size);
- klibc::printf("logic blocks for root first block = %lli, second block = %lli\r\n", get_phys_block(part, &root, 0),get_phys_block(part, &root, 1));
(void)print_buffer;
- char* buffer2 = (char*)(pmm::freelist::alloc_4k() + etc::hhdm());
- ext2_read_block(part, get_phys_block(part, &root, 0), buffer2);
- klibc::printf("dumping first root block\r\n");
- print_buffer((const unsigned char*)buffer2, 1024 << part->sb->s_log_block_size);
+ // ext2_inode root = ext2_get_inode(part, 2);
+ // klibc::printf("inode 2 size %lli links count %lli mode 0x%p block_size %lli\r\n",root.i_size, root.i_links_count, root.i_mode, 1024 << part->sb->s_log_block_size);
+ // klibc::printf("logic blocks for root first block = %lli, second block = %lli\r\n", get_phys_block(part, &root, 0),get_phys_block(part, &root, 1));
+ // (void)print_buffer;
+
+ // char* buffer2 = (char*)(pmm::freelist::alloc_4k() + etc::hhdm());
+ // ext2_read_block(part, get_phys_block(part, &root, 0), buffer2);
+ // klibc::printf("dumping first root block\r\n");
+ // print_buffer((const unsigned char*)buffer2, 1024 << part->sb->s_log_block_size);
- const char* file_test = "/test1/meow";
- ext2_inode res = {};
- std::uint64_t in = 0;
- std::int32_t status = ext2_lookup(part, file_test, &res, &in);
+ // const char* file_test = "/test1/meow";
+ // ext2_inode res = {};
+ // std::uint64_t in = 0;
+ // std::int32_t status = ext2_lookup(part, file_test, &res, &in);
- klibc::memset(buffer2, 0, PAGE_SIZE);
- klibc::printf("reading file %s, status %d, size %lli\r\n", file_test, status, res.i_size);
- ext2_read_block(part, get_phys_block(part, &res, 0), buffer2);
- klibc::printf("%s\r\n", buffer2);
+ // klibc::memset(buffer2, 0, PAGE_SIZE);
+ // klibc::printf("reading file %s, status %d, size %lli\r\n", file_test, status, res.i_size);
+ // ext2_read_block(part, get_phys_block(part, &res, 0), buffer2);
+ // klibc::printf("%s\r\n", buffer2);
- klibc::printf("group count %lli (size %lli)\r\n",groups_count,groups_count * sizeof(ext2_group_desc));
+ // klibc::printf("group count %lli (size %lli)\r\n",groups_count,groups_count * sizeof(ext2_group_desc));
} \ No newline at end of file
diff --git a/kernel/src/drivers/ext2.hpp b/kernel/src/drivers/ext2.hpp
index 4fdcd3c..2fee3fb 100644
--- a/kernel/src/drivers/ext2.hpp
+++ b/kernel/src/drivers/ext2.hpp
@@ -105,6 +105,10 @@ struct ext2_inode {
uint32_t i_osd2[3];
};
+#define EXT2_S_IFMT 0xF000
+#define EXT2_S_IFLNK 0xA000
+#define EXT2_S_IFDIR 0040000
+
struct ext2_dir_entry {
uint32_t inode;
uint16_t rec_len;
diff --git a/kernel/src/drivers/mbr.hpp b/kernel/src/drivers/mbr.hpp
index 4a78a95..6fb81a1 100644
--- a/kernel/src/drivers/mbr.hpp
+++ b/kernel/src/drivers/mbr.hpp
@@ -3,7 +3,7 @@
// mbr headers
-#define MBR_ORANGE_TRACE
+//#define MBR_ORANGE_TRACE
struct __attribute__((packed)) mbr_partition {
std::uint8_t drive_status;
diff --git a/kernel/src/drivers/nvme.cpp b/kernel/src/drivers/nvme.cpp
index 7ec7a21..cbec409 100644
--- a/kernel/src/drivers/nvme.cpp
+++ b/kernel/src/drivers/nvme.cpp
@@ -186,7 +186,7 @@ bool nvme_identify_namespace(struct nvme_controller* ctrl, uint32_t nsid) {
}
ns->valid = true;
- klibc::printf("NVME: Detected namespace %d with lba_size %lli bytes and total size %lli bytes\r\n", nsid, ns->lba_size, ns->size * ns->lba_size);
+ log("nvme", "detected namespace %d with lba_size %lli bytes and total size %lli bytes", nsid, ns->lba_size, ns->size * ns->lba_size);
return true;
}
@@ -438,7 +438,7 @@ bool nvme_identify(nvme_controller* ctrl) {
char model[41];
klibc::memcpy(model, (void*)(phys_buffer + etc::hhdm() + 24), 40);
model[40] = '\0';
- klibc::printf("NVME: Controller Model: %s\r\n", model);
+ log("nvme", "controller Model: %s", model);
ctrl->identify = (void*)(phys_buffer + etc::hhdm());
@@ -505,7 +505,7 @@ void nvme_init(std::uint64_t base) {
void nvme_pci_init(pci_t pci, std::uint8_t a, std::uint8_t b, std::uint8_t c) {
if(pci.progIF == 2) { // nvme
std::uint32_t cmd = x86_64::pci::pci_read_config32(a,b,c,0x4);
- klibc::printf("NVME_PCI: Bus mastering %d, memory access %d\r\n",(cmd & (1 << 2)) ? 1 : 0, (cmd & (1 << 1)) ? 1 : 0);
+ log("nvme_pci", "bus mastering %d, memory access %d",(cmd & (1 << 2)) ? 1 : 0, (cmd & (1 << 1)) ? 1 : 0);
cmd |= 1 << 2;
cmd |= 1 << 1;
x86_64::pci::pci_write_config32(a,b,c,0x4,cmd);
diff --git a/kernel/src/drivers/powerbutton.cpp b/kernel/src/drivers/powerbutton.cpp
index f34bdb9..a1ce3e4 100644
--- a/kernel/src/drivers/powerbutton.cpp
+++ b/kernel/src/drivers/powerbutton.cpp
@@ -16,7 +16,7 @@ void drivers::powerbutton::init() {
UACPI_FIXED_EVENT_POWER_BUTTON,
handle_power_button, UACPI_NULL
);
- klibc::printf("PowerButton: Registered powerbutton at ip 0x%p\r\n",(std::uint64_t)handle_power_button);
+ log("powerbutton", "registered powerbutton at ip 0x%p",(std::uint64_t)handle_power_button);
}
#else
diff --git a/kernel/src/drivers/uacpi_kernel_api.cpp b/kernel/src/drivers/uacpi_kernel_api.cpp
index 1a4c5cb..ac8e4c4 100644
--- a/kernel/src/drivers/uacpi_kernel_api.cpp
+++ b/kernel/src/drivers/uacpi_kernel_api.cpp
@@ -36,7 +36,7 @@ void uacpi_kernel_unmap(void *addr, uacpi_size len) {
}
void uacpi_kernel_log(uacpi_log_level, const uacpi_char* msg) {
- klibc::printf("uACPI: %s\r", msg);
+ klibc::printf("\033[1;31muacpi\033[0m: %s\r", msg);
}
uacpi_status uacpi_kernel_pci_device_open(