diff options
Diffstat (limited to 'kernel/src/drivers')
| -rw-r--r-- | kernel/src/drivers/disk.cpp | 2 | ||||
| -rw-r--r-- | kernel/src/drivers/ext2.cpp | 74 | ||||
| -rw-r--r-- | kernel/src/drivers/ext2.hpp | 4 | ||||
| -rw-r--r-- | kernel/src/drivers/mbr.hpp | 2 | ||||
| -rw-r--r-- | kernel/src/drivers/nvme.cpp | 6 | ||||
| -rw-r--r-- | kernel/src/drivers/powerbutton.cpp | 2 | ||||
| -rw-r--r-- | kernel/src/drivers/uacpi_kernel_api.cpp | 2 |
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( |
