Annotation of sys/arch/alpha/stand/boot/prom_swpal.S, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: prom_swpal.S,v 1.3 1996/10/30 22:40:45 niklas Exp $ */
2: /* $NetBSD: prom_swpal.S,v 1.4 1996/10/17 02:50:41 cgd Exp $ */
3:
4: /*
5: * Copyright (c) 1994, 1995 Carnegie-Mellon University.
6: * All rights reserved.
7: *
8: * Author: Keith Bostic
9: *
10: * Permission to use, copy, modify and distribute this software and
11: * its documentation is hereby granted, provided that both the copyright
12: * notice and this permission notice appear in all copies of the
13: * software, derivative works or modified versions, and any portions
14: * thereof, and that both notices appear in supporting documentation.
15: *
16: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19: *
20: * Carnegie Mellon requests users of this software to return to
21: *
22: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
23: * School of Computer Science
24: * Carnegie Mellon University
25: * Pittsburgh PA 15213-3890
26: *
27: * any improvements or extensions that they make and grant Carnegie the
28: * rights to redistribute these changes.
29: */
30:
31: #include "../../include/asm.h"
32: #include "../../include/prom.h"
33: #include "../../include/rpb.h"
34:
35: /* Offsets from base of HWRPB. */
36: #define RPB_SELFREF 0x00
37: #define RPB_SLOTSIZE 0x98
38: #define RPB_PERCPU_OFF 0xA0
39:
40: /* Offsets in a boot PCB. */
41: #define PCB_KSP 0x00
42: #define PCB_PTBR 0x10
43: #define PCB_ASN 0x1c
44: #define PCB_FEN 0x28
45:
46: /* Pal values. */
47: #define PAL_RESERVED 0 /* Reserved to Digital. */
48: #define PAL_VMS 1 /* VMS */
49: #define PAL_OSF 2 /* OSF */
50:
51: /*
52: * PAL code switch routine.
53: */
54: #define D_RA (7*8)
55: #define D_S0 (8*8)
56: #define D_S1 (9*8)
57: #define D_S2 (10*8)
58: #define D_S3 (11*8)
59: #define D_S4 (12*8)
60: #define D_S5 (13*8)
61: #define PALSW_FRAME_SIZE (14*8)
62: #define PALSW_REGS IM_RA|IM_S0|IM_S1|IM_S2|IM_S3|IM_S4|IM_S5
63:
64: .comm ptbr_save,8
65:
66: .text
67: .align 4
68:
69: NESTED(switch_palcode, 0, PALSW_FRAME_SIZE, ra, PALSW_REGS, 0)
70: LDGP(pv)
71: /* ldgp gp, 0(pv)*/
72:
73: lda sp, -PALSW_FRAME_SIZE(sp)
74: stq ra, D_RA(sp)
75: stq s0, D_S0(sp)
76: stq s1, D_S1(sp)
77: stq s2, D_S2(sp)
78: stq s3, D_S3(sp)
79: stq s4, D_S4(sp)
80: stq s5, D_S5(sp)
81:
82: stq pv, 0(sp)
83: stq gp, 8(sp)
84:
85: ldiq s0, HWRPB_ADDR /* s0 HWRPB_ADDR */
86: ldq s1, RPB_SLOTSIZE(s0)
87: call_pal PAL_VMS_mfpr_whami
88: mulq s1, v0, s1 /* s1 per_cpu offset from base */
89: ldq s2, RPB_PERCPU_OFF(s0)
90: addq s0, s2, s2
91: addq s2, s1, s2 /* s2 PCB (virtual) */
92:
93: call_pal PAL_VMS_mfpr_ptbr
94: stq v0, PCB_PTBR(s2)
95: stq v0, ptbr_save /* save PTBR for the kernel */
96: stl zero, PCB_ASN(s2)
97: stq zero, PCB_FEN(s2)
98: stq sp, PCB_KSP(s2)
99:
100: ldq t0, RPB_SELFREF(s0) /* HWRBP base (physical) */
101: ldq t1, RPB_PERCPU_OFF(s0)
102: addq t0, t1, t0
103: addq t0, s1, t0 /* PCB base (phys) */
104: stq t0, 16(sp)
105:
106: call_pal PAL_VMS_mfpr_vptb
107: mov v0, a3
108: ldiq a0, PAL_OSF
109: lda a1, contin
110: ldq a2, 16(sp)
111:
112: call_pal PAL_swppal /* a0, a1, a2, a3 */
113:
114: contin: ldq pv, 0(sp)
115: ldq gp, 8(sp)
116:
117: ldq ra, D_RA(sp)
118: ldq s0, D_S0(sp)
119: ldq s1, D_S1(sp)
120: ldq s2, D_S2(sp)
121: ldq s3, D_S3(sp)
122: ldq s4, D_S4(sp)
123: ldq s5, D_S5(sp)
124: lda sp, PALSW_FRAME_SIZE(sp)
125: RET
126: END(switch_palcode)
127:
128: #undef D_RA
129: #undef D_S0
130: #undef D_S1
131: #undef D_S2
132: #undef D_S3
133: #undef D_S4
134: #undef D_S5
135: #undef PALSW_FRAME_SIZE
136: #undef PALSW_REGS
CVSweb