Skip to content

Reorganize docs and add clamping/stacking paragraphs#711

Draft
rennergade wants to merge 13 commits intomainfrom
docs-grates-and-reorg
Draft

Reorganize docs and add clamping/stacking paragraphs#711
rennergade wants to merge 13 commits intomainfrom
docs-grates-and-reorg

Conversation

@rennergade
Copy link
Contributor

Changes

Added a clear description of grate stacking, including the possible outcomes of interception (handle-and-pass, handle-only, no interception, and blocking).

Added documentation for grate clamping, explaining how ancestor grates interpose at handler registration time to enforce routing structure on descendants.

Separated concerns between 3i (mechanism) and grates (policy/services) by moving grate-specific behavior out of the 3i overview.

@rennergade rennergade requested a review from Yaxuan-w February 7, 2026 22:29
@github-actions
Copy link
Contributor

github-actions bot commented Feb 7, 2026

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases142
Number of Successes142
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chartests.cSuccessNone
Success
chdir_getcwd.cSuccessNone
Success
chmod.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
cloexec.cSuccessNone
Success
close.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dup.cSuccessNone
Success
dup2.cSuccessNone
Success
dup3.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchdir.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
flock.cSuccessNone
Success
fstat.cSuccessNone
Success
fstatfs.cSuccessNone
Success
fsync.cSuccessNone
Success
ftruncate.cSuccessNone
Success
getcwd.cSuccessNone
Success
getrandom.cSuccessNone
Success
ioctl.cSuccessNone
Success
link.cSuccessNone
Success
lseek.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
read.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
readlinkat.cSuccessNone
Success
rename.cSuccessNone
Success
sc-writev.cSuccessNone
Success
stat.cSuccessNone
Success
statfs.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlink.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
writev.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
malloc_large.cSuccessNone
Success
memcpy.cSuccessNone
Success
memory_error_test.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_file.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
shmtest.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
epollcreate1.cSuccessNone
Success
gethostname.cSuccessNone
Success
getsockopt.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipepong.cSuccessNone
Success
pipewrite.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
serverclient.cSuccessNone
Success
shutdown.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketepoll.cSuccessNone
Success
socketpair.cSuccessNone
Success
socketselect.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
uds-getsockname.cSuccessNone
Success
uds-socketselect.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
fork.cSuccessNone
Success
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
fork_syscall.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkdup.cSuccessNone
Success
forkexecuid.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getegid_syscall.cSuccessNone
Success
getgid_syscall.cSuccessNone
Success
getpid.cSuccessNone
Success
getpid_syscall.cSuccessNone
Success
getppid.cSuccessNone
Success
getppid_syscall.cSuccessNone
Success
getuid.cSuccessNone
Success
getuid_syscall.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
mutex.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cSuccessNone
Success
setsid.cSuccessNone
Success
template.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_anychild.cSuccessNone
Success
waitpid_syscall.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_ignored.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Fail Tests

Summary

MetricCount
Total Test Cases1
Number of Successes1
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
Memory Tests
mmap-negative1.cSuccessNone
Success

Copy link
Member

@Yaxuan-w Yaxuan-w left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for reorganization and adding stacking/clamping for grates! It looks good. Left some suggestions to make it more fluent.

@@ -0,0 +1,73 @@
# Grates

A grate is a cage whose primary role is to intercept and handle system calls issued by other cages. Lind makes no distinction between cages and grates; any cage may register system call handlers and thereby act as a grate.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

any cage may register system call handlers and thereby act as a grate

Does this mean the cage executing register_handler or the one implementing syscall handler functions?

If it's the first one, then it's not true on our current model. Probably worth being more precise here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not 100% sure what you're saying here. Can you elaborate?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm guessing a grate needs to export pass_fptr_to_wt

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The way to distinguish grate and cage is by their functionality: whether the current cage handles some operations for syscalls. We write registering handlers logics in grates, but the operation is actually happens in the cage's process. The grate typically doesn't register handlers for a cage, but the cage will register handlers for itself.

any cage may register system call handlers and thereby act as a grate.

It's quite confused to mention in this way..

