commit - e8059c1867bc82f1f97014db914b69187ce6c47b
commit + 9f442e154ffb1bf9c7bf317327fea00ee2d385e8
blob - 6bb4b712edf9d5821d2117660336f36366628705
blob + c3fba39129b4073242a9e30c75f445a83e2b40ab
--- kernel/arch/x86_64/isr.c
+++ kernel/arch/x86_64/isr.c
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;
__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
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
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);
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
#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 */
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;
}