/****************************************************************************** * Copyright (c) 2004, 2008 IBM Corporation * All rights reserved. * This program and the accompanying materials * are made available under the terms of the BSD License * which accompanies this distribution, and is available at * http://www.opensource.org/licenses/bsd-license.php * * Contributors: * IBM Corporation - initial implementation *****************************************************************************/ #include /* Function: Input: r3: rtas parm structure r4: base address Output: Decription: Main entry point, called from OS. Second parameter is not used. */ .globl rtas_entry rtas_entry: mfmsr r11 # Get MSR to enable 64-bit mode mr r7,r11 rotldi r11,r11,1 ori r11,r11,1 # Always enable 64-bit mode flag rotldi r11,r11,63 mtmsrd r11 # Switch to 64-bit mode isync mr r9,r1 # save old stack pointer mflr r10 # save link register bcl 20,31,.over # branch to over .base: .align 3 ..got: .quad _got-.base ..stack: .quad .stack+RTAS_STACKSIZE-0x60-.base .over: mflr r8 # gpr 8 is the base ld r1,..stack-.base(r8) # load new stack pointer add r1,r1,r8 # add base std r2,64(r1) # save toc ld r2,..got-.base(r8) # load got pointer std r7,72(r1) # save original msr std r10,80(r1) # save link register std r9,0(r1) # save stack pointer add r2,r2,r8 # add base bl save_regs_r3_r12 bl .rtas_call bl restore_regs_r3_r12 rtas_return: ld r11,72(r1) # restore msr value ld r0,80(r1) # restore link register value ld r2,64(r1) # restore toc ld r1,0(r1) # get old stack mtmsrd r11 # restore msr (32 bit ?) isync mtlr r0 blr .globl .stack .lcomm .stack,RTAS_STACKSIZE