1 /// @file 2 /// This is set of macros used in calculating offsets in the IVT. 3 /// 4 /// Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR> 5 /// This program and the accompanying materials 6 /// are licensed and made available under the terms and conditions of the BSD License 7 /// which accompanies this distribution. The full text of the license may be found at 8 /// http://opensource.org/licenses/bsd-license.php 9 /// 10 /// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 /// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 /// 13 /// 14 15 16 #define EXCPT_EXTERNAL_INTERRUPT 12 17 #define MASK_0_4 0x000000000000001F // mask bits 0 through 4 18 #define SLOT0 0 19 #define SLOT1 1 20 #define SLOT2 2 21 22 #define PSR_DT 17 23 #define PSR_TB 26 24 #define PSR_RT 27 25 #define PSR_IS 34 26 #define PSR_IT 36 27 #define PSR_IC 13 28 #define PSR_I 14 29 #define PSR_SS 40 30 #define PSR_BN 44 31 #define PSR_RI_MASK 0x60000000000 32 33 #define EXCPT_EXTERNAL_INTERRUPT 12 34 35 #define SCRATCH_REG0 r23 36 #define SCRATCH_REG1 r24 37 #define SCRATCH_REG2 r25 38 #define SCRATCH_REG3 r26 39 #define SCRATCH_REG4 r27 40 #define SCRATCH_REG5 r28 41 #define SCRATCH_REG6 r29 42 #define PR_REG r30 43 #define B0_REG r31 44 45 46 // EXT_INT_OFFSET is the offset of the external interrupt entry in the IVT 47 #define EXT_INT_ENTRY_OFFSET 0x03000 48 49 // PATCH_ENTRY_OFFSET is the offset into the IVT of the entry that is coopted (stolen) 50 // for use by the handler. The entire entry is restored when the handler is 51 // unloaded. 52 #define PATCH_ENTRY_OFFSET 0x03400 53 54 // PATCH_CODE_SIZE is the size of patch code 55 #define PATCH_CODE_SIZE (EndPatchCode - PatchCode) 56 57 // A hard coded branch back into the external interrupt IVT entry's second bundle 58 // is put here, just in case the original bundle zero did not have a branch 59 // This is the last bundle in the reserved IVT entry 60 #define FAILSAFE_BRANCH_OFFSET (PATCH_ENTRY_OFFSET + 0x400 - 0x10) 61 62 // the original external interrupt IVT entry bundle zero is copied and relocated 63 // here... also in the reserved IVT entry 64 // This is the second-to-last bundle in the reserved IVT entry 65 #define RELOCATED_EXT_INT (PATCH_ENTRY_OFFSET + 0x400 - 0x20) 66 67 // The patch is actually stored at the end of IVT:PATCH_ENTRY. The PATCH_OFFSET 68 // is the offset into IVT where the patch is actually stored. It is carefully 69 // located so that when we run out of patch code, the next bundle is the 70 // relocated bundle 0 from the original external interrupt handler 71 #define PATCH_OFFSET (PATCH_ENTRY_OFFSET + 0x400 - ( EndPatchCode - PatchCode ) - 0x20) 72 73 #define PATCH_RETURN_OFFSET (PATCH_ENTRY_OFFSET + 0x400 - ( EndPatchCode - PatchCodeRet ) - 0x20) 74 75 // PATCH_BRANCH is used only in the new bundle that is placed at the beginning 76 // of the external interrupt IVT entry. 77 #define PATCH_BRANCH (PATCH_OFFSET - EXT_INT_ENTRY_OFFSET) 78 79