OpenCores
URL https://opencores.org/ocsvn/aemb/aemb/trunk

Subversion Repositories aemb

[/] [aemb/] [trunk/] [sw/] [cc/] [aemb/] [hook.hh] - Rev 111

Go to most recent revision | Compare with Previous | Blame | View Log

/* $Id: hook.hh,v 1.2 2008-04-11 15:20:31 sybreon Exp $
** 
** AEMB2 HI-PERFORMANCE CPU 
** Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
**  
** This file is part of AEMB.
**
** AEMB is free software: you can redistribute it and/or modify it
** under the terms of the GNU Lesser General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** AEMB is distributed in the hope that it will be useful, but WITHOUT
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
** or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
** Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
*/

/**
   Basic begin/end hooks
   @file hook.hh  

   These routines hook themselves onto the startup and ending parts of
   the main programme. In order to use it, the main programme needs to
   be compiled with optimisations turned on (at least -O1).
 */

#include "aemb/stack.hh"
#include "aemb/heap.hh"
#include "aemb/thread.hh"

#ifndef __OPTIMIZE__
// ugly hack to check if optimisation is used.
OPTIMISATION_REQUIRED XXX
#endif

#ifndef AEMB_HOOK_HH
#define AEMB_HOOK_HH

namespace aemb {

  //void hookProgramInit() asm ("_program_init"); // hook aliasing
  //void hookProgramClean() asm ("_program_clean"); // hook aliasing
  extern "C" void _program_init();
  extern "C" void _program_clean();

  /**
  Finalisation hook
  
  This function executes during the shutdown phase after the
  finalisation routine is called. It will merge the changes made
  during initialisation.
  */
  
  //void hookProgramClean()
  void _program_clean()
  {     
    if (aemb::isThread1()) {    
      // unify the stack backwards
      aemb::setStack(aemb::getStack() + 
                         (aemb::getStackSize() >> 1));
      
      // FIXME: unify the heap
      
    }
  }
  
  /**
  Initialisation hook
  
  This function executes during the startup phase before the
  initialisation routine is called. It splits the heap and stack
  between the threads.
  */
  
  //void hookProgramInit() 
  void _program_init()
  {
    if (aemb::isThread1()) {  // check if PHASE 1    
      // split and shift the stack
      aemb::setStack(aemb::getStack() - 
                         (aemb::getStackSize() >> 1));
      
      // FIXME: split and shift the heap
      
    }      
  }
};

#endif

/*
  $Log: not supported by cvs2svn $
  Revision 1.1  2008/04/09 19:48:37  sybreon
  Added new C++ files

*/

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.