[Main Page]

Booting petitboot from VFLASH

From EurAsiaWiki

Main Page | Recent changes | View source | Page history | Log in / create account |

Printable version | Disclaimers | Privacy policy
Category: PS3

Source: graf_chokolo @ http://ps3wiki.lan.st/index.php/Booting_petitboot_from_VFLASH


Contents

How it was done in 3.15 Firmware

How things are in 3.41 Firmware

Creating and Resizing of VFLASH region

Installing petitboot on VFLASH region

Patching GameOS System Manager

Patching Secure LPAR Loader (SLL)

otheros_booloader_loader.S

Here is my OtherOS bootloader loader from VFLASH.

/*
 * 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
 */

.set STACK_SIZE,							0x100
.set STACK_LR,								(STACK_SIZE + 0x10)
.set STACK_R25,								(STACK_SIZE - 1 * 0x8)
.set STACK_R26,								(STACK_SIZE - 2 * 0x8)
.set STACK_R27,								(STACK_SIZE - 3 * 0x8)
.set STACK_R28,								(STACK_SIZE - 4 * 0x8)
.set STACK_R29,								(STACK_SIZE - 5 * 0x8)
.set STACK_R30,								(STACK_SIZE - 6 * 0x8)
.set STACK_R31,								(STACK_SIZE - 7 * 0x8)
.set STACK_LPAR_MEM,						        (STACK_SIZE - 8 * 0x8)

.set SUB_SLL_LOAD_LV2,						        0x80000E44		/* sll_load_lv2 */
.set SUB_MMAP_LPAR_MEM,						        0x800026B4
.set SUB_OPEN,								0x80013D40		/* syscall 0x7 */
.set SUB_CLOSE,								0x80013D7C		/* syscall 0x8 */
.set SUB_READ,								0x80013DB8		/* syscall 0x9 */
.set SUB_MUNMAP,							0x80013EB8		/* syscall 0x19 */
.set SUB_BSET,								0x80000278
.set SUB_BCOPY,								0x80000254

#define BL(sub_addr)						        \
	li %r30, 0;							\
	oris %r30, %r30, (sub_addr >> 16);		                \
	ori %r30, %r30, (sub_addr & 0xFFFF);	                        \
	mtctr %r30;							\
	bctrl

.set CACHE_LINE_SIZE,						        0x80

.set FD_ERROR,								0x10
.set HEADER_ERROR,							0x14

#define LWZ_DATA(reg, data_addr)			                lwz reg, data_addr(%r31)
#define LD_DATA(reg, data_addr)				                ld reg, data_addr(%r31)
#define LD_DATA_PTR(reg, data_addr)			                addi reg, %r31, data_addr - sll_load_lv2

/*
 * %r3 - path
 * %r4 - laid
 * %r5 - lpar id
 *
 * %r25 - volatile
 * %r26 - OtherOS bootloader load address
 * %r27 - return value
 * %r28 - size of /dev/rflash_lx
 * %r29 - file descriptor of /dev/rflash_lx
 * %r30 - reserved for function calls
 * %r31 - reserved for data accesses
 */
.globl sll_load_lv2
sll_load_lv2:

	stdu %r1, -STACK_SIZE(%r1)
	mflr %r0
	std %r0, STACK_LR(%r1)
	std %r25, STACK_R25(%r1)
	std %r26, STACK_R26(%r1)
	std %r27, STACK_R27(%r1)
	std %r28, STACK_R28(%r1)
	std %r29, STACK_R29(%r1)
	std %r30, STACK_R30(%r1)
	std %r31, STACK_R31(%r1)

	bl 1f

