darwin-xnu/osfmk/ppc/Firmware.s
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 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/*
  23 * @OSF_FREE_COPYRIGHT@
  24 */
  25/*
  26 * @APPLE_FREE_COPYRIGHT@
  27 */
  28        
  29/*                                                                                                                                                                                      
  30        Firmware.s 
  31
  32        Handle things that should be treated as an extension of the hardware
  33
  34        Lovingly crafted by Bill Angell using traditional methods and only natural or recycled materials.
  35        No animal products are used other than rendered otter bile and deep fried pork lard.
  36
  37*/
  38
  39#include <ppc/asm.h>
  40#include <ppc/proc_reg.h>
  41#include <ppc/spec_reg.h>
  42#include <ppc/exception.h>
  43#include <mach/machine/vm_param.h>
  44#include <assym.s>
  45
  46
  47/*
  48 *                      Here we generate the table of supported firmware calls 
  49 */
  50 
  51
  52        
  53                        .data
  54                        .align  5                                                               /* Line up on cache line */
  55                        
  56                        .globl  EXT(FWtable)
  57
  58EXT(FWtable):
  59
  60                        .globl  CutTrace                                                /* Let everyone know 'bout it */
  61                        .set    CutTrace,(.-EXT(FWtable))/4|0x80000000  /* Call number for CutTrace */
  62                        .long   callUnimp                                               /* This was already handled in lowmem_vectors */
  63
  64#include        <ppc/FirmwareCalls.h>
  65 
  66                        .set    EXT(FirmwareCnt), (.-EXT(FWtable))/4    /* Get the top number */
  67
  68                        .text
  69                        
  70#define SIMPLESCC 1
  71#define NOTQUITEASSIMPLE 1
  72/*
  73 *                      This routine handles the firmware call routine. It must be entered with IR and DR off,
  74 *                      interruptions disabled, and in supervisor state. 
  75 *
  76 *                      When we enter, we expect R0 to have call number, and LR
  77 *                      to point to the return.  Also, all registers saved in savearea in R13.
  78 *                      R3 is as passed in by the user.  All others must be gotten from the save area
  79 */
  80
  81
  82                        .align  5
  83                        .globl  EXT(FirmwareCall)
  84
  85LEXT(FirmwareCall)
  86                
  87                        rlwinm  r1,r0,2,1,29                                    /* Clear out bit 0 and multiply by 4 */
  88                        lis             r12,HIGH_ADDR(EXT(FWtable))             /* Get the high part of the firmware call table */
  89                        cmplwi  r1,EXT(FirmwareCnt)*4                   /* Is it a valid firmware call number */
  90                        ori             r12,r12,LOW_ADDR(EXT(FWtable))  /* Now the low part */
  91                        ble+    goodCall                                                /* Yeah, it is... */
  92                        
  93                        li              r3,T_SYSTEM_CALL                                /* Tell the vector handler that we know nothing */
  94                        b               EXT(FCReturn)                                   ; Bye dudes...
  95                        
  96goodCall:       mfsprg  r10,0                                                   /* Make sure about the per_proc block */
  97                        lwzx    r1,r1,r12                                               /* Pick up the address of the routine */
  98                        lwz             r4,saver4+4(r13)                                /* Pass in caller's R4 */
  99                        lwz             r5,saver5+4(r13)                                /* Pass in caller's R5 */
 100                        rlwinm. r1,r1,0,0,29                                    /* Make sure the flag bits are clear */
 101
 102                        mtlr    r1                                                              /* Put it in the LR */
 103                        beq-    callUnimp                                               /* This one was unimplimented... */
 104
 105                        blrl                                                                    /* Call the routine... */
 106
 107                        stw             r3,saver3+4(r13)                                /* Pass back the return code to caller */
 108                        li              r3,T_IN_VAIN                                    /* Tell the vector handler that we took care of it */
 109                        b               EXT(FCReturn)                                   ; Bye dudes...
 110        
 111callUnimp:      li              r3,T_SYSTEM_CALL                                /* Tell the vector handler that we know nothing */
 112                        b               EXT(FCReturn)                                   ; Bye dudes...
 113
 114/*
 115 *                      This routine is used to store using a real address. It stores parmeter1 at parameter2.
 116 */
 117
 118                        .align  5
 119                        .globl  EXT(StoreReal)
 120
 121LEXT(StoreReal)
 122
 123                        lis             r0,HIGH_ADDR(StoreRealCall)             /* Get the top part of the SC number */
 124                        ori             r0,r0,LOW_ADDR(StoreRealCall)   /* and the bottom part */
 125                        sc                                                                              /* Do it to it */
 126                        blr                                                                             /* Bye bye, Birdie... */
 127                        
 128                        .align  5
 129                        .globl  EXT(StoreRealLL)
 130
 131LEXT(StoreRealLL)
 132
 133                        stw             r3,0(r4)                                                /* Store the word */
 134                        blr                                                                             /* Leave... */
 135
 136/*
 137 *                      This routine is used to clear a range of physical pages.
 138 */
 139                        
 140                        .align  5
 141                        .globl  EXT(ClearReal)
 142
 143LEXT(ClearReal)
 144
 145                        lis             r0,HIGH_ADDR(ClearRealCall)             /* Get the top part of the SC number */
 146                        ori             r0,r0,LOW_ADDR(ClearRealCall)   /* and the bottom part */
 147                        sc                                                                              /* Do it to it */
 148                        blr                                                                             /* Bye bye, Birdie... */
 149                        
 150                        
 151                        .align  5
 152                        .globl  EXT(ClearRealLL)
 153
 154LEXT(ClearRealLL)
 155
 156/*
 157 *                      We take the first parameter as a physical address.  The second is the length in bytes.
 158 *                      Being crazy, I'll round the address down, and the length up.  We could end up clearing
 159 *                      an extra page at the start and one at the end, but we don't really care.  If someone
 160 *                      is stupid enough to give me unaligned addresses and lengths, I am just arrogant enough
 161 *                      to take them at their word and to hell with them.
 162 */
 163
 164                        neg             r5,r3                                                   /* Negate the address */ 
 165                        addi    r4,r4,4095                                              /* Round length up */
 166                        rlwinm  r5,r5,0,20,31                                   /* Save extra length */
 167                        rlwinm  r3,r3,0,0,19                                    /* Round the page on down */
 168                        add             r4,r4,r5                                                /* Add up all extra lengths */
 169                        li              r6,32                                                   /* Get a displacement */
 170                        rlwinm  r4,r4,0,0,19                                    /* Round the length back down */
 171                        
 172clrloop:        subi    r4,r4,32                                                /* Back off a cache line */
 173                        dcbz    0,r3                                                    /* Do the even line */
 174                        sub.    r4,r4,r6                                                /* Back off a second time (we only do this to generate a CR */
 175                        dcbz    r6,r3                                                   /* Clear the even line */
 176                        addi    r3,r3,64                                                /* Move up to every other line */
 177                        bgt+    clrloop                                                 /* Go until we've done it all... */
 178
 179                        blr                                                                             /* Leave... */
 180/*
 181 *                      This routine will read in 32 byte of real storage.
 182 */
 183                        
 184                        .align  5
 185                        .globl  EXT(ReadReal)
 186
 187LEXT(ReadReal)
 188
 189                        mfsprg  r9,2                                                    ; Get the features
 190                        mfmsr   r0                                                              ; Get the MSR 
 191                        li              r8,lo16(MASK(MSR_DR))                   ; Get the DR bit
 192                        rlwinm. r9,r9,0,pf64Bitb,pf64Bitb               ; Are we 64-bit?
 193                        ori             r8,r8,lo16(MASK(MSR_EE))                ; Add in the EE bit
 194                        li              r7,1                                                    ; Get set for it
 195                        andc    r8,r0,r8                                                ; Turn off EE and DR
 196                        bt--    cr0_eq,rr32a                                    ; Yes, we are...
 197                        
 198                        rldimi  r8,r7,63,MSR_SF_BIT                             ; Set SF bit (bit 0)
 199                        sldi    r3,r3,32                                                ; Slide on over for true 64-bit address
 200                        mtmsrd  r8
 201                        isync
 202                        or              r3,r3,r4                                                ; Join top and bottom of address
 203                        mr              r4,r5                                                   ; Set destination address
 204                        b               rrJoina                                                 ; Join on up...
 205                        
 206rr32a:          mr              r3,r4                                                   ; Position bottom of long long
 207                        mr              r4,r5                                                   ; Set destination address
 208                        mtmsr   r8                                                              /* Disable EE and DR */
 209                        isync                                                                   /* Just make sure about it */
 210                        
 211rrJoina:        lwz             r5,0(r3)                                                /* Get word 0 */
 212                        lwz             r6,4(r3)                                                /* Get word 1 */
 213                        lwz             r7,8(r3)                                                /* Get word 2 */
 214                        lwz             r8,12(r3)                                               /* Get word 3 */
 215                        lis             r2,hi16(MASK(MSR_VEC))                  ; Get the vector enable 
 216                        lwz             r9,16(r3)                                               /* Get word 4 */
 217                        ori             r2,r2,lo16(MASK(MSR_FP))                ; Get the FP enable 
 218                        lwz             r10,20(r3)                                              /* Get word 5 */
 219                        andc    r0,r0,r2                                                ; Clear VEC and FP enables
 220                        lwz             r11,24(r3)                                              /* Get word 6 */
 221                        lwz             r12,28(r3)                                              /* Get word 7 */
 222                        
 223                        bt--    cr0_eq,rr32b                                    ; We are not 64-bit...
 224
 225                        mtmsrd  r0
 226                        isync
 227                        b               rrJoinb                                                 ; Join on up...
 228
 229rr32b:          mtmsr   r0                                                              /* Restore original machine state */
 230                        isync                                                                   /* Insure goodness */
 231                        
 232rrJoinb:        stw             r5,0(r4)                                                /* Set word 0 */
 233                        stw             r6,4(r4)                                                /* Set word 1 */
 234                        stw             r7,8(r4)                                                /* Set word 2 */
 235                        stw             r8,12(r4)                                               /* Set word 3 */
 236                        stw             r9,16(r4)                                               /* Set word 4 */
 237                        stw             r10,20(r4)                                              /* Set word 5 */
 238                        stw             r11,24(r4)                                              /* Set word 6 */
 239                        stw             r12,28(r4)                                              /* Set word 7 */
 240                        
 241                        blr
 242                        
 243
 244/*
 245 *                      This routine is used to load all 4 DBATs.
 246 */
 247                        
 248                        .align  5
 249                        .globl  EXT(LoadDBATs)
 250
 251LEXT(LoadDBATs)
 252
 253
 254                        lis             r0,HIGH_ADDR(LoadDBATsCall)             /* Top half of LoadDBATsCall firmware call number */
 255                        ori             r0,r0,LOW_ADDR(LoadDBATsCall)   /* Bottom half */
 256                        sc                                                                              /* Do it to it */
 257
 258                        blr                                                                             /* Bye bye, Birdie... */
 259                        
 260                        
 261                        .align  5
 262                        .globl  EXT(xLoadDBATsLL)
 263
 264LEXT(xLoadDBATsLL)
 265
 266                        lwz             r4,0(r3)                                                /* Get DBAT 0 high */
 267                        lwz             r5,4(r3)                                                /* Get DBAT 0 low */
 268                        lwz             r6,8(r3)                                                /* Get DBAT 1 high */
 269                        lwz             r7,12(r3)                                               /* Get DBAT 1 low */
 270                        lwz             r8,16(r3)                                               /* Get DBAT 2 high */
 271                        lwz             r9,20(r3)                                               /* Get DBAT 2 low */
 272                        lwz             r10,24(r3)                                              /* Get DBAT 3 high */
 273                        lwz             r11,28(r3)                                              /* Get DBAT 3 low */
 274                        
 275                        sync                                                                    /* Common decency and the state law require that you wash your hands */
 276                        mtdbatu 0,r4                                                    /* Load DBAT 0 high */
 277                        mtdbatl 0,r5                                                    /* Load DBAT 0 low */
 278                        mtdbatu 1,r6                                                    /* Load DBAT 1 high */
 279                        mtdbatl 1,r7                                                    /* Load DBAT 1 low */
 280                        mtdbatu 2,r8                                                    /* Load DBAT 2 high */
 281                        mtdbatl 2,r9                                                    /* Load DBAT 2 low */
 282                        mtdbatu 3,r10                                                   /* Load DBAT 3 high */
 283                        mtdbatl 3,r11                                                   /* Load DBAT 3 low */
 284                        sync                                                                    /* Make sure it's done */
 285                        isync                                                                   /* Toss out anything new */
 286
 287                        blr                                                                             /* Leave... */
 288
 289/*
 290 *                      This routine is used to load all 4 IBATs.
 291 */
 292
 293                        .align  5
 294                        .globl  EXT(LoadIBATs)
 295
 296LEXT(LoadIBATs)
 297
 298
 299                        lis             r0,HIGH_ADDR(LoadIBATsCall)             /* Top half of LoadIBATsCall firmware call number */
 300                        ori             r0,r0,LOW_ADDR(LoadIBATsCall)   /* Bottom half */
 301                        sc                                                                              /* Do it to it */
 302                        blr                                                                             /* Bye bye, Birdie... */
 303                        
 304                        .align  5
 305                        .globl  EXT(xLoadIBATsLL)
 306
 307LEXT(xLoadIBATsLL)
 308
 309                        lwz             r4,0(r3)                                                /* Get IBAT 0 high */
 310                        lwz             r5,4(r3)                                                /* Get IBAT 0 low */
 311                        lwz             r6,8(r3)                                                /* Get IBAT 1 high */
 312                        lwz             r7,12(r3)                                               /* Get IBAT 1 low */
 313                        lwz             r8,16(r3)                                               /* Get IBAT 2 high */
 314                        lwz             r9,20(r3)                                               /* Get IBAT 2 low */
 315                        lwz             r10,24(r3)                                              /* Get IBAT 3 high */
 316                        lwz             r11,28(r3)                                              /* Get IBAT 3 low */
 317                        
 318                        sync                                                                    /* Common decency and the state law require that you wash your hands */
 319                        mtibatu 0,r4                                                    /* Load IBAT 0 high */
 320                        mtibatl 0,r5                                                    /* Load IBAT 0 low */
 321                        mtibatu 1,r6                                                    /* Load IBAT 1 high */
 322                        mtibatl 1,r7                                                    /* Load IBAT 1 low */
 323                        mtibatu 2,r8                                                    /* Load IBAT 2 high */
 324                        mtibatl 2,r9                                                    /* Load IBAT 2 low */
 325                        mtibatu 3,r10                                                   /* Load IBAT 3 high */
 326                        mtibatl 3,r11                                                   /* Load IBAT 3 low */
 327                        sync                                                                    /* Make sure it's done */
 328                        isync                                                                   /* Toss out anything new */
 329                        
 330                        blr                                                                             /* Leave... */
 331
 332
 333/*
 334 *                      This is the glue to call the CutTrace firmware call
 335 *                      dbgTrace(id, p1, p2, p3, p4)
 336 */
 337                        
 338                        .align  5
 339                        .globl  EXT(dbgTrace)
 340
 341LEXT(dbgTrace)
 342                        
 343                        mr              r2,r3
 344                        mr              r3,r4
 345                        lis             r0,HIGH_ADDR(CutTrace)                  /* Top half of CreateFakeIO firmware call number */
 346                        mr              r4,r5
 347                        mr              r5,r6
 348                        ori             r0,r0,LOW_ADDR(CutTrace)                /* Bottom half */
 349                        mr              r6,r7
 350                        sc                                                                              /* Do it to it */
 351                        blr                                                                             /* Bye bye, Birdie... */
 352
 353/*
 354 *                      This is the glue to create a fake I/O interruption
 355 */
 356                        
 357                        .align  5
 358                        .globl  EXT(CreateFakeIO)
 359
 360LEXT(CreateFakeIO)
 361                        
 362                        lis             r0,HIGH_ADDR(CreateFakeIOCall)  /* Top half of CreateFakeIO firmware call number */
 363                        ori             r0,r0,LOW_ADDR(CreateFakeIOCall)        /* Bottom half */
 364                        sc                                                                              /* Do it to it */
 365                        blr                                                                             /* Bye bye, Birdie... */
 366
 367/*
 368 *                      This is the glue to create a fake Dec interruption
 369 */
 370                        
 371                        .align  5
 372                        .globl  EXT(CreateFakeDEC)
 373
 374LEXT(CreateFakeDEC)
 375                        
 376#if 0
 377                        mflr    r4                                                              ; (TEST/DEBUG)
 378                        bl              EXT(ml_sense_nmi)                               ; (TEST/DEBUG)
 379                        mtlr    r4                                                              ; (TEST/DEBUG)
 380#endif                  
 381                        
 382                        lis             r0,HIGH_ADDR(CreateFakeDECCall) /* Top half of CreateFakeDEC firmware call number */
 383                        ori             r0,r0,LOW_ADDR(CreateFakeDECCall)       /* Bottom half */
 384                        sc                                                                              /* Do it to it */
 385                        blr                                                                             /* Bye bye, Birdie... */
 386
 387
 388/*
 389 *                      This is the glue to create a shutdown context
 390 */
 391 
 392                        .align  5
 393                        .globl  EXT(CreateShutdownCTX)
 394
 395LEXT(CreateShutdownCTX)
 396                        
 397                        lis             r0,HIGH_ADDR(CreateShutdownCTXCall)     /* Top half of CreateFakeIO firmware call number */
 398                        ori             r0,r0,LOW_ADDR(CreateShutdownCTXCall)   /* Bottom half */
 399                        sc                                                                              /* Do it to it */
 400                        blr                                                                             /* Bye bye, Birdie... */
 401
 402/*
 403 *                      This is the glue to choke system
 404 */
 405  
 406                        .align  5
 407                        .globl  EXT(ChokeSys)
 408
 409LEXT(ChokeSys)
 410                        
 411                        lis             r0,HIGH_ADDR(Choke)                             /* Top half of Choke firmware call number */
 412                        ori             r0,r0,LOW_ADDR(Choke)                   /* Bottom half */
 413                        sc                                                                              /* Do it to it */
 414                        blr                                                                             /* Bye bye, Birdie... */
 415
 416/* 
 417 *                      Used to initialize the SCC for debugging output
 418 */
 419
 420  
 421                        .align  5
 422                        .globl  EXT(fwSCCinit)
 423
 424LEXT(fwSCCinit)
 425                
 426                        mfmsr   r8                                                                              /* Save the MSR */
 427                        mr.             r3,r3                                                                   /* See if printer or modem */
 428                        rlwinm  r12,r8,0,28,25                                                  /* Turn off translation */
 429                        lis             r10,0xF301                                                              /* Set the top part */
 430                        rlwinm  r12,r12,0,17,15                                                 /* Turn off interruptions */
 431#if 0
 432                        mtmsr   r12                                                                             /* Smash the MSR */
 433                        isync                                                                                   /* Make it clean */
 434#endif
 435
 436                        ori             r10,r10,0x2000                                                  /* Assume the printer (this is the normal one) */
 437                        beq+    fwSCCprnt                                                               /* It sure are... */
 438                        ori             r10,r10,0x0002                                                  /* Move it over to the modem port */
 439
 440fwSCCprnt:      dcbf    0,r10                                                                   /* Insure it is out */
 441                        sync
 442                        eieio
 443                        dcbi    0,r10                                                                   /* Toss it */
 444                        sync
 445
 446
 447                        li              r7,0x09                                                                 /* Set the register */
 448                        stb             r7,0(r10)                                                               /* Set the register */
 449                        dcbf    0,r10                                                                   /* Force it out */
 450                        sync                                                                                    /* Make sure it's out there */
 451                        dcbi    0,r10
 452                        eieio
 453
 454                        li              r7,0x80                                                                 /* Reset channel A */
 455                        stb             r7,0(r10)                                                               /* Set the register */
 456                        dcbf    0,r10                                                                   /* Force it out */
 457                        sync                                                                                    /* Make sure it's out there */
 458                        dcbi    0,r10
 459                        eieio
 460
 461                        li              r7,0x04                                                                 /* Set the register */
 462                        stb             r7,0(r10)                                                               /* Set the register */
 463                        dcbf    0,r10                                                                   /* Force it out */
 464                        sync                                                                                    /* Make sure it's out there */
 465                        dcbi    0,r10
 466                        eieio
 467
 468                        li              r7,0x44                                                                 /* x16 clock, 1 stop bit */
 469                        stb             r7,0(r10)                                                               /* Set the register */
 470                        dcbf    0,r10                                                                   /* Force it out */
 471                        sync                                                                                    /* Make sure it's out there */
 472                        dcbi    0,r10
 473                        eieio
 474
 475                        li              r7,0x03                                                                 /* Set the register */
 476                        stb             r7,0(r10)                                                               /* Set the register */
 477                        dcbf    0,r10                                                                   /* Force it out */
 478                        sync                                                                                    /* Make sure it's out there */
 479                        dcbi    0,r10
 480                        eieio
 481
 482                        li              r7,0xC0                                                                 /* 8 bits per char */
 483                        stb             r7,0(r10)                                                               /* Set the register */
 484                        dcbf    0,r10                                                                   /* Force it out */
 485                        sync                                                                                    /* Make sure it's out there */
 486                        dcbi    0,r10
 487                        eieio
 488
 489                        li              r7,0x05                                                                 /* Set the register */
 490                        stb             r7,0(r10)                                                               /* Set the register */
 491                        dcbf    0,r10                                                                   /* Force it out */
 492                        sync                                                                                    /* Make sure it's out there */
 493                        dcbi    0,r10
 494                        eieio
 495
 496                        li              r7,0xE2                                                                 /* DTR mode, 8bit/char */
 497                        stb             r7,0(r10)                                                               /* Set the register */
 498                        dcbf    0,r10                                                                   /* Force it out */
 499                        sync                                                                                    /* Make sure it's out there */
 500                        dcbi    0,r10
 501                        eieio
 502
 503                        li              r7,0x02                                                                 /* Set the register */
 504                        stb             r7,0(r10)                                                               /* Set the register */
 505                        dcbf    0,r10                                                                   /* Force it out */
 506                        sync                                                                                    /* Make sure it's out there */
 507                        dcbi    0,r10
 508                        eieio
 509
 510                        li              r7,0x00                                                                 /* Vector 0 */
 511                        stb             r7,0(r10)                                                               /* Set the register */
 512                        dcbf    0,r10                                                                   /* Force it out */
 513                        sync                                                                                    /* Make sure it's out there */
 514                        dcbi    0,r10
 515                        eieio
 516
 517                        li              r7,0x0A                                                                 /* Set the register */
 518                        stb             r7,0(r10)                                                               /* Set the register */
 519                        dcbf    0,r10                                                                   /* Force it out */
 520                        sync                                                                                    /* Make sure it's out there */
 521                        dcbi    0,r10
 522                        eieio
 523
 524                        li              r7,0x00                                                                 /* Clear misc controls */
 525                        stb             r7,0(r10)                                                               /* Set the register */
 526                        dcbf    0,r10                                                                   /* Force it out */
 527                        sync                                                                                    /* Make sure it's out there */
 528                        dcbi    0,r10
 529                        eieio
 530
 531                        li              r7,0x0B                                                                 /* Set the register */
 532                        stb             r7,0(r10)                                                               /* Set the register */
 533                        dcbf    0,r10                                                                   /* Force it out */
 534                        sync                                                                                    /* Make sure it's out there */
 535                        dcbi    0,r10
 536                        eieio
 537
 538                        li              r7,0x50                                                                 /* B/R gen T/R */
 539                        stb             r7,0(r10)                                                               /* Set the register */
 540                        dcbf    0,r10                                                                   /* Force it out */
 541                        sync                                                                                    /* Make sure it's out there */
 542                        dcbi    0,r10
 543                        eieio
 544
 545                        li              r7,0x0C                                                                 /* Set the register */
 546                        stb             r7,0(r10)                                                               /* Set the register */
 547                        dcbf    0,r10                                                                   /* Force it out */
 548                        sync                                                                                    /* Make sure it's out there */
 549                        dcbi    0,r10
 550                        eieio
 551
 552                        li              r7,0x0A                                                                 /* 9600 baud low */
 553                        stb             r7,0(r10)                                                               /* Set the register */
 554                        dcbf    0,r10                                                                   /* Force it out */
 555                        sync                                                                                    /* Make sure it's out there */
 556                        dcbi    0,r10
 557                        eieio
 558
 559                        li              r7,0x0D                                                                 /* Set the register */
 560                        stb             r7,0(r10)                                                               /* Set the register */
 561                        dcbf    0,r10                                                                   /* Force it out */
 562                        sync                                                                                    /* Make sure it's out there */
 563                        dcbi    0,r10
 564                        eieio
 565
 566                        li              r7,0x00                                                                 /* 9600 baud high */
 567                        stb             r7,0(r10)                                                               /* Set the register */
 568                        dcbf    0,r10                                                                   /* Force it out */
 569                        sync                                                                                    /* Make sure it's out there */
 570                        dcbi    0,r10
 571                        eieio
 572
 573                        li              r7,0x03                                                                 /* Set the register */
 574                        stb             r7,0(r10)                                                               /* Set the register */
 575                        dcbf    0,r10                                                                   /* Force it out */
 576                        sync                                                                                    /* Make sure it's out there */
 577                        dcbi    0,r10
 578                        eieio
 579
 580                        li              r7,0xC1                                                                 /* 8 bits/char, Rx enable */
 581                        stb             r7,0(r10)                                                               /* Set the register */
 582                        dcbf    0,r10                                                                   /* Force it out */
 583                        sync                                                                                    /* Make sure it's out there */
 584                        dcbi    0,r10
 585                        eieio
 586
 587                        li              r7,0x05                                                                 /* Set the register */
 588                        stb             r7,0(r10)                                                               /* Set the register */
 589                        dcbf    0,r10                                                                   /* Force it out */
 590                        sync                                                                                    /* Make sure it's out there */
 591                        dcbi    0,r10
 592                        eieio
 593
 594                        li              r7,0xEA                                                                 /* 8 bits/char, Tx enable */
 595                        stb             r7,0(r10)                                                               /* Set the register */
 596                        dcbf    0,r10                                                                   /* Force it out */
 597                        sync                                                                                    /* Make sure it's out there */
 598                        dcbi    0,r10
 599                        eieio
 600
 601                        li              r7,0x0E                                                                 /* Set the register */
 602                        stb             r7,0(r10)                                                               /* Set the register */
 603                        dcbf    0,r10                                                                   /* Force it out */
 604                        sync                                                                                    /* Make sure it's out there */
 605                        dcbi    0,r10
 606                        eieio
 607
 608                        li              r7,0x01                                                                 /* BR rate gen enable */
 609                        stb             r7,0(r10)                                                               /* Set the register */
 610                        dcbf    0,r10                                                                   /* Force it out */
 611                        sync                                                                                    /* Make sure it's out there */
 612                        dcbi    0,r10
 613                        eieio
 614
 615                        li              r7,0x0F                                                                 /* Set the register */
 616                        stb             r7,0(r10)                                                               /* Set the register */
 617                        dcbf    0,r10                                                                   /* Force it out */
 618                        sync                                                                                    /* Make sure it's out there */
 619                        dcbi    0,r10
 620                        eieio
 621
 622                        li              r7,0x00                                                                 /* ints off */
 623                        stb             r7,0(r10)                                                               /* Set the register */
 624                        dcbf    0,r10                                                                   /* Force it out */
 625                        sync                                                                                    /* Make sure it's out there */
 626                        dcbi    0,r10
 627                        eieio
 628
 629                        li              r7,0x10                                                                 /* Reset ext/stat ints */
 630                        stb             r7,0(r10)                                                               /* Set the register */
 631                        dcbf    0,r10                                                                   /* Force it out */
 632                        sync                                                                                    /* Make sure it's out there */
 633                        dcbi    0,r10
 634                        eieio
 635
 636                        li              r7,0x10                                                                 /* Reset ext/stat ints */
 637                        stb             r7,0(r10)                                                               /* Set the register */
 638                        dcbf    0,r10                                                                   /* Force it out */
 639                        sync                                                                                    /* Make sure it's out there */
 640                        dcbi    0,r10
 641                        eieio
 642
 643                        li              r7,0x01                                                                 /* Set the register */
 644                        stb             r7,0(r10)                                                               /* Set the register */
 645                        dcbf    0,r10                                                                   /* Force it out */
 646                        sync                                                                                    /* Make sure it's out there */
 647                        dcbi    0,r10
 648                        eieio
 649
 650                        li              r7,0x10                                                                 /* int on Rx, no Tx int enable */
 651                        stb             r7,0(r10)                                                               /* Set the register */
 652                        dcbf    0,r10                                                                   /* Force it out */
 653                        sync                                                                                    /* Make sure it's out there */
 654                        dcbi    0,r10
 655                        eieio
 656
 657                        li              r7,0x09                                                                 /* Set the register */
 658                        stb             r7,0(r10)                                                               /* Set the register */
 659                        dcbf    0,r10                                                                   /* Force it out */
 660                        sync                                                                                    /* Make sure it's out there */
 661                        dcbi    0,r10
 662                        eieio
 663
 664                        li              r7,0x0A                                                                 /* int on Rx, Tx int enable */
 665                        stb             r7,0(r10)                                                               /* Set the register */
 666                        dcbf    0,r10                                                                   /* Force it out */
 667                        sync                                                                                    /* Master enable, no vector */
 668                        dcbi    0,r10
 669                        eieio
 670
 671                        li              r7,0x09                                                                 /* Set the register */
 672                        stb             r7,0(r10)                                                               /* Set the register */
 673                        dcbf    0,r10                                                                   /* Force it out */
 674                        sync                                                                                    /* Make sure it's out there */
 675                        dcbi    0,r10
 676                        eieio
 677
 678                        li              r7,0x02                                                                 /* No vector */
 679                        stb             r7,0(r10)                                                               /* Set the register */
 680                        dcbf    0,r10                                                                   /* Force it out */
 681                        sync                                                                                    /* Master enable, no vector */
 682                        dcbi    0,r10
 683                        eieio
 684                        
 685                        lbz             r7,0(r10)                                                               /* Clear interrupts */
 686                        sync                                                                                    /* Master enable, no vector */
 687                        dcbi    0,r10
 688                        eieio
 689
 690wSCCrdy:        eieio                                                                                   /* Barricade it */
 691                        lbz             r7,0(r10)                                                               /* Get current status */
 692                        dcbi    0,r10
 693                        sync
 694                        andi.   r7,r7,0x04                                                              /* Is transmitter empty? */
 695                        beq             wSCCrdy                                                                 /* Nope... */
 696
 697                        eieio
 698
 699#if 0
 700                        mtmsr   r8                                                                              /* Restore 'rupts and TR */
 701                        isync
 702#endif
 703                        blr                                                                                             /* Leave... */
 704
 705/*
 706 *                      This routine is used to write debug output to either the modem or printer port.
 707 *                      parm 1 is printer (0) or modem (1); parm 2 is ID (printed directly); parm 3 converted to hex
 708 */
 709  
 710                        .align  5
 711                        .globl  EXT(dbgDisp)
 712
 713LEXT(dbgDisp)
 714
 715                        mr              r12,r0                                                                  /* Keep R0 pristene */
 716                        lis             r0,HIGH_ADDR(dbgDispCall)                               /* Top half of dbgDispCall firmware call number */
 717                        ori             r0,r0,LOW_ADDR(dbgDispCall)                             /* Bottom half */
 718
 719                        sc                                                                                              /* Go display the stuff */
 720
 721                        mr              r0,r12                                                                  /* Restore R0 */
 722                        blr                                                                                             /* Return... */
 723                        
 724/*                      Here's the low-level part of dbgDisp                    */
 725
 726                        .align  5
 727                        .globl  EXT(dbgDispLL)
 728
 729LEXT(dbgDispLL)
 730
 731dbgDispInt:     mfmsr   r8                                                                              /* Save the MSR */
 732
 733#if 0
 734                        lis             r10,0xF301                      /* (TEST/DEBUG) */
 735                        ori             r10,r10,0x2002          /* (TEST/DEBUG) */
 736                        dcbf    0,r10                           /* (TEST/DEBUG) */
 737                        sync                                            /* (TEST/DEBUG) */
 738                        dcbi    0,r10                           /* (TEST/DEBUG) */
 739                        eieio                                           /* (TEST/DEBUG) */
 740                        li              r7,0x35                         /* (TEST/DEBUG) */
 741                        stb             r7,4(r10)                       /* (TEST/DEBUG) */
 742                        
 743                        lis             r7,10                           /* (TEST/DEBUG) */
 744spw6:           addi    r7,r7,-1                        /* (TEST/DEBUG) */
 745                        mr.             r7,r7                           /* (TEST/DEBUG) */
 746                        bne-    spw6                            /* (TEST/DEBUG) */
 747                        dcbf    0,r10                           /* (TEST/DEBUG) */
 748                        sync                                            /* (TEST/DEBUG) */
 749                        dcbi    0,r10                           /* (TEST/DEBUG) */
 750                        eieio                                           /* (TEST/DEBUG) */
 751#endif
 752
 753                        rlwinm  r12,r8,0,28,25                                                  /* Turn off translation */
 754                        rlwinm  r12,r12,0,17,15                                                 /* Turn off interruptions */
 755
 756                        mflr    r11                                                                             /* Save the link register */
 757
 758#if 0
 759                        mr              r7,r12                          /* (TEST/DEBUG) */
 760                        bl              dumpr7                          /* (TEST/DEBUG) */
 761#endif
 762
 763                        mr.             r3,r3                                                                   /* See if printer or modem */
 764                        lis             r10,0xF301                                                              /* Set the top part */
 765                        mr              r3,r4                                                                   /* Copy the ID parameter */
 766                        
 767#if 0
 768                        mr              r9,r12                          /* (TEST/DEBUG) */
 769                        
 770                        mtmsr   r12                                     /* (TEST/DEBUG) */
 771                        isync                                           /* (TEST/DEBUG) */
 772
 773#if 0
 774                        mtmsr   r8                                      /* (TEST/DEBUG) */
 775                        isync                                           /* (TEST/DEBUG) */
 776#endif
 777
 778                        lis             r12,0xF301                      /* (TEST/DEBUG) */
 779                        ori             r12,r12,0x2002          /* (TEST/DEBUG) */
 780#if 1
 781                        dcbf    0,r12                           /* (TEST/DEBUG) */
 782                        sync                                            /* (TEST/DEBUG) */
 783                        dcbi    0,r12                           /* (TEST/DEBUG) */
 784#endif
 785
 786xqrw1:          eieio                                           /* (TEST/DEBUG) */
 787                        lbz             r7,0(r12)                       /* (TEST/DEBUG) */
 788                        dcbi    0,r12                           /* (TEST/DEBUG) */
 789                        sync                                            /* (TEST/DEBUG) */
 790                        andi.   r7,r7,0x04                      /* (TEST/DEBUG) */
 791                        beq             xqrw1                           /* (TEST/DEBUG) */
 792                        
 793                        eieio                                           /* (TEST/DEBUG) */
 794                        li              r7,0x36                         /* (TEST/DEBUG) */
 795                        stb             r7,4(r12)                       /* (TEST/DEBUG) */
 796                        eieio
 797                        dcbf    0,r12                           /* (TEST/DEBUG) */
 798                        sync                                            /* (TEST/DEBUG) */
 799                        dcbi    0,r12                           /* (TEST/DEBUG) */
 800                        eieio                                           /* (TEST/DEBUG) */
 801                        
 802                        
 803                        lis             r7,10                           /* (TEST/DEBUG) */
 804spw7:           addi    r7,r7,-1                        /* (TEST/DEBUG) */
 805                        mr.             r7,r7                           /* (TEST/DEBUG) */
 806                        bne-    spw7                            /* (TEST/DEBUG) */
 807                        dcbf    0,r12                           /* (TEST/DEBUG) */
 808                        sync                                            /* (TEST/DEBUG) */
 809                        dcbi    0,r12                           /* (TEST/DEBUG) */
 810                        eieio                                           /* (TEST/DEBUG) */
 811                        mr              r12,r9                          /* (TEST/DEBUG) */
 812#endif
 813
 814                        mtmsr   r12                                                                             /* Smash the MSR */
 815                        isync                                                                                   /* Make it clean */
 816
 817                        
 818#if SIMPLESCC && !NOTQUITEASSIMPLE
 819                        ori             r10,r10,0x3010                                                  /* Assume the printer (this is the normal one) */
 820#else
 821                        ori             r10,r10,0x2000                                                  /* Assume the printer (this is the normal one) */
 822#endif
 823                        beq+    dbgDprintr                                                              /* It sure are... */
 824#if SIMPLESCC && !NOTQUITEASSIMPLE
 825                        ori             r10,r10,0x0020                                                  /* Move it over to the modem port */
 826#else
 827                        ori             r10,r10,0x0002                                                  /* Move it over to the modem port */
 828
 829#if !NOTQUITEASSIMPLE
 830                        lis             r7,0xF300                                                               /* Address of SCC rounded to 128k */
 831                        ori             r7,r7,0x0032                                                    /* Make it cache inhibited */
 832                        mtdbatl 3,r7                                                                    /* Load DBAT 3 low */
 833                        lis             r7,0xF300                                                               /* Address of SCC rounded to 128k */
 834                        ori             r7,r7,0x0002                                                    /* Make it supervisor only */
 835                        mtdbatu 3,r7                                                                    /* Load DBAT 3 high */
 836                        ori             r12,r12,0x0010                                                  /* Turn on DR */
 837                        mtmsr   r12                                                                             /* Smash the MSR */
 838                        isync                                                                                   /* Make it clean */
 839
 840#endif
 841#endif
 842                        
 843dbgDprintr:     sync
 844#if 0
 845                        mr              r7,r10                                                                  /* (TEST/DEBUG) */
 846                        bl              dumpr7                                                                  /* (TEST/DEBUG) */
 847#endif
 848                        
 849                        dcbi    0,r10                                                                   /* Toss it */
 850                        eieio
 851                        
 852#if 0
 853                        lis             r12,0xF301                      /* (TEST/DEBUG) */
 854                        ori             r12,r12,0x2002          /* (TEST/DEBUG) */
 855                        dcbf    0,r12                           /* (TEST/DEBUG) */
 856                        sync                                            /* (TEST/DEBUG) */
 857                        dcbi    0,r12                           /* (TEST/DEBUG) */
 858                        eieio                                           /* (TEST/DEBUG) */
 859                        li              r7,0x37                         /* (TEST/DEBUG) */
 860                        stb             r7,4(r12)                       /* (TEST/DEBUG) */
 861                        
 862                        lis             r7,12                           /* (TEST/DEBUG) */
 863spw8:           addi    r7,r7,-1                        /* (TEST/DEBUG) */
 864                        mr.             r7,r7                           /* (TEST/DEBUG) */
 865                        bne-    spw8                            /* (TEST/DEBUG) */
 866                        dcbf    0,r12                           /* (TEST/DEBUG) */
 867                        sync                                            /* (TEST/DEBUG) */
 868                        dcbi    0,r12                           /* (TEST/DEBUG) */
 869                        eieio                                           /* (TEST/DEBUG) */
 870#endif
 871
 872
 873/*                      Print the ID parameter                                                  */
 874                        
 875                        lis             r12,HIGH_ADDR(fwdisplock)                               /* Get the display locker outer */
 876                        ori             r12,r12,LOW_ADDR(fwdisplock)                    /* Last part */
 877                        
 878                        lwarx   r7,0,r12                                                                ; ?
 879
 880ddwait0:        lwarx   r7,0,r12                                                                /* Get the lock */
 881                        mr.             r7,r7                                                                   /* Is it locked? */
 882                        bne-    ddwait0                                                                 /* Yup... */
 883                        stwcx.  r12,0,r12                                                               /* Try to get it */
 884                        bne-    ddwait0                                                                 /* Nope, start all over... */
 885
 886#if 0
 887                        dcbf    0,r10                           /* (TEST/DEBUG) */
 888                        sync                                            /* (TEST/DEBUG) */
 889                        dcbi    0,r10                           /* (TEST/DEBUG) */
 890                        eieio                                           /* (TEST/DEBUG) */
 891                        li              r7,0x38                         /* (TEST/DEBUG) */
 892                        stb             r7,6(r10)                       /* (TEST/DEBUG) */
 893                        
 894                        lis             r7,10                           /* (TEST/DEBUG) */
 895spwa:           addi    r7,r7,-1                        /* (TEST/DEBUG) */
 896                        mr.             r7,r7                           /* (TEST/DEBUG) */
 897                        bne-    spwa                            /* (TEST/DEBUG) */
 898                        dcbf    0,r10                           /* (TEST/DEBUG) */
 899                        sync                                            /* (TEST/DEBUG) */
 900                        dcbi    0,r10                           /* (TEST/DEBUG) */
 901                        eieio                                           /* (TEST/DEBUG) */
 902#endif
 903                        
 904                        rlwinm  r3,r3,8,0,31                                                    /* Get the first character */
 905                        bl              dbgDchar                                                                /* Print it */
 906                        rlwinm  r3,r3,8,0,31                                                    /* Get the second character */
 907                        bl              dbgDchar                                                                /* Print it */
 908                        rlwinm  r3,r3,8,0,31                                                    /* Get the third character */
 909                        bl              dbgDchar                                                                /* Print it */
 910                        rlwinm  r3,r3,8,0,31                                                    /* Get the fourth character */
 911                        bl              dbgDchar                                                                /* Print it */
 912                        
 913                        li              r3,0x20                                                                 /* Get a space for a separator */
 914                        bl              dbgDchar                                                                /* Print it */
 915                        bl              dbg4byte                                                                /* Print register 5 in hex */                   
 916
 917                        li              r3,0x0A                                                                 /* Linefeed */
 918                        bl              dbgDchar                                                                /* Send it */
 919                        li              r3,0x0D                                                                 /* Carriage return */
 920                        bl              dbgDchar                                                                /* Send it */
 921                        
 922                        mtlr    r11                                                                             /* Get back the return */
 923#if !SIMPLESCC && !NOTQUITEASSIMPLE
 924                        li              r7,0                                                                    /* Get a zero */
 925                        mtdbatu 3,r7                                                                    /* Invalidate DBAT 3 upper */
 926                        mtdbatl 3,r7                                                                    /* Invalidate DBAT 3 lower */
 927#endif
 928                        lis             r12,HIGH_ADDR(fwdisplock)                               /* Get the display locker outer */
 929                        li              r7,0                                                                    /* Get a zero */
 930                        ori             r12,r12,LOW_ADDR(fwdisplock)                    /* Last part */
 931                        dcbi    0,r10                                                                   /* ? */
 932                        stw             r7,0(r12)                                                               /* Release the display lock */
 933                        mtmsr   r8                                                                              /* Restore the MSR */
 934                        isync                                                                                   /* Wait for it */
 935                        blr                                                                                             /* Leave... */
 936                        
 937
 938dbg4byte:       mflr    r12                                                                             /* Save the return */
 939
 940                        lis             r4,HIGH_ADDR(hexTab)                                    /* Point to the top of table */
 941                        li              r6,8                                                                    /* Set number of hex digits to dump */
 942                        ori             r4,r4,LOW_ADDR(hexTab)                                  /* Point to the bottom of table */
 943                                                
 944dbgDnext:       rlwinm  r5,r5,4,0,31                                                    /* Rotate a nybble */
 945                        subi    r6,r6,1                                                                 /* Back down the count */
 946                        rlwinm  r3,r5,0,28,31                                                   /* Isolate the last nybble */
 947                        lbzx    r3,r4,r3                                                                /* Convert to ascii */
 948                        bl              dbgDchar                                                                /* Print it */
 949                        mr.             r6,r6                                                                   /* Any more? */
 950                        bne+    dbgDnext                                                                /* Convert 'em all... */
 951
 952                        li              r3,0x20                                                                 /* Space */
 953                        bl              dbgDchar                                                                /* Send it */
 954                        mtlr    r12                                                                             /* Restore LR */
 955                        blr                                                                                             /* Return... */
 956                        
 957/*                      Write to whichever serial port.  Try to leave it clean, but not too hard (this is a hack) */
 958                        
 959dbgDchar:       
 960#if SIMPLESCC && !NOTQUITEASSIMPLE              
 961                        stb             r3,0(r10)                                                               /* ? */
 962                        dcbf    0,r10                                                                   /* Force it out */
 963                        sync                                                                                    /* Make sure it's out there */
 964
 965                        lis             r7,3                                                                    /* Get enough for about 1ms */
 966
 967dbgDchar0:      addi    r7,r7,-1                                                                /* Count down */
 968                        mr.             r7,r7                                                                   /* Waited long enough? */
 969                        bgt+    dbgDchar0                                                               /* Nope... */
 970#endif
 971#if NOTQUITEASSIMPLE
 972#if 0
 973                        li              r7,0x01                                                                 /* ? */
 974                        stb             r7,0(r10)                                                               /* ? */
 975                        dcbf    0,r10                                                                   /* Force it out */
 976                        sync                                                                                    /* Make sure it's out there */
 977                        dcbi    0,r10
 978                        eieio
 979
 980                        lbz             r7,0(r10)                                                               /* ? */
 981                        dcbi    0,r10                                                                   /* Force it out */
 982                        sync                                                                                    /* kill it off */
 983                        eieio
 984
 985                        li              r7,0x00                                                                 /* ? */
 986                        stb             r7,0(r10)                                                               /* ? */
 987                        dcbf    0,r10                                                                   /* Force it out */
 988                        sync                                                                                    /* Make sure it's out there */
 989                        dcbi    0,r10
 990                        eieio
 991
 992                        lbz             r7,0(r10)                                                               /* ? */
 993                        dcbi    0,r10                                                                   /* Force it out */
 994                        sync                                                                                    /* kill it off */
 995                        eieio
 996#endif
 997                
 998qrw1:           eieio                                                                                   /* Barricade it */
 999                        lbz             r7,0(r10)                                                               /* ? */
1000                        dcbi    0,r10
1001                        sync
1002                        andi.   r7,r7,0x04                                                              /* ? */
1003                        beq             qrw1                                                                    /* Nope... */
1004
1005                        eieio
1006
1007                        stb             r3,4(r10)                                                               /* ? */
1008                        dcbf    0,r10                                                                   /* Force it out */
1009                        sync                                                                                    /* Make sure it's out there */
1010                        dcbi    0,r10
1011                        eieio
1012
1013qrw2:           eieio                                                                                   /* Barricade it */
1014                        lbz             r7,0(r10)                                                               /* ? */
1015                        dcbi    0,r10
1016                        sync
1017                        andi.   r7,r7,0x04                                                              /* ? */
1018                        beq             qrw2                                                                    /* Nope... */
1019
1020#if 0
1021                        eieio
1022                        li              r7,0x10                                                                 /* ? */
1023                        stb             r7,0(r10)                                                               /* ? */
1024                        dcbf    0,r10                                                                   /* Force it out */
1025                        sync                                                                                    /* Make sure it's out there */
1026                        dcbi    0,r10
1027                        eieio
1028
1029                        lbz             r7,0(r10)                                                               /* ? */
1030                        dcbi    0,r10                                                                   /* Force it out */
1031                        sync                                                                                    /* kill it off */
1032                        eieio
1033#endif          
1034                        
1035                        lis             r7,0x0080                                                               /* ? */
1036                        lis             r9,0xF300                                                               /* ? */
1037                        ori             r7,r7,0x010F                                                    /* ? */
1038                        stw             r7,0x28(r9)                                                             /* ? */
1039                        dcbf    0,r10                                                                   /* Force it out */
1040                        sync                                                                                    /* Make sure it's out there */
1041                        dcbi    0,r10
1042                        eieio
1043                        
1044#endif
1045#if !SIMPLESCC && !NOTQUITEASSIMPLE
1046                        rlwinm  r9,r10,0,0,29                                                   /* Get channel a */
1047                        eieio                                                                                   /* Barricade it */
1048                
1049                        li              r7,0x03                                                                 /* ? */
1050                        stb             r7,0(r9)                                                                /* ? */
1051                        eieio                                                                                   /* Barricade it */
1052
1053                        lbz             r7,0(r9)                                                                /* ? */
1054                
1055                        eieio                                                                                   /* Barricade it */
1056                        lbz             r7,0(r9)                                                                /* ? */
1057                        
1058dchrw1:         eieio                                                                                   /* Barricade it */
1059                        lbz             r7,0(r10)                                                               /* ? */
1060                        andi.   r7,r7,0x04                                                              /* ? */
1061                        beq             dchrw1                                                                  /* Nope... */
1062                        
1063                        stb             r3,4(r10)                                                               /* ? */
1064                        sync                                                                                    /* Make sure it's there */
1065                        eieio                                                                                   /* Don't get confused */
1066
1067dchrw2:         eieio                                                                                   /* Barricade it */
1068                        lbz             r7,0(r10)                                                               /* ? */
1069                        andi.   r7,r7,0x04                                                              /* ? */
1070                        beq             dchrw2                                                                  /* Nope... */
1071        
1072                        eieio                                                                                   /* Avoid confusion */
1073                        lbz             r7,0(r10)                                                               /* ? */
1074                        andi.   r7,r7,0x40                                                              /* ? */
1075                        beq+    nounder                                                                 /* Nope... */
1076
1077                        eieio                                                                                   /* Avoid confusion */
1078                        li              r7,0xC0                                                                 /* ? */
1079                        stb             r7,0(r10)                                                               /* ? */
1080
1081nounder:        eieio                                                                                   /* Avoid confusion */
1082                        li              r7,0x10                                                                 /* ? */
1083                        stb             r7,0(r10)                                                               /* ? */
1084
1085                        eieio                                                                                   /* Avoid confusion */
1086                        li              r7,0x38                                                                 /* ? */
1087                        stb             r7,0(r9)                                                                /* ? */
1088                
1089                        eieio                                                                                   /* Avoid confusion */
1090                        li              r7,0x30                                                                 /* ? */
1091                        stb             r7,0(r10)                                                               /* ? */
1092
1093                        eieio                                                                                   /* Avoid confusion */
1094                        li              r7,0x20                                                                 /* ? */
1095                        stb             r7,0(r10)                                                               /* ? */
1096                        eieio                                                                                   /* Avoid confusion */
1097                        sync
1098
1099#endif
1100                        blr                                                                                             /* Return */
1101
1102                        .globl hexTab
1103
1104hexTab:         STRINGD "0123456789ABCDEF"                                              /* Convert hex numbers to printable hex */                      
1105                        
1106
1107/*
1108 *                      Dumps all the registers in the savearea in R13
1109 */
1110 
1111
1112                        .align  5
1113                        .globl  EXT(dbgRegsLL)
1114
1115LEXT(dbgRegsLL)
1116
1117                        b               EXT(FCReturn)                                   ; Bye dudes...
1118#if 0
1119                        li              r3,0                                                                    /* ? */
1120                        bl              dbgRegsCm                                                               /* Join on up... */
1121                        b               EXT(FCReturn)                                   ; Bye dudes...
1122                        
1123                        
1124                        .align  5
1125                        .globl  EXT(dbgRegs)
1126
1127LEXT(dbgRegs)
1128
1129dbgRegsCm:      mfmsr   r8                                                                              /* Save the MSR */
1130                        mr.             r3,r3                                                                   /* ? */
1131                        rlwinm  r12,r8,0,28,25                                                  /* Turn off translation */
1132                        lis             r10,0xF301                                                              /* Set the top part */
1133                        rlwinm  r12,r12,0,17,15                                                 /* Turn off interruptions */
1134                        mtmsr   r12                                                                             /* Smash the MSR */
1135                        isync                                                                                   /* Make it clean */
1136#if SIMPLESCC && !NOTQUITEASSIMPLE
1137                        ori             r10,r10,0x3010                                                  /* ? */
1138#else
1139                        ori             r10,r10,0x2000                                                  /* ? */
1140#endif
1141                        mflr    r11                                                                             /* Save the link register */
1142                        beq+    dbgDprints                                                              /* It sure are... */
1143#if SIMPLESCC && !NOTQUITEASSIMPLE
1144                        ori             r10,r10,0x0020                                                  /* ? */
1145#else
1146                        ori             r10,r10,0x0002                                                  /* ? */
1147
1148                        dcbf    0,r10                                                                   /* Insure it is out */
1149                        sync
1150                        dcbi    0,r10                                                                   /* Toss it */
1151#if !NOTQUITEASSIMPLE
1152                        lis             r7,0xF300                                                               /* ? */
1153                        ori             r7,r7,0x0032                                                    /* ? */
1154                        mtdbatl 3,r7                                                                    /* ? */
1155                        lis             r7,0xF300                                                               /* ? */
1156                        ori             r7,r7,0x0002                                                    /* ? */
1157                        mtdbatu 3,r7                                                                    /* ? */
1158                        ori             r12,r12,0x0010                                                  /* ? */
1159                        mtmsr   r12                                                                             /* ? */
1160                        isync                                                                                   /* ? */
1161#endif
1162#endif
1163
1164dbgDprints:     
1165                        lis             r3,HIGH_ADDR(fwdisplock)                                /* Get the display locker outer */
1166                        ori             r3,r3,LOW_ADDR(fwdisplock)                              /* Last part */
1167                        
1168                        lwarx   r5,0,r3                                                                 ; ?
1169ddwait1:        lwarx   r5,0,r3                                                                 /* Get the lock */
1170                        mr.             r5,r5                                                                   /* Is it locked? */
1171                        bne-    ddwait1                                                                 /* Yup... */
1172                        stwcx.  r3,0,r3                                                                 /* Try to get it */
1173                        bne-    ddwait1                                                                 /* Nope, start all over... */
1174                        
1175                        li              r3,0x52                                                                 /* Print eyecatcher */
1176                        bl              dbgDchar                                                                /* Send it */
1177                        li              r3,0x65                                                                 /* Print eyecatcher */
1178                        bl              dbgDchar                                                                /* Send it */
1179                        li              r3,0x67                                                                 /* Print eyecatcher */
1180                        bl              dbgDchar                                                                /* Send it */
1181                        li              r3,0x73                                                                 /* Print eyecatcher */
1182                        bl              dbgDchar                                                                /* Send it */
1183                        li              r3,0x20                                                                 /* Print eyecatcher */
1184                        bl              dbgDchar                                                                /* Send it */
1185
1186                        lwz             r5,saver0(r13)                                                  /* Do register */
1187                        bl              dbg4byte                                                                /* Print */                     
1188                        lwz             r5,saver1(r13)                                                  /* Do register */
1189                        bl              dbg4byte                                                                /* Print */                     
1190                        lwz             r5,saver2(r13)                                                  /* Do register */
1191                        bl              dbg4byte                                                                /* Print */                     
1192                        lwz             r5,saver3(r13)                                                  /* Do register */
1193                        bl              dbg4byte                                                                /* Print */                     
1194                        li              r3,0x0A                                                                 /* Linefeed */
1195                        bl              dbgDchar                                                                /* Send it */
1196                        li              r3,0x0D                                                                 /* Carriage return */
1197                        bl              dbgDchar                                                                /* Send it */
1198
1199                        li              r3,0x20                                                                 /* Print eyecatcher */
1200                        bl              dbgDchar                                                                /* Send it */
1201                        li              r3,0x20                                                                 /* Print eyecatcher */
1202                        bl              dbgDchar                                                                /* Send it */
1203                        li              r3,0x20                                                                 /* Print eyecatcher */
1204                        bl              dbgDchar                                                                /* Send it */
1205                        li              r3,0x20                                                                 /* Print eyecatcher */
1206                        bl              dbgDchar                                                                /* Send it */
1207                        li              r3,0x20                                                                 /* Print eyecatcher */
1208                        bl              dbgDchar                                                                /* Send it */
1209                        lwz             r5,saver4(r13)                                                  /* Do register */
1210                        bl              dbg4byte                                                                /* Print */                     
1211                        lwz             r5,saver5(r13)                                                  /* Do register */
1212                        bl              dbg4byte                                                                /* Print */                     
1213                        lwz             r5,saver6(r13)                                                  /* Do register */
1214                        bl              dbg4byte                                                                /* Print */                     
1215                        lwz             r5,saver7(r13)                                                  /* Do register */
1216                        bl              dbg4byte                                                                /* Print */                     
1217                        li              r3,0x0A                                                                 /* Linefeed */
1218                        bl              dbgDchar                                                                /* Send it */
1219                        li              r3,0x0D                                                                 /* Carriage return */
1220                        bl              dbgDchar                                                                /* Send it */
1221
1222                        li              r3,0x20                                                                 /* Print eyecatcher */
1223                        bl              dbgDchar                                                                /* Send it */
1224                        li              r3,0x20                                                                 /* Print eyecatcher */
1225                        bl              dbgDchar                                                                /* Send it */
1226                        li              r3,0x20                                                                 /* Print eyecatcher */
1227                        bl              dbgDchar                                                                /* Send it */
1228                        li              r3,0x20                                                                 /* Print eyecatcher */
1229                        bl              dbgDchar                                                                /* Send it */
1230                        li              r3,0x20                                                                 /* Print eyecatcher */
1231                        bl              dbgDchar                                                                /* Send it */
1232                        lwz             r5,saver8(r13)                                                  /* Do register */
1233                        bl              dbg4byte                                                                /* Print */                     
1234                        lwz             r5,saver9(r13)                                                  /* Do register */
1235                        bl              dbg4byte                                                                /* Print */                     
1236                        lwz             r5,saver10(r13)                                                 /* Do register */
1237                        bl              dbg4byte                                                                /* Print */                     
1238                        lwz             r5,saver11(r13)                                                 /* Do register */
1239                        bl              dbg4byte                                                                /* Print */                     
1240                        li              r3,0x0A                                                                 /* Linefeed */
1241                        bl              dbgDchar                                                                /* Send it */
1242                        li              r3,0x0D                                                                 /* Carriage return */
1243                        bl              dbgDchar                                                                /* Send it */
1244
1245                        li              r3,0x20                                                                 /* Print eyecatcher */
1246                        bl              dbgDchar                                                                /* Send it */
1247                        li              r3,0x20                                                                 /* Print eyecatcher */
1248                        bl              dbgDchar                                                                /* Send it */
1249                        li              r3,0x20                                                                 /* Print eyecatcher */
1250                        bl              dbgDchar                                                                /* Send it */
1251                        li              r3,0x20                                                                 /* Print eyecatcher */
1252                        bl              dbgDchar                                                                /* Send it */
1253                        li              r3,0x20                                                                 /* Print eyecatcher */
1254                        bl              dbgDchar                                                                /* Send it */
1255                        lwz             r5,saver12(r13)                                                 /* Do register */
1256                        bl              dbg4byte                                                                /* Print */                     
1257                        lwz             r5,saver13(r13)                                                 /* Do register */
1258                        bl              dbg4byte                                                                /* Print */                     
1259                        lwz             r5,saver14(r13)                                                 /* Do register */
1260                        bl              dbg4byte                                                                /* Print */                     
1261                        lwz             r5,saver15(r13)                                                 /* Do register */
1262                        bl              dbg4byte                                                                /* Print */                     
1263                        li              r3,0x0A                                                                 /* Linefeed */
1264                        bl              dbgDchar                                                                /* Send it */
1265                        li              r3,0x0D                                                                 /* Carriage return */
1266                        bl              dbgDchar                                                                /* Send it */
1267
1268                        li              r3,0x20                                                                 /* Print eyecatcher */
1269                        bl              dbgDchar                                                                /* Send it */
1270                        li              r3,0x20                                                                 /* Print eyecatcher */
1271                        bl              dbgDchar                                                                /* Send it */
1272                        li              r3,0x20                                                                 /* Print eyecatcher */
1273                        bl              dbgDchar                                                                /* Send it */
1274                        li              r3,0x20                                                                 /* Print eyecatcher */
1275                        bl              dbgDchar                                                                /* Send it */
1276                        li              r3,0x20                                                                 /* Print eyecatcher */
1277                        bl              dbgDchar                                                                /* Send it */
1278                        lwz             r5,saver16(r13)                                                 /* Do register */
1279                        bl              dbg4byte                                                                /* Print */                     
1280                        lwz             r5,saver17(r13)                                                 /* Do register */
1281                        bl              dbg4byte                                                                /* Print */                     
1282                        lwz             r5,saver18(r13)                                                 /* Do register */
1283                        bl              dbg4byte                                                                /* Print */                     
1284                        lwz             r5,saver19(r13)                                                 /* Do register */
1285                        bl              dbg4byte                                                                /* Print */                     
1286                        li              r3,0x0A                                                                 /* Linefeed */
1287                        bl              dbgDchar                                                                /* Send it */
1288                        li              r3,0x0D                                                                 /* Carriage return */
1289                        bl              dbgDchar                                                                /* Send it */
1290
1291                        li              r3,0x20                                                                 /* Print eyecatcher */
1292                        bl              dbgDchar                                                                /* Send it */
1293                        li              r3,0x20                                                                 /* Print eyecatcher */
1294                        bl              dbgDchar                                                                /* Send it */
1295                        li              r3,0x20                                                                 /* Print eyecatcher */
1296                        bl              dbgDchar                                                                /* Send it */
1297                        li              r3,0x20                                                                 /* Print eyecatcher */
1298                        bl              dbgDchar                                                                /* Send it */
1299                        li              r3,0x20                                                                 /* Print eyecatcher */
1300                        bl              dbgDchar                                                                /* Send it */
1301                        lwz             r5,saver20(r13)                                                 /* Do register */
1302                        bl              dbg4byte                                                                /* Print */                     
1303                        lwz             r5,saver21(r13)                                                 /* Do register */
1304                        bl              dbg4byte                                                                /* Print */                     
1305                        lwz             r5,saver22(r13)                                                 /* Do register */
1306                        bl              dbg4byte                                                                /* Print */                     
1307                        lwz             r5,saver23(r13)                                                 /* Do register */
1308                        bl              dbg4byte                                                                /* Print */                     
1309                        li              r3,0x0A                                                                 /* Linefeed */
1310                        bl              dbgDchar                                                                /* Send it */
1311                        li              r3,0x0D                                                                 /* Carriage return */
1312                        bl              dbgDchar                                                                /* Send it */
1313
1314                        li              r3,0x20                                                                 /* Print eyecatcher */
1315                        bl              dbgDchar                                                                /* Send it */
1316                        li              r3,0x20                                                                 /* Print eyecatcher */
1317                        bl              dbgDchar                                                                /* Send it */
1318                        li              r3,0x20                                                                 /* Print eyecatcher */
1319                        bl              dbgDchar                                                                /* Send it */
1320                        li              r3,0x20                                                                 /* Print eyecatcher */
1321                        bl              dbgDchar                                                                /* Send it */
1322                        li              r3,0x20                                                                 /* Print eyecatcher */
1323                        bl              dbgDchar                                                                /* Send it */
1324                        lwz             r5,saver24(r13)                                                 /* Do register */
1325                        bl              dbg4byte                                                                /* Print */                     
1326                        lwz             r5,saver25(r13)                                                 /* Do register */
1327                        bl              dbg4byte                                                                /* Print */                     
1328                        lwz             r5,saver26(r13)                                                 /* Do register */
1329                        bl              dbg4byte                                                                /* Print */                     
1330                        lwz             r5,saver27(r13)                                                 /* Do register */
1331                        bl              dbg4byte                                                                /* Print */                     
1332                        li              r3,0x0A                                                                 /* Linefeed */
1333                        bl              dbgDchar                                                                /* Send it */
1334                        li              r3,0x0D                                                                 /* Carriage return */
1335                        bl              dbgDchar                                                                /* Send it */
1336
1337                        li              r3,0x20                                                                 /* Print eyecatcher */
1338                        bl              dbgDchar                                                                /* Send it */
1339                        li              r3,0x20                                                                 /* Print eyecatcher */
1340                        bl              dbgDchar                                                                /* Send it */
1341                        li              r3,0x20                                                                 /* Print eyecatcher */
1342                        bl              dbgDchar                                                                /* Send it */
1343                        li              r3,0x20                                                                 /* Print eyecatcher */
1344                        bl              dbgDchar                                                                /* Send it */
1345                        li              r3,0x20                                                                 /* Print eyecatcher */
1346                        bl              dbgDchar                                                                /* Send it */
1347                        lwz             r5,saver28(r13)                                                 /* Do register */
1348                        bl              dbg4byte                                                                /* Print */                     
1349                        lwz             r5,saver29(r13)                                                 /* Do register */
1350                        bl              dbg4byte                                                                /* Print */                     
1351                        lwz             r5,saver30(r13)                                                 /* Do register */
1352                        bl              dbg4byte                                                                /* Print */                     
1353                        lwz             r5,saver31(r13)                                                 /* Do register */
1354                        bl              dbg4byte                                                                /* Print */                     
1355                        li              r3,0x0A                                                                 /* Linefeed */
1356                        bl              dbgDchar                                                                /* Send it */
1357                        li              r3,0x0D                                                                 /* Carriage return */
1358                        bl              dbgDchar                                                                /* Send it */
1359
1360/*                      Segment registers */
1361
1362                        li              r3,0x53                                                                 /* Print eyecatcher */
1363                        bl              dbgDchar                                                                /* Send it */
1364                        li              r3,0x65                                                                 /* Print eyecatcher */
1365                        bl              dbgDchar                                                                /* Send it */
1366                        li              r3,0x67                                                                 /* Print eyecatcher */
1367                        bl              dbgDchar                                                                /* Send it */
1368                        li              r3,0x73                                                                 /* Print eyecatcher */
1369                        bl              dbgDchar                                                                /* Send it */
1370                        li              r3,0x20                                                                 /* Print eyecatcher */
1371                        bl              dbgDchar                                                                /* Send it */
1372
1373                        lwz             r5,savesr0(r13)                                                 /* Do register */
1374                        bl              dbg4byte                                                                /* Print */                     
1375                        lwz             r5,savesr1(r13)                                                 /* Do register */
1376                        bl              dbg4byte                                                                /* Print */                     
1377                        lwz             r5,savesr2(r13)                                                 /* Do register */
1378                        bl              dbg4byte                                                                /* Print */                     
1379                        lwz             r5,savesr3(r13)                                                 /* Do register */
1380                        bl              dbg4byte                                                                /* Print */                     
1381                        li              r3,0x0A                                                                 /* Linefeed */
1382                        bl              dbgDchar                                                                /* Send it */
1383                        li              r3,0x0D                                                                 /* Carriage return */
1384                        bl              dbgDchar                                                                /* Send it */
1385
1386                        li              r3,0x20                                                                 /* Print eyecatcher */
1387                        bl              dbgDchar                                                                /* Send it */
1388                        li              r3,0x20                                                                 /* Print eyecatcher */
1389                        bl              dbgDchar                                                                /* Send it */
1390                        li              r3,0x20                                                                 /* Print eyecatcher */
1391                        bl              dbgDchar                                                                /* Send it */
1392                        li              r3,0x20                                                                 /* Print eyecatcher */
1393                        bl              dbgDchar                                                                /* Send it */
1394                        li              r3,0x20                                                                 /* Print eyecatcher */
1395                        bl              dbgDchar                                                                /* Send it */
1396                        lwz             r5,savesr4(r13)                                                 /* Do register */
1397                        bl              dbg4byte                                                                /* Print */                     
1398                        lwz             r5,savesr5(r13)                                                 /* Do register */
1399                        bl              dbg4byte                                                                /* Print */                     
1400                        lwz             r5,savesr6(r13)                                                 /* Do register */
1401                        bl              dbg4byte                                                                /* Print */                     
1402                        lwz             r5,savesr7(r13)                                                 /* Do register */
1403                        bl              dbg4byte                                                                /* Print */                     
1404                        li              r3,0x0A                                                                 /* Linefeed */
1405                        bl              dbgDchar                                                                /* Send it */
1406                        li              r3,0x0D                                                                 /* Carriage return */
1407                        bl              dbgDchar                                                                /* Send it */
1408
1409                        li              r3,0x20                                                                 /* Print eyecatcher */
1410                        bl              dbgDchar                                                                /* Send it */
1411                        li              r3,0x20                                                                 /* Print eyecatcher */
1412                        bl              dbgDchar                                                                /* Send it */
1413                        li              r3,0x20                                                                 /* Print eyecatcher */
1414                        bl              dbgDchar                                                                /* Send it */
1415                        li              r3,0x20                                                                 /* Print eyecatcher */
1416                        bl              dbgDchar                                                                /* Send it */
1417                        li              r3,0x20                                                                 /* Print eyecatcher */
1418                        bl              dbgDchar                                                                /* Send it */
1419                        lwz             r5,savesr8(r13)                                                 /* Do register */
1420                        bl              dbg4byte                                                                /* Print */                     
1421                        lwz             r5,savesr9(r13)                                                 /* Do register */
1422                        bl              dbg4byte                                                                /* Print */                     
1423                        lwz             r5,savesr10(r13)                                                /* Do register */
1424                        bl              dbg4byte                                                                /* Print */                     
1425                        lwz             r5,savesr11(r13)                                                /* Do register */
1426                        bl              dbg4byte                                                                /* Print */                     
1427                        li              r3,0x0A                                                                 /* Linefeed */
1428                        bl              dbgDchar                                                                /* Send it */
1429                        li              r3,0x0D                                                                 /* Carriage return */
1430                        bl              dbgDchar                                                                /* Send it */
1431
1432                        li              r3,0x20                                                                 /* Print eyecatcher */
1433                        bl              dbgDchar                                                                /* Send it */
1434                        li              r3,0x20                                                                 /* Print eyecatcher */
1435                        bl              dbgDchar                                                                /* Send it */
1436                        li              r3,0x20                                                                 /* Print eyecatcher */
1437                        bl              dbgDchar                                                                /* Send it */
1438                        li              r3,0x20                                                                 /* Print eyecatcher */
1439                        bl              dbgDchar                                                                /* Send it */
1440                        li              r3,0x20                                                                 /* Print eyecatcher */
1441                        bl              dbgDchar                                                                /* Send it */
1442                        lwz             r5,savesr12(r13)                                                /* Do register */
1443                        bl              dbg4byte                                                                /* Print */                     
1444                        lwz             r5,savesr13(r13)                                                /* Do register */
1445                        bl              dbg4byte                                                                /* Print */                     
1446                        lwz             r5,savesr14(r13)                                                /* Do register */
1447                        bl              dbg4byte                                                                /* Print */                     
1448                        lwz             r5,savesr15(r13)                                                /* Do register */
1449                        bl              dbg4byte                                                                /* Print */                     
1450                        li              r3,0x0A                                                                 /* Linefeed */
1451                        bl              dbgDchar                                                                /* Send it */
1452                        li              r3,0x0D                                                                 /* Carriage return */
1453                        bl              dbgDchar                                                                /* Send it */
1454                        
1455                        li              r3,0x30                                                                 /* Print eyecatcher */
1456                        bl              dbgDchar                                                                /* Send it */
1457                        li              r3,0x31                                                                 /* Print eyecatcher */
1458                        bl              dbgDchar                                                                /* Send it */
1459                        li              r3,0x64                                                                 /* Print eyecatcher */
1460                        bl              dbgDchar                                                                /* Send it */
1461                        li              r3,0x64                                                                 /* Print eyecatcher */
1462                        bl              dbgDchar                                                                /* Send it */
1463                        li              r3,0x20                                                                 /* Print eyecatcher */
1464                        bl              dbgDchar                                                                /* Send it */
1465                        lwz             r5,savesrr0(r13)                                                /* Do register */
1466                        bl              dbg4byte                                                                /* Print */                     
1467                        lwz             r5,savesrr1(r13)                                                /* Do register */
1468                        bl              dbg4byte                                                                /* Print */                     
1469                        lwz             r5,savedar(r13)                                                 /* Do register */
1470                        bl              dbg4byte                                                                /* Print */                     
1471                        lwz             r5,savedsisr(r13)                                               /* Do register */
1472                        bl              dbg4byte                                                                /* Print */                     
1473                        li              r3,0x0A                                                                 /* Linefeed */
1474                        bl              dbgDchar                                                                /* Send it */
1475                        li              r3,0x0D                                                                 /* Carriage return */
1476                        bl              dbgDchar                                                                /* Send it */
1477                        
1478                        li              r3,0x20                                                                 /* Print eyecatcher */
1479                        bl              dbgDchar                                                                /* Send it */
1480                        li              r3,0x6C                                                                 /* Print eyecatcher */
1481                        bl              dbgDchar                                                                /* Send it */
1482                        li              r3,0x63                                                                 /* Print eyecatcher */
1483                        bl              dbgDchar                                                                /* Send it */
1484                        li              r3,0x63                                                                 /* Print eyecatcher */
1485                        bl              dbgDchar                                                                /* Send it */
1486                        li              r3,0x20                                                                 /* Print eyecatcher */
1487                        bl              dbgDchar                                                                /* Send it */
1488                        lwz             r5,savelr(r13)                                                  /* Do register */
1489                        bl              dbg4byte                                                                /* Print */                     
1490                        lwz             r5,savecr(r13)                                                  /* Do register */
1491                        bl              dbg4byte                                                                /* Print */                     
1492                        lwz             r5,savectr(r13)                                                 /* Do register */
1493                        bl              dbg4byte                                                                /* Print */                     
1494                        li              r3,0x0A                                                                 /* Linefeed */
1495                        bl              dbgDchar                                                                /* Send it */
1496                        li              r3,0x0D                                                                 /* Carriage return */
1497                        bl              dbgDchar                                                                /* Send it */
1498                        mtlr    r11                                                                             /* Get back the return */
1499                        dcbi    0,r10                                                                   /* ? */
1500#if !SIMPLESCC && !NOTQUITEASSIMPLE
1501                        li              r7,0                                                                    /* Get a zero */
1502                        mtdbatu 3,r7                                                                    /* Invalidate DBAT 3 upper */
1503                        mtdbatl 3,r7                                                                    /* Invalidate DBAT 3 lower */
1504#endif
1505                        lis             r3,HIGH_ADDR(fwdisplock)                                /* Get the display locker outer */
1506                        li              r7,0                                                                    /* Get a zero */
1507                        ori             r3,r3,LOW_ADDR(fwdisplock)                              /* Last part */
1508                        stw             r7,0(r3)                                                                /* Clear display lock */
1509                        mtmsr   r8                                                                              /* Restore the MSR */
1510                        isync                                                                                   /* Wait for it */
1511                        blr                                                                                             /* Leave... */
1512#endif                  
1513                        
1514/*
1515 *                      Used for debugging to leave stuff in 0x380-0x3FF (128 bytes).
1516 *                      Mapping is V=R.  Stores and loads are real.
1517 */
1518                        
1519                        .align  5
1520                        .globl  EXT(dbgCkpt)
1521
1522LEXT(dbgCkpt)
1523
1524                        mr              r12,r0                                                                  /* Keep R0 pristene */
1525                        lis             r0,HIGH_ADDR(dbgCkptCall)                               /* Top half of dbgCkptCall firmware call number */
1526                        ori             r0,r0,LOW_ADDR(dbgCkptCall)                             /* Bottom half */
1527
1528                        sc                                                                                              /* Go stash the stuff */
1529
1530                        mr              r0,r12                                                                  /* Restore R0 */
1531                        blr                                                                                             /* Return... */
1532                        
1533/*                      Here's the low-level part of dbgCkpt                    */
1534
1535                        .align  5
1536                        .globl  EXT(dbgCkptLL)
1537
1538LEXT(dbgCkptLL)
1539
1540
1541                        li              r12,0x380                                                               /* Point to output area */
1542                        li              r1,32                                                                   /* Get line size */
1543                        dcbz    0,r12                                                                   /* Make sure we don't fetch a cache line */
1544
1545                        lwz             r4,0x00(r3)                                                             /* Load up storage to checkpoint */
1546                        
1547                        dcbt    r1,r3                                                                   /* Start in the next line */
1548                        
1549                        lwz             r5,0x04(r3)                                                             /* Load up storage to checkpoint */
1550                        lwz             r6,0x08(r3)                                                             /* Load up storage to checkpoint */
1551                        lwz             r7,0x0C(r3)                                                             /* Load up storage to checkpoint */
1552                        lwz             r8,0x10(r3)                                                             /* Load up storage to checkpoint */
1553                        lwz             r9,0x14(r3)                                                             /* Load up storage to checkpoint */
1554                        lwz             r10,0x18(r3)                                                    /* Load up storage to checkpoint */
1555                        lwz             r11,0x1C(r3)                                                    /* Load up storage to checkpoint */
1556                        
1557                        add             r3,r3,r1                                                                /* Bump input */
1558                        
1559                        stw             r4,0x00(r12)                                                    /* Store it */
1560                        stw             r5,0x04(r12)                                                    /* Store it */
1561                        stw             r6,0x08(r12)                                                    /* Store it */
1562                        stw             r7,0x0C(r12)                                                    /* Store it */
1563                        stw             r8,0x10(r12)                                                    /* Store it */
1564                        stw             r9,0x14(r12)                                                    /* Store it */
1565                        stw             r10,0x18(r12)                                                   /* Store it */
1566                        stw             r11,0x1C(r12)                                                   /* Store it */
1567                        
1568                        dcbz    r1,r12                                                                  /* Clear the next line */
1569                        add             r12,r12,r1                                                              /* Point to next output line */
1570
1571                        lwz             r4,0x00(r3)                                                             /* Load up storage to checkpoint */
1572                        lwz             r5,0x04(r3)                                                             /* Load up storage to checkpoint */
1573                        lwz             r6,0x08(r3)                                                             /* Load up storage to checkpoint */
1574                        lwz             r7,0x0C(r3)                                                             /* Load up storage to checkpoint */
1575                        lwz             r8,0x10(r3)                                                             /* Load up storage to checkpoint */
1576                        lwz             r9,0x14(r3)                                                             /* Load up storage to checkpoint */
1577                        lwz             r10,0x18(r3)                                                    /* Load up storage to checkpoint */
1578                        lwz             r11,0x1C(r3)                                                    /* Load up storage to checkpoint */
1579                        
1580                        dcbt    r1,r3                                                                   /* Touch the next line */
1581                        add             r3,r3,r1                                                                /* Point to next input line */
1582                                
1583                        stw             r4,0x00(r12)                                                    /* Store it */
1584                        stw             r5,0x04(r12)                                                    /* Store it */
1585                        stw             r6,0x08(r12)                                                    /* Store it */
1586                        stw             r7,0x0C(r12)                                                    /* Store it */
1587                        stw             r8,0x10(r12)                                                    /* Store it */
1588                        stw             r9,0x14(r12)                                                    /* Store it */
1589                        stw             r10,0x18(r12)                                                   /* Store it */
1590                        stw             r11,0x1C(r12)                                                   /* Store it */
1591
1592                        dcbz    r1,r12                                                                  /* Clear the next line */
1593                        add             r12,r12,r1                                                              /* Point to next output line */
1594
1595                        lwz             r4,0x00(r3)                                                             /* Load up storage to checkpoint */
1596                        lwz             r5,0x04(r3)                                                             /* Load up storage to checkpoint */
1597                        lwz             r6,0x08(r3)                                                             /* Load up storage to checkpoint */
1598                        lwz             r7,0x0C(r3)                                                             /* Load up storage to checkpoint */
1599                        lwz             r8,0x10(r3)                                                             /* Load up storage to checkpoint */
1600                        lwz             r9,0x14(r3)                                                             /* Load up storage to checkpoint */
1601                        lwz             r10,0x18(r3)                                                    /* Load up storage to checkpoint */
1602                        lwz             r11,0x1C(r3)                                                    /* Load up storage to checkpoint */
1603                        
1604                        dcbt    r1,r3                                                                   /* Touch the next line */
1605                        add             r3,r3,r1                                                                /* Point to next input line */
1606                                
1607                        stw             r4,0x00(r12)                                                    /* Store it */
1608                        stw             r5,0x04(r12)                                                    /* Store it */
1609                        stw             r6,0x08(r12)                                                    /* Store it */
1610                        stw             r7,0x0C(r12)                                                    /* Store it */
1611                        stw             r8,0x10(r12)                                                    /* Store it */
1612                        stw             r9,0x14(r12)                                                    /* Store it */
1613                        stw             r10,0x18(r12)                                                   /* Store it */
1614                        stw             r11,0x1C(r12)                                                   /* Store it */
1615
1616                        dcbz    r1,r12                                                                  /* Clear the next line */
1617                        add             r12,r12,r1                                                              /* Point to next output line */
1618
1619                        lwz             r4,0x00(r3)                                                             /* Load up storage to checkpoint */
1620                        lwz             r5,0x04(r3)                                                             /* Load up storage to checkpoint */
1621                        lwz             r6,0x08(r3)                                                             /* Load up storage to checkpoint */
1622                        lwz             r7,0x0C(r3)                                                             /* Load up storage to checkpoint */
1623                        lwz             r8,0x10(r3)                                                             /* Load up storage to checkpoint */
1624                        lwz             r9,0x14(r3)                                                             /* Load up storage to checkpoint */
1625                        lwz             r10,0x18(r3)                                                    /* Load up storage to checkpoint */
1626                        lwz             r11,0x1C(r3)                                                    /* Load up storage to checkpoint */
1627                        
1628                        stw             r4,0x00(r12)                                                    /* Store it */
1629                        stw             r5,0x04(r12)                                                    /* Store it */
1630                        stw             r6,0x08(r12)                                                    /* Store it */
1631                        stw             r7,0x0C(r12)                                                    /* Store it */
1632                        stw             r8,0x10(r12)                                                    /* Store it */
1633                        stw             r9,0x14(r12)                                                    /* Store it */
1634                        stw             r10,0x18(r12)                                                   /* Store it */
1635                        stw             r11,0x1C(r12)                                                   /* Store it */
1636                        
1637                        blr
1638
1639                        
1640/*
1641 *                      Do Preemption.  Forces a T_PREEMPT trap to allow a preemption to occur.
1642 */
1643
1644                        .align  5
1645                        .globl  EXT(DoPreemptLL)
1646
1647LEXT(DoPreemptLL)
1648
1649                        li              r3,T_PREEMPT                                    /* Set preemption interrupt value */
1650                        stw             r3,saveexception(r13)                   /* Modify the exception type to preemption */
1651                        b               EXT(FCReturn)                                   ; Bye dudes...
1652
1653                        
1654/*
1655 *                      Force 'rupt handler to dispatch with new context
1656 *                      R3 at the call contains the new savearea.
1657 *                      R4 at the call contains a return code to pass back in R3.
1658 *                      Forces a T_CSWITCH
1659 */
1660
1661                        .align  5
1662                        .globl  EXT(SwitchContextLL)
1663
1664LEXT(SwitchContextLL)
1665
1666                        li              r3,T_CSWITCH                                    /* Set context switch value */
1667                        stw             r3,saveexception(r13)                   /* Modify the exception type to switch context */
1668                        b               EXT(FCReturn)                                   ; Bye dudes...
1669
1670                        
1671/*
1672 *                      Create a fake I/O 'rupt.  
1673 *                      Forces a T_INTERRUPT trap to pretend that an actual I/O interrupt occurred.
1674 */
1675
1676                        .align  5
1677                        .globl  EXT(CreateFakeIOLL)
1678
1679LEXT(CreateFakeIOLL)
1680
1681                        li              r3,T_INTERRUPT                                  /* Set external interrupt value */
1682                        stw             r3,saveexception(r13)                   /* Modify the exception type to external */
1683                        b               EXT(FCReturn)                                   ; Bye dudes...
1684                        
1685/*
1686 *                      Create a shutdown context
1687 *                      Forces a T_SHUTDOWN trap.
1688 */
1689
1690                        .align  5
1691                        .globl  EXT(CreateShutdownCTXLL)
1692
1693LEXT(CreateShutdownCTXLL)
1694
1695                        li              r3,T_SHUTDOWN                                   /* Set external interrupt value */
1696                        stw             r3,saveexception(r13)                   /* Modify the exception type to external */
1697                        b               EXT(FCReturn)                                   ; Bye dudes...
1698                        
1699/*
1700 *                      Create a fake decrementer 'rupt.  
1701 *                      Forces a T_DECREMENTER trap to pretend that an actual decrementer interrupt occurred.
1702 */
1703
1704                        .align  5
1705                        .globl  EXT(CreateFakeDECLL)
1706
1707LEXT(CreateFakeDECLL)
1708
1709                        li              r3,T_DECREMENTER                                /* Set decrementer interrupt value */
1710                        stw             r3,saveexception(r13)                   /* Modify the exception type to external */
1711                        b               EXT(FCReturn)                                   ; Bye dudes...
1712
1713/*
1714 *                      Choke the system.  
1715 */
1716
1717                        .align  5
1718                        .globl  EXT(DoChokeLL)
1719
1720LEXT(DoChokeLL)
1721
1722                        li              r3,T_CHOKE                                              ; Set external interrupt value
1723                        stw             r3,saveexception(r13)                   ; Modify the exception type to external
1724                        b               EXT(FCReturn)                                   ; Bye dudes...
1725
1726/*
1727 *                      Null firmware call 
1728 */
1729
1730                        .align  5
1731                        .globl  EXT(NullLL)
1732
1733LEXT(NullLL)
1734
1735                        li              r3,T_IN_VAIN                                    ; Set to just ignore this one
1736                        b               EXT(FCReturn)                                   ; Bye dudes...
1737
1738;
1739;                       Null firmware call 
1740;
1741
1742                        .align  5
1743                        .globl  EXT(iNullLL)
1744
1745LEXT(iNullLL)
1746
1747                        mfspr   r4,pmc1                                                 ; Get stamp
1748                        stw             r4,0x6100+(9*16)+0x0(0)                 ; Save it
1749#if 1
1750                        mfspr   r4,pmc2                                                 ; Get stamp
1751                        stw             r4,0x6100+(9*16)+0x4(0)                 ; Save it
1752                        mfspr   r4,pmc3                                                 ; Get stamp
1753                        stw             r4,0x6100+(9*16)+0x8(0)                 ; Save it
1754                        mfspr   r4,pmc4                                                 ; Get stamp
1755                        stw             r4,0x6100+(9*16)+0xC(0)                 ; Save it
1756#endif
1757                        li              r3,T_IN_VAIN                                    ; Set to just ignore this one
1758                        b               EXT(FCReturn)                                   ; Bye dudes...
1759                        
1760;
1761;                       Set the low level trace flags 
1762;
1763 
1764                        .align  5
1765                        .globl  EXT(LLTraceSet)
1766
1767LEXT(LLTraceSet)
1768
1769                        mr              r4,r3                                                   ; Save the new value 
1770                        
1771                        lwz             r3,traceMask(0)                                 ; Get the old trace flags to pass back 
1772                        stw             r4,traceMask(0)                                 ; Replace with the new ones
1773                        blr                                                                             ; Leave... 
1774
1775#if 0
1776        
1777/*
1778; ***************************************************************************
1779;
1780;                       ----------------- Grateful Deb ----------------
1781;
1782;                       Debugging: direct draw into main screen menu bar
1783;
1784;                       Takes R4 value, converts it to hex characters and displays it.
1785;
1786;                       Gotta make sure the DCBST is done to force the pixels from the cache.
1787;
1788;                       Position is taken as column, row (0 based) from R3.
1789;                       Characters are from hexfont, and are 16x16 pixels. 
1790;
1791;                       Only works with two processors so far
1792;
1793;
1794; ***************************************************************************
1795*/
1796
1797#define GDfromright 20
1798#define GDfontsize 16
1799
1800                        .align  5
1801                        .globl  EXT(GratefulDeb)
1802
1803LEXT(GratefulDeb)
1804
1805                        mfspr   r6,pir                                                  /* Get the PIR */
1806                        lis             r5,HIGH_ADDR(EXT(GratefulDebWork))      /* Point to our work area */
1807                        rlwinm  r6,r6,8,23,23                                   /* Get part of the offset to our processors area */
1808                        ori             r5,r5,LOW_ADDR(EXT(GratefulDebWork))    /* Start building the address */
1809                        rlwimi  r6,r6,2,21,21                                   /* Get the rest of the offset to our processors area */
1810                        add             r6,r6,r5                                                /* Point at our CPU's work area */
1811                        mfmsr   r5                                                              /* Get that MSR */
1812                        stmw    r0,GDsave(r6)                                   /* Save all registers */
1813                        lwz             r10,GDready(r6)                                 /* See if we're all ready to go */
1814                        ori             r0,r5,0x2000                                    /* Turn on the floating point */
1815                        mr              r31,r6                                                  /* Get a more sane base register */
1816                        mr.             r10,r10                                                 /* Are we all set? */
1817                        mtmsr   r0                                                              /* Enable floating point */
1818                        isync
1819                        
1820                        stfd    f0,GDfp0(r31)                                   /* Save FP */
1821                        stfd    f1,GDfp1(r31)                                   /* Save FP */
1822                        stfd    f2,GDfp2(r31)                                   /* Save FP */
1823                        stfd    f3,GDfp3(r31)                                   /* Save FP */
1824                
1825                        beq-    GDbailout                                               /* Go and bail... */
1826                        
1827                        rlwinm  r25,r3,0,16,31                                  /* Isolate just the row number */
1828                        lwz             r28,GDtopleft(r31)                              /* Get the physical address of our line 0 */
1829                        rlwinm  r3,r3,16,16,31                                  /* Isolate the column number */
1830                        lwz             r27,GDrowbytes(r31)                             /* Get the number of bytes per row */
1831                        lwz             r9,GDrowchar(r31)                               /* Get the number of bytes per row of full leaded charactrers */
1832                        lwz             r26,GDdepth(r31)                                /* Get the bit depth */
1833                        mullw   r25,r25,r9                                              /* get offset to the row to write in bytes */
1834                        lwz             r24,GDcollgn(r31)                               /* Get the size of columns in bytes */
1835                        add             r25,r28,r25                                             /* Physical address of row */
1836                        mullw   r3,r3,r24                                               /* Get byte offset to first output column */
1837                        
1838                        li              r9,32                                                   /* Get the initial shift calc */
1839                        
1840                        lis             r20,HIGH_ADDR(hexfont)                  /* Point to the font */
1841                        
1842                        li              r18,GDfontsize                                  /* Get the number of rows in the font */
1843                        ori             r20,r20,LOW_ADDR(hexfont)               /* Point to the low part */
1844                        add             r21,r25,r3                                              /* Physical address of top left output pixel */
1845                        sub             r9,r9,r26                                               /* Get right shift justifier for pixel size */
1846                        li              r7,32                                                   /* Number of bits per word */
1847
1848startNybble:
1849                        la              r6,GDrowbuf1(r31)                               /* Point to the row buffer */
1850                        li              r19,8                                                   /* Get the number of characters in a row */
1851                        
1852getNybble:      rlwinm  r10,r4,9,23,26                                  /* Get the top nybble * 32 */
1853                        rlwinm  r4,r4,4,0,31                                    /* Rotate a nybble */
1854                        add             r10,r20,r10                                             /* Point to the character in the font */
1855                        
1856                        rlwinm  r16,r26,4,0,27                                  /* Width of row in actual bits */
1857                        lhz             r15,0(r10)                                              /* Get the next row of the font */
1858                        
1859rendrow:        rlwinm  r17,r15,16,0,0                                  /* Get the next font pixel in the row */
1860                        rlwinm  r15,r15,1,16,31                                 /* Move in the next font pixel */
1861                        srawi   r17,r17,31                                              /* Fill with 1s if black and 0s if white (reversed) */
1862                        
1863                        slw             r14,r14,r26                                             /* Make room for our pixel in a register */
1864                        srw             r17,r17,r9                                              /* Isolate one pixels worth of black or white */
1865                        sub.    r7,r7,r26                                               /* See how may bits are left */
1866                        sub             r16,r16,r26                                             /* Count how many bits are left to store for this row */
1867                        or              r14,r14,r17                                             /* Put in the pixel */
1868                        bne+    notfull                                                 /* Finish rendering this word */
1869                        
1870                        not             r14,r14                                                 /* Invert to black on white */
1871                        stw             r14,0(r6)                                               /* Write out the word */
1872                        li              r7,32                                                   /* Bit per word count */
1873                        addi    r6,r6,4                                                 /* Point to the next word */
1874                        
1875notfull:        mr.             r16,r16                                                 /* Have we finished the whole character row? */                 
1876                        bne+    rendrow                                                 /* Finish rendering the row */
1877                
1878                        addic.  r19,r19,-1                                              /* Are we finished with a whole display row yet? */
1879                        bne+    getNybble                                               /* Not yet... */
1880                        
1881                        la              r6,GDrowbuf1(r31)                               /* Point to the row buffer */
1882                        rlwinm  r19,r26,31,0,29                                 /* Number of cache lines (depth/2) */
1883                        mr              r14,r21                                                 /* Get the frame buffer address */
1884                        
1885//                      BREAKPOINT_TRAP
1886
1887blitrow:        lfd             f0,0(r6)                                                /* Load a line */
1888                        lfd             f1,8(r6)                                        
1889                        lfd             f2,16(r6)                                       
1890                        lfd             f3,24(r6)                                       
1891                        
1892                        stfd    f0,0(r14)                                               /* Blit a line */
1893                        stfd    f1,8(r14)                                       
1894                        stfd    f2,16(r14)                                      
1895                        stfd    f3,24(r14)      
1896                        
1897                        addi    r6,r6,32                                                /* Next buffered line */
1898                        
1899                        dcbst   0,r14                                                   /* Force the line to the screen */
1900                        sync                                                                    /* Make sure the line is on it's way */
1901                        eieio                                                                   /* Make sure we beat the invalidate */
1902                        dcbi    0,r14                                                   /* Make sure we leave no paradox */
1903                        
1904                        addic.  r19,r19,-1                                              /* Done all lines yet? */
1905                        addi    r14,r14,32                                              /* Point to the next output */
1906                        bne+    blitrow                                                 /* Nope, do it some more... */
1907                        
1908                        addic.  r18,r18,-1                                              /* Have we done all the rows in character yet? */
1909                        addi    r20,r20,2                                               /* Offset the font to the next row */
1910                        add             r21,r21,r27                                             /* Point to start of next row */
1911                        bne+    startNybble                                             /* Nope, go through the word one more time... */
1912                                        
1913GDbailout:      mr              r1,r31                                                  /* Move the workarea base */
1914        
1915                        lfd             f0,GDfp0(r31)                                   /* Restore FP */
1916                        lfd             f1,GDfp1(r31)                                   /* Restore FP */
1917                        lfd             f2,GDfp2(r31)                                   /* Restore FP */
1918                        lfd             f3,GDfp3(r31)                                   /* Restore FP */
1919                        
1920                        mtmsr   r5                                                              /* Disable floating point */
1921                        isync
1922                        
1923                        lmw             r3,GDsave+12(r1)                                /* Restore most registers */
1924                        lwz             r0,GDsave(r1)                                   /* Restore R0 */
1925                        lwz             r1,GDsave+4(r1)                                 /* Finally, R1 */
1926                        blr                                                                             /* Leave... */
1927                        
1928
1929/*
1930 *                      void GratefulDebDisp(unsigned int coord, unsigned int data);
1931 */
1932
1933
1934                        .align  5
1935                        .globl  EXT(GratefulDebDisp)
1936
1937LEXT(GratefulDebDisp)
1938
1939                        mfmsr   r9                                                              /* Save the current MSR */
1940                        mflr    r7                                                              /* Save the return */
1941                        andi.   r8,r9,0x7FCF                                    /* Clear interrupt and translation */
1942                        mtmsr   r8                                                              /* Turn 'em really off */
1943                        isync                                                                   /* Make sure about the translation part */
1944                        bl              EXT(GratefulDeb)                                /* Display it */
1945                        mtmsr   r9                                                              /* Restore interrupt and translation */
1946                        mtlr    r7                                                              /* Restore return */
1947                        isync                                                                   /* Make sure */
1948                        blr
1949
1950                        
1951#endif
1952
1953/*
1954 *                      void checkNMI(void);
1955 */
1956
1957
1958                        .align  5
1959                        .globl  EXT(checkNMI)
1960
1961LEXT(checkNMI)
1962                
1963                        mfmsr   r9                                                              /* Save it */
1964                        andi.   r8,r9,0x7FCF                                    /* Clear it */
1965                        mtmsr   r8                                                              /* Disable it */
1966                        isync                                                                   /* Fence it */
1967                        lis             r7,0xF300                                               /* Find it */
1968                        lis             r2,hi16(MASK(MSR_VEC))                  ; Get the vector enable 
1969                        ori             r7,r7,0x0020                                    /* Find it */
1970                        ori             r2,r2,lo16(MASK(MSR_FP))                ; Get the FP enable 
1971                        dcbi    0,r7                                                    /* Toss it */
1972                        sync                                                                    /* Sync it */
1973                        andc    r9,r9,r2                                                ; Clear VEC and FP enables
1974                        eieio                                                                   /* Get it */
1975                        lwz             r6,0x000C(r7)                                   /* Check it */
1976                        eieio                                                                   /* Fence it */
1977                        dcbi    0,r7                                                    /* Toss it */
1978                        rlwinm. r4,r6,0,19,19                                   /* Check it */
1979                        rlwinm  r6,r6,0,20,18                                   /* Clear it */
1980                        sync                                                                    /* Sync it */
1981                        eieio                                                                   /* Fence it */
1982                        beq+    xnonmi                                                  /* Branch on it */
1983
1984                        stw             r6,0x0008(r7)                                   /* Reset it */
1985                        sync                                                                    /* Sync it */
1986                        dcbi    0,r6                                                    /* Toss it */
1987                        eieio                                                                   /* Fence it */
1988
1989                        mtmsr   r9                                                              /* Restore it */
1990                        isync                                                                   /* Hold it */
1991
1992                        BREAKPOINT_TRAP                                                 /* Kill it */
1993                        blr                                                                             /* Return from it */
1994
1995xnonmi:                                                                                         /* Label it */
1996                        mtmsr   r9                                                              /* Restore it */
1997                        isync                                                                   /* Hold it */
1998                        blr                                                                             /* Return from it */
1999
2000;
2001;                       Saves floating point registers
2002;
2003
2004                        .align  5
2005                        .globl  EXT(stFloat)
2006
2007LEXT(stFloat)
2008
2009                        lis             r2,hi16(MASK(MSR_VEC))                  ; Get the vector enable 
2010                        li              r4,0
2011                        ori             r2,r2,lo16(MASK(MSR_FP))                ; Get the FP enable 
2012                        ori             r4,r4,lo16(MASK(MSR_EE))                ; Get the EE bit
2013
2014                        mfmsr   r0                                                              ; Save the MSR
2015
2016                        andc    r4,r0,r4                                                ; Clear EE
2017                        ori             r4,r4,lo16(MASK(MSR_FP))                ; Enable floating point
2018                        mtmsr   r4
2019                        isync
2020
2021                        andc    r0,r0,r2                                                ; Clear VEC and FP enables
2022                        
2023                        stfd    f0,0x00(r3)
2024                        stfd    f1,0x08(r3)
2025                        stfd    f2,0x10(r3)
2026                        stfd    f3,0x18(r3)
2027                        stfd    f4,0x20(r3)
2028                        stfd    f5,0x28(r3)
2029                        stfd    f6,0x30(r3)
2030                        stfd    f7,0x38(r3)
2031                        stfd    f8,0x40(r3)
2032                        stfd    f9,0x48(r3)
2033                        stfd    f10,0x50(r3)
2034                        stfd    f11,0x58(r3)
2035                        stfd    f12,0x60(r3)
2036                        stfd    f13,0x68(r3)
2037                        stfd    f14,0x70(r3)
2038                        stfd    f15,0x78(r3)
2039                        stfd    f16,0x80(r3)
2040                        stfd    f17,0x88(r3)
2041                        stfd    f18,0x90(r3)
2042                        stfd    f19,0x98(r3)
2043                        stfd    f20,0xA0(r3)
2044                        stfd    f21,0xA8(r3)
2045                        stfd    f22,0xB0(r3)
2046                        stfd    f23,0xB8(r3)
2047                        stfd    f24,0xC0(r3)
2048                        stfd    f25,0xC8(r3)
2049                        stfd    f26,0xD0(r3)
2050                        stfd    f27,0xD8(r3)
2051                        stfd    f28,0xE0(r3)
2052                        stfd    f29,0xE8(r3)
2053                        stfd    f30,0xF0(r3)
2054                        stfd    f31,0xF8(r3)
2055                        mffs    f0
2056                        stfd    f0,0x100(r3)
2057                        lfd             f0,0x00(r3)
2058                        mtmsr   r0
2059                        isync
2060                        blr
2061                        
2062
2063;
2064;                       Saves vector registers.  Returns 0 if non-Altivec machine.
2065;
2066
2067                        .align  5
2068                        .globl  EXT(stVectors)
2069
2070LEXT(stVectors)
2071
2072                        lis             r2,hi16(MASK(MSR_VEC))                  ; Get the vector enable 
2073                        li              r4,0
2074                        ori             r2,r2,lo16(MASK(MSR_FP))                ; Get the FP enable 
2075                        ori             r4,r4,lo16(MASK(MSR_EE))                ; Get the EE bit
2076                        
2077                        mfsprg  r6,2                            ; Get features
2078                        mr              r5,r3                           ; Save area address
2079                        rlwinm. r6,r6,0,pfAltivecb,pfAltivecb           ;  Do we have Altivec?
2080                        li              r3,0                            ; Assume failure
2081                        beqlr-                                          ; No...
2082                        
2083                        mfmsr   r0                                      ; Save the MSR
2084        
2085                        andc    r4,r0,r4                        ; Clear EE
2086
2087                        oris    r4,r4,hi16(MASK(MSR_VEC))       ; Enable vectors
2088                        mtmsr   r4
2089                        isync
2090                        
2091                        andc    r0,r0,r2                        ; Clear FP and VEC
2092                        
2093                        stvxl   v0,0,r5
2094                        addi    r5,r5,16
2095                        stvxl   v1,0,r5
2096                        addi    r5,r5,16
2097                        stvxl   v2,0,r5
2098                        addi    r5,r5,16
2099                        stvxl   v3,0,r5
2100                        addi    r5,r5,16
2101                        stvxl   v4,0,r5
2102                        addi    r5,r5,16
2103                        stvxl   v5,0,r5
2104                        addi    r5,r5,16
2105                        stvxl   v6,0,r5
2106                        addi    r5,r5,16
2107                        stvxl   v7,0,r5
2108                        addi    r5,r5,16
2109                        stvxl   v8,0,r5
2110                        addi    r5,r5,16
2111                        stvxl   v9,0,r5
2112                        addi    r5,r5,16
2113                        stvxl   v10,0,r5
2114                        addi    r5,r5,16
2115                        stvxl   v11,0,r5
2116                        addi    r5,r5,16
2117                        stvxl   v12,0,r5
2118                        addi    r5,r5,16
2119                        stvxl   v13,0,r5
2120                        addi    r5,r5,16
2121                        stvxl   v14,0,r5
2122                        addi    r5,r5,16
2123                        stvxl   v15,0,r5
2124                        addi    r5,r5,16
2125                        stvxl   v16,0,r5
2126                        addi    r5,r5,16
2127                        stvxl   v17,0,r5
2128                        addi    r5,r5,16
2129                        stvxl   v18,0,r5
2130                        addi    r5,r5,16
2131                        stvxl   v19,0,r5
2132                        addi    r5,r5,16
2133                        stvxl   v20,0,r5
2134                        addi    r5,r5,16
2135                        stvxl   v21,0,r5
2136                        addi    r5,r5,16
2137                        stvxl   v22,0,r5
2138                        addi    r5,r5,16
2139                        stvxl   v23,0,r5
2140                        addi    r5,r5,16
2141                        stvxl   v24,0,r5
2142                        addi    r5,r5,16
2143                        stvxl   v25,0,r5
2144                        addi    r5,r5,16
2145                        stvxl   v26,0,r5
2146                        addi    r5,r5,16
2147                        stvxl   v27,0,r5
2148                        addi    r5,r5,16
2149                        stvxl   v28,0,r5
2150                        addi    r5,r5,16
2151                        stvxl   v29,0,r5
2152                        addi    r5,r5,16
2153                        stvxl   v30,0,r5
2154                        addi    r5,r5,16
2155                        stvxl   v31,0,r5
2156                        mfvscr  v31
2157                        addi    r6,r5,16
2158                        stvxl   v31,0,r6
2159                        li              r3,1
2160                        lvxl    v31,0,r5
2161                        mtmsr   r0
2162                        isync
2163
2164                        blr
2165
2166
2167;
2168;                       Saves yet more registers
2169;
2170
2171                        .align  5
2172                        .globl  EXT(stSpecrs)
2173
2174LEXT(stSpecrs)
2175
2176
2177                        lis             r2,hi16(MASK(MSR_VEC))                  ; Get the vector enable 
2178                        li              r4,0
2179                        ori             r2,r2,lo16(MASK(MSR_FP))                ; Get the FP enable 
2180                        ori             r4,r4,lo16(MASK(MSR_EE))                ; Get the EE bit
2181
2182                        mfsprg  r9,2                                                    ; Get feature flags 
2183                        mtcrf   0x02,r9                                                 ; move pf64Bit cr6
2184
2185                        mfmsr   r0                                                              ; Save the MSR
2186                        andc    r0,r0,r2                                                ; Turn off VEC and FP
2187                        andc    r4,r0,r4                        ; And EE
2188                        mtmsr   r4
2189                        isync
2190                        
2191                        mfpvr   r12
2192                        stw             r12,4(r3)
2193                        rlwinm  r12,r12,16,16,31
2194
2195                        bt++    pf64Bitb,stsSF1                                 ; skip if 64-bit (only they take the hint)
2196
2197                        mfdbatu r4,0
2198                        mfdbatl r5,0
2199                        mfdbatu r6,1
2200                        mfdbatl r7,1
2201                        mfdbatu r8,2
2202                        mfdbatl r9,2
2203                        mfdbatu r10,3
2204                        mfdbatl r11,3
2205                        stw             r4,8(r3)
2206                        stw             r5,12(r3)
2207                        stw             r6,16(r3)
2208                        stw             r7,20(r3)
2209                        stw             r8,24(r3)
2210                        stw             r9,28(r3)
2211                        stw             r10,32(r3)
2212                        stw             r11,36(r3)
2213
2214                        mfibatu r4,0
2215                        mfibatl r5,0
2216                        mfibatu r6,1
2217                        mfibatl r7,1
2218                        mfibatu r8,2
2219                        mfibatl r9,2
2220                        mfibatu r10,3
2221                        mfibatl r11,3
2222                        stw             r4,40(r3)
2223                        stw             r5,44(r3)
2224                        stw             r6,48(r3)
2225                        stw             r7,52(r3)
2226                        stw             r8,56(r3)
2227                        stw             r9,60(r3)
2228                        stw             r10,64(r3)
2229                        stw             r11,68(r3)
2230                        
2231                        mfsprg  r4,0
2232                        mfsprg  r5,1
2233                        mfsprg  r6,2
2234                        mfsprg  r7,3
2235                        stw             r4,72(r3)
2236                        stw             r5,76(r3)
2237                        stw             r6,80(r3)
2238                        stw             r7,84(r3)
2239                        
2240                        mfsdr1  r4
2241                        stw             r4,88(r3)
2242                        
2243                        la              r4,92(r3)
2244                        li              r5,0
2245                        
2246stSnsr:         mfsrin  r6,r5
2247                        addis   r5,r5,0x1000
2248                        stw             r6,0(r4)
2249                        mr.             r5,r5
2250                        addi    r4,r4,4
2251                        bne+    stSnsr
2252
2253                        cmplwi  r12,PROCESSOR_VERSION_750
2254                        mfspr   r4,hid0
2255                        stw             r4,(39*4)(r3)
2256
2257                        li              r4,0
2258                        li              r5,0
2259                        li              r6,0
2260                        li              r7,0
2261                        
2262                        mfspr   r4,hid1
2263                        mfspr   r5,l2cr
2264                        mfspr   r6,msscr0
2265                        mfspr   r7,msscr1
2266
2267                        stw             r4,(40*4)(r3)
2268                        stw             r6,(42*4)(r3)
2269                        stw             r5,(41*4)(r3)
2270                        stw             r7,(43*4)(r3)
2271
2272                        li              r4,0
2273                        beq             isis750
2274                        
2275                        mfspr   r4,pir
2276isis750:        stw             r4,0(r3)
2277
2278                        li              r4,0
2279                        li              r5,0
2280                        li              r6,0
2281                        li              r7,0
2282                        blt-    b4750
2283                        
2284                        mfspr   r4,thrm1
2285                        mfspr   r5,thrm2
2286                        mfspr   r6,thrm3
2287                        mfspr   r7,ictc
2288
2289b4750:          stw             r4,(44*4)(r3)
2290                        stw             r5,(45*4)(r3)
2291                        stw             r6,(46*4)(r3)
2292                        stw             r7,(47*4)(r3)
2293                        
2294                        li              r4,0
2295                        li              r6,0
2296                        cmplwi  r12,PROCESSOR_VERSION_7400
2297                        bne             nnmax
2298                        
2299                        mfspr   r6,dabr
2300                        mfpvr   r5
2301                        rlwinm  r5,r5,0,16,31
2302                        cmplwi  r5,0x1101
2303                        beq             gnmax
2304                        cmplwi  r5,0x1102
2305                        bne             nnmax
2306
2307gnmax:          mfspr   r4,1016
2308
2309nnmax:          stw             r4,(48*4)(r3)
2310                        stw             r6,(49*4)(r3)
2311                        
2312                        mtmsr   r0
2313                        isync
2314
2315                        blr
2316
2317stsSF1:         mfsprg  r4,0
2318                        mfsprg  r5,1
2319                        mfsprg  r6,2
2320                        mfsprg  r7,3
2321                        std             r4,(18*4)(r3)
2322                        std             r5,(20*4)(r3)
2323                        std             r6,(22*4)(r3)
2324                        std             r7,(24*4)(r3)
2325                        
2326                        mfsdr1  r4
2327                        std             r4,(26*4)(r3)
2328
2329                        mfspr   r4,hid0
2330                        std             r4,(28*4)(r3)
2331                        mfspr   r4,hid1
2332                        std             r4,(30*4)(r3)
2333                        mfspr   r4,hid4
2334                        std             r4,(32*4)(r3)
2335                        mfspr   r4,hid5
2336                        std             r4,(34*4)(r3)
2337
2338
2339stsSF2:         li              r5,0
2340                        la              r4,(80*4)(r3)
2341                        
2342stsslbm:        slbmfee r6,r5
2343                        slbmfev r7,r5
2344                        std             r6,0(r4)
2345                        std             r7,8(r4)
2346                        addi    r5,r5,1
2347                        cmplwi  r5,64
2348                        addi    r4,r4,16
2349                        blt             stsslbm
2350                        
2351                        mtmsr   r0
2352                        isync
2353
2354                        blr
2355
2356;
2357;                       fwEmMck - this forces the hardware to emulate machine checks
2358;                       Only valid on 64-bit machines
2359;                       Note: we want interruptions disabled here
2360;
2361
2362                        .globl  EXT(fwEmMck)
2363                        
2364                        .align  5
2365
2366LEXT(fwEmMck)
2367
2368
2369                        rlwinm  r3,r3,0,1,0                                             ; Copy low of high high - scomd
2370                        rlwinm  r5,r5,0,1,0                                             ; Copy low of high high - hid1
2371                        rlwinm  r7,r7,0,1,0                                             ; Copy low of high high - hid4
2372                        rlwimi  r3,r4,0,0,31                                    ; Copy low of low low
2373                        rlwimi  r5,r6,0,0,31                                    ; Copy low of low low
2374                        rlwimi  r7,r8,0,0,31                                    ; Copy low of low low
2375
2376                        lis             r9,3                                                    ; Start forming hid1 error inject mask
2377                        lis             r10,hi16(0x01084083)                    ; Start formaing hid4 error inject mask
2378                        ori             r9,r9,0xC000                                    ; Next bit
2379                        ori             r10,r10,lo16(0x01084083)                ; Next part
2380                        sldi    r9,r9,32                                                ; Shift up high
2381                        sldi    r10,r10,8                                               ; Shift into position
2382                        
2383                        mfspr   r0,hid1                                                 ; Get hid1
2384                        mfspr   r2,hid4                                                 ; and hid4
2385                        
2386                        and             r5,r5,r9                                                ; Keep only error inject controls - hid1
2387                        and             r7,r7,r10                                               ; Keep only error inject controls - hid4
2388                        
2389                        andc    r0,r0,r9                                                ; Clear error inject controls hid1
2390                        andc    r2,r2,r10                                               ; Clear error inject controls hid4
2391                        
2392                        or              r0,r0,r5                                                ; Add in the new controls hid1
2393                        or              r2,r2,r7                                                ; Add in the new controls hid4
2394                        
2395/* ? */
2396#if 0
2397                        lis             r12,CoreErrI                                    ; Get the error inject controls
2398                        sync
2399
2400                        mtspr   scomd,r3                                                ; Set the error inject controls
2401                        mtspr   scomc,r12                                               ; Request error inject
2402                        mfspr   r11,scomc                                               ; Get back the status (we just ignore it)
2403#endif
2404                        sync
2405                        isync                                                   
2406                        
2407                        mtspr   hid1,r0                                                 ; Move in hid1 controls
2408                        mtspr   hid1,r0                                                 ; We need to do it twice
2409                        isync
2410                        
2411                        sync
2412                        mtspr   hid4,r2                                                 ; Move in hid4 controls
2413                        isync
2414                        
2415                        blr                                                                             ; Leave...
2416
2417;
2418;                       fwSCOMrd - read/write SCOM
2419;
2420                        .align  5
2421                        .globl  EXT(fwSCOM)
2422
2423LEXT(fwSCOM)
2424
2425                        lhz             r12,scomfunc(r3)                                ; Get the function
2426                        lwz             r4,scomreg(r3)                                  ; Get the register
2427                        rldicr  r4,r4,8,47                                              ; Position for SCOM
2428
2429                        mr.             r12,r12                                                 ; See if read or write
2430                        bne             fwSCwrite                                               ; Go do a write
2431
2432                        mfsprg  r0,2                                                    ; Get the feature flags
2433                        ori             r4,r4,0x8000                                    ; Set to read data
2434                        rlwinm. r0,r0,pfSCOMFixUpb+1,31,31              ; Set shift if we need a fix me up
2435                        sync
2436
2437                        mtspr   scomc,r4                                                ; Request the register
2438                        mfspr   r11,scomd                                               ; Get the register contents
2439                        mfspr   r10,scomc                                               ; Get back the status
2440                        sync
2441                        isync                                                   
2442
2443                        sld             r11,r11,r0                                              ; Fix up if needed
2444                        
2445                        std             r11,scomdata(r3)                                ; Save result
2446                        eieio
2447                        std             r10,scomstat(r3)                                ; Save status
2448
2449                        blr
2450
2451fwSCwrite:      ld              r5,scomdata(r3)                                 ; Get the data
2452                        
2453                        sync
2454
2455                        mtspr   scomd,r5                                                ; Set the data
2456                        mtspr   scomc,r4                                                ; Set it
2457                        mfspr   r10,scomc                                               ; Get back the status
2458                        sync
2459                        isync                                                   
2460
2461                        std             r10,scomstat(r3)                                ; Save status
2462                        
2463                        blr
2464
2465;
2466;                       diagTrap - this is used to trigger checks from user space
2467;                       any "twi 31,r31,0xFFFx" will come here (x = 0 to F).
2468;                       On entry R3 points to savearea.
2469;                       R4 is the "x" from instruction;
2470;                       Pass back 1 to no-op twi and return to user
2471;                       Pass back 0 to treat as normal twi.
2472;
2473
2474                        .globl  EXT(diagTrap)
2475                        
2476                        .align  5
2477
2478LEXT(diagTrap)
2479
2480                        li              r3,1                                                    ; Ignore TWI
2481                        blr                                                                             ; Leave...
2482
2483
2484
2485
2486;
2487;                       setPmon - this is used to manipulate MMCR0 and MMCR1
2488
2489                        .globl  EXT(setPmon)
2490                        
2491                        .align  5
2492
2493LEXT(setPmon)
2494
2495                        li              r0,0
2496                        isync
2497                        mtspr   mmcr0,r0                                                ; Clear MMCR0
2498                        mtspr   mmcr1,r0                                                ; Clear MMCR1
2499                        mtspr   pmc1,r0
2500                        mtspr   pmc2,r0
2501                        mtspr   pmc3,r0
2502                        mtspr   pmc4,r0
2503
2504                        isync
2505
2506                        mtspr   mmcr0,r3                                                ; Set MMCR0
2507                        mtspr   mmcr1,r4                                                ; Set MMCR1
2508                        isync
2509                        blr                                                                             ; Leave...
2510
2511
2512
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.