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