@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases144
Number of Successes144
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chartests.cSuccessNone
Success
chdir_getcwd.cSuccessNone
Success
chmod.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
cloexec.cSuccessNone
Success
close.cSuccessNone
Success
creat_access.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dup.cSuccessNone
Success
dup2.cSuccessNone
Success
dup3.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchdir.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
flock.cSuccessNone
Success
fstat.cSuccessNone
Success
fstatfs.cSuccessNone
Success
fsync.cSuccessNone
Success
ftruncate.cSuccessNone
Success
getcwd.cSuccessNone
Success
getrandom.cSuccessNone
Success
ioctl.cSuccessNone
Success
link.cSuccessNone
Success
lseek.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
read.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
readlinkat.cSuccessNone
Success
rename.cSuccessNone
Success
sc-writev.cSuccessNone
Success
stat.cSuccessNone
Success
statfs.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlink.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
writev.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
malloc_large.cSuccessNone
Success
memcpy.cSuccessNone
Success
memory_error_test.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_file.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
mmaptest.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
shmtest.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
epollcreate1.cSuccessNone
Success
gethostname.cSuccessNone
Success
getsockopt.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipepong.cSuccessNone
Success
pipewrite.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
serverclient.cSuccessNone
Success
shutdown.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketepoll.cSuccessNone
Success
socketpair.cSuccessNone
Success
socketselect.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
uds-getsockname.cSuccessNone
Success
uds-socketselect.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
fork.cSuccessNone
Success
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
fork_syscall.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkdup.cSuccessNone
Success
forkexecuid.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getegid_syscall.cSuccessNone
Success
getgid_syscall.cSuccessNone
Success
getpid.cSuccessNone
Success
getpid_syscall.cSuccessNone
Success
getppid.cSuccessNone
Success
getppid_syscall.cSuccessNone
Success
getuid.cSuccessNone
Success
getuid_syscall.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
mutex.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cSuccessNone
Success
setsid.cSuccessNone
Success
template.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_anychild.cSuccessNone
Success
waitpid_syscall.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_ignored.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Fail Tests

Summary

MetricCount
Total Test Cases1
Number of Successes1
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
Memory Tests
mmap-negative1.cSuccessNone
Success

Co-authored-by: Justin Cappos <justincappos@gmail.com>
@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases145
Number of Successes145
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chartests.cSuccessNone
Success
chdir_getcwd.cSuccessNone
Success
chmod.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
cloexec.cSuccessNone
Success
close.cSuccessNone
Success
creat_access.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dup.cSuccessNone
Success
dup2.cSuccessNone
Success
dup3.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchdir.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
flock.cSuccessNone
Success
fstat.cSuccessNone
Success
fstatfs.cSuccessNone
Success
fsync.cSuccessNone
Success
ftruncate.cSuccessNone
Success
getcwd.cSuccessNone
Success
getrandom.cSuccessNone
Success
ioctl.cSuccessNone
Success
link.cSuccessNone
Success
lseek.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
read.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
readlinkat.cSuccessNone
Success
rename.cSuccessNone
Success
sc-writev.cSuccessNone
Success
stat.cSuccessNone
Success
statfs.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlink.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
writev.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
malloc_large.cSuccessNone
Success
memcpy.cSuccessNone
Success
memory_error_test.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_file.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
mmaptest.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
shmtest.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
epollcreate1.cSuccessNone
Success
gethostname.cSuccessNone
Success
getsockname.cSuccessNone
Success
getsockopt.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipepong.cSuccessNone
Success
pipewrite.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
serverclient.cSuccessNone
Success
shutdown.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketepoll.cSuccessNone
Success
socketpair.cSuccessNone
Success
socketselect.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
uds-getsockname.cSuccessNone
Success
uds-socketselect.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
fork.cSuccessNone
Success
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
fork_syscall.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkdup.cSuccessNone
Success
forkexecuid.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getegid_syscall.cSuccessNone
Success
getgid_syscall.cSuccessNone
Success
getpid.cSuccessNone
Success
getpid_syscall.cSuccessNone
Success
getppid.cSuccessNone
Success
getppid_syscall.cSuccessNone
Success
getuid.cSuccessNone
Success
getuid_syscall.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
mutex.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cSuccessNone
Success
setsid.cSuccessNone
Success
template.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_anychild.cSuccessNone
Success
waitpid_syscall.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_ignored.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Fail Tests

