From c03913c62ddb751d2992e8a3d70e945229ed8e15 Mon Sep 17 00:00:00 2001 From: aiju Date: Fri, 13 Jul 2012 18:09:42 +0200 Subject: fixed multiboot booting --- sys/src/9/pc/l.s | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/sys/src/9/pc/l.s b/sys/src/9/pc/l.s index d3e5f5201..128fde3d3 100644 --- a/sys/src/9/pc/l.s +++ b/sys/src/9/pc/l.s @@ -46,12 +46,28 @@ TEXT _multibootheader(SB), $0 LONG $_startKADDR-KZERO(SB) /* load_addr */ LONG $edata-KZERO(SB) /* load_end_addr */ LONG $end-KZERO(SB) /* bss_end_addr */ - LONG $_startKADDR-KZERO(SB) /* entry_addr */ + LONG $_multibootentry-KZERO(SB) /* entry_addr */ LONG $0 /* mode_type */ LONG $0 /* width */ LONG $0 /* height */ LONG $0 /* depth */ +TEXT _multibootentry(SB), $0 + MOVL $etext-KZERO(SB), SI + MOVL SI, DI + ADDL $0xfff, DI + ANDL $~0xfff, DI + MOVL $edata-KZERO(SB), CX + SUBL DI, CX + ADDL CX, SI + ADDL CX, DI + STD + REP; MOVSB + CLD + MOVL $_startPADDR(SB), AX + ANDL $~KZERO, AX + JMP* AX + /* * In protected mode with paging turned off and segment registers setup * to linear map all memory. Entered via a jump to PADDR(entry), -- cgit v1.2.3 From c612f9c41fd876c181f89472861245404cef65c5 Mon Sep 17 00:00:00 2001 From: aiju Date: Fri, 13 Jul 2012 18:52:39 +0200 Subject: multiboot: use initrd for config --- sys/src/9/pc/l.s | 10 ++++++++++ sys/src/9/pc/main.c | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/sys/src/9/pc/l.s b/sys/src/9/pc/l.s index 128fde3d3..83e6e91a3 100644 --- a/sys/src/9/pc/l.s +++ b/sys/src/9/pc/l.s @@ -52,6 +52,10 @@ TEXT _multibootheader(SB), $0 LONG $0 /* height */ LONG $0 /* depth */ +/* + * the kernel expects the data segment to be page-aligned + * multiboot bootloaders put the data segment right behind text + */ TEXT _multibootentry(SB), $0 MOVL $etext-KZERO(SB), SI MOVL SI, DI @@ -64,10 +68,16 @@ TEXT _multibootentry(SB), $0 STD REP; MOVSB CLD + ADDL $KZERO, BX + MOVL BX, multiboot-KZERO(SB) MOVL $_startPADDR(SB), AX ANDL $~KZERO, AX JMP* AX +/* multiboot structure pointer */ +TEXT multiboot(SB), $0 + LONG $0 + /* * In protected mode with paging turned off and segment registers setup * to linear map all memory. Entered via a jump to PADDR(entry), diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index 1ea96d6c7..71c469650 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -37,6 +37,22 @@ options(void) { long i, n; char *cp, *line[MAXCONF], *p, *q; + ulong *m, l; + extern ulong *multiboot; + + if(multiboot != nil){ + cp = BOOTARGS; + *cp = 0; + if((*multiboot & 8) != 0 && multiboot[5] > 0){ + m = KADDR(multiboot[6]); + l = m[1] - m[0]; + m = KADDR(m[0]); + if(l >= BOOTARGSLEN) + l = BOOTARGSLEN - 1; + memmove(cp, m, l); + cp[l] = 0; + } + } /* * parse configuration args from dos file plan9.ini -- cgit v1.2.3