Commit Graph
100 Commits
Author SHA1 Message Date
Bananymous d52ad29afa Kernel: Add missing tr cmake file 2026-05-19 13:57:56 +03:00
Bananymous 1dc26d3c06 Kernel: Cleanup inode stat updating
Inode now handles stat upates itself and calls sync function to make
updates visible on the underlying filesystem
2026-05-19 13:00:05 +03:00
Bananymous a05fcdde8c Kernel: Move UTIME_OMIT handling to the syscall from inode 2026-05-19 11:56:12 +03:00
Bananymous deb2f52a35 Kernel: Add support for named pipes
These only copy inodes stat when created, if you fchmod/fchown a named
pipe, the change will not be visible on the filesystem
2026-05-19 00:15:25 +03:00
Bananymous 8224659c48 Kernel: Allow creating FIFOs in tmpfs 2026-05-19 00:05:22 +03:00
Bananymous 1922d78661 Kernel: Add support for mkfifo{,at} mkdir at
Opening FIFOs still dont work as expected but at least you can create
them now :D
2026-05-18 23:53:09 +03:00
Bananymous 6d1ecc2388 Kernel: Clean up file creation 2026-05-18 15:26:59 +03:00
Bananymous 5cf658c175 Kernel: Fix 2 memory pinning bugs
If pinning a region succeeded but pushing the region to a vector failed,
we would leak the pin preventing the process from cleaning up
2026-05-17 03:38:18 +03:00
Bananymous ef2738bfb7 Kernel: Disable devfs device add/remove logging 2026-05-17 03:38:18 +03:00
Bananymous d7865b2929 Kernel: Don't msync file backed pages that were never mapped writable 2026-05-17 03:21:08 +03:00
Bananymous 9c79971bdc LibC/Kernel: Add support for detached pthreads 2026-05-17 00:40:56 +03:00
Bananymous ff75c15ba3 LibC: Move pthread keys to TCB
This removes all TLS relocations from libc which may become handy ;)
2026-05-17 00:29:20 +03:00
Bananymous 9e6fa0a1ba Kernel: Add fast path for invalid address during region pin
Before I was falling through to the write lock which does allocation,
but as the read loop already saw, specified address was not mapped.
2026-05-17 00:29:20 +03:00
Bananymous 6e95519acc Kernel: Make TTY write lock a mutex instead of a spinlock
The mutex could not be locked while processing ANSI DGR in VTTY
2026-05-17 00:29:20 +03:00
Bananymous d081655913 Kernel: Add API for mutex to check if it is locked by current thread
Also add assertion that you have interrupts enabled :^)
2026-05-17 00:29:20 +03:00
Bananymous 9c3eb8d270 userspace: Implement tr utility 2026-05-17 00:29:20 +03:00
Bananymous 68479bf07e userspace: Fix getopt_long usage
- Add missing null entry after the last long option
- Don't duplicate illegal option message, getopt already prints
  the message as I do not suppress it. Also handle missing arguments.
2026-05-17 00:29:20 +03:00
Bananymous d528314ae3 Kernel: Make SYS_FUTEX restartable 2026-05-17 00:29:20 +03:00
Bananymous 40dd29b876 LibC: Cleanup syscall macros 2026-05-17 00:29:20 +03:00
Bananymous dc1d7e3fae ls: Print total field with -l 2026-05-15 22:46:50 +03:00
Bananymous 8f8ba2751c ls: Add support for -A and -h 2026-05-15 22:35:58 +03:00
Bananymous 928d3e3fe7 dirname: Fix help message 2026-05-15 22:34:48 +03:00
Bananymous 4ef7b8e71c Kernel: AFG reset return value 2026-05-15 21:38:23 +03:00
Bananymous 5e1b5c329b Kernel: Allow HDA stream reset to timeout
This was hanging on some version of qemu :^)
2026-05-15 21:30:41 +03:00
Bananymous b2f795b1e1 Kernel: Pipe ignore tc attr ioctls 2026-05-15 21:23:19 +03:00
Bananymous bf2121e166 LibC: Implement tc{get,set}winsize
These were added in POSIX issue 8 :^)
2026-05-15 17:08:02 +03:00
Bananymous 05c9f0640c Kernel/LibC: Replace terminal syscalls with ioctls
isatty, tc{get,set}attr, tc{get,set}pgrp are now implemented as ioctls
instead of separate syscalls
2026-05-15 17:03:33 +03:00
Bananymous fe2c9f7d2d LibC: Rewrite malloc
The old linked list allocator with power of two pool sizes was kinda
weird. Now we use 1MiB bitmap allocators for allocations <64KiB and
directly call mmap for larger allocations. This allows userspace to
actually free unused memory on `free` :)
2026-05-15 17:03:33 +03:00
Bananymous d7cdf3818c LibC: Make aio.h incudable in C++
aio stuff is not supported but now the header is at least includable in
C++ which was not possible before as __restrict was not allowed in array
size
2026-05-15 17:03:33 +03:00
Bananymous 6a2f041858 LibC: Handle negative size in fgets 2026-05-15 17:03:33 +03:00
Bananymous f0c5fb3a87 LibC: Don't use ScopeGuard in exec
These ended up pulling `operator delete` which is not available when
linking with gcc :^)
2026-05-15 17:03:33 +03:00
Bananymous 28b873b949 Kernel: Allow recursive rwlock write lock 2026-05-15 17:03:33 +03:00
Bananymous c352fb600f Kernel: Reduce ext2 locking
Replace the mutex with a rwlock and lock when its not necessary
2026-05-14 17:23:06 +03:00
Bananymous dd8a9b1793 Kernel: clamp msync address range instead of calling contains 2026-05-13 20:03:37 +03:00
Bananymous 212ab010a5 BAN: Expose radix sort with user provided buffer
This can be nice if user has memory for a the temporary buffer and
doesnt want the sorting to allocate or be able to fail.

