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

Subversion Repositories aemb

[/] [aemb/] [trunk/] [sw/] [c/] [libaemb.h] - Rev 191

Compare with Previous | Blame | View Log

/* $Id: libaemb.h,v 1.3 2007-12-16 03:26:37 sybreon Exp $
**
** AEMB2 CUSTOM LIBRARY
** 
** 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/>.
*/
 
#ifndef LIBAEMB_H
#define LIBAEMB_H
 
#define AEMB_TXE 0x0100
#define AEMB_TXP 0x0400
#define AEMB_TX0 0x0300
#define AEMB_TX1 0x0700
#define AEMB_MSK 0x0F00
 
#define AEMB_BIP 0x0008
#define AEMB_CCC 0x0004
#define AEMB_ITE 0x0002
#define AEMB_BLE 0x0001
 
 
// Linker symbols
extern void* _STACK_SIZE;
extern void* _stack_end;
 
 
void aemb_hook_init () asm ("_program_init");
void aemb_hook_clean () asm ("_program_clean");
 
inline void aemb_enable_interrupt ();
inline void aemb_disable_interrupt ();
inline int aemb_isthread1();
inline int aemb_isthread0();
inline int aemb_isthreaded();
 
/*!
* Assembly macro to enable MSR_IE
*/
void aemb_enable_interrupt ()
{
  int msr, tmp;
  asm volatile ("mfs %0, rmsr;"
		"ori %1, %0, 0x02;"
		"mts rmsr, %1;"
		: "=r"(msr)
		: "r" (tmp)
		);
}
 
/*!
* Assembly macro to disable MSR_IE
*/
void aemb_disable_interrupt ()
{
  int msr, tmp;
  asm volatile ("mfs %0, rmsr;"
		"andi %1, %0, 0xFD;"
		"mts rmsr, %1;"
		: "=r"(msr)
		: "r" (tmp)
		);
}
 
/*!
* Bootstrap Hook Override
*/
 
void aemb_hook_init ()
{
  int msr, tmp;
  int stk_end, stk_siz;
 
  /*
  // Check to see if hardware threads are enabled
  if (((msr & AEMB_TXE) != AEMB_TXE) ||
  // Check to see if second thread is started
      ((msr & AEMB_TX1) == AEMB_TX1)) return;
  */
  //return;
  asm volatile ("mfs %0, rmsr;"
		// Check for BIP
		"andi %1, %0, %5;"
		"xori %1, %1, %5;"
		"beqi %1, 44;"
 
		// Check for TXE
		"andi %1, %0, %2;"
		"xori %1, %1, %2;"
		"bnei %1, 36;"	
 
		// Check for TX1
		"andi %1, %0, %3;"
		"xori %1, %1, %3;"
		"beqi %1, 20;"
 
		// reallocate stack pointer for T0
		"ori %1, r0, %4;"
		"sra %1, %1;"
		"rsubk r1, %1, r1;"
 
		// reboot the machine
		//"brki r0, _crtinit;"
		"brid 0;"
		"nop;"
 
		// clear BIP
		"andni %1, %0, %5;"
		"mts rmsr, %1;"
 
		:"=r"(msr), "=r"(tmp)
		:"i"(AEMB_TXE), "i"(AEMB_TX1), "i"(&_STACK_SIZE), "i"(AEMB_BIP)
		);
 
}
 
/*!
 Undo the changes made by programme init
*/
 
void aemb_hook_clean ()
{
  int msr, tmp;
  int stk_end, stk_siz;
 
  /*
  // Check to see if hardware threads are enabled
  if (((msr & AEMB_TXE) != AEMB_TXE) ||
  // Check to see if second thread is started
      ((msr & AEMB_TX1) == AEMB_TX1)) return;
  */
  return;
  asm volatile ("mfs %0, rmsr;"
		"andi %1, %0, %2;"
		"xori %1, %1, %2;"
		"bnei %1, 28;"		
		"andi %1, %0, %3;"
		"xori %1, %1, %3;"
		"beqi %1, 16;"
 
		// reallocate stack pointer for T0
		"ori %1, r0, %4;"
		"sra %1, %1;"
		"addk r1, %1, r1;"
 
		:"=r"(msr), "=r"(tmp)
		:"i"(AEMB_TXE), "i"(AEMB_TX1), "i"(&_STACK_SIZE)
		);
 
 
}
 
/* Checks if it's T1, and returns 0 if true */
 
int aemb_isthread1 ()
{
  int msr, tmp, res;
  asm volatile ("mfs %0, rmsr;"
		"andi %1, %0, %3;"
		"xori %1, %1, %3;"	       
		:"=r"(msr), "=r"(tmp)
		:"i"(AEMB_TXE), "i"(AEMB_TXP)
		);
  return tmp;  
}
 
/* Checks if it's T0, and returns 0 if true */
 
int aemb_isthread0 ()
{
  int msr, tmp, res;
  asm volatile ("mfs %0, rmsr;"
		"andi %1, %0, %3;"
		"xori %1, %1, %2;"	       
		:"=r"(msr), "=r"(tmp)
		:"i"(AEMB_TXP), "i"(AEMB_MSK)
		);
  return tmp;  
}
 
/* Checks if TXE is available, and returns 0 if true */
 
int aemb_isthreaded ()
{
  int msr, tmp, res;
  asm volatile ("mfs %0, rmsr;"
		"andi %1, %0, %2;"
		"xori %1, %1, %2;"	       
		:"=r"(msr), "=r"(tmp)
		:"i"(AEMB_TXE), "i"(AEMB_MSK)
		);
  return tmp;  
}
 
#endif
 
/* $Log: not supported by cvs2svn $
/* Revision 1.1  2007/12/11 00:44:04  sybreon
/* initial import
/* */
 

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.