xref: /plan9-contrib/sys/src/9/pc/rebootcode.s (revision b00e0779eca495c89a9f865e899aeba7b49ff6c3)
19a747e4fSDavid du Colombier#include "mem.h"
29a747e4fSDavid du Colombier
39a747e4fSDavid du Colombier/*
4*b00e0779SDavid du Colombier * Turn off MMU, then memmove the new kernel to its correct location
5*b00e0779SDavid du Colombier * in physical memory.  Then jump to the start of the kernel.
69a747e4fSDavid du Colombier */
79a747e4fSDavid du Colombier
89a747e4fSDavid du ColombierTEXT	main(SB),$0
99a747e4fSDavid du Colombier	MOVL	p1+0(FP), DI		/* destination */
109a747e4fSDavid du Colombier	MOVL	DI, AX			/* entry point */
119a747e4fSDavid du Colombier	MOVL	p2+4(FP), SI		/* source */
129a747e4fSDavid du Colombier	MOVL	n+8(FP), CX		/* byte count */
139a747e4fSDavid du Colombier
149a747e4fSDavid du Colombier/*
159a747e4fSDavid du Colombier * disable paging
169a747e4fSDavid du Colombier */
179a747e4fSDavid du Colombier	MOVL	CR0, DX
189a747e4fSDavid du Colombier	ANDL	$~0x80000000, DX		/* ~(PG) */
199a747e4fSDavid du Colombier	MOVL	DX, CR0
209a747e4fSDavid du Colombier	MOVL	$0, DX
219a747e4fSDavid du Colombier	MOVL	DX, CR3
229a747e4fSDavid du Colombier
239a747e4fSDavid du Colombier/*
249a747e4fSDavid du Colombier * the source and destination may overlap.
259a747e4fSDavid du Colombier * determine whether to copy forward or backwards
269a747e4fSDavid du Colombier */
279a747e4fSDavid du Colombier	CMPL	SI, DI
289a747e4fSDavid du Colombier	JGT	_forward
299a747e4fSDavid du Colombier	MOVL	SI, DX
309a747e4fSDavid du Colombier	ADDL	CX, DX
319a747e4fSDavid du Colombier	CMPL	DX, DI
329a747e4fSDavid du Colombier	JGT	_back
339a747e4fSDavid du Colombier
349a747e4fSDavid du Colombier_forward:
359a747e4fSDavid du Colombier	CLD
369a747e4fSDavid du Colombier	REP;	MOVSB
379a747e4fSDavid du Colombier	JMP	_startkernel
389a747e4fSDavid du Colombier
399a747e4fSDavid du Colombier_back:
409a747e4fSDavid du Colombier	ADDL	CX, DI
419a747e4fSDavid du Colombier	ADDL	CX, SI
429a747e4fSDavid du Colombier	SUBL	$1, DI
439a747e4fSDavid du Colombier	SUBL	$1, SI
449a747e4fSDavid du Colombier	STD
459a747e4fSDavid du Colombier	REP;	MOVSB
469a747e4fSDavid du Colombier	JMP	_startkernel
479a747e4fSDavid du Colombier/*
489a747e4fSDavid du Colombier * JMP to kernel entry point.  Note the true kernel entry point is
499a747e4fSDavid du Colombier * the virtual address KZERO|AX, but this must wait until
509a747e4fSDavid du Colombier * the MMU is enabled by the kernel in l.s
519a747e4fSDavid du Colombier */
529a747e4fSDavid du Colombier_startkernel:
539a747e4fSDavid du Colombier	ORL	AX, AX		/* NOP: avoid link bug */
549a747e4fSDavid du Colombier	JMP*	AX
55