Commit graph

58463 commits

Author SHA1 Message Date
Andreas Kling 1c1d0f5362 ExecSpace should free its own allocations on destruction.
If hookableAlloc was used, we don't free anything. That's the client's
responsibility.
2018-10-23 15:31:23 +02:00
Andreas Kling ccd15e0590 Various things:
- putch syscall now directly calls Console::putChar().
- /proc/summary includes some info about kmalloc stats.
- Syscall entry is guarded by a simple spinlock.
- Unmap regions for crashed tasks.
2018-10-23 15:19:02 +02:00
Andreas Kling c80a1f39ce Minor userland tweaks. 2018-10-23 13:57:17 +02:00
Andreas Kling 71ed63c91d Assume commands are binaries in /bin for now. 2018-10-23 13:05:50 +02:00
Andreas Kling d133a2845f Add missing TLB flushes. 2018-10-23 13:03:11 +02:00
Andreas Kling 77821da42f Also send console output to port 0xe9 (bochs console.)
This is very handy for debugging.
2018-10-23 13:02:38 +02:00
Andreas Kling 63e253bac9 Generate a basic /proc/summary file with some info about all tasks. 2018-10-23 12:44:46 +02:00
Andreas Kling ed2422d7af Start adding a basic /proc filesystem and a "ps" utility. 2018-10-23 12:04:03 +02:00
Andreas Kling 98f76f0153 Flush the TLB after modifying page tables.
This is a very inefficient naive implementation, but it gets us going.
Mapping tasks in and out of a shared address space now totally works.
2018-10-23 11:03:56 +02:00
Andreas Kling 56ed448424 Move ELFLoader debug output behind flags.
The logging spam was out of control.
2018-10-23 11:03:26 +02:00
Andreas Kling fe237ee215 Lots of hacking:
- Turn Keyboard into a CharacterDevice (85,1) at /dev/keyboard.
- Implement MM::unmapRegionsForTask() and MM::unmapRegion()
- Save SS correctly on interrupt.
- Add a simple Spawn syscall for launching another process.
- Move a bunch of IO syscall debug output behind DEBUG_IO.
- Have ASSERT do a "cli" immediately when failing.
  This makes the output look proper every time.
- Implement a bunch of syscalls in LibC.
- Add a simple shell ("sh"). All it can do now is read a line
  of text from /dev/keyboard and then try launching the specified
  executable by calling spawn().

There are definitely bugs in here, but we're moving on forward.
2018-10-23 10:12:50 +02:00
Andreas Kling 72514c8b97 Don't use doubles in RandomDevice.
...since Computron doesn't have FPU support yet, I'm gonna avoid using it
here in Serenity for now.
2018-10-23 00:35:11 +02:00
Andreas Kling c8b7173aa8 Add a CircularQueue template class to AK. 2018-10-22 22:46:02 +02:00
Andreas Kling b824f15619 Launching an arbitrary ELF executable from disk works! :^)
This is so cool! It's a bit messy now with two Task constructors,
but eventually they should fold into a single constructor somehow.
2018-10-22 15:43:02 +02:00
Andreas Kling befeabd8fe Okay, with some mucking around, there is now a /bin/id and it runs!
It statically links against everything in LibC that it needs.
This will work just fine for a long time to come!
2018-10-22 14:41:54 +02:00
Andreas Kling 38a621c721 Link "id" against the LibC.
We can now produce what should essentially be a runnable Serenity executable.
2018-10-22 14:13:17 +02:00
Andreas Kling 63764b3a65 Import very modest Userland. 2018-10-22 14:06:22 +02:00
Andreas Kling 4cbf079a17 Start work on a standard C library. I'm calling it... LibC. 2018-10-22 13:57:25 +02:00
Andreas Kling 85bcf2ed0f Add getgid() and getpid() syscalls. Prep for LibC. 2018-10-22 13:55:11 +02:00
Andreas Kling bae59609e3 Move kprintf to its own file. It has nothing to do with VGA anymore. 2018-10-22 13:20:35 +02:00
Andreas Kling 702d308e67 Oops, StringImpl's "the empty string" global was not always initialized.
These "oops forgot to initialize" bugs are getting annoying...
2018-10-22 13:10:08 +02:00
Andreas Kling c5e55f4737 Use UD2 instead of CLI;HLT for CRASH().
This way the kernel prints out a nice register dump so we can find
out where we crashed.
2018-10-22 13:07:06 +02:00
Andreas Kling a9ca75c98b Add IRQHandler class that can be subclasses to handle an IRQ.
Also move Keyboard to a class implementation using this pattern.
2018-10-22 12:58:29 +02:00
Andreas Kling 8f941561b4 Add ALWAYS_INLINE macro. 2018-10-22 12:55:59 +02:00
Andreas Kling ba185e3eba Zero out VirtualFileSystem::s_the in initializeGlobals().
This catches attempts to access the vfs before it's been constructed.
2018-10-22 12:54:19 +02:00
Andreas Kling e4afa2a041 Tweak _test.o to use the putch() syscall.
It's still running in kernel space. Once I make it possible for ELFLoader
to set up a ring 3 task, we'll really be cooking!
2018-10-22 11:53:59 +02:00
Andreas Kling 3a3c57357c Add a sys$exit and make init_stage2 call it when finished. 2018-10-22 11:43:55 +02:00
Andreas Kling 79ffdb7205 A lot of hacking:
- More work on funneling console output through Console.
- init() now breaks off into a separate task ASAP.
- ..this leaves the "colonel" task as a simple hlt idle loop.
- Mask all IRQs on startup (except IRQ2 for slave passthru)
- Fix underallocation bug in Task::allocateRegion().
- Remember how many times each Task has been scheduled.

The panel and scheduling banner are disabled until I get things
working nicely in the (brave) new Console world.
2018-10-22 11:15:16 +02:00
Andreas Kling df4fdd6f1e printf format fixups in ELFLoader. 2018-10-22 00:29:35 +02:00
Andreas Kling 09fc9c0698 Make Console::m_rows/m_columns const for now. 2018-10-21 23:48:50 +02:00
Andreas Kling e38f40a83c Add an InlineLinkedList::containsSlow(T*) helper. 2018-10-21 23:48:27 +02:00
Andreas Kling a89bebfda4 printf -> kprintf 2018-10-21 23:48:13 +02:00
Andreas Kling fc88368582 Have Console::write() directly call vga_putch. 2018-10-21 22:44:26 +02:00
Andreas Kling a70bfb87d5 Add a Console device and start refactoring screen output. 2018-10-21 21:59:43 +02:00
Andreas Kling d5ec18027e Protect the first 4 KB of memory.
This makes null pointers crashy, tremendously useful :^)
2018-10-21 21:59:11 +02:00
Andreas Kling dd6706a1a1 Fix null deref in contextSwitch(). 2018-10-21 21:57:43 +02:00
Andreas Kling 2f99ff801e Move post-boot kernel stack pointer to 0x4000. 2018-10-21 21:51:12 +02:00
Andreas Kling 46ff281695 Turn the syscall interrupt into a trap (by switching the gate type.)
This leaves interrupts enabled while we're in the kernel, which is
precisely what we want.

This uncovered a horrendous problem with kernel tasks silently
overflowing their stacks. For now I've simply increased the stack size
but I need a more MMU-y solution for this eventually.
2018-10-19 11:31:18 +02:00
Andreas Kling 2d1d01661b Add a way to initialize VFS globals.
This is needed since the kernel loader doesn't even zero out bss,
much less call any static constructors.
2018-10-19 11:20:49 +02:00
Andreas Kling 97e0d75bcb ELFLoader works inside the kernel!
We load /_hello.o which just prints out a simple message.
It executes inside the kernel itself, so no fancy userspace process
or anything, but this is still so cool!
2018-10-18 15:46:08 +02:00
Andreas Kling 6ab0649ad6 ksprintf() should null-terminate strings. 2018-10-18 15:24:07 +02:00
Andreas Kling c149d2a8f0 Build ELFLoader into Kernel. 2018-10-18 15:03:10 +02:00
Andreas Kling 3649638259 Add Regions concept to Task. 2018-10-18 14:55:20 +02:00
Andreas Kling 5b10846bed Add a simple ELF binary called _test.o to the test fs. 2018-10-18 13:16:30 +02:00
Andreas Kling f67d695254 More paging stuff.
The test userspace process now runs at linear address 0x300000 which is
mapped to a dynamically allocated page from the MemoryManager. Cool!
2018-10-18 13:05:00 +02:00
Andreas Kling 89851a9ded Use FileHandle from VFS. 2018-10-18 10:28:09 +02:00
Andreas Kling e86cadc7af Add an fd field to FileHandle in Kernel builds. 2018-10-18 10:27:07 +02:00
Andreas Kling 9d5de91cf3 Actually destroy tasks after they crash. 2018-10-18 00:26:30 +02:00
Andreas Kling 1a801e5737 Hang if we GPF in ring 0. 2018-10-18 00:13:06 +02:00
Andreas Kling 56c1f9db8e A userspace process can now GPF and the OS goes on!
This is really rickety, but it kinda sorta works for my test GPF!
2018-10-17 23:49:32 +02:00