Will be merged with the x86 one later on. Requires -fno-omit-frame-pointer on
the kernel build flags, GCC defaults to not generating stack frames on x86_64.
* Wasn't storing the fixed virtual address of the PML4 in kernel_args.
* After switching to long mode, reload GDTR with the virtual address of
the GDT. This was working fine until now because the physical address
was identity mapped, but broke as soon as I removed the identity
mapping.
* typedef for jmp_buf was using int where it should be long.
* setjmp was clearing the buffer pointer rather than the signal mask before
calling sigsetjmp.
* KDL now works without crashing on x86_64.
Since x86_64 has such a large virtual address space all available physical
memory can be mapped in to it. The physical page mapper implementation for
x86_64 will use this mapping. Also changed the mapping code to map kernel
pages with the global flag.
* Added empty source files for all the 64-bit paging method code, and a
stub implementation of X86PagingMethod64Bit.
* arch_vm_translation_map.cpp has been modified to use X86PagingMethod64Bit
on x86_64.
* Some things are currently ifndef'd out completely for x86_64 because
they aren't implemented, there's a few other ifdef's to handle x86_64
differences but most of the code works unchanged.
* Renamed some i386_* functions to x86_*.
* Added a temporary method for setting the current thread on x86_64
(a global variable, not SMP safe). This will be changed to be done
via the GS segment but I've not implemented that yet.
I've split the 32-bit dependent IDT setup code and ASM interrupt handlers to
the 32 subdirectory, arch_int.cpp now contains only the generic hardware
interrupt handling code.
For now I've just put all the stub functions that are needed to link the
kernel into a file called stubs.cpp. I've not yet moved across the interrupt
handling code or the ELF64 relocation code to the x86 directory. Once those
have been moved I can get rid of the x86_64 headers/source directories.
- repnz movsb turns out to not actually be a legal instruction,
resulting in various strings being copied incorrectly, leading to
random crashes in various places. Rework to use loop instead.
Thanks to Alex Smith for helping review changes and offering
improvements.
- Minor cleanups.
- Fixes #8650 properly.
Not many changes seeing as there's not much x86_64 stuff done yet. Small
differences are handled with ifdefs, large differences (descriptors.h,
struct iframe) have separate headers under arch/x86/32 and arch/x86/64.
Since x86 and x86_64 share a lot of common code, x86_64 kernel sources/headers
are going to reside under headers/private/kernel/arch/x86 and
src/system/kernel/arch/x86 along with the existing x86 code. This commit
changes the build system to handle this. A new variable, TARGET_KERNEL_ARCH,
has been added. This is the name of the kernel/boot architecture directory
name, set to x86 on both x86 and x86_64. This is now used in all places where
TARGET_ARCH was used to get to kernel arch sources/headers (I've changed
everything necessary as far as I can tell). Kernel won't build for x86_64
at the moment as the sources have not been merged, loader does.
- Replace arch_cpu_user_strlcpy() and arch_cpu_user_memset() with x86 assembly
versions. These correctly handle the fault handler, which had broken again
on gcc4 for the C versions, causing stack corruption in certain error cases.
The other architectures will still need to have corresponding asm variants
added in order for them to not run into the same issue though.
The caches contain pointers into memory allocated by debug_malloc()
that come from a pool that is destroied once the command returns.
We therefore have to ensure that all such pointers are cleared in all
cases before returning from the command or we will run into errors
when executing the next commands.
Using the qrwebpost debugger command one can initialize an id for
subsequent QR codes. All QR codes generated following such an
invokation produce URL QR codes that link to an online service that
concatenates all data with the same id and later allows it to be
displayed/downloaded in one piece. This makes collecting larger amounts
of data more convenient. Note though that the URL encoding does waste
space and therefore reduces data density, causing more QR codes to be
generated for the same amount of input data.
* Generates QR codes using the qrencode library functions and prints them
using terminal escape sequences and the special "block" characters.
* Supplies a static QR buffer that can be used to accumulate output for
later conversion into QR codes.
* Adds qrencode debugger command that allows to generate QR codes for
arbitrary strings.
* Adds qrappend, qrflush and qrclear to manipulate the QR buffer.
qrappend can be the target of a pipe to accumulate output from other
commands. qrflush causes the QR buffer to be encoded and cleared and
qrclear only clears the QR buffer.
* Adds qrconfig that allows changing the QR code version, determining
what size QR codes are to be used.
Characters 17, 18 and 19 (device control 1, 2 and 3) become "full block",
"upper filled block" and "lower filled block". Using back- and foreground
color inversion these could be reduced to a single "half block", but
having them available as idividual chars is more convenient.
The kernel strdup will still be used, as the local symbol doesn't
override that. Since we must not use strdup from within the kernel
debugger (as it does malloc from the normal heap), force the use of
the internal strdup that gets redirected to debug_malloc.