Commit Diff


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;
 }