henesyinit from p9fd787fda5 years agoHistory
54 lines · 988 B · Assembly
RawDownload
#include "mem.h" /* * Turn off MMU, then memmory the new kernel to its correct location * in physical memory.  Then jumps the to start of the kernel. */ TEXT	main(SB),$0	MOVL	p1+0(FP), DI		/* destination */	MOVL	DI, AX			/* entry point */	MOVL	p2+4(FP), SI		/* source */	MOVL	n+8(FP), CX		/* byte count */ /* * disable paging */	MOVL	CR0, DX	ANDL	$~0x80000000, DX		/* ~(PG) */	MOVL	DX, CR0	MOVL	$0, DX	MOVL	DX, CR3 /* * the source and destination may overlap. * determine whether to copy forward or backwards */	CMPL	SI, DI	JGT	_forward	MOVL	SI, DX	ADDL	CX, DX	CMPL	DX, DI	JGT	_back _forward:	CLD	REP;	MOVSB	JMP	_startkernel _back:	ADDL	CX, DI	ADDL	CX, SI	SUBL	$1, DI	SUBL	$1, SI	STD	REP;	MOVSB	JMP	_startkernel/* * JMP to kernel entry point.  Note the true kernel entry point is * the virtual address KZERO|AX, but this must wait until * the MMU is enabled by the kernel in l.s */_startkernel:	ORL	AX, AX		/* NOP: avoid link bug */	JMP*	AX