Compare commits

..

2 Commits

Author SHA1 Message Date
df95126ccd
kernel: Remove unneeded debug logs & random cleanups
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-14 21:10:38 +02:00
8c4ead0c0f
libc: Add more conversion specifiers to strftime 2023-04-14 21:08:50 +02:00
14 changed files with 46 additions and 50 deletions

View File

@ -1,3 +1,6 @@
target_compile_definitions(moon PRIVATE LOCKED_VALUE_DEBUG) target_compile_definitions(moon PRIVATE LOCKED_VALUE_DEBUG)
target_compile_definitions(moon PRIVATE DEBUG_MODE) target_compile_definitions(moon PRIVATE DEBUG_MODE)
target_compile_definitions(moon PRIVATE ELF_DEBUG)
target_compile_definitions(moon PRIVATE MMU_DEBUG)
target_compile_definitions(moon PRIVATE MMAP_DEBUG)
target_compile_options(moon PRIVATE -fsanitize=undefined) target_compile_options(moon PRIVATE -fsanitize=undefined)

View File

@ -32,48 +32,48 @@ namespace ELFLoader
if (nread < sizeof elf_header) if (nread < sizeof elf_header)
{ {
kdbgln("Error while loading ELF: ELF header does not fit in file"); kerrorln("Error while loading ELF: ELF header does not fit in file");
return err(ENOEXEC); return err(ENOEXEC);
} }
if (memcmp(elf_header.e_ident, ELFMAG, SELFMAG) != 0) if (memcmp(elf_header.e_ident, ELFMAG, SELFMAG) != 0)
{ {
kdbgln("Error while loading ELF: ELF header has no valid magic"); kerrorln("Error while loading ELF: ELF header has no valid magic");
return err(ENOEXEC); return err(ENOEXEC);
} }
if (elf_header.e_ident[EI_CLASS] != ELFCLASS64) if (elf_header.e_ident[EI_CLASS] != ELFCLASS64)
{ {
kdbgln("Error while loading ELF: ELF object is not 64-bit"); kerrorln("Error while loading ELF: ELF object is not 64-bit");
return err(ENOEXEC); return err(ENOEXEC);
} }
if (elf_header.e_ident[EI_DATA] != ELFDATA2LSB) if (elf_header.e_ident[EI_DATA] != ELFDATA2LSB)
{ {
kdbgln("Error while loading ELF: ELF object is not 2's complement little-endian"); kerrorln("Error while loading ELF: ELF object is not 2's complement little-endian");
return err(ENOEXEC); return err(ENOEXEC);
} }
if (elf_header.e_type != ET_EXEC) if (elf_header.e_type != ET_EXEC)
{ {
kdbgln("Error while loading ELF: ELF object is not an executable"); kerrorln("Error while loading ELF: ELF object is not an executable");
return err(ENOEXEC); return err(ENOEXEC);
} }
if (elf_header.e_machine != EM_MACH) if (elf_header.e_machine != EM_MACH)
{ {
kdbgln("Error while loading ELF: ELF object's target architecture does not match the current one (%s)", kerrorln("Error while loading ELF: ELF object's target architecture does not match the current one (%s)",
CPU::platform_string()); CPU::platform_string());
return err(ENOEXEC); return err(ENOEXEC);
} }
if (elf_header.e_phnum == 0) if (elf_header.e_phnum == 0)
{ {
kdbgln("Error while loading ELF: ELF object has no program headers"); kerrorln("Error while loading ELF: ELF object has no program headers");
return err(ENOEXEC); return err(ENOEXEC);
} }
kdbgln("ELF: Loading ELF with entry=%#.16lx", elf_header.e_entry); kinfoln("ELF: Loading ELF with entry=%#.16lx", elf_header.e_entry);
usize i; usize i;
Elf64_Phdr program_header; Elf64_Phdr program_header;
@ -85,9 +85,11 @@ namespace ELFLoader
{ {
if (program_header.p_type == PT_LOAD) if (program_header.p_type == PT_LOAD)
{ {
#ifdef ELF_DEBUG
kdbgln("ELF: Loading segment (offset=%zu, base=%#.16lx, filesize=%zu, memsize=%zu)", kdbgln("ELF: Loading segment (offset=%zu, base=%#.16lx, filesize=%zu, memsize=%zu)",
program_header.p_offset, program_header.p_vaddr, program_header.p_filesz, program_header.p_offset, program_header.p_vaddr, program_header.p_filesz,
program_header.p_memsz); program_header.p_memsz);
#endif
u64 base_vaddr = align_down<ARCH_PAGE_SIZE>(program_header.p_vaddr); u64 base_vaddr = align_down<ARCH_PAGE_SIZE>(program_header.p_vaddr);
u64 vaddr_diff = program_header.p_vaddr - base_vaddr; u64 vaddr_diff = program_header.p_vaddr - base_vaddr;
@ -109,7 +111,7 @@ namespace ELFLoader
memset((void*)(program_header.p_vaddr + program_header.p_filesz), 0, memset((void*)(program_header.p_vaddr + program_header.p_filesz), 0,
program_header.p_memsz - program_header.p_filesz); program_header.p_memsz - program_header.p_filesz);
} }
else { kdbgln("ELF: Encountered non-loadable program header, skipping"); } else { kwarnln("ELF: Encountered non-loadable program header, skipping"); }
} }
return ELFData { elf_header.e_entry }; return ELFData { elf_header.e_entry };

View File

@ -8,9 +8,6 @@
#include <luna/ScopeGuard.h> #include <luna/ScopeGuard.h>
#include <luna/SystemError.h> #include <luna/SystemError.h>
#pragma GCC push_options
#pragma GCC diagnostic ignored "-Wconversion"
PageDirectory* g_kernel_directory; PageDirectory* g_kernel_directory;
u64 g_kernel_directory_virt; u64 g_kernel_directory_virt;
@ -18,6 +15,9 @@ u64 g_kernel_directory_virt;
// physical memory at 0xFFFF800000000000. // physical memory at 0xFFFF800000000000.
u64 g_physical_mapping_base = 0; u64 g_physical_mapping_base = 0;
#pragma GCC push_options
#pragma GCC diagnostic ignored "-Wconversion"
void PageTableEntry::set_address(u64 addr) void PageTableEntry::set_address(u64 addr)
{ {
this->address = (addr >> 12); this->address = (addr >> 12);
@ -207,7 +207,7 @@ namespace MMU
if (flags & Flags::ReadWrite) l3.read_write = true; if (flags & Flags::ReadWrite) l3.read_write = true;
if (flags & Flags::User) l3.user = true; if (flags & Flags::User) l3.user = true;
if (l3.larger_pages) return err(EEXIST); if (l3.larger_pages) return err(ENOMEM);
auto& l2 = l2_entry(l3, virt); auto& l2 = l2_entry(l3, virt);
if (!l2.present) if (!l2.present)
@ -225,7 +225,7 @@ namespace MMU
if (flags & Flags::ReadWrite) l2.read_write = true; if (flags & Flags::ReadWrite) l2.read_write = true;
if (flags & Flags::User) l2.user = true; if (flags & Flags::User) l2.user = true;
if (l2.larger_pages) return err(EEXIST); if (l2.larger_pages) return err(ENOMEM);
else if (use_huge_pages == UseHugePages::Yes) else if (use_huge_pages == UseHugePages::Yes)
{ {
l2.larger_pages = true; l2.larger_pages = true;
@ -234,7 +234,7 @@ namespace MMU
} }
auto& l1 = l1_entry(l2, virt); auto& l1 = l1_entry(l2, virt);
if (l1.present) return err(EEXIST); // Please explicitly unmap the page before mapping it again. if (l1.present) return err(ENOMEM);
set_page_table_entry_properties(l1, phys, flags); set_page_table_entry_properties(l1, phys, flags);
return {}; return {};
} }
@ -296,7 +296,9 @@ namespace MMU
g_kernel_directory_virt = translate_physical((u64)g_kernel_directory); g_kernel_directory_virt = translate_physical((u64)g_kernel_directory);
#ifdef MMU_DEBUG
kdbgln("MMU init page directory (ring0): virt %#.16lx, phys %p", g_kernel_directory_virt, g_kernel_directory); kdbgln("MMU init page directory (ring0): virt %#.16lx, phys %p", g_kernel_directory_virt, g_kernel_directory);
#endif
} }
Result<PageDirectory*> create_page_directory_for_userspace() Result<PageDirectory*> create_page_directory_for_userspace()
@ -312,7 +314,9 @@ namespace MMU
memcpy(offset_ptr(directory, HALF_PAGE), offset_ptr((PageDirectory*)g_kernel_directory_virt, HALF_PAGE), memcpy(offset_ptr(directory, HALF_PAGE), offset_ptr((PageDirectory*)g_kernel_directory_virt, HALF_PAGE),
HALF_PAGE); HALF_PAGE);
#ifdef MMU_DEBUG
kdbgln("MMU init page directory (ring3): virt %p, phys %#.16lx", directory, directory_phys); kdbgln("MMU init page directory (ring3): virt %p, phys %#.16lx", directory, directory_phys);
#endif
return (PageDirectory*)directory_phys; return (PageDirectory*)directory_phys;
} }