Also counts are now stack allocated, there isn't really any reason to
allocate them on the heap as 256x 64 bit values only adds up to 2 KiB
2026-05-13 05:05:11 +03:00
Bananymous d345f96387 LibC: Optimize qsort
Apply same optimizations as to BAN quick sort!
2026-05-13 04:37:25 +03:00
Bananymous d181f9e553 BAN: Optimize quick sort
We now use the middle element as the pivot and do three way partitioning
to improve sorting with equivalent elements
2026-05-13 04:31:31 +03:00
Bananymous 5f237abc3b Kernel: Don't lock Ext2FS while reading and writing blocks
There is really no reason for this. The underlying block devices are
(should be) thread safe themselves
2026-05-09 23:28:00 +03:00
Bananymous 0bf7328e04 Kernel: Handle TIOC{G,S}WINSZ on pipes
GCC likes to do this a lot and debug logging is excessive
2026-05-09 23:28:00 +03:00
Bananymous 9f4271f6d8 Kernel: Remove the big inode lock
This moves locking to the inodes themselves which allows reducing lock
times significantly. Main inodes (ext2 and tmpfs) still do contain a
single big mutex that gets locked during operations but now we have the
architecture to optimize these.
2026-05-09 23:28:00 +03:00
Bananymous a7356716ff Kernel: Reduce locking FileBackedRegions 2026-05-09 15:08:26 +03:00
Bananymous 912647ce68 Shell: Fix type builtin PATH resolution
We were not adding a '/' between PATH dir and the command
2026-05-06 17:30:43 +03:00
Bananymous d2e21f9380 Kernel: Fix 64 bit page table range reservation from lower->higher half 2026-05-06 17:30:43 +03:00
Bananymous 443be800b7 Kernel: Fix remote TLB shootdown for <= 32 pages
I was modifying the `vaddr` argument while invalidating which lead to
the smp message containing wrong virtual address. This showed up in
really weird bugs from invalid TLB
2026-05-06 17:30:43 +03:00
Bananymous 3ac955714b Kernel: Optimize FileBackedRegion CoW
Just copy data from the existing page instead of locking inode's shared
data, copying to temporary buffer and finally copying to destination
2026-05-06 17:30:43 +03:00
Bananymous 62f5292f38 Kernel: Send only one TLB invalidation when creating a ByteRingBuffer 2026-05-06 17:30:43 +03:00
Bananymous 7553ede3b4 Kernel: Send only one TLB invalidation when creating a VirtualRange 2026-05-06 00:27:26 +03:00
Bananymous eba97c1fc7 Kernel: Avoid possible dead lock while sending smp messages
Process own events while waiting for space on another processor. This
fixes a dead lock when processors are sending messages to each other
2026-05-06 00:09:05 +03:00
Bananymous 47650980f2 LibC: Reorder stack trace dump printing
If we fault while getting start of stack frame at least we now print
that we were trying to get the stack trace :^)
2026-05-05 13:54:51 +03:00
Bananymous 4b12770485 LibC: Don't leak FILEs on failed shebang exec 2026-05-05 13:52:52 +03:00
Bananymous ba106f6bf5 LibC: Update argv[0] for shebang scripts to full path
This is needed so `dirname -- "$0"` works with shebang scripts found in
PATH
2026-05-05 12:48:04 +03:00
Bananymous 3a05a29294 dirname: Support options and multiple strings
This is not needed by POSIX but sdl2-config uses `dirname -- "$0"`
2026-05-05 01:42:28 +03:00
Bananymous efeaafaff6 Kernel: Cleanup E1000 link speed code 2026-05-04 21:23:04 +03:00
Bananymous 6966475dcf Kernel: Make E1000 sending lockless and mostly non-blocking
Now we only block if all 256 tx descriptors are waiting to be sent. This
removes TCP acks from taking 30% of profiles while DOWNLOADING files
2026-05-04 21:15:15 +03:00
Bananymous dfe24b69e0 Kernel: Don't keep devfs locked while performing disk sync 2026-05-04 20:26:02 +03:00
Bananymous 93e1091252 Kernel: Rewrite kmalloc
Kmalloc is now a bitmap allocator with dynamic resizing and we dont need
to allocate 64 MiB static block of memory reserved for kmalloc :^)
2026-05-04 20:26:02 +03:00
Bananymous f293377e31 Kernel: Dynamically allocate PCI devices
There was no need to prealloce almost a 5 MiB buffer for PCI all
possible pci devies :D
2026-05-04 20:26:02 +03:00
Bananymous f4e2e62d04 Kernel: Remove kmalloc API for identity mapped results
This is no longer used. This finally allows me to rewrite kmalloc :^)
2026-05-04 20:26:02 +03:00
Bananymous d42b363fb1 Kernel: Remove kmalloc identity map requirement from USB keyboard
This is the last place requiring kmalloc identity mapping
2026-05-04 20:26:02 +03:00
Bananymous 8773e80917 Kernel: Remove kmalloc identity map requirement from XHCI device init 2026-05-04 20:26:02 +03:00
Bananymous 0c6d713c4a Kernel: Rewrite 32 bit paging to not depend on kmalloc
There are a lot of 'unnecessary' fast page mappings but at least this
works.
2026-05-04 20:26:02 +03:00
Bananymous 8091127150 Kernel: Add page table api to map multiple fast pages
This is not currently used, but can be handy in the future
2026-05-04 20:26:02 +03:00
Bananymous 74127c0f45 Kernel: Cleanup inline assembly accessing cpu specific data 2026-05-04 20:26:02 +03:00
Bananymous 28499b890c LibC: Mark exit as noreturn 2026-05-04 20:26:02 +03:00
Bananymous 2f45349658 Kernel: Calculate internet checksum in host endian
No need to swap bytes of every 16 bit word in the packet, we can just do
one swap at the return
2026-05-04 20:26:02 +03:00
Bananymous fde085e04b Kernel: Pass current cpu index as a GDT limit
I had no idea LSL was an instruction. This cleans up code to get the
current cpu by a lot and does not require extra segment usage :D
2026-05-04 20:26:02 +03:00
Bananymous 77ca525552 BAN: Fix HashSet 2026-05-04 20:26:02 +03:00
Bananymous 3b83daef17 Kernel: Use empty string instead of nullptr for non existing proc name 2026-05-04 20:26:01 +03:00
Bananymous f37d9dbdb1 Kernel: Remove kmalloc_vaddr_of
This is no longer needed. It was only used for x86_64 paging and AP
stack initialization
2026-05-04 20:26:01 +03:00
Bananymous b7cedad891 Kernel: Wrap syscall macro value in paranthesis 2026-05-04 20:26:01 +03:00
Bananymous cdf0de34fb Kernel: Stop stacktrace dump on null bp
This makes stack traces not crash before IDT is initialized
2026-05-04 20:26:01 +03:00
Bananymous 03fccdffe1 Kernel: Rewrite paging and AP initialization
Initial step of paging now just prepares fast page for heap, actual page
table initialization happens after heap is initialized which allows
x86_64 to never depend on kmalloc for pages.

Processor's stacks are now also spawned with PMM/VMM allocated stacks
instead of kmalloc identity mapped.
2026-05-04 20:26:01 +03:00
Bananymous 1602b195c5 ports: Rework ssl certificates
ca-certificates:
 - update to 2026.03.19
 - install to /etc/cacert
 - extract individual ceritificates from the bundle

openssl:
 - depend on ca-certificates
 - install hashed symlinks to individual certs

curl:
 - don't depend on ca-certificates; openssl handles this
 - set both ca-bundle and ca-path
2026-04-28 02:23:46 +03:00
Bananymous 1486ad7aa5 Kernel: Don't map NIC buffers as uncached
There is no need for them to be uncached. Having them as uncached killed
the networking performance, over 90% time was spent in kernel out of
which 80% was in checksum calculation and memcpy, half each (measured in
qemu with e1000e)
2026-04-27 19:45:16 +03:00
Bananymous ab8bcbec3e Kernel: Allow mapping dma regions as not uncached 2026-04-27 19:36:32 +03:00
Bananymous 0e00b72df6 BAN: Cleanup HashMap
Add a concept for HashMapFindable instead of manually specifying the
requries expression everywhere.

Allow HashMapFindable also for `remove`, `contains`, `operator[]`, `at`

Make Entry have a const Key. This allows iterator's operator* and
operator-> return values have const keys.
2026-04-25 22:10:01 +03:00
Bananymous a63818ec33 BAN: Cleanup HashSet
Add a concept for HashSetFindable instead of manually specifying the
requries expression everywhere.

Allow HashSetFindable also for `remove` and `contains`.

Remove non-const return values from iterator; you should never modify
the hashed value in place.

