ref: cd22f5ca84e68df5c0c7f897e52c065ae4a7feeb
parent: 14dd03e25d50d82c820e3f40f03141d16a9c35c7
parent: 715da0d49486a7c07a36277690aec2068ec55f2e
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sat Jul 14 19:08:38 EDT 2012
merge
--- a/sys/src/9/pc/l.s
+++ b/sys/src/9/pc/l.s
@@ -46,11 +46,37 @@
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 */
+
+/*
+ * 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
+ ADDL $0xfff, DI
+ ANDL $~0xfff, DI
+ MOVL $edata-KZERO(SB), CX
+ SUBL DI, CX
+ ADDL CX, SI
+ ADDL CX, DI
+ 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
--- a/sys/src/9/pc/main.c
+++ b/sys/src/9/pc/main.c
@@ -37,6 +37,22 @@
{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
--
⑨