/*
 * hal_kentry.h - uzone definition
 * 
 * Author     Alain Greiner (2016,2017,2018,2019)
 *
 * Copyright (c) UPMC Sorbonne Universites
 * 
 * This file is part of ALMOS-MKH.
 *
 * ALMOS-MKH is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2.0 of the License.
 *
 * ALMOS-MKH 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
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ALMOS-kernel; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef _HAL_KENTRY_H_
#define _HAL_KENTRY_H_

//////////////////////////////////////////////////////////////////////////////////////////
// This file defines the MIPS32 specific mnemonics to access the "uzone", that is
// a fixed size array of 32 bits integers, used by the kentry function to save/restore 
// the MIPS32 CPU registers, at each exception / interruption / syscall.
//
// This file is included in the hal_kentry.S, hal_syscall.c, hal_exception.c,
// and hal_context.c files.
//////////////////////////////////////////////////////////////////////////////////////////


/****************************************************************************************
 * This structure defines the "uzone" dynamically allocated in the kernel stack
 * by the hal_kentry assembly code to save the MIPS32 registers each time a core
 * enters the kernel to handle an interrupt, exception, or syscall.
 * These define are specific for the TSAR_MIPS32 architecture.
 *
 * WARNING : It is replicated in hal_kentry.S file.
 ***************************************************************************************/

#define      UZ_MODE         0    /* c2_mode */             
#define      UZ_AT           1    /* at_01   */
#define      UZ_V0           2    /* v0_02   */
#define      UZ_V1           3    /* v1_03   */
#define      UZ_A0           4    /* a0_04   */
#define      UZ_A1           5    /* a1_05   */
#define      UZ_A2           6    /* a2_06   */
#define      UZ_A3           7    /* a3_07   */
#define      UZ_T0           8    /* t0_08   */
#define      UZ_T1           9    /* t1_09   */
#define      UZ_T2           10   /* t2_10   */
#define      UZ_T3           11   /* t3_11   */
#define      UZ_T4           12   /* t4_12   */
#define      UZ_T5           13   /* t5_13   */
#define      UZ_T6           14   /* t6_14   */
#define      UZ_T7           15   /* t7_15   */
#define      UZ_S0           16   /* s0_16   */
#define      UZ_S1           17   /* s1_17   */
#define      UZ_S2           18   /* s2_18   */
#define      UZ_S3           19   /* s3_19   */
#define      UZ_S4           20   /* s4_20   */
#define      UZ_S5           21   /* s5_21   */
#define      UZ_S6           22   /* s6_22   */
#define      UZ_S7           23   /* s7_23   */
#define      UZ_T8           24   /* t8_24   */
#define      UZ_T9           25   /* t9_25   */

#define      UZ_LO           26
#define      UZ_HI           27

#define      UZ_GP           28   /* gp_28   */
#define      UZ_SP           29   /* sp_29   */
#define      UZ_S8           30   /* s8_30   */
#define      UZ_RA           31   /* ra_31   */

#define      UZ_PTPR         32   /* c2_ptpr */
#define      UZ_EPC          33   /* c0_epc  */
#define      UZ_SR           34   /* c0_sr   */
#define      UZ_TH           35   /* c0_th   */
#define      UZ_CR           36   /* c0_cr   */

#define      UZ_REGS         37

/*************************************************************************************
 * The hal_kentry_enter() function is the unique kernel entry point in case of 
 * exception, interrupt, or syscall for the TSAR_MIPS32 architecture.  
 * It can be executed by a core in user mode or by a core already in kernel mode
 * (in case of interrupt or non fatal exception).
 * In both cases it allocates an "uzone" space in the kernel stack to save the
 * CPU registers values, desactivates the MMU, and calls the relevant handler 
 * (exception/interrupt/syscall) 
 *
 * After handler execution, it restores the CPU context from the uzone and jumps 
 * to address contained in EPC calling the hal_kentry_eret() function.
 ************************************************************************************/
void hal_kentry_enter( void );

/*************************************************************************************
 * The hal_kentry_eret() function contains only the assembly "eret" instruction,
 * that reset the EXL bit in the c0_sr register, and jumps to the address 
 * contained in the c0_epc register. 
 * ************************************************************************************/
void hal_kentry_eret( void );

#endif	/* _HAL_KENTRY_H_ */