Summary

MetricCount
Total Test Cases1
Number of Successes1
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
Memory Tests
mmap-negative1.cSuccessNone
Success

@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases145
Number of Successes145
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
File Tests
chartests.cSuccessNone
Success
chdir_getcwd.cSuccessNone
Success
chmod.cSuccessNone
Success
clock_gettime_highlevel.cSuccessNone
Success
clock_gettime_simple.cSuccessNone
Success
cloexec.cSuccessNone
Success
close.cSuccessNone
Success
creat_access.cSuccessNone
Success
doubleclose.cSuccessNone
Success
dup.cSuccessNone
Success
dup2.cSuccessNone
Success
dup3.cSuccessNone
Success
dupwrite.cSuccessNone
Success
fchdir.cSuccessNone
Success
fchmod.cSuccessNone
Success
fcntl.cSuccessNone
Success
fdatasync.cSuccessNone
Success
filetest.cSuccessNone
Success
filetest1000.cSuccessNone
Success
flock.cSuccessNone
Success
fstat.cSuccessNone
Success
fstatfs.cSuccessNone
Success
fsync.cSuccessNone
Success
ftruncate.cSuccessNone
Success
getcwd.cSuccessNone
Success
getrandom.cSuccessNone
Success
ioctl.cSuccessNone
Success
link.cSuccessNone
Success
lseek.cSuccessNone
Success
mkdir_rmdir.cSuccessNone
Success
open.cSuccessNone
Success
pread_pwrite.cSuccessNone
Success
printf.cSuccessNone
Success
read.cSuccessNone
Success
readbytes.cSuccessNone
Success
readlink.cSuccessNone
Success
readlinkat.cSuccessNone
Success
rename.cSuccessNone
Success
sc-writev.cSuccessNone
Success
stat.cSuccessNone
Success
statfs.cSuccessNone
Success
sync_file_range.cSuccessNone
Success
truncate.cSuccessNone
Success
unlink.cSuccessNone
Success
unlinkat.cSuccessNone
Success
write.cSuccessNone
Success
writeloop.cSuccessNone
Success
writepartial.cSuccessNone
Success
writev.cSuccessNone
Success
Memory Tests
brk.cSuccessNone
Success
malloc.cSuccessNone
Success
malloc_large.cSuccessNone
Success
memcpy.cSuccessNone
Success
memory_error_test.cSuccessNone
Success
mmap.cSuccessNone
Success
mmap_aligned.cSuccessNone
Success
mmap_complicated.cSuccessNone
Success
mmap_file.cSuccessNone
Success
mmap_shared.cSuccessNone
Success
mmaptest.cSuccessNone
Success
mprotect.cSuccessNone
Success
mprotect_boundary.cSuccessNone
Success
mprotect_end_region.cSuccessNone
Success
mprotect_middle_region.cSuccessNone
Success
mprotect_multiple_times.cSuccessNone
Success
mprotect_same_value.cSuccessNone
Success
mprotect_spanning_regions.cSuccessNone
Success
sbrk.cSuccessNone
Success
segfault.cSuccessNone
Success
shm.cSuccessNone
Success
shmtest.cSuccessNone
Success
vtable.cSuccessNone
Success
Networking Tests
dnstest.cSuccessNone
Success
epollcreate1.cSuccessNone
Success
gethostname.cSuccessNone
Success
getsockname.cSuccessNone
Success
getsockopt.cSuccessNone
Success
makepipe.cSuccessNone
Success
pipe.cSuccessNone
Success
pipe2.cSuccessNone
Success
pipeinput.cSuccessNone
Success
pipeinput2.cSuccessNone
Success
pipeonestring.cSuccessNone
Success
pipepong.cSuccessNone
Success
pipewrite.cSuccessNone
Success
poll.cSuccessNone
Success
recvfrom-sendto.cSuccessNone
Success
serverclient.cSuccessNone
Success
shutdown.cSuccessNone
Success
shutdown_fork.cSuccessNone
Success
simple-select.cSuccessNone
Success
simple_epoll.cSuccessNone
Success
socket.cSuccessNone
Success
socket_cloexec.cSuccessNone
Success
socketepoll.cSuccessNone
Success
socketpair.cSuccessNone
Success
socketselect.cSuccessNone
Success
tcp_connect_single.cSuccessNone
Success
uds-getsockname.cSuccessNone
Success
uds-socketselect.cSuccessNone
Success
Process Tests
chain_thread.cSuccessNone
Success
exit.cSuccessNone
Success
fork.cSuccessNone
Success
fork2malloc.cSuccessNone
Success
fork_simple.cSuccessNone
Success
fork_syscall.cSuccessNone
Success
forkandopen.cSuccessNone
Success
forkdup.cSuccessNone
Success
forkexecuid.cSuccessNone
Success
forkexecv-arg.cSuccessNone
Success
forkexecv.cSuccessNone
Success
forkfiles.cSuccessNone
Success
forkmalloc.cSuccessNone
Success
forknodup.cSuccessNone
Success
function-ptr.cSuccessNone
Success
getegid_syscall.cSuccessNone
Success
getgid_syscall.cSuccessNone
Success
getpid.cSuccessNone
Success
getpid_syscall.cSuccessNone
Success
getppid.cSuccessNone
Success
getppid_syscall.cSuccessNone
Success
getuid.cSuccessNone
Success
getuid_syscall.cSuccessNone
Success
hello-arg.cSuccessNone
Success
hello.cSuccessNone
Success
longjmp.cSuccessNone
Success
mutex.cSuccessNone
Success
noforkfiles.cSuccessNone
Success
sem_forks.cSuccessNone
Success
setsid.cSuccessNone
Success
template.cSuccessNone
Success
thread.cSuccessNone
Success
wait.cSuccessNone
Success
waitpid_anychild.cSuccessNone
Success
waitpid_syscall.cSuccessNone
Success
waitpid_wnohang.cSuccessNone
Success
Signal Tests
alarm.cSuccessNone
Success
setitimer.cSuccessNone
Success
sigalrm.cSuccessNone
Success
sigchld.cSuccessNone
Success
signal-fork.cSuccessNone
Success
signal-simple.cSuccessNone
Success
signal_fork.cSuccessNone
Success
signal_int_ignored.cSuccessNone
Success
sigprocmask.cSuccessNone
Success
Fail Tests

