|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: #include <ppc/asm.h>
23: #include <ppc/proc_reg.h>
24: #include <ppc/exception.h>
25: #include <mach/ppc/vm_param.h>
26: #include <assym.s>
27:
28: /*
29: ** Blue Box Fast Trap entry
30: **
31: ** The registers at entry are as hw_exceptions left them. Which means
32: ** that the Blue Box data area is pointed to be R26.
33: **
34: ** We exit here through the fast path exit point in hw_exceptions. That means that
35: ** upon exit, R4 must not change. It is the savearea with the current user context
36: ** to restore.
37: **
38: ** Input registers are:
39: ** r4 = Current context savearea (do not modify)
40: ** r9 = THREAD_TOP_ACT pointer
41: ** r24 = Offset into Call Descriptor table
42: ** r26 = base of ACT_MACH_BDA in kernel address space
43: **
44: **
45: */
46:
47: ENTRY(atomic_switch_trap, TAG_NO_FRAME_USED)
48:
49: /*
50: ** functions 0-13, 15 -> Call PseudoKernel
51: ** 14 -> Exit PseudoKernel
52: */
53:
54: cmplwi cr7,r24,BBEXITTRAP*PKTDSIZE ; Is this an exit?
55: add r24,r24,r26 ; Point to the actual entry offset+base
56: beq cr7,.L_ExitPseudoKernel ; Yes...
57:
58: /******************************************************************************
59: * void CallPseudoKernel ( void )
60: *
61: * This op provides a means of invoking the BlueBox PseudoKernel from a
62: * system (68k) or native (PPC) context while changing BlueBox interruption
63: * state atomically. As an added bonus, this op leaves the user state
64: * registers intact.
65: *
66: * This op is invoked from the Emulator Trap dispatch table. The kernel is
67: * aware of starting address of this table. It uses the users PC (SS_SRR0)
68: * and the Trap dispatch table address to verify the trap exception as a
69: * atomic_switch trap. If a trap exception is verified as a atomic_switch
70: * we enter here with the following registers loaded.
71: *
72: * Input registers are:
73: * r4 = Current context savearea (do not modify)
74: * r24 = Offset into PseudoKernel Trap Descriptor table
75: * r26 = Base address of BlueBox Data in kernel address space
76: *
77: ********************************************************************************/
78:
79: lwz r8,BDA_INTCONTROLWORD(r26) ; Get the interruption control word (ICW)
80: lis r9,SYSCONTEXTSTATE ; Load system context constant
81: rlwinm r7,r8,0,INTSTATEMASK_B,INTSTATEMASK_E ; extract the current state from interruption control word
82: lwz r6,BDA_PKTD_NEWSTATE(r24) ; Get the new context state
83: cmplw r7,r9 ; test for entry from system context
84: rlwimi r8,r6,0,INTSTATEMASK_B,INTSTATEMASK_E ; insert the new state into interruption control word
85: lwz r7,savecr(r4) ; Get the CR at interruption time
86: bne .L_CallFromAlternateContext ; We were in the alternate context...
87: rlwimi r8,r7,32-INTCR2TOBACKUPSHIFT,INTBACKUPCR2MASK_B,INTBACKUPCR2MASK_E
88: ; remove old backup CR2 and insert live CR2 into backup CR2 position
89:
90: .L_CallFromAlternateContext:
91: lwz r5,saver2(r4) ; Get live R2
92: lwz r6,BDA_PKTD_PC(r24) ; Get the PC
93: lwz r7,savesrr1(r4) ; Get the interrupt-time MSR value
94: stw r8,BDA_INTCONTROLWORD(r26) ; update interruption control word
95: rlwinm r7,r7,0,MSR_FE1_BIT,MSR_FE0_BIT ; Clear BE and SE bits
96: stw r5,BDA_PKTD_REG(r24) ; Save R2 into call descriptor
97: stw r6,savesrr0(r4) ; Set the new instruction address
98: stw r7,savesrr1(r4) ; Set the updated msr
99: b EXT(fastexit) ; Go back and take the fast path exit...
100:
101:
102: /*******************************************************************************
103: * void ExitPseudoKernel ( ExitPseudoKernelDescriptorPtr exitDescriptor )
104: *
105: * This op provides a means of exiting from the BlueBox PseudoKernel to a
106: * user context while changing the BlueBox interruption state atomically.
107: * It also allows the MSR's FE0,BE,SE and FE1 bits to updated for the user
108: * and completes the PPC register loading.
109: *
110: * Input registers are:
111: * r4 = Current context savearea (do not modify)
112: * r24 = Offset into PseudoKernel Trap Descriptor table
113: * r26 = Base address of BlueBox Data in kernel address space
114: *
115: *********************************************************************************/
116:
117: .L_ExitPseudoKernel:
118: lwz r9,savesrr1(r4) ; Pick up the old MSR value
119: lwz r8,savecr(r4) ; Get the live CR value
120: lwz r7,BDA_PKTD_NEWSTATE(r24) ; Get the new state
121: lis r0,SYSCONTEXTSTATE ; Get the system context constant
122: lwz r10,BDA_INTCONTROLWORD(r26) ; Get Interruption Control Word (ICW)
123: lwz r6,BDA_PKTD_PC(r24) ; Get the brand-new spanking clean inst address
124: cmplw r7,r0 ; Are we going system context?
125: lwz r5,BDA_PKTD_MSR(r24) ; Pick up new MSR state
126: rlwimi r10,r7,0,INTSTATEMASK_B,INTSTATEMASK_E
127: ; Insert the new state into interruption control word
128: beq .L_ExitToSystemContext ; We are going to system context...
129: lwz r7,BDA_TESTINTMASK(r26) ; Get the pending interrupt mask
130: lwz r14,BDA_PKTD_INTPENDINGPC(r26) ; Get the interruption exit address
131: and. r7,r10,r7 ; test for pending interrupt in backup cr2
132: beq .L_ExitUpdateRuptControlWord ; and enter alternate context if none pending
133: mr r6,r14 ; otherwise, introduce entry abort pc
134: b .L_ExitNoUpdateRuptControlWord ; and prepare to reenter pseudokernel
135:
136: .L_ExitToSystemContext:
137: rlwimi r8,r10,INTCR2TOBACKUPSHIFT,INTCR2MASK_B,INTCR2MASK_E
138: ; remove old CR2 and insert backup CR2 into live CR2 position
139: .L_ExitUpdateRuptControlWord:
140: rlwimi r9,r5,0,MSR_FE0_BIT,MSR_FE1_BIT ; Insert FE0, BE, SE and FE1 into MSR
141: stw r10,BDA_INTCONTROLWORD(r26) ; update the interrupt control word
142:
143: .L_ExitNoUpdateRuptControlWord:
144: lwz r7,BDA_PKTD_REG(r24) ; Get the new CTR
145: stw r6,savesrr0(r4) ; Set the new PC
146: stw r7,savectr(r4) ; Set the new CTR
147: stw r8,savecr(r4) ; Set the new CR
148: stw r9,savesrr1(r4) ; Set the new MSR
149:
150: b EXT(fastexit) ; Go back and take the fast path exit...
151:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.