]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseLib/Ipf/AccessPsr.s
1. Port X64, IPF and EBC arch for BaseLib
[mirror_edk2.git] / MdePkg / Library / BaseLib / Ipf / AccessPsr.s
1 /// @file
2 /// IPF specific Processor Status Register accessing functions
3 ///
4 /// Copyright (c) 2006, Intel Corporation
5 /// All rights reserved. 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 /// Module Name: AccessPsr.s
14 ///
15 ///
16
17 #define CpuModeMask 0x0000001008020000
18
19 #define CpuInVirtualMode 0x1
20 #define CpuInPhysicalMode 0x0
21 #define CpuInMixMode (0x0 - 0x1)
22
23 //---------------------------------------------------------------------------------
24 //++
25 // AsmReadPsr
26 //
27 // This routine is used to read the current value of Processor Status Register (PSR).
28 //
29 // Arguments :
30 //
31 // On Entry :
32 //
33 // Return Value: The current PSR value.
34 //
35 //--
36 //----------------------------------------------------------------------------------
37 .text
38 .type AsmReadPsr, @function
39 .proc AsmReadPsr
40
41 AsmReadPsr::
42 mov r8 = psr;;
43 br.ret.dpnt b0;;
44 .endp AsmReadPsr
45
46 //---------------------------------------------------------------------------------
47 //++
48 // AsmWritePsr
49 //
50 // This routine is used to write the value of Processor Status Register (PSR).
51 //
52 // Arguments :
53 //
54 // On Entry : The value need to be written.
55 //
56 // Return Value: The value have been written.
57 //
58 //--
59 //----------------------------------------------------------------------------------
60 .text
61 .type AsmWritePsr, @function
62 .proc AsmWritePsr
63 .regstk 1, 0, 0, 0
64
65 AsmWritePsr::
66 mov psr.l = in0
67 mov r8 = in0;;
68 srlz.d;;
69 srlz.i;;
70 br.ret.dpnt b0;;
71 .endp AsmWritePsr
72
73 //---------------------------------------------------------------------------------
74 //++
75 // AsmCpuVirtual
76 //
77 // This routine is used to determines if the CPU is currently executing
78 // in virtual, physical, or mixed mode.
79 //
80 // If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.
81 // If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.
82 // If the CPU is not in physical mode or virtual mode, then it is in mixed mode,
83 // and -1 is returned.
84 //
85 // Arguments:
86 //
87 // On Entry: None
88 //
89 // Return Value: The CPU mode flag
90 // return 1 The CPU is in virtual mode.
91 // return 0 The CPU is in physical mode.
92 // return -1 The CPU is in mixed mode.
93 //
94 //--
95 //----------------------------------------------------------------------------------
96 .text
97 .type AsmCpuVirtual, @function
98 .proc AsmCpuVirtual
99
100 AsmCpuVirtual::
101 mov r29 = psr
102 movl r30 = CpuModeMask;;
103 and r28 = r30, r29;;
104 cmp.eq p6, p7 = r30, r28;;
105 (p6) mov r8 = CpuInVirtualMode;;
106 (p7) cmp.eq p6, p7 = 0x0, r28;;
107 (p6) mov r8 = CpuInPhysicalMode;;
108 (p7) mov r8 = CpuInMixMode;;
109 br.ret.dpnt b0;;
110 .endp AsmCpuVirtual