View File

@ -44,8 +44,6 @@ namespace VFS
auto child_name = TRY(parser.basename()); auto child_name = TRY(parser.basename());
// kdbgln("vfs: creating directory '%s' in parent '%s'", child_name.chars(), parent_path.chars());
return parent_inode->create_subdirectory(child_name.chars()); return parent_inode->create_subdirectory(child_name.chars());
} }
@ -60,8 +58,6 @@ namespace VFS
auto child_name = TRY(parser.basename()); auto child_name = TRY(parser.basename());
// kdbgln("vfs: creating file '%s' in parent '%s'", child_name.chars(), parent_path.chars());
return parent_inode->create_file(child_name.chars()); return parent_inode->create_file(child_name.chars());
} }

View File

@ -33,7 +33,7 @@ namespace DeviceRegistry
if (descriptor.major == major && descriptor.minor == minor) return err(EEXIST); if (descriptor.major == major && descriptor.minor == minor) return err(EEXIST);
} }
kdbgln("device manager: registered new device type %u:%u", major, minor); kdbgln("DeviceRegistry: registered new device type %u:%u", major, minor);
return g_available_devices.try_append( return g_available_devices.try_append(
DeviceDescriptor { .initializer = initializer, .major = major, .minor = minor }); DeviceDescriptor { .initializer = initializer, .major = major, .minor = minor });

View File

@ -92,7 +92,6 @@ static u64 allocate_initial_kernel_stack()
// First page is a guard page, the rest is stack. // First page is a guard page, the rest is stack.
MMU::unmap(address); // Unmap (without deallocating VM) one guard page so that attempts to access it fail with a MMU::unmap(address); // Unmap (without deallocating VM) one guard page so that attempts to access it fail with a
// non-present page fault. // non-present page fault.
kdbgln("stack guard page: %p", (void*)address);
// The actual stack. // The actual stack.
Stack stack { address + ARCH_PAGE_SIZE, BOOTSTRAP_STACK_PAGES * ARCH_PAGE_SIZE }; Stack stack { address + ARCH_PAGE_SIZE, BOOTSTRAP_STACK_PAGES * ARCH_PAGE_SIZE };

View File

@ -40,7 +40,6 @@ Result<OwnedPtr<UserVM>> UserVM::clone()
UserVM::UserVM(void* base, usize size) UserVM::UserVM(void* base, usize size)
{ {
kdbgln("user vm created with base=%p, size=%zu", base, size);
m_bitmap.initialize(base, size); m_bitmap.initialize(base, size);
m_bitmap.clear(false); m_bitmap.clear(false);
} }
@ -57,8 +56,6 @@ Result<bool> UserVM::try_expand(usize size)
m_bitmap.resize(new_size); m_bitmap.resize(new_size);
m_bitmap.clear_region(old_size * 8, (new_size - old_size) * 8, false); m_bitmap.clear_region(old_size * 8, (new_size - old_size) * 8, false);
kdbgln("user vm expanded to base=%p, size=%zu", m_bitmap.location(), new_size);
return true; return true;
} }
@ -121,6 +118,5 @@ Result<bool> UserVM::free_several_pages(u64 address, usize count)
UserVM::~UserVM() UserVM::~UserVM()
{ {
kdbgln("user vm destroyed: base=%p, size=%zu", m_bitmap.location(), m_bitmap.size_in_bytes());
m_bitmap.deallocate(); m_bitmap.deallocate();
} }

View File

@ -51,13 +51,9 @@ Result<u64> sys_execve(Registers* regs, SyscallArgs args)
auto image = TRY(ThreadImage::try_load_from_elf(inode)); auto image = TRY(ThreadImage::try_load_from_elf(inode));
kdbgln("exec: copying argv to image memory (argc = %zu)", argv.size());
u64 user_argv = TRY(image->push_string_vector_on_stack(argv)); u64 user_argv = TRY(image->push_string_vector_on_stack(argv));
usize user_argc = argv.size(); usize user_argc = argv.size();
kdbgln("exec: copying envp to image memory (envc = %zu)", envp.size());
u64 user_envp = TRY(image->push_string_vector_on_stack(envp)); u64 user_envp = TRY(image->push_string_vector_on_stack(envp));
usize user_envc = envp.size(); usize user_envc = envp.size();
@ -89,8 +85,6 @@ Result<u64> sys_execve(Registers* regs, SyscallArgs args)
memcpy(regs, &current->regs, sizeof(*regs)); memcpy(regs, &current->regs, sizeof(*regs));
kinfoln("exec: done");
return 0; return 0;
} }
@ -100,8 +94,6 @@ Result<u64> sys_fork(Registers* regs, SyscallArgs)
auto guard = make_scope_guard([current] { MMU::switch_page_directory(current->directory); }); auto guard = make_scope_guard([current] { MMU::switch_page_directory(current->directory); });
kinfoln("fork: trying to duplicate process %lu", current->id);
memcpy(&current->regs, regs, sizeof(*regs)); memcpy(&current->regs, regs, sizeof(*regs));
auto current_directory_path = TRY(current->current_directory_path.clone()); auto current_directory_path = TRY(current->current_directory_path.clone());
@ -129,5 +121,7 @@ Result<u64> sys_fork(Registers* regs, SyscallArgs)
Scheduler::add_thread(thread); Scheduler::add_thread(thread);
kinfoln("fork: thread %lu forked into child %lu", current->id, thread->id);
return thread->id; return thread->id;
} }

View File

@ -11,8 +11,6 @@ Result<u64> sys_mkdir(Registers*, SyscallArgs args)
Thread* current = Scheduler::current(); Thread* current = Scheduler::current();
kinfoln("mkdir: attempting to create %s", path.chars());
auto inode = TRY(VFS::create_directory(path.chars(), current->auth, current->current_directory)); auto inode = TRY(VFS::create_directory(path.chars(), current->auth, current->current_directory));
inode->chmod(mode); inode->chmod(mode);
inode->chown(current->auth.euid, current->auth.egid); inode->chown(current->auth.euid, current->auth.egid);

View File

@ -17,8 +17,6 @@ Result<u64> sys_mknod(Registers*, SyscallArgs args)
u32 maj = luna_dev_major(dev); u32 maj = luna_dev_major(dev);
u32 min = luna_dev_minor(dev); u32 min = luna_dev_minor(dev);
kdbgln("mknod: attempting to create device %u:%u in path %s", maj, min, path.chars());
auto parser = TRY(PathParser::create(path.chars())); auto parser = TRY(PathParser::create(path.chars()));
auto dirname = TRY(parser.dirname()); auto dirname = TRY(parser.dirname());

View File

@ -49,7 +49,9 @@ Result<u64> sys_mmap(Registers*, SyscallArgs args)
if (prot & PROT_EXEC) mmu_flags &= ~MMU::NoExecute; if (prot & PROT_EXEC) mmu_flags &= ~MMU::NoExecute;
if (prot == PROT_NONE) mmu_flags = MMU::NoExecute; if (prot == PROT_NONE) mmu_flags = MMU::NoExecute;
#ifdef MMAP_DEBUG
kdbgln("mmap: mapping memory at %#lx, size=%zu", address, len); kdbgln("mmap: mapping memory at %#lx, size=%zu", address, len);
#endif
return MemoryManager::alloc_at(address, get_blocks_from_size(len, ARCH_PAGE_SIZE), mmu_flags); return MemoryManager::alloc_at(address, get_blocks_from_size(len, ARCH_PAGE_SIZE), mmu_flags);
} }
@ -69,7 +71,9 @@ Result<u64> sys_munmap(Registers*, SyscallArgs args)
// POSIX says munmap should silently do nothing if the memory was not already mapped. // POSIX says munmap should silently do nothing if the memory was not already mapped.
if (!ok) return 0; if (!ok) return 0;
#ifdef MMAP_DEBUG
kdbgln("munmap: unmapping memory at %#lx, size=%zu", address, size); kdbgln("munmap: unmapping memory at %#lx, size=%zu", address, size);
#endif
TRY(MemoryManager::unmap_owned(address, get_blocks_from_size(size, ARCH_PAGE_SIZE))); TRY(MemoryManager::unmap_owned(address, get_blocks_from_size(size, ARCH_PAGE_SIZE)));

