1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
|
/* -*- asm -*-
*
* Creation Date: <2001/01/28 20:33:22 samuel>
* Time-stamp: <2001/06/16 15:29:32 samuel>
*
* <molasm.h>
*
* Utility assembly macros
*
* Copyright (C) 2001 Samuel Rydh (samuel@ibrium.se)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation
*
*/
#ifndef _H_MOLASM
#define _H_MOLASM
/************************************************************************/
/* Vector entry point definitions */
/************************************************************************/
#define MOL_SPRG2_MAGIC 0x1779
/*
* This code uses the dynamic linkage/action symbol functionality of
* the MOL kernel loader to automatically install the hooks.
* Refer to init.c for the actual implementation.
*/
#define VECTOR_HOOK( v ) \
.long Action_RELOC_HOOK ;\
.long v ;\
.long vhook_end_##v - vhook_##v ;\
.long vret_##v - vhook_##v ;\
vhook_##v: ;\
mtsprg0 r3 ;\
addis r3,0,0 /* [1] hook address inserted */ ;\
mtsprg1 r1 ;\
ori r3,r3,0 /* [3] at module initialization */ ;\
mflr r1 ;\
mtlr r3 ;\
blr ;\
;\
vret_##v: ;\
nop /* overwritten instruction is inserted here */ ;\
ba v + 0x4 ;\
vhook_end_##v: ;
/* SPRG0,1 = saved r3,r1, r1 = saved lr */
#define VECTOR_(v, dummy_str, secondary, not_mol_label ) \
/* not mol return */ ;\
716: mtcr r3 ;\
mfsprg1 r1 ;\
mfsprg0 r3 ;\
717: ; continue_trap_##v: ;\
.long Action_VRET + v /* ba vret_xxx */ ;\
;\
/* secondary interrupt */ ;\
718: li r3,v ;\
b secondary ;\
;\
VECTOR_HOOK( v ) ;\
;\
/* entrypoint */ ;\
mtlr r1 ;\
mfcr r3 ;\
mfsprg2 r1 ;\
cmpwi r1,MOL_SPRG2_MAGIC ;\
bne- not_mol_label ;\
soft_603_entry_##v: ;\
mfsrr1 r1 ;\
rlwinm. r1,r1,0,17,17 /* MSR_PR set? */ ;\
mfsprg3 r1 ;\
beq- 718b /* if not, take a secondary trap? */ ;
#define VECTOR(v, dummy_str, secondary) VECTOR_(v, dummy_str, secondary, 716b )
#define TAKE_EXCEPTION_( v ) \
bl take_exception ;\
.long Action_VRET + v ;
#define TAKE_EXCEPTION \
bl take_exception ;\
b 717b
/************************************************************************/
/* 603 vector HOOKs (r0-r3, cr0 saved by hardware) */
/************************************************************************/
#define VECTOR_HOOK_603( v ) \
.long Action_RELOC_HOOK ;\
.long v ;\
.long vhook_end_##v - vhook_##v ;\
.long vret_##v - vhook_##v ;\
vhook_##v: ;\
mfsprg2 r1 ;\
addis r3,0,0 /* [1] hook address inserted */ ;\
cmpwi r1,MOL_SPRG2_MAGIC ;\
ori r3,r3,0 /* [3] at module initialization */ ;\
bne vret_##v ;\
mfctr r0 ;\
mtctr r3 ;\
bctr ;\
;\
vret_##v: ;\
nop /* overwritten instruction is inserted here */ ;\
ba v + 0x4 ;\
vhook_end_##v: ;
/* r0 = saved ctr */
#define VECTOR_603(v, dummy_str ) \
VECTOR_HOOK_603( v ) ;\
/* entrypoint goes here */ ;
/* all register are assumed unmodified here */
#define SOFT_VECTOR_ENTRY_603( v ) \
mtsprg0 r3 ;\
mtsprg1 r1 ;\
mfcr r3 ;\
b soft_603_entry_##v ;
/************************************************************************/
/* FUNCTION_HOOK */
/************************************************************************/
#define FHOOK( symind ) \
.long Action_HOOK_FUNCTION ;\
.long symind ;\
.long fhook_end_##symind - fhook_##symind ;\
.long fret_##symind - fhook_##symind ;\
fhook_##symind: ;\
mflr r10 ;\
addis r9,0,0 /* [1] address inserted */ ;\
ori r9,r9,0 /* [2] at runtime */ ;\
mtctr r9 ;\
bctrl ;\
mtlr r10 ;\
fret_##symind: ;\
nop /* overwritten instruction is inserted here */ ;\
nop /* return (through a relative branch) */ ;\
fhook_end_##symind: ;
/************************************************************************/
/* Utility */
/************************************************************************/
.macro LOAD_VARIABLE reg, offs
lis \reg,(k_mol_stack + \offs)@ha
lwz \reg,(k_mol_stack + \offs)@l(\reg)
.endm
.macro SET_SESSION_TABLE reg
lis \reg,(k_session_table)@ha
addi \reg,\reg,(k_session_table)@l
.endm
/************************************************************************/
/* GPR save / restore */
/************************************************************************/
.macro xGPR_SAVE p0=-1,p1=-1,p2=-1,p3=-1,p4=-1,p5=-1,p6=-1,p7=-1,p8=-1,p9=-1
.if \p0+1
stw \p0,xGPR0+\p0*4(r1)
xGPR_SAVE \p1,\p2,\p3,\p4,\p5,\p6,\p8,\p8,\p9
.endif
.endm
.macro xGPR_LOAD p0=-1,p1=-1,p2=-1,p3=-1,p4=-1,p5=-1,p6=-1,p7=-1,p8=-1,p9=-1
.if \p0+1
lwz \p0,xGPR0+\p0*4(r1)
xGPR_LOAD \p1,\p2,\p3,\p4,\p5,\p6,\p8,\p8,\p9
.endif
.endm
/************************************************************************/
/* FPU misc */
/************************************************************************/
.macro ENABLE_MSR_FP scr
mfmsr \scr
ori \scr,\scr,MSR_FP
mtmsr \scr
isync
.endm
/************************************************************************/
/* Segment registers */
/************************************************************************/
.macro LOAD_SEGMENT_REGS base, scr, scr2, ind=0
.if \ind - 16
lwz \scr,(\ind * 4)(\base)
lwz \scr2,((\ind+1) * 4)(\base)
mtsr \ind,\scr
mtsr \ind+1,\scr2
LOAD_SEGMENT_REGS \base, \scr2, \scr, (\ind+2)
.endif
.endm
.macro SAVE_SEGMENT_REGS base, scr, scr2, ind=0
.if \ind - 16
mfsr \scr,\ind
mfsr \scr2,\ind+1
stw \scr,(\ind * 4)(\base)
stw \scr2,((\ind+1) * 4)(\base)
SAVE_SEGMENT_REGS \base, \scr, \scr2, (\ind+2)
.endif
.endm
/************************************************************************/
/* BAT register */
/************************************************************************/
.macro SAVE_DBATS varoffs, scr1
mfpvr \scr1
srwi \scr1,\scr1,16
cmpwi r3,1
beq 33f
.irp nn,0,1,2,3,4,5,6,7
mfspr \scr1, SPRN_DBAT0U + \nn
stw \scr1,\varoffs + (4*\nn)(r1)
.endr
33:
.endm
.macro SAVE_IBATS varoffs, scr1
.irp nn,0,1,2,3,4,5,6,7
mfspr \scr1, SPRN_IBAT0U + \nn
stw \scr1,(\varoffs + (4*\nn))(r1)
.endr
.endm
/************************************************************************/
/* Physical/virtual conversion */
/************************************************************************/
/* replaced with lis dreg,addr@ha ; addi dreg,dreg,addr@l */
#define LI_PHYS( dreg, addr ) \
.long Action_LI_PHYS + dreg ;\
.long addr - r__reloctable_start
#define LI_VIRT( dreg, addr ) \
lis dreg,addr@ha ; \
addi dreg,dreg,addr@l
#define LI_PHYS_VARBASE( base ) \
LI_PHYS( base, k_variable_base )
#define LI_VIRT_VARBASE( base ) \
LI_VIRT( base, k_variable_base )
/************************************************************************/
/* D E B U G */
/************************************************************************/
.macro STOP_EMULATION val
stw r3,xDEBUG_SCR1(r1)
li r3,\val
stw r3,xKERNEL_DBG_STOP(r1)
li r3,1
stw r3,xINTERRUPT(r1)
lwz r3,xDEBUG_SCR1(r1)
.endm
.macro DEBUG_INC num, dummy=""
.if (\num >= 9 || \num<0)
.print "******* DEBUG_INC num out of range **********" ; .fail 1
.endif
stw r3,xDEBUG_SCR1(r1)
lwz r3,(xDEBUG0+4*\num)(r1)
addi r3,r3,1
stw r3,(xDEBUG0+4*\num)(r1)
lwz r3,xDEBUG_SCR1(r1)
.endm
.macro DEBUG_TRACE num, dummy=""
stw r3,xDEBUG_SCR1(r1)
lwz r3,xDEBUG_TRACE(r1)
addi r3,r3,1
stw r3,xDEBUG_TRACE(r1)
stw r3,(xDEBUG0+4*\num)(r1)
lwz r3,xDEBUG_SCR1(r1)
.endm
.macro TRACE_VAL val, dummy=""
stw r30,xDEBUG_SCR1(r1)
stw r29,xDEBUG_SCR2(r1)
lwz r30,xDEBUG_TRACE(r1)
rlwinm r30,r30,0,24,31 // 256 entries
rlwinm r30,r30,2,22,29
addi r30,r30,xDBG_TRACE_SPACE
lis r29,(\val)@ha
addi r29,r29,(\val)@l
stwx r29,r30,r1
lwz r30,xDEBUG_TRACE(r1)
addi r30,r30,1
rlwinm r30,r30,0,24,31 // 256 entries
stw r30,xDEBUG_TRACE(r1)
lwz r29,xDEBUG_SCR2(r1)
lwz r30,xDEBUG_SCR1(r1)
.endm
#endif /* _H_MOLASM */
|