diff options
author | Yue Du <daviddu@us.ibm.com> | 2017-07-13 14:51:27 -0500 |
---|---|---|
committer | Joshua Hunsberger <jahunsbe@us.ibm.com> | 2017-10-23 18:45:34 -0500 |
commit | 54d959041df5dac3c69d84c3ae392edc92079076 (patch) | |
tree | 1269e128c96d888cf5dd4812c16ab678bcf3e28f /import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_threads.c | |
parent | 318a174897126d34e5b3e8875e3727883d7fb94e (diff) | |
download | talos-hcode-54d959041df5dac3c69d84c3ae392edc92079076.tar.gz talos-hcode-54d959041df5dac3c69d84c3ae392edc92079076.zip |
STOP: Init code before starting threads
Change-Id: Icbd3cb6e0f647b78391bb405f6cfc6ae25d1326a
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43112
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: BRIAN D. VICTOR <brian.d.victor1@ibm.com>
Reviewed-by: CHRISTOPHER M. RIEDL <cmriedl@us.ibm.com>
Reviewed-by: Gregory S. Still <stillgs@us.ibm.com>
Diffstat (limited to 'import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_threads.c')
-rw-r--r-- | import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_threads.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_threads.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_threads.c new file mode 100644 index 00000000..530d1593 --- /dev/null +++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_threads.c @@ -0,0 +1,112 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_threads.c $ */ +/* */ +/* OpenPOWER HCODE Project */ +/* */ +/* COPYRIGHT 2015,2017 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* 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. */ +/* */ +/* IBM_PROLOG_END_TAG */ + +#include "p9_cme_stop.h" +#include "p9_cme_irq.h" + +extern CmeStopRecord G_cme_stop_record; +extern CmeRecord G_cme_record; + + + +void +p9_cme_stop_eval_eimr_override() +{ + g_eimr_override &= ~(BITS64(12, 6) | BITS64(20, 2)); + data64_t mask_irqs = {0}; + mask_irqs.words.lower = 0; + + mask_irqs.words.upper = + ((((~G_cme_record.core_enabled) | + G_cme_stop_record.core_running | + G_cme_stop_record.core_blockpc | + G_cme_stop_record.core_blockwu) & CME_MASK_BC) << SHIFT32(13)) | +#if SPWU_AUTO + ((((~G_cme_record.core_enabled) | + G_cme_stop_record.core_running) & CME_MASK_BC) << SHIFT32(15)) | +#endif + ((((~G_cme_record.core_enabled) | + G_cme_stop_record.core_running) & CME_MASK_BC) << SHIFT32(17)) | + (((~(G_cme_record.core_enabled & + G_cme_stop_record.core_running) & + G_cme_stop_record.core_blockey) & CME_MASK_BC) << SHIFT32(21)); + + g_eimr_override |= mask_irqs.value; +} + + + +void +p9_cme_stop_enter_thread(void* arg) +{ + PkMachineContext ctx __attribute__((unused)); + +#if !defined(__IOTA__) + + while(1) + { + // Thread goes to sleep + pk_semaphore_pend(&(G_cme_stop_record.sem[0]), PK_WAIT_FOREVER); + wrteei(1); + + // The actual entry sequence + p9_cme_stop_entry(); + + // re-evaluate g_eimr_override then restore eimr + p9_cme_stop_eval_eimr_override(); + pk_irq_vec_restore(&ctx); + } + +#endif +} + + + +void +p9_cme_stop_exit_thread(void* arg) +{ + PkMachineContext ctx __attribute__((unused)); + + //-------------------------------------------------------------------------- + // Starting Thread Loop + //-------------------------------------------------------------------------- +#if !defined(__IOTA__) + + while(1) + { + // Thread goes to sleep + pk_semaphore_pend(&(G_cme_stop_record.sem[1]), PK_WAIT_FOREVER); + wrteei(1); + + // The actual exit sequence + p9_cme_stop_exit(); + + // re-evaluate g_eimr_override then restore eimr + p9_cme_stop_eval_eimr_override(); + pk_irq_vec_restore(&ctx); + } + +#endif +} |