Gunnar Beutner
db334b50d0
Kernel: Don't byteswap the ISR number on interrupt entry
...
Let's just add the padding before we jump to interrupt_common_asm_entry.
2021-07-01 23:36:17 +02:00
Hendiadyoin1
5f6c513610
Kernel: Add support for 64-bit unaligned Mem-ops
...
Also let the compiler enforce the size and type restrictions
2021-07-01 17:32:34 +02:00
Hendiadyoin1
6b9cf8376e
Kernel: Remove not needed comment in Processor.h
2021-07-01 17:32:34 +02:00
Hendiadyoin1
90cd11fa8c
Kernel: Support starting up secondary processors on x86_64
2021-07-01 10:50:00 +02:00
Gunnar Beutner
e37576440d
Kernel: Fix stack alignment on x86_64
...
These were already properly aligned (as far as I can tell).
2021-06-30 15:13:30 +02:00
Gunnar Beutner
50839bd1f1
Kernel: Properly initialize r8-r15 for new threads on x86_64
2021-06-30 15:13:30 +02:00
Gunnar Beutner
0b82c583e0
Kernel: Implement capturing stack traces on x86_64
2021-06-29 20:03:36 +02:00
Gunnar Beutner
36ce2a2b76
Kernel: Fix struct layout for interrupt entries on x86_64
2021-06-29 20:03:36 +02:00
Gunnar Beutner
df9e73de25
Kernel: Add x86_64 support for fork()
2021-06-29 20:03:36 +02:00
Gunnar Beutner
732dc72c58
Kernel: Fix the limit for the IDT table
2021-06-28 22:29:28 +02:00
Gunnar Beutner
e979a88af4
Kernel: Implement do_assume_context for execve() on x86_64
2021-06-28 22:29:28 +02:00
Gunnar Beutner
a8587fbfb9
Kernel: Use FlatPtr for register-sized values
2021-06-28 22:29:28 +02:00
Gunnar Beutner
b5aad1c81d
Kernel: Fix GDT and segment selectors to make userland work on x86_64
...
Userland faulted on the very first instruction before because the
PML4T/PDPT/etc. weren't marked as user-accessible. For some reason
x86 doesn't care about that.
Also, we need to provide an appropriate userspace stack segment
selector to iretq.
2021-06-28 22:29:28 +02:00
rileylyman
640db93bdd
Kernel: Fix small typo in inline comment
2021-06-28 16:39:25 +02:00
Gunnar Beutner
e56a0d6af7
Kernel: Fix memset() on x86_64
...
Previously memset() only set half of the bytes to the requested value.
2021-06-28 15:55:00 +02:00
Gunnar Beutner
32840dfa17
Kernel: Implement more x86_64 context switching functionality
2021-06-28 15:55:00 +02:00
Gunnar Beutner
076692b1ef
Kernel: Implement entry code for x86_64 interrupts
...
With this fixed we can now properly handle interrupts (e.g. timer
interrupts) on x86_64.
2021-06-28 15:55:00 +02:00
Gunnar Beutner
328d44e227
Kernel: Fix stack for new threads on x86_64
...
Unlike on x86 iretq always pops rsp and ss.
2021-06-28 15:55:00 +02:00
Gunnar Beutner
9ed051fe25
Kernel: Implement initializing threads on x86_64
2021-06-27 15:46:42 +02:00
Gunnar Beutner
f285241cb8
Kernel: Rename Thread::tss to Thread::regs and add x86_64 support
...
We're using software context switches so calling this struct tss is
somewhat misleading.
2021-06-27 15:46:42 +02:00
Gunnar Beutner
eba33f82b8
Kernel: Reorder code a bit to clarify which #if block it belongs to
2021-06-27 15:46:42 +02:00
Gunnar Beutner
df530941cc
Kernel: Implement safe_* memory access functions for x86_64
2021-06-27 15:46:42 +02:00
Gunnar Beutner
79ab9cce18
Kernel: Clear segment registers on x86_64
...
They're supposedly unused but iretq doesn't like ss being non-zero.
2021-06-27 15:46:42 +02:00
Gunnar Beutner
9d9f20391d
Kernel: Use macros for GDT indices instead of hardcoding the values
2021-06-27 15:46:42 +02:00
Gunnar Beutner
065c6c307d
Kernel: Add support for interrupts on x86_64
2021-06-27 15:46:42 +02:00
Gunnar Beutner
233ef26e4d
Kernel+Userland: Add x86_64 registers to RegisterState/PtraceRegisters
2021-06-27 15:46:42 +02:00
Gunnar Beutner
10ca7f18a7
Kernel: Fix declaration for struct TrapFrame
...
This is declared as a struct elsewhere.
2021-06-27 15:46:42 +02:00
Gunnar Beutner
324f72d02b
Kernel: Fix incorrect flags for the GDT entries
...
The Sz (protected mode) bit should not be set for 64-bit GDT entries.
2021-06-27 15:46:42 +02:00
Gunnar Beutner
389bf82889
Kernel: Add CPUID flag for long mode
...
This isn't particularly useful because by the time we've entered
init() the CPU had better support x86_64 anyway. However this shows the
CPU flag in System Monitor - even in 32-bit mode.
2021-06-26 11:08:52 +02:00
Gunnar Beutner
9077c64d37
Kernel: Correct spelling mistake
2021-06-26 11:08:52 +02:00
Gunnar Beutner
e52051903b
Kernel: Fix off-by-one error in Processor::write_raw_gdt_entry
2021-06-26 11:08:52 +02:00
Gunnar Beutner
f630299d49
Kernel: Add support for setting up a x86_64 GDT once in C++ land
2021-06-26 11:08:52 +02:00
Gunnar Beutner
29d9666e02
Kernel: Fix GDT limits
...
The GDT limits are inclusive, so for correctness we should subtract
one from the structs' size.
2021-06-26 11:08:52 +02:00
Gunnar Beutner
4c555684b7
Kernel: Set an appropriate GDT for 64-bit mode
2021-06-25 15:19:09 +02:00
Gunnar Beutner
d84abe51f5
Kernel: Use PML4T for 64-bit mode
2021-06-25 15:19:09 +02:00
Gunnar Beutner
13e4093da4
Kernel: Move Multiboot header into a separate file
2021-06-25 15:19:09 +02:00
Gunnar Beutner
19c0498ccc
Kernel: Update the x86_64 boot code to match i386's code
2021-06-25 15:19:09 +02:00
Daniel Bertalan
74535628a8
Kernel: Use proper Atomic<T>
types in CPU
...
This is needed because Clang's intrinsic atomic functions behave weirdly
if only one of their pointer arguments is volatile.
2021-06-24 17:35:49 +04:30
Gunnar Beutner
38fca26f54
Kernel: Add stubs for missing x86_64 functionality
...
This adds just enough stubs to make the kernel compile on x86_64. Obviously
it won't do anything useful - in fact it won't even attempt to boot because
Multiboot doesn't support ELF64 binaries - but it gets those compiler errors
out of the way so more progress can be made getting all the missing
functionality in place.
2021-06-24 09:27:13 +02:00
Hendiadyoin1
62f9377656
Kernel: Move special sections into Sections.h
...
This also removes a lot of CPU.h includes infavor for Sections.h
2021-06-24 00:38:23 +02:00
Hendiadyoin1
553ea3036d
Kernel: Remove PAGE_SIZE from CPU.h
...
We have that information in LibC, lets use that instead
2021-06-24 00:38:23 +02:00
Hendiadyoin1
7ca3d413f7
Kernel: Pull apart CPU.h
...
This does not add any functional changes
2021-06-24 00:38:23 +02:00
Jean-Baptiste Boric
fea23d0ec1
Kernel: Detect support for CPUID FXSR
...
The fxsave and fxrstor instructions are available only if the FXSR
feature is present.
2021-06-18 01:02:25 +02:00
Gunnar Beutner
4fca9ee060
Kernel: Allow building the kernel with -O0
...
Unfortunately the kernel doesn't run with -O0 but at least it can be
successfully built with this change.
2021-05-28 19:52:22 +01:00
Gunnar Beutner
8495d6aeca
Kernel: Use the Function class for smp_broadcast()/smp_unicast()
...
This avoids allocations for smp_broadcast() and smp_unicast() by
using the Function class.
2021-05-20 09:09:10 +02:00
Gunnar Beutner
cac7a8ced9
Kernel: Use the Function class for deferred_call_queue()
...
This avoids allocations for deferred_call_queue().
2021-05-20 09:09:10 +02:00
Brian Gianforcaro
7540f4268b
Kernel: Remove s_processor_lock by making s_processors statically sized
...
Currently in SMP mode we hard code support for up to only 8 processors.
There is no reason for this to be a dynamic allocation that needs to be
guarded by a spinlock. Instead use a Array<T* with inline storage of 8,
allowing each processor to initialize it self in place, avoiding all
the need for locks.
2021-05-20 08:10:07 +02:00
Nicholas Baron
aa4d41fe2c
AK+Kernel+LibELF: Remove the need for IteratorDecision::Continue
...
By constraining two implementations, the compiler will select the best
fitting one. All this will require is duplicating the implementation and
simplifying for the `void` case.
This constraining also informs both the caller and compiler by passing
the callback parameter types as part of the constraint
(e.g.: `IterationFunction<int>`).
Some `for_each` functions in LibELF only take functions which return
`void`. This is a minimal correctness check, as it removes one way for a
function to incompletely do something.
There seems to be a possible idiom where inside a lambda, a `return;` is
the same as `continue;` in a for-loop.
2021-05-16 10:36:52 +01:00
Brian Gianforcaro
64b4e3f34b
Kernel: Add Processor::is_bootstrap_processor() function, and use it. ( #6871 )
...
The variety of checks for Processor::id() == 0 could use some assistance
in the readability department. This change adds a new function to
represent this check, and replaces the comparison everywhere it's used.
2021-05-05 18:48:26 +02:00
Tom
ec27cbbb2a
Kernel: Store whether a thread is the idle thread in Thread directly
...
This solves a problem where checking whether a thread is an idle
thread may require iterating all processors if it is not the idle
thread of the current processor.
2021-05-04 16:44:02 +02:00