Annotation of sys/arch/hppa64/hppa64/locore.S, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: locore.S,v 1.6 2007/05/26 00:36:03 krw Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2005 Michael Shalayeff
! 5: * All rights reserved.
! 6: *
! 7: * Permission to use, copy, modify, and distribute this software for any
! 8: * purpose with or without fee is hereby granted, provided that the above
! 9: * copyright notice and this permission notice appear in all copies.
! 10: *
! 11: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 12: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 13: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 14: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 15: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
! 16: * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 17: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 18: */
! 19:
! 20: .level 2.0w
! 21:
! 22: #include <sys/reboot.h>
! 23: #include <machine/param.h>
! 24: #include <machine/asm.h>
! 25: #include <machine/psl.h>
! 26: #include <machine/trap.h>
! 27: #include <machine/iomod.h>
! 28: #include <machine/pdc.h>
! 29: #include <machine/frame.h>
! 30: #include <machine/reg.h>
! 31: #include <machine/pte.h>
! 32: #include "assym.h"
! 33:
! 34: .import __gp, data
! 35: .import pdc, data
! 36: .import boothowto, data
! 37: .import bootdev, data
! 38: .import esym, data
! 39: .import want_resched, data
! 40: .import proc0, data
! 41: .import proc0paddr, data
! 42:
! 43: #define EMRG_STACKSIZE (1*PAGE_SIZE)
! 44: #define FPEMU_STACKSIZE (1*PAGE_SIZE)
! 45:
! 46: .data
! 47:
! 48: .export netisr, data
! 49: .align 16
! 50: netisr
! 51: .word 0
! 52: .align 16
! 53: $kpsl
! 54: .word PSL_W | PSL_Q | PSL_P | PSL_C | PSL_D | PSL_S | PSL_O
! 55: .export cpl, data
! 56: cpl
! 57: .word IPL_HIGH
! 58:
! 59: BSS(pdc_stack, 8) /* temp stack for PDC call */
! 60: BSS(emrg_stack, 8) /* stack for HPMC/TOC/PWRF */
! 61: BSS(fpemu_stack, 8) /* stack for FPU emulation */
! 62:
! 63: .export fpu_enable, data
! 64: BSS(fpu_enable, 4) /* bits to set in the %cr10 to enable fpu */
! 65: .export fpu_curpcb, data
! 66: BSS(fpu_curpcb, 8) /* pcb of the fpu owner */
! 67: BSS(fpu_scratch, 16) /* FPU scratch space, enough for a quad */
! 68:
! 69: .text
! 70:
! 71: /*
! 72: * $start(pdc, boothowto, bootdev, esym)
! 73: */
! 74: .export $start, entry
! 75: $start
! 76: rsm (PSL_R|PSL_Q|PSL_I|PSL_P|PSL_D), %r0
! 77: nop ! nop ! nop ! nop
! 78:
! 79: ldil L%__gp, %dp
! 80: ldo R%__gp(%dp), %dp
! 81:
! 82: ldi HPPA_PID_KERNEL, %r1
! 83: mtctl %r1, %pidr1
! 84: mtctl %r1, %pidr2
! 85: mtctl %r0, %pidr3
! 86: mtctl %r0, %pidr4
! 87:
! 88: mtsp %r0, %sr0
! 89: mtsp %r0, %sr1
! 90: mtsp %r0, %sr2
! 91: mtsp %r0, %sr3
! 92: mtsp %r0, %sr4
! 93: mtsp %r0, %sr5
! 94: mtsp %r0, %sr6
! 95: mtsp %r0, %sr7
! 96:
! 97: ldi -1, %r1
! 98: mtctl %r0, %eiem
! 99: mtctl %r1, %eirr
! 100: mtctl %r0, %cr10 /* ccr */
! 101:
! 102: ldil L%pdc, %r1
! 103: std %arg0, R%pdc(%r1)
! 104: ldil L%boothowto, %r1
! 105: stw %arg1, R%boothowto(%r1)
! 106: ldil L%bootdev, %r1
! 107: stw %arg2, R%bootdev(%r1)
! 108: ldil L%esym, %r1
! 109: std %arg3, R%esym(%r1)
! 110:
! 111: /* align esym */
! 112: ldo PAGE_MASK(%arg3), %arg3
! 113: depw %r0, 31, PAGE_SHIFT, %arg3
! 114:
! 115: .import __kernel_pagedir, data
! 116: ldil L%__kernel_pagedir, %r1
! 117: ldo R%__kernel_pagedir(%r1), %r1
! 118: mtctl %r1, %cr25 /* vtop */
! 119:
! 120: /* setup kernel initial PIEs */
! 121: ldo PAGE_SIZE(%r1), %r31
! 122: extrd,u %r31, 51, 32, %arg0
! 123: ldo 1(%arg0), %arg1
! 124: ldo 2(%arg0), %arg2
! 125: stw %arg0, 0(%r1)
! 126: stw %arg1, 4(%r1)
! 127: /* (VM_MIN_KERNEL_ADDRESS & PIE_MASK) >> PIE_SHIFT */
! 128: ldo 1(%arg2), %arg0
! 129: stw %arg2, 0x20*4(%r1)
! 130: stw %arg0, 0xffc(%r1)
! 131:
! 132: .import kernel_ptes, data
! 133: ldil L%kernel_ptes, %r1
! 134: ldo R%kernel_ptes(%r1), %r1
! 135:
! 136: ldd,ma 8(%r1), %r8
! 137: ldd,ma 8(%r1), %r9
! 138: ldd,ma 8(%r1), %r10
! 139: ldd,ma 8(%r1), %r11
! 140:
! 141: /* fill eight pages at the same time */
! 142: copy %arg3, %arg0
! 143: ldo PAGE_SIZE(%arg0), %arg1
! 144: extrd,u %arg0, 51, 32, %r1
! 145: stw,ma %r1, 4(%r31)
! 146: ldo PAGE_SIZE(%arg1), %arg2
! 147: extrd,u %arg1, 51, 32, %r1
! 148: stw,ma %r1, 4(%r31)
! 149: ldo PAGE_SIZE(%arg2), %arg3
! 150: extrd,u %arg2, 51, 32, %r1
! 151: stw,ma %r1, 4(%r31)
! 152: ldo PAGE_SIZE(%arg3), arg4
! 153: extrd,u %arg3, 51, 32, %r1
! 154: stw,ma %r1, 4(%r31)
! 155: ldo PAGE_SIZE(arg4), arg5
! 156: extrd,u arg4, 51, 32, %r1
! 157: stw,ma %r1, 4(%r31)
! 158: ldo PAGE_SIZE(arg5), arg6
! 159: extrd,u arg5, 51, 32, %r1
! 160: stw,ma %r1, 4(%r31)
! 161: ldo PAGE_SIZE(arg6), arg7
! 162: extrd,u arg6, 51, 32, %r1
! 163: stw,ma %r1, 4(%r31)
! 164: extrd,u arg7, 51, 32, %r1
! 165: stw,ma %r1, 4(%r31)
! 166: ldi PAGE_SIZE, %r1
! 167: $start_set_ptes
! 168: std,ma,bc %r8, 8(%arg0)
! 169: std,ma,bc %r8, 8(%arg1)
! 170: std,ma,bc %r9, 8(%arg2)
! 171: std,ma,bc %r9, 8(%arg3)
! 172: std,ma,bc %r10, 8(arg4)
! 173: std,ma,bc %r10, 8(arg5)
! 174: std,ma,bc %r11, 8(arg6)
! 175: addib,>= -8, %r1, $start_set_ptes
! 176: std,ma,bc %r11, 8(arg7)
! 177:
! 178: ldo -8(arg7), %arg3
! 179:
! 180: /* assuming size being page-aligned */
! 181: #define STACK_ALLOC(n,s) \
! 182: ldil L%n, %r1 ! \
! 183: ldil L%s, %r31 ! \
! 184: std %arg3, R%n(%r1) ! \
! 185: add %arg3, %r31, %arg3
! 186:
! 187: STACK_ALLOC(pdc_stack, PDC_STACKSIZE)
! 188: STACK_ALLOC(emrg_stack, EMRG_STACKSIZE)
! 189: STACK_ALLOC(fpemu_stack, FPEMU_STACKSIZE)
! 190:
! 191: copy %arg3, %arg0
! 192: ldi PAGE_SIZE+TRAPFRAME_SIZEOF, %r1
! 193: $start_zero_tf
! 194: std,ma,bc %r0, 8(%arg0)
! 195: addib,>= -16, %r1, $start_zero_tf
! 196: std,ma,bc %r0, 8(%arg0)
! 197:
! 198: /* setup proc0/user0 */
! 199: ldil L%(USPACE+PAGE_SIZE), %arg0
! 200: add %arg0, %arg3, %arg0
! 201: ldil L%proc0paddr, %r1
! 202: std %arg3, R%proc0paddr(%r1)
! 203:
! 204: ldo PAGE_SIZE(%arg3), %sp
! 205: mtctl %arg3, %cr30
! 206: std %r0, U_PCB+PCB_ONFAULT(%arg3)
! 207: std %r0, U_PCB+PCB_SPACE(%arg3)
! 208: std %arg3, U_PCB+PCB_UVA(%arg3)
! 209:
! 210: ldil L%proc0, %r1
! 211: ldo R%proc0(%r1), %r1
! 212: ldo -TRAPFRAME_SIZEOF(%sp), %arg2
! 213: std %arg3, P_ADDR(%r1)
! 214: std %arg2, P_MD_REGS(%r1)
! 215:
! 216: ldil TFF_LAST, %r1
! 217: std %r1, TF_FLAGS(%arg2)
! 218: std %arg3, TF_CR30(%arg2)
! 219:
! 220: ldil L%$kpsl, %r1
! 221: ldw R%$kpsl(%r1), arg7
! 222: ldil L%$start_virt, %r31
! 223: ldo R%$start_virt(%r31), %r31
! 224: ldil L%$ivaaddr, %r1
! 225: ldo R%$ivaaddr(%r1), %r1
! 226: mtctl %r1, %iva
! 227: mtctl %r0, %pcsq
! 228: mtctl %r0, %pcsq
! 229: mtctl %r31, %pcoq
! 230: ldo 4(%r31), %r31
! 231: mtctl %r31, %pcoq
! 232: mtctl arg7, %ipsw
! 233: rfi
! 234: nop
! 235:
! 236: $start_virt
! 237: copy %arg0, %r5
! 238: copy %sp, %r3
! 239: std,ma %r0, HPPA_FRAME_SIZE(%sp)
! 240: .call
! 241: b,l hppa_init, %rp
! 242: ldo -16(%sp), ap
! 243:
! 244: $start_callmain
! 245: .import main, code
! 246: .call
! 247: b,l main, %rp
! 248: ldo -TRAPFRAME_SIZEOF(%arg0), %r5
! 249: .size $start, .-$start
! 250:
! 251: /* int
! 252: * pdc_call(func, pdc_flag, ...)
! 253: * iodcio_t func;
! 254: * int pdc_flag;
! 255: */
! 256: ENTRY(pdc_call,160)
! 257: std %rp, HPPA_FRAME_RP(%sp)
! 258: std %sp, HPPA_FRAME_PSP(%sp)
! 259: copy %r3, %r31
! 260: copy %sp, %ret0
! 261:
! 262: ldil L%pdc_stack, %r1
! 263: ldd R%pdc_stack(%r1), %r3
! 264: copy %r3, %sp
! 265: std,ma %r31, 32+12*4+12*8(%sp) /* old frame+args+save(64) */
! 266:
! 267: mfctl %eiem, %r1
! 268: mtctl %r0, %eiem
! 269: std %r1, 1*8(%r3)
! 270:
! 271: copy %arg0, %r31
! 272: /* copy arguments */
! 273: copy %arg2, %arg0
! 274: copy %arg3, %arg1
! 275: copy arg4, %arg2
! 276: copy arg5, %arg3
! 277:
! 278: ldd 0*8(ap), arg4
! 279: ldd 1*8(ap), arg5
! 280: stw arg6, -32-(4+1)*4(%sp)
! 281: stw arg7, -32-(5+1)*4(%sp)
! 282: stw arg4, -32-(6+1)*4(%sp)
! 283: stw arg5, -32-(7+1)*4(%sp)
! 284: ldd 2*8(ap), arg4
! 285: ldd 3*8(ap), arg5
! 286: ldd 4*8(ap), arg6
! 287: ldd 5*8(ap), arg7
! 288: stw arg4, -32-(8+1)*4(%sp)
! 289: stw arg5, -32-(9+1)*4(%sp)
! 290: stw arg6, -32-(10+1)*4(%sp)
! 291: stw arg7, -32-(11+1)*4(%sp)
! 292:
! 293: mfctl %cr24, arg4
! 294: mfctl %cr25, arg5
! 295: mfctl %cr26, arg6
! 296: mfctl %cr27, arg7
! 297: std arg4, 2*8(%r3)
! 298: std arg5, 3*8(%r3)
! 299: std arg6, 4*8(%r3)
! 300: std arg7, 5*8(%r3)
! 301: mfctl %cr28, arg4
! 302: mfctl %cr29, arg5
! 303: mfctl %cr30, arg6
! 304: mfctl %cr31, arg7
! 305: std arg4, 6*8(%r3)
! 306: std arg5, 7*8(%r3)
! 307: std arg6, 8*8(%r3)
! 308: std arg7, 9*8(%r3)
! 309:
! 310: copy %arg0, %ret1
! 311: std %ret0, 11*8(%r3) /* old %sp */
! 312: ldi PSL_Q, %arg0
! 313: break HPPA_BREAK_KERNEL, HPPA_BREAK_SET_PSW
! 314: copy %ret1, %arg0
! 315:
! 316: .call
! 317: blr %r0, %rp
! 318: bv,n (%r31)
! 319: nop
! 320:
! 321: /* load temp control regs */
! 322: ldd 2*8(%r3), arg4
! 323: ldd 3*8(%r3), arg5
! 324: ldd 4*8(%r3), arg6
! 325: ldd 5*8(%r3), arg7
! 326: mtctl arg4, %cr24
! 327: mtctl arg5, %cr25
! 328: mtctl arg6, %cr26
! 329: mtctl arg7, %cr27
! 330: ldd 6*8(%r3), arg4
! 331: ldd 7*8(%r3), arg5
! 332: ldd 8*8(%r3), arg6
! 333: ldd 9*8(%r3), arg7
! 334: mtctl arg4, %cr28
! 335: mtctl arg5, %cr29
! 336: mtctl arg6, %cr30
! 337: mtctl arg7, %cr31
! 338:
! 339: ldil L%$kpsl, %r1
! 340: ldw R%$kpsl(%r1), %arg0
! 341: copy %ret0, %arg1
! 342: break HPPA_BREAK_KERNEL, HPPA_BREAK_SET_PSW
! 343: copy %arg1, %ret0
! 344:
! 345: ldd 1*8(%r3), arg5 /* %eiem */
! 346: ldd 11*8(%r3), %sp
! 347: ldd HPPA_FRAME_RP(%sp), %rp
! 348: ldd 0(%r3), %r3
! 349:
! 350: bv %r0(%rp)
! 351: mtctl arg5, %eiem
! 352: EXIT(pdc_call)
! 353:
! 354: /*
! 355: * the whole syscall() glue is fit on one page
! 356: * both enter and return paths
! 357: */
! 358: /* TODO has to be mapped w/a special perms */
! 359: .align PAGE_SIZE
! 360: .export gateway_page, entry
! 361: gateway_page
! 362: nop
! 363: gate,n $bsd_syscall,%r0
! 364: nop
! 365:
! 366: .align 256
! 367: #ifdef COMPAT_LINUX
! 368: gate,n $linux_syscall, %r0 /* TODO linux syscall fix */
! 369: nop
! 370:
! 371: $linux_syscall
! 372: nop
! 373: #endif
! 374:
! 375: $bsd_syscall
! 376: mfctl %eiem, %r1
! 377: mtctl %r0, %eiem
! 378: mtsp %r0, %sr1
! 379: mfctl %pidr1, %ret0
! 380: ldi HPPA_PID_KERNEL, %ret0
! 381: mtctl %ret0, %pidr1
! 382:
! 383: /* TODO prepare for syscall() */
! 384:
! 385: .import syscall,code
! 386: b,l syscall, %rp
! 387: nop
! 388:
! 389: mfctl %cr24, %arg1
! 390: ldd CI_CURPROC(%arg1), %r1
! 391: ldw P_MD_REGS(%r1), %arg0
! 392:
! 393: $syscall_return
! 394: /* %arg0 -- trapframe */
! 395:
! 396: mtctl %r0, %eiem
! 397:
! 398: ldo 8(%arg0), %r31 /* flags */
! 399:
! 400: rfi
! 401: nop
! 402: .size $bsd_syscall, .-$bsd_syscall
! 403: .size $syscall_return, .-$syscall_return
! 404:
! 405: gateway_end
! 406: . = gateway_page + PAGE_SIZE
! 407: .size gateway_page, .-gateway_page
! 408:
! 409: /*
! 410: * interrupt vector table
! 411: */
! 412: #define TLABEL(name) $trap$name
! 413: #define TRAP(name,num,pre) \
! 414: .export TLABEL(name)$num, entry ! \
! 415: .label TLABEL(name)$num ! \
! 416: pre ! \
! 417: .call ! \
! 418: .import TLABEL(name), code ! \
! 419: b TLABEL(name) ! \
! 420: ldi num, %r1 ! \
! 421: .align 32
! 422:
! 423: #define ITLBPRE \
! 424: mfctl %pcsq, %r8 ! \
! 425: mfctl %pcoq, %r9 ! \
! 426: extrd,u %r8, 63, SID_SHIFT, %r1 ! \
! 427: depd %r1, 31, SID_SHIFT, %r9 ! \
! 428: depd %r0, 63, SID_SHIFT, %r8
! 429:
! 430: #define DTLBPRE \
! 431: mfctl %isr, %r8 ! \
! 432: mfctl %ior, %r9 ! \
! 433: extrd,u %r8, 63, SID_SHIFT, %r1 ! \
! 434: depd %r1, 31, SID_SHIFT, %r9 ! \
! 435: depd %r0, 63, SID_SHIFT, %r8
! 436:
! 437: #define HPMCPRE nop
! 438:
! 439: #define BRKPRE \
! 440: mfctl %pcoq, %r8
! 441:
! 442: .align PAGE_SIZE /* already */
! 443: .export $ivaaddr, entry
! 444: .export hpmc_v, entry
! 445: $ivaaddr
! 446: TRAP(all,T_NONEXIST,) /* 0. invalid interrupt vector */
! 447: hpmc_v
! 448: TRAP(hpmc,T_HPMC,HPMCPRE) /* 1. high priority machine check */
! 449: TRAP(pfr,T_POWERFAIL,) /* 2. power failure */
! 450: TRAP(all,T_RECOVERY,) /* 3. recovery counter trap */
! 451: TRAP(all,T_INTERRUPT,) /* 4. external interrupt */
! 452: TRAP(all,T_LPMC,) /* 5. low-priority machine check */
! 453: TRAP(itlb,T_ITLBMISS,ITLBPRE) /* 6. instruction TLB miss fault */
! 454: TRAP(all,T_IPROT,) /* 7. instruction protection trap */
! 455: TRAP(all,T_ILLEGAL,) /* 8. Illegal instruction trap */
! 456: TRAP(ibrk,T_IBREAK,BRKPRE) /* 9. break instruction trap */
! 457: TRAP(all,T_PRIV_OP,) /* 10. privileged operation trap */
! 458: TRAP(all,T_PRIV_REG,) /* 11. privileged register trap */
! 459: TRAP(all,T_OVERFLOW,) /* 12. overflow trap */
! 460: TRAP(all,T_CONDITION,) /* 13. conditional trap */
! 461: TRAP(excpt,T_EXCEPTION,) /* 14. assist exception trap */
! 462: TRAP(dtlb,T_DTLBMISS,DTLBPRE) /* 15. data TLB miss fault */
! 463: TRAP(itlbna,T_ITLBMISSNA,DTLBPRE)/* 16. ITLB non-access miss fault */
! 464: TRAP(dtlbna,T_DTLBMISSNA,DTLBPRE)/* 17. DTLB non-access miss fault */
! 465: TRAP(all,T_DPROT,) /* 18. data protection trap
! 466: unaligned data reference trap */
! 467: TRAP(all,T_DBREAK,) /* 19. data break trap */
! 468: TRAP(tlbd,T_TLB_DIRTY,DTLBPRE) /* 20. TLB dirty bit trap */
! 469: TRAP(all,T_PAGEREF,) /* 21. page reference trap */
! 470: TRAP(emu,T_EMULATION,) /* 22. assist emulation trap */
! 471: TRAP(all,T_HIGHERPL,) /* 23. higher-privelege transfer trap*/
! 472: TRAP(all,T_LOWERPL,) /* 24. lower-privilege transfer trap */
! 473: TRAP(all,T_TAKENBR,) /* 25. taken branch trap */
! 474: TRAP(all,T_DATACC,) /* 26. data access rights trap */
! 475: TRAP(all,T_DATAPID,) /* 27. data protection ID trap */
! 476: TRAP(all,T_DATALIGN,) /* 28. unaligned data ref trap */
! 477: TRAP(all,29,)
! 478: TRAP(all,30,)
! 479: TRAP(all,31,)
! 480: TRAP(all,32,)
! 481: TRAP(all,33,)
! 482: TRAP(all,34,)
! 483: TRAP(all,35,)
! 484: TRAP(all,36,)
! 485: TRAP(all,37,)
! 486: TRAP(all,38,)
! 487: TRAP(all,39,)
! 488: TRAP(all,40,)
! 489: TRAP(all,41,)
! 490: TRAP(all,42,)
! 491: TRAP(all,43,)
! 492: TRAP(all,44,)
! 493: TRAP(all,45,)
! 494: TRAP(all,46,)
! 495: TRAP(all,47,)
! 496: TRAP(all,48,)
! 497: TRAP(all,49,)
! 498: TRAP(all,50,)
! 499: TRAP(all,51,)
! 500: TRAP(all,52,)
! 501: TRAP(all,53,)
! 502: TRAP(all,54,)
! 503: TRAP(all,55,)
! 504: TRAP(all,56,)
! 505: TRAP(all,57,)
! 506: TRAP(all,58,)
! 507: TRAP(all,59,)
! 508: TRAP(all,60,)
! 509: TRAP(all,61,)
! 510: TRAP(all,62,)
! 511: TRAP(all,63,)
! 512: /* 64 */
! 513:
! 514: /*
! 515: * High Priority Machine Check Interrupt
! 516: */
! 517: .export TLABEL(hpmc), entry
! 518: ENTRY(TLABEL(hpmc),0)
! 519: rfi
! 520: nop
! 521:
! 522: hpmc_never_dies
! 523: b hpmc_never_dies
! 524: nop
! 525: EXIT(TLABEL(hpmc))
! 526:
! 527: /*
! 528: * transfer of control handler
! 529: */
! 530: ENTRY(hppa_toc,0)
! 531: rfi
! 532: nop
! 533:
! 534: ALTENTRY(hppa_toc_end)
! 535: .word 0
! 536: EXIT(hppa_toc)
! 537:
! 538: /*
! 539: * power fail recovery handler
! 540: */
! 541: ENTRY(TLABEL(pfr),0)
! 542: rfi
! 543: nop
! 544:
! 545: ALTENTRY(hppa_pfr_end)
! 546: .word 0
! 547: EXIT(hppa_pfr)
! 548:
! 549: /*
! 550: * system breaks
! 551: */
! 552: .export TLABEL(ibrk), entry
! 553: ENTRY(TLABEL(ibrk),0)
! 554: /* If called by a user process then always pass it to trap() */
! 555: extrd,u,*= %r8, 63, 2, %r0
! 556: b,n TLABEL(all)
! 557:
! 558: /* don't accept breaks from data segments */
! 559: .import etext, code
! 560: ldil L%etext, %r9
! 561: ldo R%etext(%r9), %r9
! 562: cmpb,*>>=,n %r8, %r9, TLABEL(all)
! 563:
! 564: mfctl %iir, %r8
! 565: extrd,u,*= %r8, 63, 5, %r0
! 566: b,n TLABEL(all)
! 567:
! 568: /* now process all those `break' calls we make */
! 569: extrd,u %r8, 50, 13, %r9
! 570: comib,=,n HPPA_BREAK_GET_PSW, %r9, $ibrk_getpsw
! 571: comib,=,n HPPA_BREAK_SET_PSW, %r9, $ibrk_setpsw
! 572:
! 573: b TLABEL(all)
! 574: nop
! 575:
! 576: $ibrk_getpsw
! 577: b $ibrk_exit
! 578: mfctl %ipsw, %ret0
! 579:
! 580: $ibrk_setpsw
! 581: mfctl %ipsw, %ret0
! 582: b $ibrk_exit
! 583: mtctl %arg0, %ipsw
! 584:
! 585: /* insert other fast breaks here */
! 586: nop ! nop
! 587:
! 588: $ibrk_exit
! 589: /* skip the break */
! 590: mtctl %r0, %pcoq
! 591: mfctl %pcoq, %r9
! 592: mtctl %r9, %pcoq
! 593: ldo 4(%r9), %r9
! 594: mtctl %r9, %pcoq
! 595:
! 596: rfi,r
! 597: nop
! 598: EXIT(TLABEL(ibrk))
! 599:
! 600: .export TLABEL(all), entry
! 601: ENTRY(TLABEL(all),0)
! 602: /* %r1 still has trap type */
! 603: mfctl %ipsw, %r9
! 604: mtctl %r9, %cr31
! 605:
! 606: mtsp %r0, %sr3
! 607: ldi HPPA_PID_KERNEL, %r9
! 608: mtctl %r9, %pidr3
! 609:
! 610: mfctl %isr, %r8
! 611: mfctl %ior, %r9
! 612: extrd,u %r8, 63, SID_SHIFT, %r16
! 613: depd %r16, 31, SID_SHIFT, %r9
! 614: depd %r0, 63, SID_SHIFT, %r8
! 615: mtsp %r8, %sr6
! 616: mtctl %r9, %cr27
! 617:
! 618: mfctl %pcsq, %r24
! 619: mtctl %r0, %pcsq
! 620: mfctl %pcsq, %r25
! 621: mtctl %r0, %pcsq
! 622: mtsp %r24, %sr4
! 623: mtsp %r25, %sr5
! 624:
! 625: /* TODO fix pcsq:pcoq split */
! 626: ldil L%TLABEL(all_virt), %r9
! 627: ldo R%TLABEL(all_virt)(%r9), %r9
! 628: mfctl %pcoq, %r24
! 629: mtctl %r9, %pcoq
! 630: mfctl %pcoq, %r25
! 631: ldo 4(%r9), %r9
! 632: mtctl %r24, %cr28
! 633: mtctl %r9, %pcoq
! 634: mtctl %r25, %cr29
! 635:
! 636: ldil L%$kpsl, %r9
! 637: ldw R%$kpsl(%r9), %r9
! 638: mtctl %r9, %ipsw
! 639:
! 640: mfctl %cr30, %r9
! 641:
! 642: mfsp %sr0, %r8
! 643: extrd,u,*<> %r24, 63, 2, %r0 /* still pcoq head */
! 644: cmpb,*= %r0, %r8, TLABEL(all_kern)
! 645: copy %sp, %r17
! 646:
! 647: depdi 1, T_USER_POS, 1, %r1
! 648: depdi 1, TFF_LAST_POS, 1, %r1
! 649: ldd U_PCB+PCB_UVA(%r9), %sp
! 650: ldo PAGE_SIZE-TRAPFRAME_SIZEOF(%sp), %sp
! 651:
! 652: TLABEL(all_kern)
! 653: ldo 127(%sp), %sp
! 654: depdi 0, 63, 7, %sp
! 655:
! 656: ldo TF_SP(%sp), %r8
! 657: std %r17, 0(%r8)
! 658: fdc %r0(%r8)
! 659:
! 660: mfctl %iir, %r16
! 661: ldo TF_IIR(%sp), %r8
! 662: std %r16, 0(%r8)
! 663: fdc %r0(%r8)
! 664:
! 665: mtctl %r1, %cr26
! 666: rfi,r
! 667: nop ! nop ! nop ! nop ! nop ! nop ! nop ! nop
! 668: TLABEL(all_virt)
! 669:
! 670: ldo 8(%sp), %sp /* space for flags */
! 671: std,ma %r1, 8(%sr3,%sp)
! 672: mfctl %cr26, %r1 /* sar */
! 673: std %r1, -16(%sr3,%sp)
! 674: std,ma %rp, 8(%sr3,%sp)
! 675: std,ma %r3, 8(%sr3,%sp)
! 676: std,ma %r4, 8(%sr3,%sp)
! 677: std,ma %r5, 8(%sr3,%sp)
! 678: std,ma %r6, 8(%sr3,%sp)
! 679: std,ma %r7, 8(%sr3,%sp)
! 680: std,ma %r8, 8(%sr3,%sp)
! 681: std,ma %r9, 8(%sr3,%sp)
! 682: std,ma %r10, 8(%sr3,%sp)
! 683: std,ma %r11, 8(%sr3,%sp)
! 684: std,ma %r12, 8(%sr3,%sp)
! 685: std,ma %r13, 8(%sr3,%sp)
! 686: std,ma %r14, 8(%sr3,%sp)
! 687: std,ma %r15, 8(%sr3,%sp)
! 688: std,ma %r16, 8(%sr3,%sp)
! 689: std,ma %r17, 8(%sr3,%sp)
! 690: std,ma %r18, 8(%sr3,%sp)
! 691: std,ma %r19, 8(%sr3,%sp)
! 692: std,ma %r20, 8(%sr3,%sp)
! 693: std,ma %r21, 8(%sr3,%sp)
! 694: std,ma %r22, 8(%sr3,%sp)
! 695: std,ma %r23, 8(%sr3,%sp)
! 696: std,ma %r24, 8(%sr3,%sp)
! 697: std,ma %r25, 8(%sr3,%sp)
! 698: std,ma %r26, 8(%sr3,%sp)
! 699: std,ma %r27, 8(%sr3,%sp)
! 700: std,ma %r28, 8(%sr3,%sp)
! 701: std,ma %r29, 8(%sr3,%sp)
! 702: ldo -30*8(%sp), %arg1
! 703: ldo 8(%sp), %sp /* %sp */
! 704: std,ma %r31, 8(%sr3,%sp)
! 705: copy %r1, %arg0
! 706:
! 707: mfsp %sr0, %arg2
! 708: mfsp %sr1, %arg3
! 709: std,ma %arg2, 8(%sr3,%sp) /* %sr0 */
! 710: std,ma %arg3, 8(%sr3,%sp) /* %sr1 */
! 711: std,ma %arg2, 8(%sr3,%sp) /* %sr2 */
! 712: std,ma %arg2, 8(%sr3,%sp) /* %sr3 */
! 713: std,ma %arg2, 8(%sr3,%sp) /* %sr4 */
! 714: std,ma %arg2, 8(%sr3,%sp) /* %sr5 */
! 715: std,ma %arg2, 8(%sr3,%sp) /* %sr6 */
! 716: std,ma %arg2, 8(%sr3,%sp) /* %sr7 */
! 717:
! 718: mfctl %cr0, %arg3
! 719: mfctl %cr10, %arg2
! 720: std,ma %arg3, 8(%sr3,%sp) /* rctr */
! 721: std,ma %arg2, 8(%sr3,%sp) /* ccr */
! 722:
! 723: mfctl %cr28, %arg2 /* pcoq */
! 724: mfctl %cr29, %arg3
! 725: std,ma %arg2, 8(%sr3,%sp)
! 726: std,ma %arg3, 8(%sr3,%sp)
! 727:
! 728: mfsp %sr4, %arg2 /* pcsq */
! 729: mfsp %sr5, %arg3
! 730: std,ma %arg2, 8(%sr3,%sp)
! 731: std,ma %arg3, 8(%sr3,%sp)
! 732:
! 733: mfctl %pidr1, %arg2
! 734: mfctl %pidr2, %arg3
! 735: std,ma %arg2, 8(%sr3,%sp) /* pidr1 */
! 736: std,ma %arg3, 8(%sr3,%sp) /* pidr2 */
! 737:
! 738: mfctl %pidr3, %r1
! 739: mtctl %r1, %pidr1
! 740: mtctl %r0, %pidr3
! 741:
! 742: mfctl %eiem, %arg2
! 743: mfctl %eirr, %arg3
! 744: std,ma %arg2, 8(%sr3,%sp) /* eiem */
! 745: std,ma %arg3, 8(%sr3,%sp) /* eirr */
! 746:
! 747: mfctl %cr27, %arg2
! 748: mfsp %sr6, %arg3
! 749: std,ma %arg2, 8(%sr3,%sp) /* ior */
! 750: std,ma %arg3, 8(%sr3,%sp) /* isr */
! 751:
! 752: ldo 8(%sp), %sp /* iir */
! 753: mfctl %cr31, %arg3
! 754: std,ma %arg3, 8(%sr3,%sp) /* ipsw */
! 755:
! 756: mfctl %cr24, %arg2
! 757: mfctl %cr25, %arg3
! 758: std,ma %arg2, 8(%sr3,%sp) /* curcpuinfo */
! 759: std,ma %arg3, 8(%sr3,%sp) /* vtop */
! 760:
! 761: mfctl %cr30, %arg2
! 762: mfctl %cr27, %arg3 /* XXX */
! 763: std,ma %arg2, 8(%sr3,%sp) /* pa(u) */
! 764: std,ma %arg3, 8(%sr3,%sp) /* user curthread */
! 765:
! 766: mfctl %sar, %arg2
! 767: std,ma %arg2, 8(%sr3,%sp) /* sar */
! 768:
! 769: mtsp %r0, %sr0
! 770: mtsp %r0, %sr1
! 771: mtsp %r0, %sr2
! 772: mtsp %r0, %sr3
! 773: mtsp %r0, %sr4
! 774: mtsp %r0, %sr5
! 775: mtsp %r0, %sr6
! 776: mtsp %r0, %sr7
! 777:
! 778: ldo TRAPFRAME_SIZEOF(%arg1), %sp
! 779: copy %sp, %r3
! 780: std,ma %r0, HPPA_FRAME_SIZE(%sp)
! 781:
! 782: ldil L%__gp, %dp
! 783: ldo R%__gp(%dp), %dp
! 784: copy %arg1, %r5
! 785:
! 786: depd %r0, T_USER_POS+1, T_USER_POS, %arg0
! 787: .import trap, code
! 788: b,l trap, %rp
! 789: copy %arg0, %r4
! 790:
! 791: /* non-terminal frames return to the same proc */
! 792: bb,*>=,n %r4, TFF_LAST_POS, $syscall_return
! 793: copy %r5, %arg0
! 794:
! 795: /* see if curproc have really changed */
! 796: mfctl %cr24, %arg1
! 797: ldd CI_CURPROC(%arg1), %r1
! 798: sub,*= %r0, %r1, %r0
! 799: ldd P_MD_REGS(%r1), %r5
! 800:
! 801: b $syscall_return
! 802: copy %r5, %arg0
! 803: EXIT(TLABEL(all))
! 804:
! 805: #define PTPULL(bits,lbl) \
! 806: /* space:offset -- %r8:%r9 */ ! \
! 807: ldil L%__kernel_pagedir, %r24 ! \
! 808: or,*= %r8, %r8, %r0 ! \
! 809: mfctl %cr25, %r24 /* vtop */ ! \
! 810: ldo PAGE_SIZE(%r24), %r25 ! \
! 811: extrd,u %r25, 51, 32, %r25 ! \
! 812: extrd,u,*= %r9, 32, 10, %r17 ! \
! 813: ldw,s %r17(%r24), %r25 ! \
! 814: extrd,u %r9, 42, 10, %r17 ! \
! 815: depd,z,*<> %r25, 51, 32, %r25 ! \
! 816: b,n lbl ! \
! 817: ldw,s %r17(%r25), %r25 ! \
! 818: extrd,u %r9, 51, 9, %r24 ! \
! 819: depd,z,*<> %r25, 51, 32, %r25 ! \
! 820: b,n lbl ! \
! 821: ldd,s %r24(%r25), %r16 ! \
! 822: or,*<> %r16, %r0, %r17 ! \
! 823: b,n lbl ! \
! 824: depdi bits, 2+bits, 1+bits, %r17 ! \
! 825: shladd,l %r24, 3, %r25, %r25 ! \
! 826: sub,*= %r16, %r17, %r0 ! \
! 827: std %r17, 0(%r25) ! \
! 828: extrd,s %r16, 63, 37, %r16 ! \
! 829: depd %r8, 63, 48, %r17 ! \
! 830: depdi 1, 62, 1, %r17
! 831:
! 832: TLABEL(itlb)
! 833: PTPULL(0, TLABEL(all))
! 834: iitlbt %r16, %r17
! 835: rfi,r
! 836: nop
! 837:
! 838: TLABEL(tlbd)
! 839: PTPULL(1, TLABEL(all))
! 840: idtlbt %r16, %r17
! 841: rfi,r
! 842: nop
! 843:
! 844: TLABEL(itlbna)
! 845: TLABEL(dtlbna)
! 846: PTPULL(0, TLABEL(dtlbna_fake))
! 847: idtlbt %r16, %r17
! 848: rfi,r
! 849: nop
! 850: TLABEL(dtlbna_fake)
! 851: /* parse probei?,[rw] insns, decent to trap() to set regs proper */
! 852: mfctl %iir, %r16
! 853: extrd,u %r16, 38, 6, %r24
! 854: comib,=,n 1, %r24, TLABEL(all)
! 855: extrd,u %r16, 56, 6, %r24
! 856: subi,<> 0x23, %r24, %r0
! 857: b TLABEL(all)
! 858: subi,<> 0x63, %r24, %r0
! 859: b TLABEL(all)
! 860: /* otherwise generate a flush-only tlb entry */
! 861: depd,z %r8, 62, 47, %r17
! 862: depdi -13, 11, 7, %r17
! 863: ldo 2(%r17), %r17 /* 3? */
! 864: idtlbt %r0, %r17
! 865: rfi,r
! 866: nop
! 867:
! 868: TLABEL(dtlb)
! 869: PTPULL(0, TLABEL(all))
! 870: idtlbt %r16, %r17
! 871: rfi,r
! 872: nop
! 873:
! 874: .export TLABEL(excpt), entry
! 875: ENTRY(TLABEL(excpt),0)
! 876: /* assume we never get this one w/o fpu [enabled] */
! 877: copy %rp, %r1
! 878: copy %arg0, %r8
! 879: mfctl %cr30, %r9
! 880: #if (PCB_FPREGS+U_PCB) != 0
! 881: ldo PCB_FPREGS+U_PCB(%r9), %r9
! 882: #endif
! 883: .import fpu_save, code
! 884: .call
! 885: b,l fpu_save, %rp
! 886: copy %r9, %arg0
! 887: copy %r1, %rp
! 888: copy %r8, %arg0
! 889: mtctl %r0, %cr10 /* reset ccr: cause a reload after exception */
! 890: ldil L%fpu_curpcb, %r1
! 891: std %r0, R%fpu_curpcb(%r1)
! 892:
! 893: /* now, check for trap */
! 894: ldw 0(%r9), %r1
! 895: bb,>=,n %r1, HPPA_FPU_T_POS, excpt_notrap
! 896: ldw 1*4(%r9), %r1
! 897: comb,<>,n %r0, %r1, excpt_emulate
! 898: ldw 2*4(%r9), %r1
! 899: comb,<>,n %r0, %r1, excpt_emulate
! 900: ldw 3*4(%r9), %r1
! 901: comb,<>,n %r0, %r1, excpt_emulate
! 902: ldw 4*4(%r9), %r1
! 903: comb,<>,n %r0, %r1, excpt_emulate
! 904: ldw 5*4(%r9), %r1
! 905: comb,<>,n %r0, %r1, excpt_emulate
! 906: ldw 6*4(%r9), %r1
! 907: comb,<>,n %r0, %r1, excpt_emulate
! 908: ldw 7*4(%r9), %r1
! 909:
! 910: excpt_emulate
! 911: bb,*>=,n %r1, 37, excpt_notrap /* HPPA_FPU_UNMPL not set */
! 912:
! 913: #if TODO_emulate
! 914: ldw 0(%r9), %r16
! 915: depi 0, HPPA_FPU_T_POS, 1, %r16
! 916: .import $fpu_emulate, code
! 917: b $fpu_emulate
! 918: stw %r16, 0(%r9)
! 919: #endif
! 920:
! 921: excpt_notrap
! 922: sync
! 923: b TLABEL(all)
! 924: ldi T_EXCEPTION, %r1
! 925: EXIT(TLABEL(excpt))
! 926:
! 927: .export TLABEL(emu), entry
! 928: ENTRY(TLABEL(emu),0)
! 929: /*
! 930: * Switch FPU/SFU context
! 931: *
! 932: * %isr:%ior - data address
! 933: * %iir - instruction to emulate
! 934: * iisq:iioq - address of instruction to emulate
! 935: *
! 936: * note: ISR and IOR contain valid data only if the
! 937: * instruction is a coprocessor load or store.
! 938: *
! 939: */
! 940:
! 941: mfctl %iir, %r8
! 942: extrd,u %r8, 37, 6, %r9 /* no sfu implementation right now */
! 943: comib,= 4, %r9, TLABEL(all)
! 944: ldi T_ILLEGAL, %r1
! 945:
! 946: /*
! 947: * pass through for all coprocessors now and
! 948: * do not check the uid here.
! 949: * in case that piece does not exist emulate
! 950: * or the trap will be generted later.
! 951: */
! 952:
! 953: /* if we are already enabled and hit again, emulate */
! 954: mfctl %cr10, %r1 /* ccr */
! 955: extru,<> %r1, 25, 2, %r0
! 956: b,n $fpusw_set
! 957: nop
! 958:
! 959: $fpusw_emu
! 960: mtctl %r0, %cr10 /* reset ccr: cause a reload after exception */
! 961: std %r0, R%fpu_curpcb(%r1)
! 962: #if TODO_emulate
! 963: /* here we emulate the fld/fst */
! 964: mfctl %iir, %r1
! 965: extrd,u %r1, 37, 6, %r1
! 966: comib,= 0xb, %r9, TLABEL(all)
! 967: ldi T_ILLEGAL, %r1
! 968:
! 969: mfctl %iir, %r1
! 970: extrd,u %r1, 37, 6, %r1
! 971: comib,= 0x9, %r9, TLABEL(all)
! 972: ldi T_ILLEGAL, %r1
! 973:
! 974: mfctl %iir, %r1
! 975: .import $fpu_emulate, code
! 976: b $fpu_emulate
! 977: nop
! 978: #else
! 979: b TLABEL(all)
! 980: ldi T_ILLEGAL, %r1
! 981: #endif
! 982: $fpusw_set
! 983: /* enable coprocessor */
! 984: depdi 3, 37, 2, %r1
! 985: mtctl %r1, %cr10 /* ccr */
! 986:
! 987: ldil L%fpu_curpcb, %r16
! 988: mfctl %cr30, %r9
! 989: ldd R%fpu_curpcb(%r16), %r16
! 990:
! 991: comb,=,n %r16, %r0, $fpusw_nosave
! 992: comb,=,n %r16, %r9, $fpusw_done
! 993:
! 994: copy %arg0, %r17
! 995: copy %rp, %r1
! 996: #if (PCB_FPREGS+U_PCB) != 0
! 997: ldo PCB_FPREGS+U_PCB(%r16), %r16
! 998: #endif
! 999: .import fpu_save, code
! 1000: .call
! 1001: b,l fpu_save, %rp
! 1002: copy %r16, %arg0
! 1003: copy %r1, %rp
! 1004: copy %r17, %arg0
! 1005:
! 1006: $fpusw_nosave
! 1007: /* count switches */
! 1008: .import umvexp, data
! 1009: ldil L%(uvmexp+FPSWTCH), %r1
! 1010: ldw R%(uvmexp+FPSWTCH)(%r1), %r16
! 1011: ldo 31*8+PCB_FPREGS+U_PCB(%r9), %r17
! 1012: ldo 1(%r16), %r16
! 1013: stw %r16, R%(uvmexp+FPSWTCH)(%r1)
! 1014:
! 1015: fldds,ma -8(%r17), %fr31
! 1016: fldds,ma -8(%r17), %fr30
! 1017: fldds,ma -8(%r17), %fr29
! 1018: fldds,ma -8(%r17), %fr28
! 1019: fldds,ma -8(%r17), %fr27
! 1020: fldds,ma -8(%r17), %fr26
! 1021: fldds,ma -8(%r17), %fr25
! 1022: fldds,ma -8(%r17), %fr24
! 1023: fldds,ma -8(%r17), %fr23
! 1024: fldds,ma -8(%r17), %fr22
! 1025: fldds,ma -8(%r17), %fr21
! 1026: fldds,ma -8(%r17), %fr20
! 1027: fldds,ma -8(%r17), %fr19
! 1028: fldds,ma -8(%r17), %fr18
! 1029: fldds,ma -8(%r17), %fr17
! 1030: fldds,ma -8(%r17), %fr16
! 1031: fldds,ma -8(%r17), %fr15
! 1032: fldds,ma -8(%r17), %fr14
! 1033: fldds,ma -8(%r17), %fr13
! 1034: fldds,ma -8(%r17), %fr12
! 1035: fldds,ma -8(%r17), %fr11
! 1036: fldds,ma -8(%r17), %fr10
! 1037: fldds,ma -8(%r17), %fr9
! 1038: fldds,ma -8(%r17), %fr8
! 1039: fldds,ma -8(%r17), %fr7
! 1040: fldds,ma -8(%r17), %fr6
! 1041: fldds,ma -8(%r17), %fr5
! 1042: fldds,ma -8(%r17), %fr4
! 1043: fldds,ma -8(%r17), %fr3
! 1044: fldds,ma -8(%r17), %fr2
! 1045: fldds,ma -8(%r17), %fr1
! 1046: fldds 0(%r17), %fr0 /* fr0 must be restored last */
! 1047:
! 1048: ldil L%fpu_curpcb, %r1
! 1049: std %r17, R%fpu_curpcb(%r1)
! 1050:
! 1051: $fpusw_done
! 1052: rfir
! 1053: nop
! 1054: EXIT(TLABEL(emu))
! 1055:
! 1056: LEAF_ENTRY(fpu_exit)
! 1057: /* enable coprocessor XXX */
! 1058: depi 3, 25, 2, %r1
! 1059: mtctl %r1, %cr10
! 1060:
! 1061: ldil L%fpu_scratch, %r25
! 1062: ldo R%fpu_scratch(%r25), %r25
! 1063: fstds %fr0, 0(%r25)
! 1064: sync
! 1065: bv %r0(%rp)
! 1066: mtctl %r0, %cr10
! 1067: EXIT(fpu_exit)
! 1068:
! 1069: LEAF_ENTRY(fpu_save)
! 1070: fstds,ma %fr0 , 8(%arg0)
! 1071: fstds,ma %fr1 , 8(%arg0)
! 1072: fstds,ma %fr2 , 8(%arg0)
! 1073: fstds,ma %fr3 , 8(%arg0)
! 1074: fstds,ma %fr4 , 8(%arg0)
! 1075: fstds,ma %fr5 , 8(%arg0)
! 1076: fstds,ma %fr6 , 8(%arg0)
! 1077: fstds,ma %fr7 , 8(%arg0)
! 1078: fstds,ma %fr8 , 8(%arg0)
! 1079: fstds,ma %fr9 , 8(%arg0)
! 1080: fstds,ma %fr10, 8(%arg0)
! 1081: fstds,ma %fr11, 8(%arg0)
! 1082: fstds,ma %fr12, 8(%arg0)
! 1083: fstds,ma %fr13, 8(%arg0)
! 1084: fstds,ma %fr14, 8(%arg0)
! 1085: fstds,ma %fr15, 8(%arg0)
! 1086: fstds,ma %fr16, 8(%arg0)
! 1087: fstds,ma %fr17, 8(%arg0)
! 1088: fstds,ma %fr18, 8(%arg0)
! 1089: fstds,ma %fr19, 8(%arg0)
! 1090: fstds,ma %fr20, 8(%arg0)
! 1091: fstds,ma %fr21, 8(%arg0)
! 1092: fstds,ma %fr22, 8(%arg0)
! 1093: fstds,ma %fr23, 8(%arg0)
! 1094: fstds,ma %fr24, 8(%arg0)
! 1095: fstds,ma %fr25, 8(%arg0)
! 1096: fstds,ma %fr26, 8(%arg0)
! 1097: fstds,ma %fr27, 8(%arg0)
! 1098: fstds,ma %fr28, 8(%arg0)
! 1099: fstds,ma %fr29, 8(%arg0)
! 1100: fstds,ma %fr30, 8(%arg0)
! 1101: fstds %fr31, 0(%arg0)
! 1102: ldo -24(%arg0), %arg0
! 1103: ldi -32, %r25 /* gotta be free for all callers */
! 1104: fdc,m %r25(%arg0)
! 1105: fdc,m %r25(%arg0)
! 1106: fdc,m %r25(%arg0)
! 1107: fdc,m %r25(%arg0)
! 1108: fdc,m %r25(%arg0)
! 1109: fdc,m %r25(%arg0)
! 1110: fdc,m %r25(%arg0)
! 1111: fdc,m %r25(%arg0)
! 1112: bv %r0(%rp)
! 1113: sync
! 1114: EXIT(fpu_save)
! 1115:
! 1116: /*
! 1117: * void
! 1118: * mtctl(register_t val, int reg)
! 1119: */
! 1120: LEAF_ENTRY(mtctl)
! 1121: b,l mtctl_end, %r1
! 1122: extrd,u %arg1, 63, 32, %arg1
! 1123: bv %r0(%rp)
! 1124: mtctl %arg0, %cr0
! 1125: bv %r0(%rp)
! 1126: nop /* mtctl %arg0, %cr1 */
! 1127: bv %r0(%rp)
! 1128: nop /* mtctl %arg0, %cr2 */
! 1129: bv %r0(%rp)
! 1130: nop /* mtctl %arg0, %cr3 */
! 1131: bv %r0(%rp)
! 1132: nop /* mtctl %arg0, %cr4 */
! 1133: bv %r0(%rp)
! 1134: nop /* mtctl %arg0, %cr5 */
! 1135: bv %r0(%rp)
! 1136: nop /* mtctl %arg0, %cr6 */
! 1137: bv %r0(%rp)
! 1138: nop /* mtctl %arg0, %cr7 */
! 1139: bv %r0(%rp)
! 1140: mtctl %arg0, %cr8
! 1141: bv %r0(%rp)
! 1142: mtctl %arg0, %cr9
! 1143: bv %r0(%rp)
! 1144: mtctl %arg0, %cr10
! 1145: bv %r0(%rp)
! 1146: mtctl %arg0, %cr11
! 1147: bv %r0(%rp)
! 1148: mtctl %arg0, %cr12
! 1149: bv %r0(%rp)
! 1150: mtctl %arg0, %cr13
! 1151: bv %r0(%rp)
! 1152: mtctl %arg0, %cr14
! 1153: bv %r0(%rp)
! 1154: mtctl %arg0, %cr15
! 1155: bv %r0(%rp)
! 1156: mtctl %arg0, %cr16
! 1157: bv %r0(%rp)
! 1158: mtctl %arg0, %cr17
! 1159: bv %r0(%rp)
! 1160: mtctl %arg0, %cr18
! 1161: bv %r0(%rp)
! 1162: mtctl %arg0, %cr19
! 1163: bv %r0(%rp)
! 1164: mtctl %arg0, %cr20
! 1165: bv %r0(%rp)
! 1166: mtctl %arg0, %cr21
! 1167: bv %r0(%rp)
! 1168: mtctl %arg0, %cr22
! 1169: bv %r0(%rp)
! 1170: mtctl %arg0, %cr23
! 1171: bv %r0(%rp)
! 1172: mtctl %arg0, %cr24
! 1173: bv %r0(%rp)
! 1174: mtctl %arg0, %cr25
! 1175: bv %r0(%rp)
! 1176: mtctl %arg0, %cr26
! 1177: bv %r0(%rp)
! 1178: mtctl %arg0, %cr27
! 1179: bv %r0(%rp)
! 1180: mtctl %arg0, %cr28
! 1181: bv %r0(%rp)
! 1182: mtctl %arg0, %cr29
! 1183: bv %r0(%rp)
! 1184: mtctl %arg0, %cr30
! 1185: bv %r0(%rp)
! 1186: mtctl %arg0, %cr31
! 1187: mtctl_end
! 1188: subi,<< 31, %arg1, %r0
! 1189: bv,n %arg1(%r1)
! 1190: bv %r0(%rp)
! 1191: nop
! 1192: EXIT(mtctl)
! 1193:
! 1194: /*
! 1195: * void
! 1196: * pdtlb(pa_space_t sp, vaddr_t va)
! 1197: */
! 1198: LEAF_ENTRY(pdtlb)
! 1199: mfsp %sr1, %arg2
! 1200: mtsp %arg0, %sr1
! 1201: pdtlb %r0(%sr1, %arg1)
! 1202: bv %r0(%rp)
! 1203: mtsp %arg2, %sr1
! 1204: EXIT(pdtlb)
! 1205:
! 1206: /*
! 1207: * void
! 1208: * pitlb(pa_space_t sp, vaddr_t va)
! 1209: */
! 1210: LEAF_ENTRY(pitlb)
! 1211: mfsp %sr1, %arg2
! 1212: mtsp %arg0, %sr1
! 1213: pitlb %r0(%sr1, %arg1)
! 1214: bv %r0(%rp)
! 1215: mtsp %arg2, %sr1
! 1216: EXIT(pitlb)
! 1217:
! 1218: /*
! 1219: * register_t
! 1220: * mfctl(int reg)
! 1221: */
! 1222: LEAF_ENTRY(mfctl)
! 1223: b,l mfctl_end, %r1
! 1224: extrd,u %arg0, 63, 32, %arg0
! 1225: bv %r0(%rp)
! 1226: mfctl %cr0, %ret0
! 1227: bv %r0(%rp)
! 1228: nop /* mfctl %cr1, %ret0 */
! 1229: bv %r0(%rp)
! 1230: nop /* mfctl %cr2, %ret0 */
! 1231: bv %r0(%rp)
! 1232: nop /* mfctl %cr3, %ret0 */
! 1233: bv %r0(%rp)
! 1234: nop /* mfctl %cr4, %ret0 */
! 1235: bv %r0(%rp)
! 1236: nop /* mfctl %cr5, %ret0 */
! 1237: bv %r0(%rp)
! 1238: nop /* mfctl %cr6, %ret0 */
! 1239: bv %r0(%rp)
! 1240: nop /* mfctl %cr7, %ret0 */
! 1241: bv %r0(%rp)
! 1242: mfctl %cr8, %ret0
! 1243: bv %r0(%rp)
! 1244: mfctl %cr9, %ret0
! 1245: bv %r0(%rp)
! 1246: mfctl %cr10, %ret0
! 1247: bv %r0(%rp)
! 1248: mfctl %cr11, %ret0
! 1249: bv %r0(%rp)
! 1250: mfctl %cr12, %ret0
! 1251: bv %r0(%rp)
! 1252: mfctl %cr13, %ret0
! 1253: bv %r0(%rp)
! 1254: mfctl %cr14, %ret0
! 1255: bv %r0(%rp)
! 1256: mfctl %cr15, %ret0
! 1257: bv %r0(%rp)
! 1258: mfctl %cr16, %ret0
! 1259: bv %r0(%rp)
! 1260: mfctl %cr17, %ret0
! 1261: bv %r0(%rp)
! 1262: mfctl %cr18, %ret0
! 1263: bv %r0(%rp)
! 1264: mfctl %cr19, %ret0
! 1265: bv %r0(%rp)
! 1266: mfctl %cr20, %ret0
! 1267: bv %r0(%rp)
! 1268: mfctl %cr21, %ret0
! 1269: bv %r0(%rp)
! 1270: mfctl %cr22, %ret0
! 1271: bv %r0(%rp)
! 1272: mfctl %cr23, %ret0
! 1273: bv %r0(%rp)
! 1274: mfctl %cr24, %ret0
! 1275: bv %r0(%rp)
! 1276: mfctl %cr25, %ret0
! 1277: bv %r0(%rp)
! 1278: mfctl %cr26, %ret0
! 1279: bv %r0(%rp)
! 1280: mfctl %cr27, %ret0
! 1281: bv %r0(%rp)
! 1282: mfctl %cr28, %ret0
! 1283: bv %r0(%rp)
! 1284: mfctl %cr29, %ret0
! 1285: bv %r30(%rp)
! 1286: mfctl %cr30, %ret0
! 1287: bv %r30(%rp)
! 1288: mfctl %cr31, %ret0
! 1289:
! 1290: mfctl_end
! 1291: subi,<< 31, %arg0, %r0
! 1292: bv,n %arg0(%r1)
! 1293: bv %r0(%rp)
! 1294: nop
! 1295: EXIT(mfctl)
! 1296:
! 1297: #define CACHELOOP(sp,addr,len,step,insn) \
! 1298: mtsp sp, %sr1 ! \
! 1299: ldi -1, arg7 ! \
! 1300: sh3add step, arg7, %r1 ! \
! 1301: andcm len, %r1, %r1 ! \
! 1302: add addr, %r1, %r1 ! \
! 1303: b __CONCAT(insn,_loop) ! \
! 1304: add addr, len, len ! \
! 1305: .label __CONCAT(insn,_loop8) ! \
! 1306: insn,m step(%sr1, addr) ! \
! 1307: insn,m step(%sr1, addr) ! \
! 1308: insn,m step(%sr1, addr) ! \
! 1309: insn,m step(%sr1, addr) ! \
! 1310: insn,m step(%sr1, addr) ! \
! 1311: insn,m step(%sr1, addr) ! \
! 1312: insn,m step(%sr1, addr) ! \
! 1313: .label __CONCAT(insn,_loop) ! \
! 1314: comb,<< addr, %r1, __CONCAT(insn,_loop8) ! \
! 1315: insn,m step(%sr1, addr) ! \
! 1316: .label __CONCAT(insn,_loop1) ! \
! 1317: comb,<<,n addr, len, __CONCAT(insn,_loop1) ! \
! 1318: insn,m step(%sr1, addr)
! 1319:
! 1320:
! 1321: LEAF_ENTRY(fdcache)
! 1322: ldil L%dcache_stride, %r1
! 1323: ldw R%dcache_stride(%r1), %arg3
! 1324: CACHELOOP(%arg0,%arg1,%arg2,%arg3,fdc)
! 1325: bv %r0(%rp)
! 1326: sync
! 1327: EXIT(fdcache)
! 1328:
! 1329: LEAF_ENTRY(pdcache)
! 1330: ldil L%dcache_stride, %r1
! 1331: ldw R%dcache_stride(%r1), %arg3
! 1332: CACHELOOP(%arg0,%arg1,%arg2,%arg3,pdc)
! 1333: bv %r0(%rp)
! 1334: sync
! 1335: EXIT(pdcache)
! 1336:
! 1337: LEAF_ENTRY(ficache)
! 1338: ldil L%icache_stride, %r1
! 1339: ldw R%icache_stride(%r1), %arg3
! 1340: CACHELOOP(%arg0,%arg1,%arg2,%arg3,fic)
! 1341: bv %r0(%rp)
! 1342: sync
! 1343: EXIT(ficache)
! 1344:
! 1345: LEAF_ENTRY(copy_on_fault)
! 1346: mtsp %r0, %sr1
! 1347: mtsp %r0, %sr2
! 1348: std %r1, PCB_ONFAULT+U_PCB(%rp)
! 1349: ldd HPPA_FRAME_RP(%sp), %rp
! 1350: ldo -HPPA_FRAME_SIZE(%sp), %sp
! 1351: bv %r0(%rp)
! 1352: ldi EFAULT, %ret0
! 1353: EXIT(copy_on_fault)
! 1354:
! 1355: LEAF_ENTRY(sync_caches)
! 1356: sync
! 1357: syncdma
! 1358: sync
! 1359: nop
! 1360: nop
! 1361: nop
! 1362: nop
! 1363: nop
! 1364: nop
! 1365: bv %r0(%rp)
! 1366: nop
! 1367: EXIT(sync_caches)
! 1368:
! 1369: /*
! 1370: * int spstrcpy (pa_space_t ssp, const void *src, pa_space_t dsp, void *dst,
! 1371: * size_t size, size_t *rsize)
! 1372: * do a space to space strncpy, return actual copy size in the rsize;
! 1373: */
! 1374: LEAF_ENTRY(spstrcpy)
! 1375: stw %rp, HPPA_FRAME_RP(%sp)
! 1376: ldo HPPA_FRAME_SIZE(%sp), %sp
! 1377: add arg4, %arg1, arg4
! 1378: /* setup fault handler */
! 1379: mfctl %cr24, %arg1
! 1380: ldd CI_CURPROC(%arg1), %r1
! 1381: ldil L%copy_on_fault, arg7
! 1382: ldd P_ADDR(arg6), %rp
! 1383: ldo R%copy_on_fault(arg7), arg7
! 1384: ldd PCB_ONFAULT+U_PCB(%rp), %r1
! 1385: std arg7, PCB_ONFAULT+U_PCB(%rp)
! 1386:
! 1387: mtsp %arg0, %sr1
! 1388: mtsp %arg2, %sr2
! 1389: copy %arg1, %arg0
! 1390:
! 1391: $spstrcpy_loop
! 1392: ldbs,ma 1(%sr1, %arg1), arg7
! 1393: comb,= arg4, %arg1, $spstrcpy_exit
! 1394: stbs,ma arg7, 1(%sr2, %arg3)
! 1395: comb,<>,n %r0, arg7, $spstrcpy_loop
! 1396: nop
! 1397:
! 1398: $spstrcpy_exit
! 1399: ldo -HPPA_FRAME_SIZE(%sp), %sp
! 1400: mtsp %r0, %sr1
! 1401: mtsp %r0, %sr2
! 1402: std %r1, PCB_ONFAULT+U_PCB(%rp)
! 1403: sub %arg1, %arg0, %arg1
! 1404: ldd HPPA_FRAME_RP(%sp), %rp
! 1405: sub,= %r0, arg5, %r0
! 1406: stw %arg1, 0(arg5)
! 1407: bv 0(%rp)
! 1408: copy %r0, %ret0
! 1409: EXIT(spstrcpy)
! 1410:
! 1411: LEAF_ENTRY(setjmp)
! 1412: std,ma %rp, 8(%arg0)
! 1413: std,ma %sp, 8(%arg0)
! 1414: std,ma %r3, 8(%arg0)
! 1415: std,ma %r4, 8(%arg0)
! 1416: std,ma %r5, 8(%arg0)
! 1417: std,ma %r6, 8(%arg0)
! 1418: std,ma %r7, 8(%arg0)
! 1419: std,ma %r8, 8(%arg0)
! 1420: std,ma %r9, 8(%arg0)
! 1421: std,ma %r10, 8(%arg0)
! 1422: std,ma %r11, 8(%arg0)
! 1423: std,ma %r12, 8(%arg0)
! 1424: std,ma %r13, 8(%arg0)
! 1425: std,ma %r14, 8(%arg0)
! 1426: std,ma %r15, 8(%arg0)
! 1427: std,ma %r16, 8(%arg0)
! 1428: std,ma %r17, 8(%arg0)
! 1429: std,ma %r18, 8(%arg0)
! 1430: std,ma %r19, 8(%arg0)
! 1431: std,ma %r27, 8(%arg0)
! 1432:
! 1433: bv %r0(%rp)
! 1434: copy %r0, %ret0
! 1435: EXIT(setjmp)
! 1436:
! 1437: LEAF_ENTRY(longjmp)
! 1438: ldd,ma 8(%arg0), %rp
! 1439: ldd,ma 8(%arg0), %sp
! 1440: ldd,ma 8(%arg0), %r3
! 1441: ldd,ma 8(%arg0), %r4
! 1442: ldd,ma 8(%arg0), %r5
! 1443: ldd,ma 8(%arg0), %r6
! 1444: ldd,ma 8(%arg0), %r7
! 1445: ldd,ma 8(%arg0), %r8
! 1446: ldd,ma 8(%arg0), %r9
! 1447: ldd,ma 8(%arg0), %r10
! 1448: ldd,ma 8(%arg0), %r11
! 1449: ldd,ma 8(%arg0), %r12
! 1450: ldd,ma 8(%arg0), %r13
! 1451: ldd,ma 8(%arg0), %r14
! 1452: ldd,ma 8(%arg0), %r15
! 1453: ldd,ma 8(%arg0), %r16
! 1454: ldd,ma 8(%arg0), %r17
! 1455: ldd,ma 8(%arg0), %r18
! 1456: ldd,ma 8(%arg0), %r19
! 1457: ldd,ma 8(%arg0), %r27
! 1458:
! 1459: bv %r0(%rp)
! 1460: copy %arg1, %ret0
! 1461: EXIT(longjmp)
! 1462:
! 1463: .import whichqs, data
! 1464: .import qs, data
! 1465: /*
! 1466: * setrunqueue(struct proc *p);
! 1467: * Insert a process on the appropriate queue. Should be called at splclock().
! 1468: */
! 1469: .align 32
! 1470: ENTRY(setrunqueue,0)
! 1471: #ifdef DIAGNOSTIC
! 1472: ldd P_BACK(%arg0), %r1
! 1473: comb,<>,n %r0, %r1, Lsetrunqueue_panic
! 1474: ldd P_WCHAN(%arg0), %r1
! 1475: comb,<>,n %r0, %r1, Lsetrunqueue_panic
! 1476: ldb P_STAT(%arg0), %r1
! 1477: comib,=,n SRUN, %r1, Lsetrunqueue_ok
! 1478: Lsetrunqueue_panic
! 1479: copy %arg0, %arg1
! 1480: ldil L%Lsrqpstr, %arg0
! 1481: .call
! 1482: b,l panic, %rp
! 1483: ldo R%Lsrqpstr(%arg0), %arg0
! 1484: Lsrqpstr
! 1485: .asciz "setrunqueue(%p)"
! 1486: .align 8
! 1487: Lsetrunqueue_ok
! 1488: #endif
! 1489:
! 1490: ldb P_PRIORITY(%arg0), %r1
! 1491: ldil L%qs, arg7
! 1492: shd %r0, %r1, 2, %r1
! 1493: ldo R%qs(arg7), arg7
! 1494: sh3add %r1, arg7, arg7
! 1495: ldil L%whichqs, %arg3
! 1496: ldd P_BACK(arg7), arg6
! 1497: std arg7, P_FORW(%arg0)
! 1498: std %arg0, P_BACK(arg7)
! 1499: ldw R%whichqs(%arg3), arg5
! 1500: std %arg0, P_FORW(arg6)
! 1501: mtctl %r1, %sar
! 1502: std arg6, P_BACK(%arg0)
! 1503: vdepi 1, 1, arg5
! 1504: bv 0(%rp)
! 1505: stw arg5, R%whichqs(%arg3)
! 1506: EXIT(setrunqueue)
! 1507:
! 1508: /*
! 1509: * remrunqueue(struct proc *p);
! 1510: * Remove a process from its queue. Should be called at splclock().
! 1511: */
! 1512: .align 32
! 1513: ENTRY(remrunqueue,0)
! 1514: ldb P_PRIORITY(%arg0), %r1
! 1515: shd %r0, %r1, 2, %r1
! 1516: ldil L%whichqs, arg5
! 1517: mtsar %r1
! 1518: ldw R%whichqs(arg5), arg6
! 1519:
! 1520: #ifdef DIAGNOSTIC
! 1521: bvb,<,n arg6, remrunqueue_ok
! 1522:
! 1523: Lremrunqueue_panic
! 1524: copy %arg0, %arg1
! 1525: ldil L%Lrrqpstr, %arg0
! 1526: .call
! 1527: b,l panic, %rp
! 1528: ldo R%Lrrqpstr(%arg0), %arg0
! 1529:
! 1530: Lrrqpstr
! 1531: .asciz "remrunqueue(%p), bit=%x"
! 1532: .align 8
! 1533: remrunqueue_ok
! 1534: #endif
! 1535: ldd P_BACK(%arg0), arg7
! 1536: std %r0, P_BACK(%arg0)
! 1537: ldd P_FORW(%arg0), %arg0
! 1538: std %arg0, P_FORW(arg7)
! 1539: vdepi 0, 1, arg6
! 1540: sub,*<> arg7, %arg0, %r0
! 1541: stw arg6, R%whichqs(arg5)
! 1542: bv 0(%rp)
! 1543: std arg7, P_BACK(%arg0)
! 1544: EXIT(remrunqueue)
! 1545:
! 1546: /*
! 1547: * cpu_switch()
! 1548: * find the highest priority process and resume it.
! 1549: */
! 1550: .align 32
! 1551: ENTRY(cpu_switch,128)
! 1552: ldil L%cpl, %r1
! 1553: ldw R%cpl(%r1), %ret0
! 1554: copy %r3, %r1
! 1555: std %rp, HPPA_FRAME_RP(%sp)
! 1556: copy %sp, %r3
! 1557: stwm %r1, HPPA_FRAME_SIZE+20*8(%sp)
! 1558: ldo -(HPPA_FRAME_SIZE)(%sp), ap
! 1559: stw %ret0, 2*8(ap) /* cpl */
! 1560:
! 1561: /*
! 1562: * Clear curproc so that we don't accumulate system time while idle.
! 1563: */
! 1564: mfctl %cr24, %r1
! 1565: ldd CI_CURPROC(%r1), %arg2
! 1566: b switch_search
! 1567: std %r0, CI_CURPROC(%r1)
! 1568: /* remain on the old (curproc)'s stack until we have a better choice */
! 1569:
! 1570: cpu_idle
! 1571: .call
! 1572: b,l spllower, %rp
! 1573: copy %r0, %arg0
! 1574: .import uvm, data
! 1575: ldil L%uvm, %r1
! 1576: ldo R%uvm(%r1), %r1
! 1577: ldw PAGE_IDLE_ZERO(%r1), %r1
! 1578: sub,<> %r0, %r1, %r0
! 1579: b,n cpu_loop
! 1580:
! 1581: .call
! 1582: b,l uvm_pageidlezero, %rp
! 1583: std %arg2, 8(%r3)
! 1584:
! 1585: ldw 2*8(ap), %ret0 /* cpl */
! 1586: ldd 8(%r3), %arg2
! 1587:
! 1588: cpu_loop
! 1589: ldil L%cpl, %arg0
! 1590: stw %ret0, R%cpl(%arg0)
! 1591:
! 1592: switch_search
! 1593: /*
! 1594: * t1: &whichqs
! 1595: * arg2: old curproc
! 1596: *
! 1597: */
! 1598: ldil L%whichqs, %r1
! 1599: ldw R%whichqs(%r1), %arg2
! 1600: comb,=,n %r0, %arg2, cpu_idle
! 1601: copy %r0, %arg0
! 1602:
! 1603: ldi 0, %arg3
! 1604: getbit
! 1605: mtsar %arg3
! 1606: bvb,>=,n %arg2, getbit
! 1607: ldo 1(%arg3), %arg3
! 1608:
! 1609: ldil L%qs, %arg2
! 1610: ldo R%qs(%arg2), %arg2
! 1611: depd %arg3, 62, 63, %arg3
! 1612: shladd,l %arg3, 3, %arg2, %arg2
! 1613:
! 1614: ldd P_FORW(%arg2), %arg1
! 1615: #ifdef DIAGNOSTIC
! 1616: comb,<> %arg2, %arg1, link_ok
! 1617: nop
! 1618: switch_error
! 1619: copy %arg3, %arg1
! 1620: copy %arg2, %arg2
! 1621: ldil L%Lcspstr, %arg0
! 1622: .call
! 1623: b,l panic, %rp
! 1624: ldo R%Lcspstr(%arg0), %arg0
! 1625: Lcspstr
! 1626: .asciz "cpu_switch: bit=%x, q/p=%p"
! 1627: .align 8
! 1628: link_ok
! 1629: #endif
! 1630: ldil L%want_resched, %r1
! 1631: stw %r0, R%want_resched(%r1)
! 1632:
! 1633: ldd P_FORW(%arg1), %arg0
! 1634: std %arg0, P_FORW(%arg2)
! 1635: std %arg2, P_BACK(%arg0)
! 1636: std %r0, P_BACK(%arg1)
! 1637:
! 1638: ldil L%whichqs, %r1
! 1639: vdepi 0, 1, %arg3
! 1640: sub,<> %arg2, %arg0, %r0
! 1641: stw %arg3, R%whichqs(%r1)
! 1642:
! 1643: /* don't need &whichqs (t1) starting here */
! 1644: #ifdef DIAGNOSTIC
! 1645: ldd P_WCHAN(%arg1), %arg3
! 1646: comb,<>,n %r0, %arg3, switch_error
! 1647: copy %arg1, %t2
! 1648: ldb P_STAT(%arg1), %arg3
! 1649: comib,<>,n SRUN, %arg3, switch_error
! 1650: copy %arg1, %arg2
! 1651: /*
! 1652: * Either we must be switching to the same process, or
! 1653: * the new process' kernel stack must be reasonable.
! 1654: */
! 1655: comb,=,n %arg1, %arg2, kstack_ok
! 1656: ldd P_ADDR(%arg1), %arg0
! 1657: ldd U_PCB+PCB_KSP(%arg0), %arg3
! 1658: ldo NBPG(%arg0), %arg0
! 1659: comb,>>,n %arg0, %arg3, switch_error
! 1660: copy %arg1, %arg2
! 1661: sub %arg3, %arg0, %arg3
! 1662: ldil L%USPACE, %arg0
! 1663: ldo R%USPACE(%arg0), %arg0
! 1664: comb,<<=,n %arg0, %arg3, switch_error
! 1665: copy %arg1, %arg2
! 1666: kstack_ok
! 1667: #endif
! 1668: ldi SONPROC, %r1
! 1669: stb %r1, P_STAT(%arg1)
! 1670: /* Skip context switch if same process. */
! 1671: comb,=,n %arg1, %arg2, switch_return
! 1672:
! 1673: /* If old process exited, don't bother. */
! 1674: comb,=,n %r0, %arg2, switch_exited
! 1675:
! 1676: /*
! 1677: * 2. save old proc context
! 1678: *
! 1679: * arg2: old proc
! 1680: */
! 1681: ldd P_ADDR(%arg2), %r1
! 1682: /* save callee-save registers */
! 1683: std %r4, 1*8(%r3)
! 1684: std %sp, U_PCB+PCB_KSP(%r1)
! 1685: std %r5, 2*8(%r3)
! 1686: std %r6, 3*8(%r3)
! 1687: std %r7, 4*8(%r3)
! 1688: std %r8, 5*8(%r3)
! 1689: std %r9, 6*8(%r3)
! 1690: std %r10, 7*8(%r3)
! 1691: std %r11, 8*8(%r3)
! 1692: std %r12, 9*8(%r3)
! 1693: std %r13, 10*8(%r3)
! 1694: std %r14, 11*8(%r3)
! 1695: std %r15, 12*8(%r3)
! 1696: std %r16, 13*8(%r3)
! 1697: std %r17, 14*8(%r3)
! 1698: std %r18, 15*8(%r3)
! 1699: fdc %r0(%r1)
! 1700: std %r0, 1*8(ap) /* say no trampoline */
! 1701: sync
! 1702:
! 1703: /* don't need old curproc (arg2) starting from here */
! 1704: switch_exited
! 1705: /*
! 1706: * 3. restore new proc context
! 1707: *
! 1708: * arg1: new proc
! 1709: */
! 1710: ldd P_ADDR(%arg1), %arg3
! 1711: ldd P_MD_REGS(%arg1), %r1
! 1712: ldd U_PCB+PCB_KSP(%arg3), %sp
! 1713: mtctl %r0, %cr10 /* ccr */
! 1714: ldd TF_CR30(%r1), %arg2
! 1715: ldd TF_PIDR2(%r1), %arg3
! 1716: mtctl %arg2, %cr30
! 1717: mtctl %arg3, %pidr2
! 1718: ldo -(HPPA_FRAME_SIZE+20*8)(%sp), %r3
! 1719: ldo -(HPPA_FRAME_SIZE)(%sp), ap
! 1720: ldd 0*8(ap), %arg0
! 1721: ldd 1*8(ap), %arg3 /* in case we're on trampoline */
! 1722: sub,*= %r0, %arg3, %r0
! 1723: b,n switch_gonnajump
! 1724: ldd 1*8(%r3), %r4
! 1725: ldd 2*8(%r3), %r5
! 1726: ldd 3*8(%r3), %r6
! 1727: ldd 4*8(%r3), %r7
! 1728: ldd 5*8(%r3), %r8
! 1729: ldd 6*8(%r3), %r9
! 1730: ldd 7*8(%r3), %r10
! 1731: ldd 8*8(%r3), %r11
! 1732: ldd 9*8(%r3), %r12
! 1733: ldd 10*8(%r3), %r13
! 1734: ldd 11*8(%r3), %r14
! 1735: ldd 12*8(%r3), %r15
! 1736: ldd 13*8(%r3), %r16
! 1737: ldd 14*8(%r3), %r17
! 1738: ldd 15*8(%r3), %r18
! 1739: switch_gonnajump
! 1740: ldw 2*8(ap), %ret0 /* cpl */
! 1741: ldil L%cpl, %r1
! 1742: stw %ret0, R%cpl(%r1)
! 1743: sync
! 1744:
! 1745: switch_return
! 1746: mfctl %cr24, %r1
! 1747: std %arg1, CI_CURPROC(%r1)
! 1748: ldd HPPA_FRAME_RP(%r3), %rp
! 1749: bv 0(%rp)
! 1750: ldd,mb -(HPPA_FRAME_SIZE+20*8)(%sp), %r3
! 1751: EXIT(cpu_switch)
! 1752:
! 1753: .align 8
! 1754: .export switch_tramp_p, code
! 1755: switch_tramp_p
! 1756: .dword switch_trampoline
! 1757:
! 1758: ENTRY(switch_trampoline,0)
! 1759: /* ldd 0x18(%arg3), %r19 but we know we are in kernel! */
! 1760: ldd 0x10(%arg3), %arg3
! 1761: .call
! 1762: ble 0(%sr0, %arg3)
! 1763: copy %r31, %rp
! 1764:
! 1765: mfctl %cr24, %arg1
! 1766: ldd CI_CURPROC(%arg1), %r1
! 1767: b $syscall_return
! 1768: ldd P_MD_REGS(%r1), %arg0
! 1769: EXIT(switch_trampoline)
! 1770:
! 1771: /*
! 1772: * Signal "trampoline" code. Invoked from RTE setup by sendsig().
! 1773: */
! 1774: ENTRY(sigcode,0)
! 1775: ldd 0x18(%arg3), %r19
! 1776: ldd 0x10(%arg3), %arg3
! 1777: .call
! 1778: ble 0(%sr0, %arg3)
! 1779: copy %r31, %rp
! 1780:
! 1781: ldil L%SYSCALLGATE, %r1
! 1782: copy %r4, %arg0
! 1783: .call
! 1784: ble 4(%sr7, %r1)
! 1785: ldi SYS_sigreturn, %r1
! 1786:
! 1787: ldil L%SYSCALLGATE, %r1
! 1788: copy %ret0, %arg0
! 1789: .call
! 1790: ble 4(%sr7, %r1)
! 1791: ldi SYS_exit, %r1
! 1792: ALTENTRY(esigcode)
! 1793: EXIT(sigcode)
! 1794:
! 1795: /*
! 1796: * struct cpu_info *curcpu(void);
! 1797: */
! 1798: LEAF_ENTRY(curcpu)
! 1799: bv %r0(%rp)
! 1800: mfctl %cr24, %ret0
! 1801: EXIT(curcpu)
! 1802:
! 1803: /*
! 1804: * int splraise(int newcpl);
! 1805: */
! 1806: LEAF_ENTRY(splraise)
! 1807: bv %r0(%rp)
! 1808: nop
! 1809:
! 1810: extrd,u %arg0, 63, 32, %arg0
! 1811: #ifdef DEBUG
! 1812: cmpib,<=,n NIPL, %arg0, splraise_ok
! 1813: copy %arg0, %arg1
! 1814: ldil L%splraise_fmt, %arg0
! 1815: b,l panic, %rp
! 1816: ldo R%splraise_fmt(%arg0), %arg0
! 1817: bv %r0(%rp)
! 1818: ldi IPL_HIGH, %ret0
! 1819: splraise_fmt
! 1820: .asciz "splraise(%d)"
! 1821: .align 8
! 1822: splraise_ok
! 1823: #endif
! 1824: sync
! 1825: mfctl %eiem, %arg2
! 1826: mtctl %r0, %eiem
! 1827: ldil L%cpl, %r1
! 1828: ldw R%cpl(%r1), %ret0
! 1829: ldil L%imask, %arg3
! 1830: ldo R%imask(%arg3), %arg3
! 1831: sub,<= %arg0, %ret0, %r0
! 1832: ldd,s %arg0(%arg3), %arg2
! 1833: sub,<= %arg0, %ret0, %r0
! 1834: stw %arg0, R%cpl(%r1)
! 1835: sync
! 1836: bv %r0(%rp)
! 1837: mtctl %arg2, %eiem
! 1838: EXIT(splraise)
! 1839:
! 1840: /*
! 1841: * int spllower(int newcpl);
! 1842: */
! 1843: LEAF_ENTRY(spllower)
! 1844: bv %r0(%rp)
! 1845: nop
! 1846:
! 1847: extrd,u %arg0, 63, 32, %arg0
! 1848: #ifdef DEBUG
! 1849: cmpib,<=,n NIPL, %arg0, spllower_ok
! 1850: copy %arg0, %arg1
! 1851: ldil L%spllower_fmt, %arg0
! 1852: b,l panic, %rp
! 1853: ldo R%spllower_fmt(%arg0), %arg0
! 1854: bv %r0(%rp)
! 1855: ldi IPL_HIGH, %ret0
! 1856: spllower_fmt
! 1857: .asciz "spllower(%d)"
! 1858: .align 8
! 1859: spllower_ok
! 1860: #endif
! 1861: sync
! 1862: mfctl %eiem, %arg2
! 1863: mtctl %r0, %eiem
! 1864: ldil L%cpl, %r1
! 1865: ldw R%cpl(%r1), %ret0
! 1866: ldil L%imask, %arg3
! 1867: ldo R%imask(%arg3), %arg3
! 1868: sub,>= %arg0, %ret0, %r0
! 1869: ldd,s %arg0(%arg3), %arg2
! 1870: sub,>= %arg0, %ret0, %r0
! 1871: stw %arg0, R%cpl(%r1)
! 1872: sync
! 1873: bv %r0(%rp)
! 1874: mtctl %arg2, %eiem
! 1875: EXIT(spllower)
! 1876:
! 1877: .end
CVSweb