arch/x86/intel64: do not use thread_state for arch data
k_thread.thread_state (or rather, _thread_base.thread_state) should be private to the kernel/scheduler, so flags previously stored there are moved to _thread_arch where the belong. Signed-off-by: Charles E. Youse <charles.youse@intel.com>
This commit is contained in:
parent
437256d17c
commit
a224998355
6 changed files with 15 additions and 13 deletions
|
@ -175,7 +175,7 @@ __swap:
|
|||
movq $_kernel, %rsi
|
||||
movq _kernel_offset_to_current(%rsi), %rsi
|
||||
|
||||
orb $_THREAD_SWAPPED, _thread_offset_to_thread_state(%rsi)
|
||||
andb $~X86_THREAD_FLAG_ALL, _thread_offset_to_flags(%rsi)
|
||||
|
||||
movl _k_neg_eagain, %eax
|
||||
movl %eax, _thread_offset_to_rax(%rsi)
|
||||
|
@ -219,8 +219,8 @@ __resume:
|
|||
movq _thread_offset_to_r15(%rsi), %r15
|
||||
movq _thread_offset_to_rax(%rsi), %rax
|
||||
|
||||
testb $_THREAD_SWAPPED, _thread_offset_to_thread_state(%rsi)
|
||||
jnz 1f
|
||||
testb $X86_THREAD_FLAG_ALL, _thread_offset_to_flags(%rsi)
|
||||
jz 1f
|
||||
|
||||
fxrstor _thread_offset_to_sse(%rsi)
|
||||
movq _thread_offset_to_rcx(%rsi), %rcx
|
||||
|
@ -466,7 +466,7 @@ irq_enter_nested: /* Nested IRQ: dump register state to stack. */
|
|||
|
||||
irq_enter_unnested: /* Not nested: dump state to thread struct for __resume */
|
||||
movq _kernel_offset_to_current(%rsi), %rsi
|
||||
andb $(~_THREAD_SWAPPED), _thread_offset_to_thread_state(%rsi)
|
||||
orb $X86_THREAD_FLAG_ALL, _thread_offset_to_flags(%rsi)
|
||||
fxsave _thread_offset_to_sse(%rsi)
|
||||
movq %rbx, _thread_offset_to_rbx(%rsi)
|
||||
movq %rbp, _thread_offset_to_rbp(%rsi)
|
||||
|
|
|
@ -30,4 +30,6 @@ void z_new_thread(struct k_thread *thread, k_thread_stack_t *stack,
|
|||
thread->arch.rcx = (long) parameter3;
|
||||
|
||||
x86_sse_init(thread);
|
||||
|
||||
thread->arch.flags = X86_THREAD_FLAG_ALL;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ GEN_OFFSET_SYM(_callee_saved_t, rip);
|
|||
GEN_OFFSET_SYM(_callee_saved_t, rflags);
|
||||
GEN_OFFSET_SYM(_callee_saved_t, rax);
|
||||
|
||||
GEN_OFFSET_SYM(_thread_arch_t, flags);
|
||||
GEN_OFFSET_SYM(_thread_arch_t, rcx);
|
||||
GEN_OFFSET_SYM(_thread_arch_t, rdx);
|
||||
GEN_OFFSET_SYM(_thread_arch_t, rsi);
|
||||
|
|
|
@ -14,14 +14,6 @@
|
|||
#define X86_FXSAVE_ALIGN 16 /* ... for FXSAVE/FXRSTOR ops */
|
||||
#define X86_MXCSR_SANE 0x1dc0 /* enable division-by-zero exception */
|
||||
|
||||
/*
|
||||
* A flag for k_thread.thread_state to tell __resume that the thread
|
||||
* voluntarily switched itself out, so only a portion of the register
|
||||
* state needs to be restored. See kernel_arch_thread.h and locore.S.
|
||||
*/
|
||||
|
||||
#define _THREAD_SWAPPED BIT(7)
|
||||
|
||||
/*
|
||||
* GDT selectors - these must agree with the GDT layout in locore.S.
|
||||
*/
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#ifndef ZEPHYR_ARCH_X86_INCLUDE_INTEL64_KERNEL_ARCH_THREAD_H_
|
||||
#define ZEPHYR_ARCH_X86_INCLUDE_INTEL64_KERNEL_ARCH_THREAD_H_
|
||||
|
||||
#define X86_THREAD_FLAG_ALL 0x01 /* _thread_arch.flags: entire state saved */
|
||||
|
||||
#ifndef _ASMLANGUAGE
|
||||
|
||||
#include <zephyr/types.h>
|
||||
|
@ -14,7 +16,7 @@
|
|||
/*
|
||||
* The _callee_saved registers are unconditionally saved/restored across
|
||||
* context switches; the _thread_arch registers are only preserved when
|
||||
* the thread is interrupted. _THREAD_SWAPPED tells __resume when it can
|
||||
* the thread is interrupted. _arch_thread.flags tells __resume when to
|
||||
* cheat and only restore the first set. For more details see locore.S.
|
||||
*/
|
||||
|
||||
|
@ -34,6 +36,8 @@ struct _callee_saved {
|
|||
typedef struct _callee_saved _callee_saved_t;
|
||||
|
||||
struct _thread_arch {
|
||||
u8_t flags;
|
||||
|
||||
u64_t rcx;
|
||||
u64_t rdx;
|
||||
u64_t rsi;
|
||||
|
|
|
@ -38,6 +38,9 @@
|
|||
#define _thread_offset_to_rax \
|
||||
(___thread_t_callee_saved_OFFSET + ___callee_saved_t_rax_OFFSET)
|
||||
|
||||
#define _thread_offset_to_flags \
|
||||
(___thread_t_arch_OFFSET + ___thread_arch_t_flags_OFFSET)
|
||||
|
||||
#define _thread_offset_to_rcx \
|
||||
(___thread_t_arch_OFFSET + ___thread_arch_t_rcx_OFFSET)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue