diff options
author | Bill Hoffa <wghoffa@us.ibm.com> | 2014-03-27 10:16:15 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-05-29 12:49:26 -0500 |
commit | a8e490184f0f436d8fa1e175c7f9d7368923340b (patch) | |
tree | e967ed626d53e1f13aaac3b81bd2f83ad9f0bca0 /src/usr/hwpf | |
parent | 192aff0a38f60718af72a730b0c968a35a56d74f (diff) | |
download | talos-hostboot-a8e490184f0f436d8fa1e175c7f9d7368923340b.tar.gz talos-hostboot-a8e490184f0f436d8fa1e175c7f9d7368923340b.zip |
Only accept Istep Messages to Master Node after system SMP established
Change-Id: I993a9684b4ee93541b75b4bfc22f22ddad5bedb5
RTC:93394
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/10012
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf')
-rw-r--r-- | src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C index e22e76a96..912ababed 100644 --- a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C +++ b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C @@ -71,6 +71,7 @@ // #include "host_coalesce_host/host_coalesce_host.H" #include "p8_block_wakeup_intr/p8_block_wakeup_intr.H" #include "p8_cpu_special_wakeup.H" +#include <initservice/istepdispatcherif.H> namespace ESTABLISH_SYSTEM_SMP { @@ -212,12 +213,11 @@ errlHndl_t call_host_coalesce_host( ) const INTR::PIR_t masterCpu = task_getcpuid(); uint64_t this_node = masterCpu.nodeId; - //loop though all possible drawers whether they exist or not // An invalid or non-existant logical node number in that drawer // indicates that the drawer does not exist. - TARGETING::ATTR_HB_EXISTING_IMAGE_type mask = 0x0; + TARGETING::ATTR_HB_EXISTING_IMAGE_type master_node_mask = 0x0; for(uint16_t drawer = 0; drawer < NUMBER_OF_POSSIBLE_NODES; ++drawer) { @@ -235,6 +235,12 @@ errlHndl_t call_host_coalesce_host( ) mask,hb_existing_image); if( 0 != ((mask >> node) & hb_existing_image ) ) { + //The first nonzero bit in hb_existing_image represents the + // master node, set mask for later comparison + if (master_node_mask == 0) + { + master_node_mask = mask; + } TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "send coalese host message to drawer %d", drawer ); @@ -259,6 +265,26 @@ errlHndl_t call_host_coalesce_host( ) //the other nodes if(l_errl == NULL) { + // reset mask to msb + mask = 0x1 << (NUMBER_OF_POSSIBLE_NODES -1); + //create mask to apply to hb_existing_image for this particular node + mask = mask >> this_node; + + if (master_node_mask & (hb_existing_image & mask)) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "Master Node detected, continue allowing " + "istep messages to this node."); + INITSERVICE::setAcceptIstepMessages(true); + } + else + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "This node is not the master node, no longer " + "respond to istep messages."); + INITSERVICE::setAcceptIstepMessages(false); + } + //wait for all hb images to respond //want to spawn a timer thread tid_t l_progTid = task_create( |