1:

	mflr %r31
	addi %r31, %r31, (sll_load_lv2 - 1b)

	/* map lpar memory */

	mr %r3, %r5
	li %r4, 0
	LD_DATA(%r26, bootloader_load_addr)
	LD_DATA(%r28, dev_rflash_lx_size)
	add %r5, %r26, %r28
	addi %r6, %r1, STACK_LPAR_MEM
	BL(SUB_MMAP_LPAR_MEM)
	cmpwi %cr7, %r3, 0
	mr %r27, %r3
	bne %cr7, done

	/* zero out lpar memory */

	ld %r3, STACK_LPAR_MEM(%r1)
	li %r4, 0
	mr %r5, %r28
	BL(SUB_BSET)

	/* open /dev/rflash_lx where OtherOS bootloader is stored */

	LD_DATA_PTR(%r3, dev_rflash_lx)
	li %r4, 0
	li %r27, FD_ERROR
	BL(SUB_OPEN)
	cmpwi %cr7, %r3, 0
	mr %r29, %r3
	blt %cr7, bad1

	/* read header */

	extsw %r3, %r29
	ld %r4, STACK_LPAR_MEM(%r1)
	LD_DATA(%r25, header_size)
	mr %r5, %r25
	li %r27, FD_ERROR
	BL(SUB_READ)
	cmpd %cr7, %r3, %r25
	bne %cr7, bad2

	/* check header magic */

	li %r27, HEADER_ERROR

	LD_DATA(%r3, header_magic)
	ld %r5, STACK_LPAR_MEM(%r1)
	ld %r4, 0(%r5)
	cmpd %cr7, %r3, %r4
	bne %cr7, bad2

	/* read OtherOS bootloader size from header */

	ld %r25, 8(%r5)
	cmpd %cr7, %r25, %r28
	bgt %cr7, bad2

	/* read OtherOS bootloader to lpar memory */

	extsw %r3, %r29
	ld %r4, STACK_LPAR_MEM(%r1)
	mr %r5, %r25
	li %r27, FD_ERROR
	BL(SUB_READ)
	cmpd %cr7, %r3, %r25
	bne %cr7, bad2

	/* flush data cache */

	li %r9, 0
	b 2f

1:

	ld %r0, STACK_LPAR_MEM(%r1)
	add %r0, %r9, %r0
	dcbst %r0, %r0
	addi %r9, %r9, CACHE_LINE_SIZE

2:

	cmpd %cr7, %r9, %r28
	blt %cr7, 1b

	sync

	/* flush code cache */

	li %r9, 0
	b 2f

1:

	ld %r0, STACK_LPAR_MEM(%r1)
	add %r0, %r9, %r0
	icbi %r0, %r0
	addi %r9, %r9, CACHE_LINE_SIZE

2:

	cmpd %cr7, %r9, %r28
	blt %cr7, 1b

	isync

success:

	li %r27, 0

bad2:

	/* close /dev/rflash_lx */

	extsw %r3, %r29
	BL(SUB_CLOSE)

bad1:

	/* unmap lpar memory */

	ld %r3, STACK_LPAR_MEM(%r1)
	add %r4, %r26, %r28
	BL(SUB_MUNMAP)

done:

	rldicl %r3, %r27, 0, 32

	ld %r0, STACK_LR(%r1)
	ld %r25, STACK_R25(%r1)
	ld %r26, STACK_R26(%r1)
	ld %r27, STACK_R27(%r1)
	ld %r28, STACK_R28(%r1)
	ld %r29, STACK_R29(%r1)
	ld %r30, STACK_R30(%r1)
	ld %r31, STACK_R31(%r1)
	addi %r1, %r1, STACK_SIZE
	mtlr %r0
	blr

/* read-only data */

data_start:

bootloader_load_addr:
	.quad 0x0000000000000000

header_size:
	.quad (2 * 0x200) /* 2 sectors of size 0x200 */

header_magic:
	.quad 0x0FACE0FFDEADBABE

dev_rflash_lx_size:
	.quad (0x4000 * 0x200) /* 0x4000 sectors of size 0x200 */

dev_rflash_lx:
	.asciz "/dev/rflash_lx"

data_end:

Retrieved from "http://www.eurasia.nu/wiki/index.php/Booting_petitboot_from_VFLASH"

This page has been accessed 569 times. This page was last modified 02:33, 11 February 2011.