From 7de0708eac63bb81786c2a5e794c5d6fbef069c4 Mon Sep 17 00:00:00 2001 From: Doug Gilbert Date: Fri, 4 Nov 2011 12:12:01 -0500 Subject: Interrupt presenter implementation Change-Id: If6b499d819b71298b8a64e096e1eb83c639ad645 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/517 Tested-by: Jenkins Server Reviewed-by: Daniel M. Crowell Reviewed-by: A. Patrick Williams III --- src/include/kernel/intmsghandler.H | 99 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/include/kernel/intmsghandler.H (limited to 'src/include/kernel/intmsghandler.H') diff --git a/src/include/kernel/intmsghandler.H b/src/include/kernel/intmsghandler.H new file mode 100644 index 000000000..52eadde27 --- /dev/null +++ b/src/include/kernel/intmsghandler.H @@ -0,0 +1,99 @@ +// IBM_PROLOG_BEGIN_TAG +// This is an automatically generated prolog. +// +// $Source: src/include/kernel/intmsghandler.H $ +// +// IBM CONFIDENTIAL +// +// COPYRIGHT International Business Machines Corp. 2011 +// +// p1 +// +// Object Code Only (OCO) source materials +// Licensed Internal Code Source Materials +// IBM HostBoot Licensed Internal Code +// +// The source code for this program is not published or other- +// wise divested of its trade secrets, irrespective of what has +// been deposited with the U.S. Copyright Office. +// +// Origin: 30 +// +// IBM_PROLOG_END +#ifndef __KERNEL_INTERRUPTMSGHDLR_H +#define __KERNEL_INTERRUPTMSGHDLR_H + +#include +#include +#include +#include + +/** + * @class InterruptMsgHdlr + * @brief Class to handle sending a message to user space for + * an External Interrupt. + * + * This class extends from the base MessageHandler so the base send/receive + * message functions can be utilized. It overrides how to handle the message + * responses + */ +class InterruptMsgHdlr : public MessageHandler +{ + public: + + // Notes: + // All external interrupts are routed to one cpu core + // External Interrupts are only processed one at a time + // So we don't need a spinlock + /** + * Constructor + */ + InterruptMsgHdlr(MessageQueue * i_msgQ) + : MessageHandler(NULL,i_msgQ) {} // TODO need splinlock? + + /** + * Destructor. + */ + virtual ~InterruptMsgHdlr() {}; + + /** + * Handle response to 'send message' + * + * @param[in] i_type - The message type previously sent. + * @param[in] i_key - The key value for the received message. + * @param[in] i_task - The deferred task. + * @param[in] i_rc - The response rc from userspace. + * + * @return HandleResult - The desired behavior on the 'recv message' + * interface for this pair. + */ + virtual HandleResult handleResponse(msg_sys_types_t i_type,void* i_key, + task_t* i_task,int i_rc); + + + /** + * Create the InterruptMsgHdlr to handle external interrupts + * @param[in] i_msgQ The message queue + */ + static void create(MessageQueue * i_msgQ); + + /** + * Handle an external interrupt from HW + */ + static void handleInterrupt(); + + /** + * Add cpu core - set up the external interrupt registers + * @param[in] i_pir The cpu id of the core to to set-up + * @note should be called when ever a new core becomes active + */ + static void addCpuCore(uint64_t i_pir); + + private: + + static InterruptMsgHdlr * cv_instance; +}; + + +#endif + -- cgit v1.2.1