View File

@ -17,8 +17,6 @@ Result<u64> sys_open(Registers*, SyscallArgs args)
Thread* current = Scheduler::current(); Thread* current = Scheduler::current();
kinfoln("open: trying to open file %s, flags %d", path.chars(), flags);
SharedPtr<VFS::Inode> inode; SharedPtr<VFS::Inode> inode;
// Caller did not pass either O_RDONLY, O_WRONLY or O_RDWR // Caller did not pass either O_RDONLY, O_WRONLY or O_RDWR
@ -54,7 +52,7 @@ Result<u64> sys_open(Registers*, SyscallArgs args)
current->fd_table[fd] = FileDescriptor { inode, 0, flags & FLAGS_TO_KEEP }; current->fd_table[fd] = FileDescriptor { inode, 0, flags & FLAGS_TO_KEEP };
kinfoln("open: allocated file descriptor %d for inode %zu", fd, inode->inode_number()); kinfoln("open: opening file %s, flags %d, mode %#o = fd %d", path.chars(), flags, mode, fd);
return (u64)fd; return (u64)fd;
} }
@ -70,8 +68,6 @@ Result<u64> sys_close(Registers*, SyscallArgs args)
if (!descriptor.has_value()) return err(EBADF); if (!descriptor.has_value()) return err(EBADF);
kinfoln("close: closing file descriptor %d (was referencing inode %zu)", fd, descriptor->inode->inode_number());
descriptor = {}; descriptor = {};
return 0; return 0;

View File

@ -157,15 +157,11 @@ namespace Scheduler
if (thread->is_kernel) if (thread->is_kernel)
{ {
auto stack = thread->stack; auto stack = thread->stack;
// FIXME: Propagate errors I guess?
kinfoln("deleting stack @ %#lx", stack.bottom());
MemoryManager::unmap_owned_and_free_vm(stack.bottom(), stack.bytes() / ARCH_PAGE_SIZE).release_value(); MemoryManager::unmap_owned_and_free_vm(stack.bottom(), stack.bytes() / ARCH_PAGE_SIZE).release_value();
} }
else else
{ {
auto stack = thread->kernel_stack; auto stack = thread->kernel_stack;
kinfoln("deleting kstack @ %#lx", stack.bottom());
// FIXME: Propagate errors I guess?
MemoryManager::unmap_owned_and_free_vm(stack.bottom(), stack.bytes() / ARCH_PAGE_SIZE).release_value(); MemoryManager::unmap_owned_and_free_vm(stack.bottom(), stack.bytes() / ARCH_PAGE_SIZE).release_value();
} }

View File

@ -84,7 +84,12 @@ extern "C"
case 'B': case 'B':
if (!try_put_string(state, mon_names[tm->tm_mon])) return 0; if (!try_put_string(state, mon_names[tm->tm_mon])) return 0;
break; break;
case 'c': todo(); case 'c':
if (!try_format(state, "%s %s %.2d %.2d:%.2d:%.2d %d", abday_names[tm->tm_wday],
abmon_names[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
tm->tm_year + 1900))
return 0;
break;
case 'd': case 'd':
if (!try_format(state, "%.2d", tm->tm_mday)) return 0; if (!try_format(state, "%.2d", tm->tm_mday)) return 0;
break; break;
@ -117,8 +122,13 @@ extern "C"
case 'S': case 'S':
if (!try_format(state, "%.2d", tm->tm_sec)) return 0; if (!try_format(state, "%.2d", tm->tm_sec)) return 0;
break; break;
case 'x': todo(); case 'x':
case 'X': todo(); // Sorry, Americans, but I ain't doing m/d/y.
if (!try_format(state, "%.2d/%.2d/%.2d", tm->tm_mday, tm->tm_mon + 1, tm->tm_year + 1900)) return 0;
break;
case 'X':
if (!try_format(state, "%.2d:%.2d:%.2d", tm->tm_hour, tm->tm_min, tm->tm_sec)) return 0;
break;
case 'y': case 'y':
if (!try_format(state, "%.2d", (tm->tm_year + 1900) % 100)) return 0; if (!try_format(state, "%.2d", (tm->tm_year + 1900) % 100)) return 0;
break; break;