Summary

MetricCount
Total Test Cases1
Number of Successes1
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeOutput
Memory Tests
mmap-negative1.cSuccessNone
Success

@@ -0,0 +1,73 @@
# Grates

A grate is a cage whose primary role is to intercept and handle system calls issued by other cages. Lind makes no distinction between cages and grates; any cage may register system call handlers and thereby act as a grate.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm guessing a grate needs to export pass_fptr_to_wt

@rennergade rennergade marked this pull request as draft February 12, 2026 03:15
@rennergade
Copy link
Contributor Author

@Yaxuan-w @JustinCappos @stupendoussuperpowers thank you all for your comments, very helpful. I made some updates that I believe answer your questions. Let me know if there's anything else I could improve.


---

### Execution Flow
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe needs some high level context.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've put up some context here, but I'm wondering whether splitting this section out to another execution flow md makes more sense?

Something that combines (1) the rawposix execution flow for lind-wasm, (2) grate call execution flow, (3) overall arch figures, etc


However, the ancestor grate may register additional internal syscall numbers. For example, a namespace grate may allow the normal `write` syscall number to continue routing toward RawPOSIX or a grate stacked below it, while registering a new internal syscall number such as `write_imfs` for an in-memory filesystem grate.

When `write` is invoked by a child cage, the ancestor grate examines the arguments and decides how to route the call. It may issue a new 3i call using the original `write` number to continue normal routing, or issue a call using the internal `write_imfs` number to direct the operation to the in-memory filesystem grate.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should register a handler for write syscall with dest_cageid=imfs_grateid to achieve this...?


Clamping is used when an ancestor grate needs structural control over how a descendant handles system calls.

Often this is used to divide a namespace, but it is more general than that. Clamping allows an ancestor to ensure that certain checks, routing decisions, or transformations occur before a descendant’s handler executes.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like we let users to handle behaviors related to ancestors /descendants relationships entirely in grate implementation. If so, mentioning how to achieve this in 1-2 sentences would be clearer to understand.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants