summaryrefslogtreecommitdiff
path: root/Kernel/Arch
AgeCommit message (Collapse)Author
2023-05-28Kernel/aarch64: Make `Processor::capture_stack_trace` stub non-crashingDaniel Bertalan
This is the only kernel issue blocking us from running the test suite. Having userspace backtraces printed to the debug console during crashes isn't vital to the system's function, so let's just return an empty trace and print a FIXME instead of crashing.
2023-05-26Kernel/aarch64: Use the correct MMIO base address in the MMUCaoimhe
2023-05-24Kernel: Use UnixDateTime wherever applicablekleines Filmröllchen
"Wherever applicable" = most places, actually :^), especially for networking and filesystem timestamps. This includes changes to unzip, which uses DOSPackedTime, since that is changed for the FAT file systems.
2023-05-24AK: Rename Time to Durationkleines Filmröllchen
That's what this class really is; in fact that's what the first line of the comment says it is. This commit does not rename the main files, since those will contain other time-related classes in a little bit.
2023-05-21Kernel/aarch64: Detect if access faults come from SafeMemDaniel Bertalan
This commit lets us differentiate whether access faults are caused by accessing junk memory addresses given to us by userspace or if we hit a kernel bug. The stub implementations of the `safe_*` functions currently don't let us jump back into them and return a value indicating failure, so we panic if such a fault happens. Practically, this means that we still crash, but if the access violation was caused by something else, we take the usual kernel crash code path and print a register and memory dump, rather than hitting the `TODO_AARCH64` in `handle_safe_access_fault`.
2023-05-21Kernel/aarch64: Flatten `safe_{memset,strnlen,memcpy}()`Daniel Bertalan
We want to detect if an access fault comes from within these operations, so they cannot be calling out to the non-safe variants.
2023-05-21Kernel/aarch64: Stub out atomic SafeMem functionsDaniel Bertalan
These are used in futexes, which are needed if we want to get further in `run-tests`. For now, we have no way to return a non-fatal error if an access fault is raised while executing these, so the kernel will panic. Some would consider this a DoS vulnerability where a malicious userspace app can crash the kernel by passing bogus pointers to it, but I prefer to call it progress :^)
2023-05-19Kernel: Enable data and instruction cache on aarch64Andrew Kaster
Enabling these will fix the Unsupported Exclusive or Atomic access data fault we get on bare metal Raspberry Pi 3. On A53/A57 chips (and newer), atomic compare-exchange operations require the data cache to be enabled.
2023-05-19Kernel: Update reset value and register names of SCTLR_EL1 per Arm ARMAndrew Kaster
Referencing ARM DDI 0487J.a, update the names of previously reserved fields, and set the reset_value() of the SCTLR_EL1 struct to reflect the defaults we want for this register on reboot.
2023-05-19Kernel: Move a bunch of generic devices code into new subdirectoryLiav A
2023-05-17Kernel: Flush data cache before passing a buffer to the VC MailboxDaniel Bertalan
Otherwise, the message's contents might be in the cache only, so VideoCore will read stale/garbage data from main memory. This fixes framebuffer setup on bare metal with the data cache enabled.
2023-05-17Kernel: Add character device driver for the RPi "mini UART" (UART1)Daniel Bertalan
While the PL011-based UART0 is currently reserved for the kernel console, UART1 is free to be exposed to the userspace as `/dev/ttyS0`. This will be used as the stdout of `run-tests-and-shutdown.sh` when testing the AArch64 kernel.
2023-05-17Kernel: Add `RPi::Timer::get_clock_rate()`Daniel Bertalan
2023-05-17Kernel: Add RPi Watchdog and use it for system shutdownDaniel Bertalan
The Raspberry Pi hardware doesn't support a proper software-initiated shutdown, so this instead uses the watchdog to reboot to a special partition which the firmware interprets as an immediate halt on shutdown. When running under Qemu, this causes the emulator to exit.
2023-05-17Kernel: Unify x86-64 and AArch64 `__panic` implementationDaniel Bertalan
We now have everything in the AArch64 kernel to be able to use the full `__panic` implementation, so we can share the code with x86-64. I have kept `__assertion_failed` separate for now, as the x86-64 version directly executes inline assembly, thus `Kernel/Arch/aarch64/Panic.cpp` could not be removed.
2023-05-15Kernel/aarch64: Make REGISTER_STATE_SIZE a multiple of 16 bytesTimon Kruiper
This ensure that the stack pointer also stays 16 byte aligned. This fixes a baremetal issue when getting an exception.
2023-05-15Kernel/aarch64: Dump registers when unknown exception occursTimon Kruiper
This is useful when debugging baremetal issues.
2023-05-13Kernel/aarch64: Remove drawing of logo on the framebuffer during initLiav A
This logo was actually used as a first sign of life in the very early days of the aarch64 port. Now that we boot into the graphical mode of the system just fine there's no need to keep this.
2023-05-07Kernel: Implement helpers to manipulate MSI(x) data structuresPankaj Raghav
MSIx table entry is used to program interrupt vectors and it is architecture specific. Add helper functions declaration in Arch/PCIMSI.h. The definition of the function is placed in the respective arch specific code.
2023-05-07Kernel: Add reserve_interrupt_handlers APIPankaj Raghav
MSI(x) interrupts need to reserve IRQs so that it can be programmed by the device. Add an API to reserve contiguous ranges of interrupt handlers so that it can used by PCI devices that use MSI(x) mechanism. This API needs to be implemented by aarch64 architecture.
2023-05-07Kernel/PCI: Set IRQ as reserved for pin-based interruptsPankaj Raghav
Set pin-based interrupt handler as reserved during PCI bus init. This is required so that MSI(x) based interrupts can avoid sharing the IRQ which has been marked as reserved.
2023-04-29Kernel/aarch64: Don't set multiboot_modules to an empty array on-stackLiav A
Since multiboot_modules_count is set to 0, we can safely set the multiboot_modules pointer to 0 (null pointer), as we don't use multiboot on aarch64 anyway.
2023-04-29Kernel/aarch64: Support reading the command line via the RPi MailboxDaniel Bertalan
This reuses the existing `RPi::Mailbox` interface to read the command line via a VideoCore-specific mailbox message. This will have to be replaced if that interface starts being smarter, as this is needed very early, and nothing guarantees that a smarter Mailbox interface wouldn't need to allocate or log, which is a no-no during early boot. As the response string can be arbitrarily long, it's the caller's job to provide a long enough buffer for `Mailbox::query_kernel_command_line`. This commit chose 512 bytes, as it provides a large enough headroom over the 150-200 characters implicitly added by the VC firmware. The portable way would be to parse the `/chosen/bootargs` property of the device tree, but we currently lack the scaffolding for doing that. Support for this in QEMU relies on a patch that has not yet been accepted upstream, but is available via our `Toolchain/BuildQEMU.sh` script. It should, however, work on bare metal. Tested-By: Timon Kruiper <timonkruiper@gmail.com>
2023-04-29Kernel: Store the kernel command line in a `StringView`Daniel Bertalan
The Raspberry Pi's mailbox interface does not guarantee that the returned command line is null-terminated. This commit removes that assumption from the current code, allowing the next commit to add support for reading it on the Pi. This also lets us eliminate a few manual `strlen()` calls :^)
2023-04-28Revert "Kernel/x86: Bake the Prekernel and the Kernel into one image"Tim Schumacher
Some hardware/software configurations crash KVM as soon as we try to start Serenity. The exact cause is currently unknown, so just fully revert it for now. This reverts commit 897c4e5145474d55b247a4a3b5e6bf5420279e2f.
2023-04-28Kernel/aarch64: Fix build after `is_sharing_with_others` API removalDaniel Bertalan
This commit fixes the build after the removal of `GenericInterruptHandler::is_sharing_with_others` in 8944ca830f0.
2023-04-28Kernel: Create all kernel processes before enabling boot profilingSamuel Bowman
Process created performance events for kernel processes are only ever emitted for the kernel processes that exist when profiling is enabled. Any new kernel processes created after profiling is enabled will not have corresponding process created performance events, so all kernel processes should be created before enabling profiling. NetworkTask was the only kernel process being created after enabling profiling, so we now just create it before enabling profiling. This fixes an issue where Profiler was failing to parse boot profiles as a result of NetworkTask not having a process created event.
2023-04-28Kernel/x86: Bake the Prekernel and the Kernel into one imageLiav A
The new baked image is a Prekernel and a Kernel baked together now, so essentially we no longer need to pass the Prekernel as -kernel and the actual kernel image as -initrd to QEMU, leaving the option to pass an actual initrd or initramfs module later on with multiboot.
2023-04-25Kernel: Remove is_sharing_with_others API from GenericInterruptHandlerPankaj Raghav
is_sharing_with_others API was never really put to use properly since it was introduced. The only place where it is used in Interrupts.cpp is in conjuction with is_shared_handler() which is only true for SharedIRQHandler and is_sharing_with_others will always return false. Remove that API.
2023-04-25Kernel: Set IRQHandler m_shared_with_others when the irq is sharedPankaj Raghav
If IRQHandler's IRQ is shared, then disable_irq() should not call the controller to disable that IRQ as some other device might be using it. IRQHandler had a private variable to indicate if it is being shared: m_shared_with_others but it was never modified even if the IRQ was shared. Add a new member function set_shared_with_others() to enable/disable m_shared_with_others member of IRQHandler class. This function is called when an IRQHandler is being added/removed as a part of SharedIRQHandler.
2023-04-17Kernel: Don't get rbp from internal context switch structuresTim Schumacher
This has been broken on x86_64 since its introduction, as it features more registers to be saved, and we never held up the "rbp has to be the last pushed register" there. Instead, just copy rbp from the thread structure, which is now properly updated since the last commit.
2023-04-17Kernel: Properly update the stored thread rbp when switching contextsTim Schumacher
2023-04-15Kernel/HID: Don't use *LockRefPtrs in the I8042Controller codeLiav A
2023-04-15Kernel: Re-organize header includes in the HID subsystem codeLiav A
Just a small clean-up in the I8042Controller and HIDManagement code so it will be easier to modify this code in future changes.
2023-04-14Kernel/Storage: Modernize ATA IDE controller initialization codeLiav A
This is done by 2 ways which both fit very well together: - We stop use LockRefPtrs. We also don't allow expansion of the m_channels member, by setting it to be a fixed Array of 2 IDEChannels. - More error propagation through the code, in the construction point of IDEChannel(s). This means that in the future we could technically do something meaningful with OOM conditions when initializing an IDE controller.
2023-04-13Kernel/aarch64: Add implementation of Processor::for_eachTimon Kruiper
2023-04-13Kernel/aarch64: Change RPi::Framebuffer::PixelOrder to BGRTimon Kruiper
This is what the WindowServer expects. Confusingly the pixel format for MULTIBOOT_FRAMEBUFFER_TYPE_RGB is actually BGRx8888.
2023-04-13Kernel/aarch64: Add volatile modifier to various asm statementsTimon Kruiper
This prevents the optimizer from reordering them, which hopefully prevents future bugs.
2023-04-13Kernel/aarch64: Make sure no reordering of DAIF::read is possibleTimon Kruiper
We were crashing on the VERIFY_INTERRUPTS_DISABLED() in RecursiveSpinlock::unlock, which was caused by the compiler reordering instructions in `sys$get_root_session_id`. In this function, a SpinLock is locked and quickly unlocked again, and since the lock and unlock functions were inlined into `sys$get_root_session_id` and the DAIF::read was missing the `volatile` keyword, the compiler was free to reorder the reads from the DAIF register to the top of this function. This caused the CPU to read the interrupts state at the beginning of the function, and storing the result on the stack, which in turn caused the VERIFY_INTERRUPTS_DISABLED() assertion to fail. By adding the `volatile` modifier to the inline assembly, the compiler will not reorder the instructions. In aa40cef2b7, I mistakenly assumed that the crash was related to the initial interrupts state of the kernel threads, but it turns out that the missing `volatile` keyword was the actual problem. This commit also removes that code again.
2023-04-09Kernel/HID: Untie the PS2 protocol, i8042 hardware and generic devicesLiav A
For a very long time, the kernel had only support for basic PS/2 devices such as the PS2 AT keyboard and regular PS2 mouse (with a scroll wheel). To adapt to this, we had very simple abstractions in place, essentially, the PS2 devices were registered as IRQ handlers (IRQ 1 and 12), and when an interrupt was triggered, we simply had to tell the I8042Controller to fetch a byte for us, then send it back to the appropriate device for further processing and queueing of either a key event, or a mouse packet so userspace can do something meaningful about it. When we added the VMWare mouse integration feature it was easily adapted to this paradigm, requiring small changes across the handling code for these devices. This patch is a major cleanup for any future advancements in the HID subsystem. It ensures we do things in a much more sane manner: - We stop using LockRefPtrs. Currently, after the initialization of the i8042 controller, we never have to change RefPtrs in that class, as we simply don't support PS2 hotplugging currently. Also, we remove the unnecessary getters for keyboard and mouse devices which also returned a LockRefPtr. - There's a clear separation between PS2 devices and the actual device nodes that normally exist in /dev. PS2 devices are not polled, because when the user uses these devices, they will trigger an IRQ which when is handled, could produce either a MousePacket or KeyEvent, depending on the device state. The separation is crucial for buses that are polled, for example - USB is a polled bus and will not generate an IRQ for HID devices. - There's a clear separation in roles of each structure. The PS2 devices which are attached to a I8042Controller object are managing the device state, while the generic MouseDevice and KeyboardDevice manage all related tasks of a CharacterDevice, as well as interpreting scan code events and mouse relative/absolute coordinates.
2023-04-09Kernel: Move HIDDevice::enable_interrupts method to I8042Device classLiav A
It happens to be that only PS/2 devices that are connected via the i8042 controller can generate interrupt events, so it makes much more sense to have those devices to implement the enable_interrupts method because of the I8042Device class and not the HIDDevice class.
2023-04-09Kernel: Introduce a new super class called HIDControllerLiav A
Use the new class in HID code, because all other HID device controllers will be using this class as their parent class. Hence, we no longer keep a reference to any PS/2 device in HIDManagement and rely on HIDController derived classes to do this for us. It also means that we removed another instance of a LockRefPtr, which is designated to be removed and is replaced by the better pattern of SpinlockProtected<RefPtr<>> instead.
2023-04-09Kernel: Remove redundant HID name from all associated filesLiav A
2023-04-08Kernel: Fix compilation of aarch64/RPi/Framebuffer.cppBrian Gianforcaro
The definitions were being defined already by `BootInfo.h` and that was being included here via transitive includes. The extern definitions of the variables do not have the `READONLY_AFTER_INIT` attribute in `BootInfo.h`. This causes conflicting definitions of the same variable. The `READONLY_AFTER_INIT` specifier is not needed for extern variables as it only effects their linkage, not their actual use, so just use the versions in `BootInfo.h` instead of re-declaring.
2023-04-07Kernel: Fix typo in the FramebufferGetPitchMboxMessage nameLiav A
2023-04-06Kernel/aarch64: Actually remove Arch/aarch64/init.cppTimon Kruiper
The idea was to remove this file in bd2011406, but that did not actually happen. Let's actually remove it.
2023-04-06Kernel/aarch64: Add getters/setters in RegisterState and ThreadRegistersTimon Kruiper
Specifically this commit implements two setters set_userspace_sp and set_ip in RegisterState.h, and also adds a stack pointer getter (sp) in ThreadRegisters.h. Contributed by konrad, thanks for that.
2023-04-06Kernel/aarch64: Implement copying of kernel regs into ptrace regsTimon Kruiper
And also vice versa. Contributed by konrad, thanks for that.
2023-04-06Kernel+LibC: Modify aarch64's __mcontext to store registers in an arrayTimon Kruiper
This commit also removes the unnecessary ifdefs from sys/arch/aarch64/regs.h. Contributed by konrad, thanks for that.
2023-04-06Kernel/aarch64: Flush entire TLB cache when changing TTBR0_EL1Timon Kruiper
Setting the page table base register (ttbr0_el1) is not enough, and will not flush the TLB caches, in contrary with x86_64 where setting the CR3 register will actually flush the caches. This commit adds the necessary code to properly flush the TLB caches when context switching. This commit also changes Processor::flush_tlb_local to use the vmalle1 variant, as previously we would be flushing the tlb's of all the cores in the inner-shareable domain.