/*---------------------------------------------------------------------------* Project: OS Context API File: KernelOSContext.h Copyright (C) Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ #ifndef __KERNELOSCONTEXT_H__ #define __KERNELOSCONTEXT_H__ #define OSCONTEXT_TXT_TAG1 0x4F53436F #define OSCONTEXT_TXT_TAG2 0x6E747874 #ifndef _ASSEMBLER #include #ifdef __cplusplus extern "C" { #endif #endif // _ASSEMBLER /*---------------------------------------------------------------------------* Context API *---------------------------------------------------------------------------*/ // Context status #define OS_CONTEXT_STATE_EXC 0x02 // set if saved by exception #define OS_CONTEXT_STATE_PMCSAVED 0x04 // set if saved PMC registers #define OS_CONTEXT_STATE_OSCALLBACK 0x08 // set if OSLoadContext must be // cleared first #define OS_CONTEXT_STATE_USERMODE_SAVED 0x10 // Context was saved by user-mode OSSaveContext #define OS_CONTEXT_STATE_EXC_BIT 30 #define OS_CONTEXT_STATE_PMCSAVED_BIT 29 #define OS_CONTEXT_STATE_OSCALLBACK_BIT 28 #define OS_CONTEXT_STATE_USERMODE_SAVED_BIT 27 // Context attributes #define OS_CONTEXT_ATTR_AFFINITY_NONE 0x00000007 // no affinity: run on any core #define OS_CONTEXT_ATTR_AFFINITY_CORE0 0x00000001 // run only on core0 #define OS_CONTEXT_ATTR_AFFINITY_CORE1 0x00000002 // run only on core1 #define OS_CONTEXT_ATTR_AFFINITY_CORE2 0x00000004 // run only on core2 #define OS_CONTEXT_ATTR_AFFINITY_CORE0_BIT 31 #define OS_CONTEXT_ATTR_AFFINITY_CORE1_BIT 30 #define OS_CONTEXT_ATTR_AFFINITY_CORE2_BIT 29 #ifndef _ASSEMBLER FORWARD_DECLARE_STRUCT_TYPE(OSContext) SET_STRUCT_ALIGN(8) struct OSContext { u32 txtTag1; // 'OSCo' 0x4F53436F - crashdump markers u32 txtTag2; // 'ntxt' 0x6E747874 // General-purpose registers u32 gpr[32]; u32 cr; u32 lr; u32 ctr; u32 xer; // Exception handling registers u32 srr0; u32 srr1; // Only valid during DSI exception u32 exception_specific0; // Contains DSISR during DSI u32 exception_specific1; // Contains DAR during DSI u32 crash_exception_type; u32 os_reserved; u32 fpscr_pad; u32 fpscr; // Floating-point registers f64 fpr[32]; // Context mode u16 spinLockCount; // the number of spinlock that this thread is holding. u16 state; // OR-ed OS_CONTEXT_STATE_* // Place Gecko regs at the end so we have minimal changes to // existing code u32 gqr[8]; u32 pir; f64 psf[32]; // placed coretime here so it is 64-bit aligned // TODO: wanted to use a define like SYSTEM_MAX_CORES // but it was too entangled (also will not fix the defines) u64 coretime[3]; // cumulative run times of this context u64 starttime; // time context started executing last u32 error; // per-thread OS error. u32 attributes; // per-context affinity, etc. u32 pmc1; // per-thread PMC and MMCRs u32 pmc2; u32 pmc3; u32 pmc4; u32 mmcr0; u32 mmcr1; }; SET_STRUCT_ALIGN(1) #endif // _ASSEMBLER #define OS_CONTEXT_TXTTAG1 0 #define OS_CONTEXT_TXTTAG2 4 #define OS_CONTEXT_R0 8 #define OS_CONTEXT_R1 12 #define OS_CONTEXT_R2 16 #define OS_CONTEXT_R3 20 #define OS_CONTEXT_R4 24 #define OS_CONTEXT_R5 28 #define OS_CONTEXT_R6 32 #define OS_CONTEXT_R7 36 #define OS_CONTEXT_R8 40 #define OS_CONTEXT_R9 44 #define OS_CONTEXT_R10 48 #define OS_CONTEXT_R11 52 #define OS_CONTEXT_R12 56 #define OS_CONTEXT_R13 60 #define OS_CONTEXT_R14 64 #define OS_CONTEXT_R15 68 #define OS_CONTEXT_R16 72 #define OS_CONTEXT_R17 76 #define OS_CONTEXT_R18 80 #define OS_CONTEXT_R19 84 #define OS_CONTEXT_R20 88 #define OS_CONTEXT_R21 92 #define OS_CONTEXT_R22 96 #define OS_CONTEXT_R23 100 #define OS_CONTEXT_R24 104 #define OS_CONTEXT_R25 108 #define OS_CONTEXT_R26 112 #define OS_CONTEXT_R27 116 #define OS_CONTEXT_R28 120 #define OS_CONTEXT_R29 124 #define OS_CONTEXT_R30 128 #define OS_CONTEXT_R31 132 #define OS_CONTEXT_CR 136 #define OS_CONTEXT_LR 140 #define OS_CONTEXT_CTR 144 #define OS_CONTEXT_XER 148 #define OS_CONTEXT_SRR0 152 #define OS_CONTEXT_SRR1 156 #define OS_CONTEXT_EXCEPTION_SPECIFIC0 160 // Holds DSISR for DSI #define OS_CONTEXT_EXCEPTION_SPECIFIC1 164 // Holds DAR for DSI #define OS_CONTEXT_OS_RESERVED0 168 #define OS_CONTEXT_OS_RESERVED1 172 #define OS_CONTEXT_FPSCR 176 // 8 bytes including padding #define OS_CONTEXT_FPR0 184 #define OS_CONTEXT_FPR1 192 #define OS_CONTEXT_FPR2 200 #define OS_CONTEXT_FPR3 208 #define OS_CONTEXT_FPR4 216 #define OS_CONTEXT_FPR5 224 #define OS_CONTEXT_FPR6 232 #define OS_CONTEXT_FPR7 240 #define OS_CONTEXT_FPR8 248 #define OS_CONTEXT_FPR9 256 #define OS_CONTEXT_FPR10 264 #define OS_CONTEXT_FPR11 272 #define OS_CONTEXT_FPR12 280 #define OS_CONTEXT_FPR13 288 #define OS_CONTEXT_FPR14 296 #define OS_CONTEXT_FPR15 304 #define OS_CONTEXT_FPR16 312 #define OS_CONTEXT_FPR17 320 #define OS_CONTEXT_FPR18 328 #define OS_CONTEXT_FPR19 336 #define OS_CONTEXT_FPR20 344 #define OS_CONTEXT_FPR21 352 #define OS_CONTEXT_FPR22 360 #define OS_CONTEXT_FPR23 368 #define OS_CONTEXT_FPR24 376 #define OS_CONTEXT_FPR25 384 #define OS_CONTEXT_FPR26 392 #define OS_CONTEXT_FPR27 400 #define OS_CONTEXT_FPR28 408 #define OS_CONTEXT_FPR29 416 #define OS_CONTEXT_FPR30 424 #define OS_CONTEXT_FPR31 432 #define OS_CONTEXT_SPINLOCKCOUNT 440 // only 2 bytes #define OS_CONTEXT_STATE 442 // only 2 bytes #define OS_CONTEXT_GQR0 444 #define OS_CONTEXT_GQR1 448 #define OS_CONTEXT_GQR2 452 #define OS_CONTEXT_GQR3 456 #define OS_CONTEXT_GQR4 460 #define OS_CONTEXT_GQR5 464 #define OS_CONTEXT_GQR6 468 #define OS_CONTEXT_GQR7 472 #define OS_CONTEXT_PIR 476 // double word alignment for the 64-bit psf #define OS_CONTEXT_PSF0 480 #define OS_CONTEXT_PSF1 488 #define OS_CONTEXT_PSF2 496 #define OS_CONTEXT_PSF3 504 #define OS_CONTEXT_PSF4 512 #define OS_CONTEXT_PSF5 520 #define OS_CONTEXT_PSF6 528 #define OS_CONTEXT_PSF7 536 #define OS_CONTEXT_PSF8 544 #define OS_CONTEXT_PSF9 552 #define OS_CONTEXT_PSF10 560 #define OS_CONTEXT_PSF11 568 #define OS_CONTEXT_PSF12 576 #define OS_CONTEXT_PSF13 584 #define OS_CONTEXT_PSF14 592 #define OS_CONTEXT_PSF15 600 #define OS_CONTEXT_PSF16 608 #define OS_CONTEXT_PSF17 616 #define OS_CONTEXT_PSF18 624 #define OS_CONTEXT_PSF19 632 #define OS_CONTEXT_PSF20 640 #define OS_CONTEXT_PSF21 648 #define OS_CONTEXT_PSF22 656 #define OS_CONTEXT_PSF23 664 #define OS_CONTEXT_PSF24 672 #define OS_CONTEXT_PSF25 680 #define OS_CONTEXT_PSF26 688 #define OS_CONTEXT_PSF27 696 #define OS_CONTEXT_PSF28 704 #define OS_CONTEXT_PSF29 712 #define OS_CONTEXT_PSF30 720 #define OS_CONTEXT_PSF31 728 #define OS_CONTEXT_CORETIME0 736 #define OS_CONTEXT_CORETIME1 744 #define OS_CONTEXT_CORETIME2 752 #define OS_CONTEXT_STARTTIME 760 #define OS_CONTEXT_ERROR 768 #define OS_CONTEXT_ATTRIBUTES 772 #define OS_CONTEXT_PMC1 776 #define OS_CONTEXT_PMC2 780 #define OS_CONTEXT_PMC3 784 #define OS_CONTEXT_PMC4 788 #define OS_CONTEXT_MMCR0 792 #define OS_CONTEXT_MMCR1 796 #define OS_CONTEXT_SIZE 800 // The locations that rfi must carefully touch (low and high context) to // guarantee that there will not be a DBAT LRR reload DSI after both // of the loads. These values are chosen to maximize the cache locality. #if OS_CONTEXT_R3 < OS_CONTEXT_SRR0 #define OS_CONTEXT_RFI_TOUCH_LOW OS_CONTEXT_R3 #define OS_CONTEXT_RFI_TOUCH_HIGH OS_CONTEXT_SRR1 #else #define OS_CONTEXT_RFI_TOUCH_LOW OS_CONTEXT_SRR0 #define OS_CONTEXT_RFI_TOUCH_HIGH OS_CONTEXT_R4 #endif // Safety nets in case the assumptions of the: // #if OS_CONTEXT_R3 < OS_CONTEXT_SRR0 // above are broken by changes. #if OS_CONTEXT_R3 > OS_CONTEXT_R4 #error "order of r3 and r4 is wrong" #endif #if OS_CONTEXT_SRR0 > OS_CONTEXT_SRR1 #error "order of srr0 and srr1 is wrong" #endif #ifdef __cplusplus } #endif #endif // __KERNELOSCONTEXT_H__