#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),1,$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
#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),1,$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