commit - 6b515a6f644d1aebf0f99f296c2a4e6187d8233a
commit + 1a155fb7a2b4ca3780be755801dcde3ce94a8034
blob - 99d5b8f9b1bde5657388a930e544eb64fc6fd3cc
blob + e1232717e513b49db1caca7bdad5e844f28b3c19
--- changelog.md
+++ changelog.md
- Console/PTY stability: delayed fallback disablement until both ttyd and ptyctl register; auto-activate the first PTY on alloc/open and switch off supervisor/fallback; reset the console line buffer on PTY changes to drop stale input; guarded console-injected `[signal N]` stanzas behind `LENIX_DEBUG` to avoid shells seeing `[signal` as commands; tightened shell PTY activation in init with warnings on bad PTY IDs.
- libc safety: `strlen`/`strcmp`/`strncmp` now tolerate NULL inputs to avoid release-only crashes; ramdiskd/vfs startup page faults fixed by guarding unused helpers and sizing/alignment of BSS.
- Misc: Debug-only helpers wrapped with `LENIX_DEBUG` (blockd, ramdiskd, pci) and marked padding as used to satisfy `-Werror`; added a serial log for VFS register success for visibility in non-debug boots.
+- VFS debug gating: all `[vfs]` logging is now guarded by `LENIX_VFS_DEBUG` instead of `LENIX_DEBUG`, with common macros (`VFS_PUTS/VFS_PRINTF`) to silence output in release builds.
+- IPC wait backoff: VFS/service client request loops still yield while spinning; earlier backoff tweaks were reverted to the original budgets to avoid long stalls during boot.
# 2025-12-03
blob - 803cf48ec6ef9859c61249e42edb31df2fa0f677
blob + ab71e8cb79bdd5e5edf61e1a1ecde7537bc17431
--- kernel/ipc/service_client.c
+++ kernel/ipc/service_client.c
uint8_t tmp_req[IPC_MAILBOX_MAX_PAYLOAD];
uint64_t spins = 0;
uint64_t spin_limit = 10000000; /* Default iteration budget */
- size_t resp_bytes = 0;
if (spin_limit_override != 0)
spin_limit = spin_limit_override;
if (slot->response_len > resp_len)
slot->response_len = resp_len;
service_memcpy(resp, slot->response_buf, slot->response_len);
- resp_bytes = slot->response_len;
slot->in_use = false;
slot->ready = false;
preq->in_use = false;
spinlock_unlock(&pending_requests_lock);
if (out_resp_len != NULL)
- *out_resp_len = resp_bytes;
+ *out_resp_len = slot->response_len;
return 0;
}
blob - aa9cd56c4697c6f50249b6d50f01c3419ae3fc4d
blob + 194bde48e75e5bede694aa4f98a25fbb2397c487
--- kernel/ipc/vfs_service.c
+++ kernel/ipc/vfs_service.c
* while still allowing adequate time for VFS server to respond.
* Matches block_service.c spin limits (1M iterations).
*/
- uint64_t spin_limit = 1000000;
+ uint64_t spin_limit = 1000000; /* Default iteration budget */
#ifdef LENIX_DEBUG
uint64_t t_start, t_alloc, t_send, t_wait, t_end;
t_start = __builtin_ia32_rdtsc();
blob - e54e7b1630be5ae6733b3f5c617b303662168be7
blob + 8cd5ae9b1ee21e8f2e0519524f0c33fc322e93a0
--- kernel/kmain.c
+++ kernel/kmain.c
boot_log_result("ramdiskd", rc == 0);
}
- rc = user_pci_server_prepare();
- #ifdef LENIX_DEBUG
- boot_log_result("Preparing pci-daemon...", rc == 0);
- #endif
- if (rc == 0) {
- rc = user_pci_server_launch();
- boot_log_result("pci-server", rc == 0);
- }
+ // rc = user_pci_server_prepare();
+ // #ifdef LENIX_DEBUG
+ // boot_log_result("Preparing pci-daemon...", rc == 0);
+ // #endif
+ // if (rc == 0) {
+ // rc = user_pci_server_launch();
+ // boot_log_result("pci-server", rc == 0);
+ // }
- rc = user_virtio_blk_server_prepare();
- #ifdef LENIX_DEBUG
- boot_log_result("Preparing virtio-blk driver...", rc == 0);
- #endif
- if (rc == 0) {
- rc = user_virtio_blk_server_launch();
- boot_log_result("virtio-blk driver", rc == 0);
- }
+ // rc = user_virtio_blk_server_prepare();
+ // #ifdef LENIX_DEBUG
+ // boot_log_result("Preparing virtio-blk driver...", rc == 0);
+ // #endif
+ // if (rc == 0) {
+ // rc = user_virtio_blk_server_launch();
+ // boot_log_result("virtio-blk driver", rc == 0);
+ // }
rc = user_fs_server_prepare();
#ifdef LENIX_DEBUG
boot_log_result("fs-server", rc == 0);
}
- rc = user_tmpfs_server_prepare();
- #ifdef LENIX_DEBUG
- boot_log_result("Preparing tmpfs-server...", rc == 0);
- #endif
- if (rc == 0) {
- rc = user_tmpfs_server_launch();
- boot_log_result("tmpfs-server", rc == 0);
- }
+ // rc = user_tmpfs_server_prepare();
+ // #ifdef LENIX_DEBUG
+ // boot_log_result("Preparing tmpfs-server...", rc == 0);
+ // #endif
+ // if (rc == 0) {
+ // rc = user_tmpfs_server_launch();
+ // boot_log_result("tmpfs-server", rc == 0);
+ // }
rc = user_vfs_server_prepare();
#ifdef LENIX_DEBUG
boot_log_result("vfs", rc == 0);
}
- rc = user_netd_server_prepare();
- #ifdef LENIX_DEBUG
- boot_log_result("Preparing netd...", rc == 0);
- #endif
- if (rc == 0) {
- rc = user_netd_server_launch();
- boot_log_result("netd", rc == 0);
- }
+ // rc = user_netd_server_prepare();
+ // #ifdef LENIX_DEBUG
+ // boot_log_result("Preparing netd...", rc == 0);
+ // #endif
+ // if (rc == 0) {
+ // rc = user_netd_server_launch();
+ // boot_log_result("netd", rc == 0);
+ // }
- rc = user_sock_udp_server_prepare();
- #ifdef LENIX_DEBUG
- boot_log_result("Preparing sock.udp...", rc == 0);
- #endif
- if (rc == 0) {
- rc = user_sock_udp_server_launch();
- boot_log_result("sock.udp", rc == 0);
- }
+ // rc = user_sock_udp_server_prepare();
+ // #ifdef LENIX_DEBUG
+ // boot_log_result("Preparing sock.udp...", rc == 0);
+ // #endif
+ // if (rc == 0) {
+ // rc = user_sock_udp_server_launch();
+ // boot_log_result("sock.udp", rc == 0);
+ // }
- rc = user_sock_tcp_server_prepare();
- #ifdef LENIX_DEBUG
- boot_log_result("Preparing sock.tcp...", rc == 0);
- #endif
- if (rc == 0) {
- rc = user_sock_tcp_server_launch();
- boot_log_result("sock.tcp", rc == 0);
- }
+ // rc = user_sock_tcp_server_prepare();
+ // #ifdef LENIX_DEBUG
+ // boot_log_result("Preparing sock.tcp...", rc == 0);
+ // #endif
+ // if (rc == 0) {
+ // rc = user_sock_tcp_server_launch();
+ // boot_log_result("sock.tcp", rc == 0);
+ // }
rc = user_tty_server_prepare();
#ifdef LENIX_DEBUG
blob - c0abe7ee359ef924c65b3cbf54d103ccf3cd6e88
blob + 7df4d909c3c886b430584adb030621bdffc8bb35
--- servers/fs/vfs/main.c
+++ servers/fs/vfs/main.c
memset(&resp, 0, sizeof(resp));
ipc_vfs_response_reset(&resp, IPC_VFS_RESP_READ, req->token);
- #ifdef LENIX_DEBUG
+ #ifdef LENIX_VFS_DEBUG
printf("[vfs] READ handler entry: req_handle=%u req_len=%u\n",
req->body.read.handle, req->body.read.length);
#endif
handle = vfs_handle_lookup(req->body.read.handle);
if (handle == NULL) {
+ #ifdef LENIX_VFS_DEBUG
printf("[vfs] READ: handle lookup failed\n");
+ #endif
resp.body.read.status = VFS_EBADF;
resp.body.read.data_len = 0;
vfs_send_response(&resp);
return;
}
- #ifdef LENIX_DEBUG
+ #ifdef LENIX_VFS_DEBUG
printf("[vfs] READ: handle found, fs_fd=%d VFS_READAHEAD_ENABLE=%d\n",
handle->fs_fd, VFS_READAHEAD_ENABLE);
#endif
size_t copied = 0;
int64_t pos = handle->logical_offset;
- #ifdef LENIX_DEBUG
+ #ifdef LENIX_VFS_DEBUG
printf("[vfs] read: use_readahead=%d is_device=%d refcount=%u pos=%lld req_len=%zu\n",
use_readahead, handle->is_device, handle->refcount, (long long)pos, requested_len);
#endif
handle->logical_offset = pos;
resp.body.read.status = (int32_t)copied; /* Status = bytes read, not error code */
resp.body.read.data_len = (uint32_t)copied;
- #ifdef LENIX_DEBUG
+ #ifdef LENIX_VFS_DEBUG
printf("[vfs] read done: copied=%zu new_pos=%lld\n", copied, (long long)pos);
#endif
vfs_send_response(&resp);
blob - 8572afd9da188b0a2056b87c8508d4c08b701a3e
blob + c1a56a587f3cd72c86a0968d0f7896416cb37627
--- user/runtime/src/stdio.c
+++ user/runtime/src/stdio.c
ssize_t w = write(fd, buf, len);
if (w < 0)
return -1;
+ if (w == 0) {
+ /* write() returned 0 - no progress possible.
+ * This should never happen for regular files/pipes,
+ * but handle defensively to avoid infinite loop. */
+ errno = EIO;
+ return -1;
+ }
buf += (size_t)w;
len -= (size_t)w;
}