⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofwboot.s

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 S
📖 第 1 页 / 共 2 页
字号:
	
	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_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 */
	blr

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

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

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


setup_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 - _start

copy_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)
	
	blr

dsi_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
	rfi
dsi_end:	
					
	.org	0x1000
freeldr_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	0

ofw_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	0x2000
stack:
	.space	0x4000

⌨️ 快捷键说明

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