mirror of
https://github.com/Dasharo/zephyr.git
synced 2026-03-06 14:57:20 -08:00
This patch adds a x86_64 architecture and qemu_x86_64 board to Zephyr. Only the basic architecture support needed to run 64 bit code is added; no drivers are added, though a low-level console exists and is wired to printk(). The support is built on top of a "X86 underkernel" layer, which can be built in isolation as a unit test on a Linux host. Limitations: + Right now the SDK lacks an x86_64 toolchain. The build will fall back to a host toolchain if it finds no cross compiler defined, which is tested to work on gcc 8.2.1 right now. + No x87/SSE/AVX usage is allowed. This is a stronger limitation than other architectures where the instructions work from one thread even if the context switch code doesn't support it. We are passing -no-sse to prevent gcc from automatically generating SSE instructions for non-floating-point purposes, which has the side effect of changing the ABI. Future work to handle the FPU registers will need to be combined with an "application" ABI distinct from the kernel one (or just to require USERSPACE). + Paging is enabled (it has to be in long mode), but is a 1:1 mapping of all memory. No MMU/USERSPACE support yet. + We are building with -mno-red-zone for stack size reasons, but this is a valuable optimization. Enabling it requires automatic stack switching, which requires a TSS, which means it has to happen after MMU support. + The OS runs in 64 bit mode, but for compatibility reasons is compiled to the 32 bit "X32" ABI. So while the full 64 bit registers and instruction set are available, C pointers are 32 bits long and Zephyr is constrained to run in the bottom 4G of memory. Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
Title: kernel Object Performance
Description:
The SysKernel test measures the performance of semaphore,
lifo, fifo and stack objects.
--------------------------------------------------------------------------------
Building and Running Project:
This project outputs to the console. It can be built and executed
on QEMU as follows:
make run
--------------------------------------------------------------------------------
Troubleshooting:
Problems caused by out-dated project information can be addressed by
issuing one of the following commands then rebuilding the project:
make clean # discard results of previous builds
# but keep existing configuration info
or
make pristine # discard results of previous builds
# and restore pre-defined configuration info
--------------------------------------------------------------------------------
Sample Output:
MODULE: kernel API test
KERNEL VERSION: 0x1066300
Each test below is repeated 5000 times;
average time for one iteration is displayed.
TEST CASE: Semaphore #1
TEST COVERAGE:
k_sem_init
k_sem_take(K_FOREVER)
k_sem_give
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: Semaphore #2
TEST COVERAGE:
k_sem_init
k_sem_take(TICKS_NONE)
k_yield
k_sem_give
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: Semaphore #3
TEST COVERAGE:
k_sem_init
k_sem_take(K_FOREVER)
k_sem_give
k_sem_give
k_sem_take(K_FOREVER)
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: LIFO #1
TEST COVERAGE:
k_lifo_init
k_lifo_get(K_FOREVER)
k_lifo_put
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: LIFO #2
TEST COVERAGE:
k_lifo_init
k_lifo_get(K_FOREVER)
k_lifo_get(TICKS_NONE)
k_lifo_put
k_yield
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: LIFO #3
TEST COVERAGE:
k_lifo_init
k_lifo_get(K_FOREVER)
k_lifo_put
k_lifo_get(K_FOREVER)
k_lifo_put
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: FIFO #1
TEST COVERAGE:
k_fifo_init
k_fifo_get(K_FOREVER)
k_fifo_put
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: FIFO #2
TEST COVERAGE:
k_fifo_init
k_fifo_get(K_FOREVER)
k_fifo_get(TICKS_NONE)
k_fifo_put
k_yield
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: FIFO #3
TEST COVERAGE:
k_fifo_init
k_fifo_get(K_FOREVER)
k_fifo_put
k_fifo_get(K_FOREVER)
k_fifo_put
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: Stack #1
TEST COVERAGE:
k_stack_init
k_stack_pop(K_FOREVER)
k_stack_push
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: Stack #2
TEST COVERAGE:
k_stack_init
k_stack_pop(K_FOREVER)
k_stack_pop
k_stack_push
k_yield
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
TEST CASE: Stack #3
TEST COVERAGE:
k_stack_init
k_stack_pop(K_FOREVER)
k_stack_push
k_stack_pop(K_FOREVER)
k_stack_push
Starting test. Please wait...
TEST RESULT: SUCCESSFUL
DETAILS: Average time for 1 iteration: NNNN nSec
END TEST CASE
PROJECT EXECUTION SUCCESSFUL
QEMU: Terminated