Don't require key to be move assignable, move construction is enough.
2026-04-25 22:10:01 +03:00
Bananymous cf2e8ffaff Kernel: Remove unnecessary custom RefPtr hashes
RefPtr now exposes its own default hash
2026-04-25 22:10:01 +03:00
Bananymous b5647ff258 BAN: Rewrite RefPtr,UniqPtr const semantics
const RefPtr<T> now allows accessing T as non-const. Also add default
hash function for RefPtr and UniqPtr based on the pointer value
2026-04-25 22:10:01 +03:00
Bananymous bef53c726b Userspace: Install libdl, libm, libpthread as symlinks to libc
Having dummy libraries was just unnecessary
2026-04-21 21:46:00 +03:00
Bananymous 6b43cadf3a Kernel: Implement stack trace dump with safe memcpy
This fixes kernel panic if the stack trace cannot be read. Manually
validating pointers is definitely not safe
2026-04-21 21:20:52 +03:00
Bananymous b74812d669 Kernel: Remove unnused features from VirtualRange
On-demand paging has not been used ever since I made userspace stack be
a normal MemoryRegion.
2026-04-21 19:58:09 +03:00
Bananymous eea0154f18 LibC: Cleanup RNG and properly initialize to srand(1) at startup 2026-04-21 00:26:41 +03:00
Bananymous ea4c34fc0b LibC: Fix printf thread safety
I don't know why I was using a static buffer for value conversions :D
2026-04-21 00:25:56 +03:00
Bananymous 558ed8fd44 LibC: Define pthread_{equal,self} as macros
These really should get inlined :D
2026-04-21 00:25:16 +03:00
Bananymous 8665195350 Kernel: Allow main thread to call pthread_exit
Apparently this is allowed. Also when last thread calls pthread_join
the process should also exit
2026-04-21 00:23:35 +03:00
Bananymous 72a24a0d38 Kernel: Reorder FUTEX_WAIT value and timeout check
Return EAGAIN rather than ETIMEDOUT if value does not match at futex
entry
2026-04-21 00:20:37 +03:00
Bananymous 0ee50032f3 Kernel: Fix 32 bit signal trapoline offset 2026-04-21 00:19:33 +03:00
Bananymous 40f3546aca BAN: Rewrite HashMap as a wrapper around HashSet
There is really no need to have two implementation of the same thing.
Only difference now is that HashMap's value type has to be movable but
this wasn't an issue
2026-04-21 00:18:18 +03:00
Bananymous a8e496310b Kernel: Use HashMap for fd->epoll_event mapping
I don't know why it was a static array :D
2026-04-21 00:14:24 +03:00
Bananymous fe613e4274 BAN: Rewrite HashSet
Instead of representing the map as vector or linked lists which required
an allocation for every insertion and deallocation for removal, we now
store a single big contiguous block of memory and use hash chains to
handle collisions. This intuitively feels much better although I did not
run any benchmarks.
2026-04-21 00:14:24 +03:00
Bananymous 3264dcee44 BAN: Add Math::round_up_to_power_of_two 2026-04-21 00:14:24 +03:00
Bananymous 71649ffe09 Kernel Rework ThreadBlocker
I don't know why I though the block chain had to be stored fully in the
ThreadBlocker, that did not even fix the problem I was trying to fix
when I last rewrote it. Roll back to doubly linked list of block chain
and now just check that the node is contained within the ThreadBlocker
before removing and after acquiring the ThreadBlocker's lock. Also there
is no need to have a separate lock the node's blocker field. We can just
perform an atomic reads and writes to it. We can still get a blocker
that the node is no longer part of, but this can be resolved with a
simple check. This patch reduces ThreadBlocker's size from over 200
bytes to just 12 bytes +4 bytes padding
2026-04-20 12:50:09 +03:00
Bananymous 5b7b2d7ac3 Kernel: Fix memory leak when cleaning up inodes shared page cache 2026-04-19 17:52:21 +03:00
Bananymous 8e543195b1 Kernel: Check for null in pthread_join 2026-04-19 17:52:21 +03:00
Bananymous a24ec0da2b LibC: Don't complain about stack size until 8192 bytes
It was unnecessary as userspace stack is way bigger than that...
2026-04-19 17:52:21 +03:00
Bananymous e6284c3cf3 LibC/Kernel: Bump PATH_MAX to 4096 2026-04-19 17:52:21 +03:00
Bananymous c04ad65f7f LibC: Add mbsinit and wcsrtombs stubs 2026-04-17 18:40:18 +03:00
Bananymous af17b29414 ports: Add xz port 2026-04-17 18:39:18 +03:00
Bananymous 7badcf80cf ports: Add libarchive port 2026-04-17 18:37:41 +03:00