The default implementation of the memcpy, memmove, memset and memcmp
functions in the kernel file `extern.rs` uses a naive implementation
by copying, assigning or comparing bytes ony by one. This can be slow.
This commit proposes a reimplementation of those functions by copying,
assigning or comparing in group of 8 bytes by using the u64 type and
its respective pointers instead of u8. Alternative version for 32-bit
architectures are also supplied for future compatibility with x86.
Both version first copy whatever they can with wide word types. The
tail, i.e. the final few bytes that do not fit in a dword or qword
are then copied byte by byte.
Here is a comparison of copying 64kiB (65536 bytes) on stack:
x86_64-unknown-linux-gnu: (64-bit)
| naive (ns) | fast (ns) | speedup (x)
-------|------------|-----------|------------
memcpy | 204430 | 32994 | ~6.20
memmove| 202540 | 33186 | ~6.10
memset | 163391 | 23884 | ~6.84
memcmp | 205663 | 34385 | ~5.98
i686-unknown-linux-gnu: (32-bit)
| naive (ns) | fast (ns) | speedup (x)
-------|------------|-----------|------------
memcpy | 206297 | 66858 | ~3.09
memmove| 204576 | 70326 | ~2.91
memset | 165599 | 50227 | ~3.30
memcmp | 204262 | 70572 | ~2.89
Copying on the heap behaves simmilarly.
All tests performed on Intel i5 6600K (4x4.2GHz),
ArchLinux Kernel 4.8.12-3 x86_64.
There was a bug at the `initfs` generation which made the listing of the contents of the `initfs:`subdirectories impossible from the command line.
The subdirectory listing data had the full paths of the files (like `bin/ahcid\nbin/bgad\n...`) when it should just only be the names of the files (`ahcid\nbgad\n...`)
- Implemented a global variable, ACPI_TABLE, behind a mutex, which contains the ACPI information pertinent to the rest of the kernel, currently solely containing a pointer to the FADT.
- Split device initialization into two categories - "core" devices, such as the PIC and local APIC, necessary for initializing the rest of the kernel, and "non-core" devices such as serial and RTC, which are to be initialized last.
- Checked for the presence of the century register, and consequentially read from, in the RTC code, now factored into the date calculation. The location of the register is pulled from the "century" field in the FADT.
- Modified page unmapping in the ACPI code, such that any tables to be stored globally (currently only the FADT) are not unmapped after reading, such that they can be stored in globally accessible pointers without causing page faults.
A kernel panic occurs on some CPUs (notably qemu-system-x86_64) when
calling rust-cpuid's get_extended_function_info. This is fixed upstream
in commit c3ebfc553cdff98d19d29777fd85c4f9182bfb66 but has yet to make
it crates.io.
The panic can by triggered by running "ls sys:" from ion and causes
redox to become unresponsive.