commit 9f442e154ffb1bf9c7bf317327fea00ee2d385e8 from: int16h date: Fri Dec 5 00:26:03 2025 UTC Debug: instrumentation for an unknown opcode error in ls. Fix: increase ext2 file handles to 256 commit - e8059c1867bc82f1f97014db914b69187ce6c47b commit + 9f442e154ffb1bf9c7bf317327fea00ee2d385e8 blob - 6bb4b712edf9d5821d2117660336f36366628705 blob + c3fba39129b4073242a9e30c75f445a83e2b40ab --- kernel/arch/x86_64/isr.c +++ kernel/arch/x86_64/isr.c @@ -34,6 +34,7 @@ static void x86_log_gpf(uint64_t); static inline uint64_t x86_read_cr2(void); extern uint64_t x86_syscall_last_rcx; static void x86_dump_user_stack(uint64_t rsp); +static void x86_dump_kernel_stack(uint64_t rsp); volatile uint64_t x86_last_iret_cs; @@ -146,7 +147,10 @@ x86_fault_divide(struct interrupt_frame *frame) __attribute__((interrupt)) static void x86_fault_invalid_opcode(struct interrupt_frame *frame) { - x86_exception_panic("invalid opcode", frame, 0, false); + printk("[trap] invalid opcode\n"); + x86_exception_log_frame(frame); + x86_dump_kernel_stack(frame->rsp); + panic("invalid opcode"); } __attribute__((interrupt)) static void @@ -221,6 +225,23 @@ x86_dump_user_stack(uint64_t rsp) printk("\n"); } +static void +x86_dump_kernel_stack(uint64_t rsp) +{ + uint64_t *p = (uint64_t *)rsp; + const size_t max_words = 8; + + if (p == NULL) + return; + printk(" kstack snapshot from rsp="); + trap_print_hex64("", rsp); + printk("\n"); + for (size_t i = 0; i < max_words; i++) { + trap_print_hex64(" ", p[i]); + } + printk("\n"); +} + void x86_exception_init(void) { blob - 37773657b33a89a8d0371eb6f05cbf2e49ad78f2 blob + dbfad6f1bbf8ba403824ac4c1dff6e3309e13c96 --- kernel/sys/syscall.c +++ kernel/sys/syscall.c @@ -8073,6 +8073,7 @@ sys_getdents_impl(uint64_t fd, uint64_t buf_addr, uint struct ipc_vfs_response resp; struct sys_fd_entry *entry; size_t to_copy; + static uint32_t ebadf_log; if (buf_addr == 0 || len == 0) return syscall_make_result(-SYSCALL_EINVAL, 0); @@ -8080,8 +8081,17 @@ sys_getdents_impl(uint64_t fd, uint64_t buf_addr, uint return syscall_make_result(-SYSCALL_ENOSYS, 0); entry = sys_fd_entry_lookup((int)fd); - if (entry == NULL) + if (entry == NULL) { + if (ebadf_log < 4) { + printk("[sys_getdents] EBADF fd="); + printk_dec((int64_t)fd); + printk(" pid="); + printk_dec((int64_t)sched_current_task_id()); + printk("\n"); + ebadf_log++; + } return syscall_make_result(-SYSCALL_EBADF, 0); + } if (entry->is_device) return syscall_make_result(-SYSCALL_ENOTSUP, 0); blob - b518395d87e6688d7d6fe0cd158bacba5ca22d6f blob + 1a9d1478349d730bee04745f857a905e9654d1b9 --- servers/fs/ext2/main.c +++ servers/fs/ext2/main.c @@ -21,7 +21,7 @@ #define EXT2_SECTOR_SIZE 512U #define EXT2_MAX_BLOCK_SIZE 4096U #define EXT2_FD_BASE 64 -#define EXT2_MAX_HANDLES 32 +#define EXT2_MAX_HANDLES 256 #define EXT2_SYMLINK_MAX_FOLLOW 8 /* Read-ahead cache configuration */ @@ -2075,6 +2075,11 @@ ext2_handle_alloc_slot(void) ext2_handles[i].type = EXT2_HANDLE_NONE; return &ext2_handles[i]; } + static int alloc_warn; + if (alloc_warn < 4) { + printf("[ext2] handle table full (%d entries)\n", EXT2_MAX_HANDLES); + alloc_warn++; + } return NULL; }