ofwboot.s

来自「一个类似windows」· S 代码 · 共 1,246 行 · 第 1/2 页

S
1,246
字号
		lwz	%r3,16(%r1)		/* Restore registers */	lwz	%r8,28(%r1)	mtlr	%r8	lwz	%r9,24(%r1)	lwz	%r8,20(%r1)		addi	%r1,%r1,32		/* Return */	blrofw_open:	/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,32	/* Store r8, r9, lr */	stw	%r8,20(%r1)	stw	%r9,24(%r1)	mflr	%r8	stw	%r8,28(%r1)		/* Get open name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_open_name - _start	stw	%r9,0(%r1)	/* 1 Argument and 1 return */	li	%r9,1	stw	%r9,4(%r1)	stw	%r9,8(%r1)	stw	%r3,12(%r1)	/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1		/* Fire */	blrl		lwz	%r3,16(%r1)		/* Restore registers */	lwz	%r8,28(%r1)	mtlr	%r8	lwz	%r9,24(%r1)	lwz	%r8,20(%r1)		addi	%r1,%r1,32		/* Return */	blrofw_getprop_hook:	/* Reserve stack space:	 * 32 bytes for the ofw call	 * 12 bytes for r8, r9, lr	 */			/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,48	/* Store r8, r9, lr */	stw	%r8,32(%r1)	stw	%r9,36(%r1)	mflr	%r8	stw	%r8,40(%r1)		/* Get getprop name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_getprop_name - _start	stw	%r9,0(%r1)	/* 4 Argument and 1 return */	li	%r9,4	stw	%r9,4(%r1)	li	%r9,1	stw	%r9,8(%r1)	stw	%r3,12(%r1) /* Package */	stw	%r4,16(%r1) /* Property */	stw	%r5,20(%r1) /* Return buffer */	stw	%r6,24(%r1) /* Buffer size */		/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1	/* Fire */	blrl	/* Workaround to a wierd crash ... not sure what causes it.	 * XXX investigate me */	bl	ofw_print_nothing		/* Return */	lwz	%r3,28(%r1)	/* Restore registers */	lwz	%r8,40(%r1)	mtlr	%r8	lwz	%r9,36(%r1)	lwz	%r8,32(%r1)		addi	%r1,%r1,48			/* Return */	blrofw_getprop:	/* Reserve stack space:	 * 32 bytes for the ofw call	 * 12 bytes for r8, r9, lr	 */			/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,48	/* Store r8, r9, lr */	stw	%r8,32(%r1)	stw	%r9,36(%r1)	mflr	%r8	stw	%r8,40(%r1)		/* Get getprop name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_getprop_name - _start	stw	%r9,0(%r1)	/* 4 Argument and 1 return */	li	%r9,4	stw	%r9,4(%r1)	li	%r9,1	stw	%r9,8(%r1)	stw	%r3,12(%r1) /* Package */	stw	%r4,16(%r1) /* Property */	stw	%r5,20(%r1) /* Return buffer */	stw	%r6,24(%r1) /* Buffer size */		/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1	/* Fire */	blrl		/* Return */	lwz	%r3,28(%r1)	/* Restore registers */	lwz	%r8,40(%r1)	mtlr	%r8	lwz	%r9,36(%r1)	lwz	%r8,32(%r1)		addi	%r1,%r1,48			/* Return */	blr		ofw_write:	/* Reserve stack space:	 * 28 bytes for the ofw call	 * 12 bytes for r8, r9, lr	 */			/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,48	nop		/* Store r8, r9, lr */	stw	%r8,28(%r1)	stw	%r9,32(%r1)	mflr	%r8	stw	%r8,36(%r1)		/* Get write name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_write_name - _start	stw	%r9,0(%r1)	/* 3 Arguments and 1 return */	li	%r9,3	stw	%r9,4(%r1)	li	%r9,1	stw	%r9,8(%r1)	stw	%r3,12(%r1)	stw	%r4,16(%r1)	stw	%r5,20(%r1)		/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1	/* Fire */	blrl	/* Return */	lwz	%r3,24(%r1)	/* Restore registers */	lwz	%r8,36(%r1)	mtlr	%r8	lwz	%r9,32(%r1)	lwz	%r8,28(%r1)		addi	%r1,%r1,48		/* Return */	blrofw_read:	/* Reserve stack space:	 * 28 bytes for the ofw call	 * 12 bytes for r8, r9, lr	 */			/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,48	nop		/* Store r8, r9, lr */	stw	%r8,28(%r1)	stw	%r9,32(%r1)	mflr	%r8	stw	%r8,36(%r1)		/* Get read name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_read_name - _start	stw	%r9,0(%r1)	/* 3 Arguments and 1 return */	li	%r9,3	stw	%r9,4(%r1)	li	%r9,1	stw	%r9,8(%r1)	stw	%r3,12(%r1)	stw	%r4,16(%r1)	stw	%r5,20(%r1)		/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1	/* Fire */	blrl	/* Return */	lwz	%r3,24(%r1)	/* Restore registers */	lwz	%r8,36(%r1)	mtlr	%r8	lwz	%r9,32(%r1)	lwz	%r8,28(%r1)		addi	%r1,%r1,48		/* Return */	blr		ofw_exit:	lis	%r3,0xe00000@ha	addi	%r3,%r3,freeldr_halt - _start	bl	ofw_print_string/*	ofw_exit_loop:		b	ofw_exit_loop*/	/* Load the exit name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_exit_name - _start	stw	%r9,0(%r1)	/* Zero args, zero returns */	xor	%r9,%r9,%r9	stw	%r9,4(%r1)	stw	%r9,8(%r1)		/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	mr	%r3,%r1	/* Fire */	blrl	/* No return from exit */ofw_child:	/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,32	/* Store r8, r9, lr */	stw	%r8,20(%r1)	stw	%r9,24(%r1)	mflr	%r8	stw	%r8,28(%r1)		/* Get child name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_child_name - _start	stw	%r9,0(%r1)	/* 1 Argument and 1 return */	li	%r9,1	stw	%r9,4(%r1)	stw	%r9,8(%r1)	stw	%r3,12(%r1)	/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1		/* Fire */	blrl		lwz	%r3,16(%r1)		/* Restore registers */	lwz	%r8,28(%r1)	mtlr	%r8	lwz	%r9,24(%r1)	lwz	%r8,20(%r1)		addi	%r1,%r1,32		/* Return */	blr	ofw_peer:	/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,32	/* Store r8, r9, lr */	stw	%r8,20(%r1)	stw	%r9,24(%r1)	mflr	%r8	stw	%r8,28(%r1)		/* Get peer name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_peer_name - _start	stw	%r9,0(%r1)	/* 1 Argument and 1 return */	li	%r9,1	stw	%r9,4(%r1)	stw	%r9,8(%r1)	stw	%r3,12(%r1)	/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1		/* Fire */	blrl		lwz	%r3,16(%r1)		/* Restore registers */	lwz	%r8,28(%r1)	mtlr	%r8	lwz	%r9,24(%r1)	lwz	%r8,20(%r1)		addi	%r1,%r1,32		/* Return */	blr				ofw_seek:	/* Reserve stack space ...	 * 20 bytes for the ofw call,	 * r8, r9, and lr */	subi	%r1,%r1,32	/* Store r8, r9, lr */	stw	%r8,20(%r1)	stw	%r9,24(%r1)	mflr	%r8	stw	%r8,28(%r1)		/* Get peer name */	lis	%r8,0xe00000@ha	addi	%r9,%r8,ofw_seek_name - _start	stw	%r9,0(%r1)	/* 3 Arguments and 1 return */	li	%r9,3	stw	%r9,4(%r1)	li	%r9,1	stw	%r9,8(%r1)	stw	%r3,12(%r1)	stw	%r4,16(%r1)	stw	%r5,20(%r1)	/* Load up the call address */	lwz	%r9,ofw_call_addr - _start(%r8)	mtlr	%r9	/* Set argument */	mr	%r3,%r1		/* Fire */	blrl		lwz	%r3,16(%r1)		/* Restore registers */	lwz	%r8,28(%r1)	mtlr	%r8	lwz	%r9,24(%r1)	lwz	%r8,20(%r1)		addi	%r1,%r1,32		/* Return */	blrsetup_exc:	subi	%r1,%r1,32	stw	%r3,0(%r1)	mflr	%r3	stw	%r3,4(%r1)	stw	%r8,8(%r1)	stw	%r9,12(%r1)	stw	%r10,16(%r1)	stw	%r12,20(%r1)		lis	%r8,0xe00000@ha	xor	%r12,%r12,%r12	addi	%r12,%r12,0x300	addi	%r9,%r8,dsi_exc - _start	addi	%r10,%r8,dsi_end - _startcopy_loop:		cmp	0,0,%r9,%r10	beq	ret_setup_exc	mr	%r3,%r12	bl	ofw_print_number	bl	ofw_print_space		lwz	%r3,0(%r9)	stw	%r3,0(%r12)	bl	ofw_print_number	bl	ofw_print_eol	addi	%r12,%r12,4	addi	%r9,%r9,4	b	copy_loop	ret_setup_exc:	mfmsr	%r12	andi.	%r12,%r12,0xffbf 	mtmsr	%r12		lwz	%r12,20(%r1)	lwz	%r10,16(%r1)	lwz	%r9,12(%r1)	lwz	%r8,8(%r1)	lwz	%r3,4(%r1)	mtlr	%r3	lwz	%r3,0(%r1)		blrdsi_exc:	subi	%r1,%r1,16		stw	%r0,0(%r1)	stw	%r3,4(%r1)	mfsrr0	%r3	addi	%r3,%r3,4	mtsrr0	%r3	/* mfsrr1	%r3 */	/* ori	%r3,%r3,2 */	/* mtsrr1	%r3 */			lwz	%r3,4(%r1)	lwz	%r0,0(%r1)	addi	%r1,%r1,16	rfidsi_end:							.org	0x1000freeldr_banner:	.ascii	"ReactOS OpenFirmware Boot Program\r\n\0"freeldr_halt:	.ascii	"ReactOS OpenFirmware Boot Program Halting\r\n\0"freeldr_reg_init:	.ascii	"r\0"freeldr_reg_lr:		.ascii	"lr \0"freeldr_reg_cr:		.ascii	"cr \0"freeldr_reg_ctr:		.ascii	"ctr\0"freeldr_reg_msr:		.ascii	"msr\0"			ofw_call_addr:		.long	0ofw_memory_size:	.long	0	.long	0	.long	0	.long	0	ofw_finddevice_name:	.ascii	"finddevice\0"		ofw_getprop_name:	.ascii	"getprop\0"ofw_write_name:	.ascii	"write\0"ofw_read_name:	.ascii	"read\0"	ofw_exit_name:	.ascii	"exit\0"ofw_open_name:	.ascii	"open\0"ofw_child_name:	.ascii	"child\0"ofw_peer_name:	.ascii	"peer\0"		ofw_seek_name:	.ascii	"seek\0"	ofw_chosen_name:	.ascii	"/chosen\0"ofw_stdout_name:	.ascii	"stdout\0"ofw_memory_name:	.ascii	"/memory@0\0"ofw_reg_name:	.ascii	"reg\0"	ofw_functions:	.long	ofw_finddevice_hook	.long	ofw_getprop_hook	.long	ofw_write	.long	ofw_read	.long	ofw_exit	.long	ofw_print_regs	.long	ofw_print_string	.long	ofw_print_number	.long	ofw_open	.long	ofw_child	.long	ofw_peer	.long   ofw_seek		.org	0x2000stack:	.space	0x4000

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?