// // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo // // The contents of this file are covered under the licence agreement in the // file "LICENCE" distributed with Cforall. // // kernel_private.hfa -- // // Author : Thierry Delisle // Created On : Mon Feb 13 12:27:26 2017 // Last Modified By : Peter A. Buhr // Last Modified On : Sat Nov 30 19:25:02 2019 // Update Count : 8 // #pragma once #include "kernel.hfa" #include "thread.hfa" #include "alarm.hfa" //----------------------------------------------------------------------------- // Scheduler extern "C" { void disable_interrupts() OPTIONAL_THREAD; void enable_interrupts_noPoll(); void enable_interrupts( __cfaabi_dbg_ctx_param ); } void __schedule_thread( $thread * ) __attribute__((nonnull (1))); //Block current thread and release/wake-up the following resources void __leave_thread() __attribute__((noreturn)); //----------------------------------------------------------------------------- // Processor void main(processorCtx_t *); void * __create_pthread( pthread_t *, void * (*)(void *), void * ); struct event_kernel_t { alarm_list_t alarms; __spinlock_t lock; }; extern event_kernel_t * event_kernel; struct __cfa_kernel_preemption_state_t { bool enabled; bool in_progress; unsigned short disable_count; }; extern volatile thread_local __cfa_kernel_preemption_state_t preemption_state __attribute__ ((tls_model ( "initial-exec" ))); extern cluster * mainCluster; //----------------------------------------------------------------------------- // Threads extern "C" { void __cfactx_invoke_thread(void (*main)(void *), void * this); } __cfaabi_dbg_debug_do( extern void __cfaabi_dbg_thread_register ( $thread * thrd ); extern void __cfaabi_dbg_thread_unregister( $thread * thrd ); ) // KERNEL ONLY unpark with out disabling interrupts void __unpark( $thread * thrd __cfaabi_dbg_ctx_param2 ); //----------------------------------------------------------------------------- // I/O void __kernel_io_startup ( cluster &, unsigned, bool ); void __kernel_io_finish_start( cluster & ); void __kernel_io_prepare_stop( cluster & ); void __kernel_io_shutdown ( cluster &, bool ); //----------------------------------------------------------------------------- // Utils #define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)] static inline uint32_t __tls_rand() { kernelTLS.rand_seed ^= kernelTLS.rand_seed << 6; kernelTLS.rand_seed ^= kernelTLS.rand_seed >> 21; kernelTLS.rand_seed ^= kernelTLS.rand_seed << 7; return kernelTLS.rand_seed; } void doregister( struct cluster & cltr ); void unregister( struct cluster & cltr ); void doregister( struct cluster * cltr, struct $thread & thrd ); void unregister( struct cluster * cltr, struct $thread & thrd ); void doregister( struct cluster * cltr, struct processor * proc ); void unregister( struct cluster * cltr, struct processor * proc ); // Local Variables: // // mode: c // // tab-width: 4 // // End: //