zephyr/kernel/include/offsets_short.h
Benjamin Walsh 168695c7ef kernel/arch: inspect prio/sched_locked together for preemptibility
These two fields in the thread structure control the preemptibility of a
thread.

sched_locked is decremented when the scheduler gets locked, which means
that the scheduler is locked for values 0xff to 0x01, since it can be
locked recursively. A thread is coop if its priority is negative, thus
if the prio field value is 0x80 to 0xff when looked at as an unsigned
value.

By putting them end-to-end, this means that a thread is non-preemptible
if the bundled value is greater than or equal to 0x0080. This is the
only thing the interrupt exit code has to check to decide to try a
reschedule or not.

Change-Id: I902d36c14859d0d7a951a6aa1bea164613821aca
Signed-off-by: Benjamin Walsh <benjamin.walsh@windriver.com>
2017-01-09 20:52:25 +00:00

78 lines
1.9 KiB
C

/*
* Copyright (c) 2016 Wind River Systems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _offsets_short__h_
#define _offsets_short__h_
#include <offsets.h>
#include <offsets_short_arch.h>
/* kernel */
/* main */
#define _kernel_offset_to_nested \
(___kernel_t_nested_OFFSET)
#define _kernel_offset_to_irq_stack \
(___kernel_t_irq_stack_OFFSET)
#define _kernel_offset_to_current \
(___kernel_t_current_OFFSET)
#define _kernel_offset_to_idle \
(___kernel_t_idle_OFFSET)
#define _kernel_offset_to_current_fp \
(___kernel_t_current_fp_OFFSET)
#define _kernel_offset_to_ready_q_cache \
(___kernel_t_ready_q_OFFSET + ___ready_q_t_cache_OFFSET)
/* end - kernel */
/* threads */
/* main */
#define _thread_offset_to_callee_saved \
(___thread_t_callee_saved_OFFSET)
/* base */
#define _thread_offset_to_thread_state \
(___thread_t_base_OFFSET + ___thread_base_t_thread_state_OFFSET)
#define _thread_offset_to_execution_flags \
(___thread_t_base_OFFSET + ___thread_base_t_execution_flags_OFFSET)
#define _thread_offset_to_prio \
(___thread_t_base_OFFSET + ___thread_base_t_prio_OFFSET)
#define _thread_offset_to_sched_locked \
(___thread_t_base_OFFSET + ___thread_base_t_sched_locked_OFFSET)
#define _thread_offset_to_preempt \
(___thread_t_base_OFFSET + ___thread_base_t_preempt_OFFSET)
#define _thread_offset_to_esf \
(___thread_t_arch_OFFSET + ___thread_arch_t_esf_OFFSET)
/* end - threads */
#endif /* _offsets_short__h_ */