forked from mirrors/linux
		
	 e5a21dd873
			
		
	
	
		e5a21dd873
		
	
	
	
	
		
			
			Fix a bug in the lv1_get_repository_node_value() routine of the PS3 bootwrapper. Changes in the PS3 system firmware 2.20 cause this bug to hang the system when branching from the bootwrapper to the kernel _start. Since the video system has not yet been enabled at the time the bug is hit, the system hangs with a blank screen. Earlier firmwares don't cause such a catastrophic failure, and so this bug went undetected. Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
		
			
				
	
	
		
			186 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  *  PS3 bootwrapper hvcalls.
 | |
|  *
 | |
|  *  Copyright (C) 2007 Sony Computer Entertainment Inc.
 | |
|  *  Copyright 2007 Sony Corp.
 | |
|  *
 | |
|  *  This program is free software; you can redistribute it and/or modify
 | |
|  *  it under the terms of the GNU General Public License as published by
 | |
|  *  the Free Software Foundation; version 2 of the License.
 | |
|  *
 | |
|  *  This program is distributed in the hope that it will be useful,
 | |
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  *  GNU General Public License for more details.
 | |
|  *
 | |
|  *  You should have received a copy of the GNU General Public License
 | |
|  *  along with this program; if not, write to the Free Software
 | |
|  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
|  */
 | |
| 
 | |
| #include "ppc_asm.h"
 | |
| 
 | |
| 	.machine "ppc64"
 | |
| 
 | |
| /*
 | |
|  * The PS3 hypervisor uses a 64 bit "C" language calling convention.
 | |
|  * The routines here marshal arguments between the 32 bit wrapper
 | |
|  * program and the 64 bit hvcalls.
 | |
|  *
 | |
|  *  wrapper           lv1
 | |
|  *  32-bit (h,l)      64-bit
 | |
|  *
 | |
|  *  1: r3,r4          <-> r3
 | |
|  *  2: r5,r6          <-> r4
 | |
|  *  3: r7,r8          <-> r5
 | |
|  *  4: r9,r10         <-> r6
 | |
|  *  5: 8(r1),12(r1)   <-> r7
 | |
|  *  6: 16(r1),20(r1)  <-> r8
 | |
|  *  7: 24(r1),28(r1)  <-> r9
 | |
|  *  8: 32(r1),36(r1)  <-> r10
 | |
|  *
 | |
|  */
 | |
| 
 | |
| .macro GLOBAL name
 | |
| 	.section ".text"
 | |
| 	.balign 4
 | |
| 	.globl \name
 | |
| \name:
 | |
| .endm
 | |
| 
 | |
| .macro NO_SUPPORT name
 | |
| 	GLOBAL \name
 | |
| 	b ps3_no_support
 | |
| .endm
 | |
| 
 | |
| .macro HVCALL num
 | |
| 	li r11, \num
 | |
| 	.long 0x44000022
 | |
| 	extsw r3, r3
 | |
| .endm
 | |
| 
 | |
| .macro SAVE_LR offset=4
 | |
| 	mflr r0
 | |
| 	stw r0, \offset(r1)
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_LR offset=4
 | |
| 	lwz r0, \offset(r1)
 | |
| 	mtlr r0
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_64_REG target,high,low
 | |
| 	sldi r11, \high, 32
 | |
| 	or \target, r11, \low
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_64_STACK target,offset
 | |
| 	ld \target, \offset(r1)
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R3
 | |
| 	LOAD_64_REG r3,r3,r4
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R4
 | |
| 	LOAD_64_REG r4,r5,r6
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R5
 | |
| 	LOAD_64_REG r5,r7,r8
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R6
 | |
| 	LOAD_64_REG r6,r9,r10
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R7
 | |
| 	LOAD_64_STACK r7,8
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R8
 | |
| 	LOAD_64_STACK r8,16
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R9
 | |
| 	LOAD_64_STACK r9,24
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_R10
 | |
| 	LOAD_64_STACK r10,32
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_REGS_0
 | |
| 	stwu 1,-16(1)
 | |
| 	stw 3, 8(1)
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_REGS_5
 | |
| 	LOAD_R3
 | |
| 	LOAD_R4
 | |
| 	LOAD_R5
 | |
| 	LOAD_R6
 | |
| 	LOAD_R7
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_REGS_6
 | |
| 	LOAD_REGS_5
 | |
| 	LOAD_R8
 | |
| .endm
 | |
| 
 | |
| .macro LOAD_REGS_8
 | |
| 	LOAD_REGS_6
 | |
| 	LOAD_R9
 | |
| 	LOAD_R10
 | |
| .endm
 | |
| 
 | |
| .macro STORE_REGS_0_1
 | |
| 	lwz r11, 8(r1)
 | |
| 	std r4, 0(r11)
 | |
| 	mr r4, r3
 | |
| 	li r3, 0
 | |
| 	addi r1,r1,16
 | |
| .endm
 | |
| 
 | |
| .macro STORE_REGS_5_2
 | |
| 	lwz r11, 16(r1)
 | |
| 	std r4, 0(r11)
 | |
| 	lwz r11, 20(r1)
 | |
| 	std r5, 0(r11)
 | |
| .endm
 | |
| 
 | |
| .macro STORE_REGS_6_1
 | |
| 	lwz r11, 24(r1)
 | |
| 	std r4, 0(r11)
 | |
| .endm
 | |
| 
 | |
| GLOBAL lv1_get_logical_ppe_id
 | |
| 	SAVE_LR
 | |
| 	LOAD_REGS_0
 | |
| 	HVCALL 69
 | |
| 	STORE_REGS_0_1
 | |
| 	LOAD_LR
 | |
| 	blr
 | |
| 
 | |
| GLOBAL lv1_get_logical_partition_id
 | |
| 	SAVE_LR
 | |
| 	LOAD_REGS_0
 | |
| 	HVCALL 74
 | |
| 	STORE_REGS_0_1
 | |
| 	LOAD_LR
 | |
| 	blr
 | |
| 
 | |
| GLOBAL lv1_get_repository_node_value
 | |
| 	SAVE_LR
 | |
| 	LOAD_REGS_5
 | |
| 	HVCALL 91
 | |
| 	STORE_REGS_5_2
 | |
| 	LOAD_LR
 | |
| 	blr
 | |
| 
 | |
| GLOBAL lv1_panic
 | |
| 	SAVE_LR
 | |
| 	LOAD_REGS_8
 | |
| 	HVCALL 255
 | |
| 	LOAD_LR
 | |
| 	blr
 |