Hi, However I need multiboot support for amd64. I am waiting well-tested implementation.
"Emmanuel Dreyfus" <m...@netbsd.org> writes: > Module Name: src > Committed By: manu > Date: Thu Jan 9 00:42:24 UTC 2020 > > Modified Files: > src/sys/arch/amd64/amd64: locore.S machdep.c > src/sys/arch/amd64/conf: GENERIC files.amd64 kern.ldscript > > Log Message: > Rollback multiboot2 for amd64, as requested by core > > > To generate a diff of this commit: > cvs rdiff -u -r1.197 -r1.198 src/sys/arch/amd64/amd64/locore.S > cvs rdiff -u -r1.344 -r1.345 src/sys/arch/amd64/amd64/machdep.c > cvs rdiff -u -r1.553 -r1.554 src/sys/arch/amd64/conf/GENERIC > cvs rdiff -u -r1.114 -r1.115 src/sys/arch/amd64/conf/files.amd64 > cvs rdiff -u -r1.30 -r1.31 src/sys/arch/amd64/conf/kern.ldscript > > Please note that diffs are not public domain; they are subject to the > copyright notices on the relevant files. > > Modified files: > > Index: src/sys/arch/amd64/amd64/locore.S > diff -u src/sys/arch/amd64/amd64/locore.S:1.197 > src/sys/arch/amd64/amd64/locore.S:1.198 > --- src/sys/arch/amd64/amd64/locore.S:1.197 Wed Jan 8 20:59:18 2020 > +++ src/sys/arch/amd64/amd64/locore.S Thu Jan 9 00:42:24 2020 > @@ -1,4 +1,4 @@ > -/* $NetBSD: locore.S,v 1.197 2020/01/08 20:59:18 skrll Exp $ */ > +/* $NetBSD: locore.S,v 1.198 2020/01/09 00:42:24 manu Exp $ */ > > /* > * Copyright-o-rama! > @@ -158,7 +158,6 @@ > > #include "opt_compat_netbsd.h" > #include "opt_compat_netbsd32.h" > -#include "opt_multiboot.h" > #include "opt_xen.h" > #include "opt_svs.h" > > @@ -178,13 +177,6 @@ > #include <machine/frameasm.h> > #include <machine/cputypes.h> > > -#ifndef XENPV > -#include <arch/i386/include/multiboot.h> > -#endif > - > -#define CODE_SEGMENT 0x08 > -#define DATA_SEGMENT 0x10 > - > #if NLAPIC > 0 > #include <machine/i82489reg.h> > #endif > @@ -432,50 +424,6 @@ END(farjmp64) > .space 512 > tmpstk: > > -.section multiboot,"a" > -#if defined(MULTIBOOT) > - .align 8 > - .globl Multiboot2_Header > -_C_LABEL(Multiboot2_Header): > - .int MULTIBOOT2_HEADER_MAGIC > - .int MULTIBOOT2_ARCHITECTURE_I386 > - .int Multiboot2_Header_end - Multiboot2_Header > - .int -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 \ > - + (Multiboot2_Header_end - Multiboot2_Header)) > - > - .int 1 /* MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST */ > - .int 12 /* sizeof(multiboot_header_tag_information_request) */ > - /* + sizeof(uint32_t) * requests */ > - .int 4 /* MULTIBOOT_TAG_TYPE_BASIC_MEMINFO */ > - .align 8 > - > - .int 3 /* MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS */ > - .int 16 /* sizeof(struct multiboot_tag_efi64) */ > - .quad (multiboot2_entry - KERNBASE) > - .align 8 > - > - .int 9 /* MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 */ > - .int 16 /* sizeof(struct multiboot_tag_efi64) */ > - .quad (multiboot2_entry - KERNBASE) > - .align 8 > - > -#if notyet > - /* > - * Could be used to get an early console for debug, > - * but this is broken. > - */ > - .int 7 /* MULTIBOOT_HEADER_TAG_EFI_BS */ > - .int 8 /* sizeof(struct multiboot_tag) */ > - .align 8 > -#endif > - > - .int 0 /* MULTIBOOT_HEADER_TAG_END */ > - .int 8 /* sizeof(struct multiboot_tag) */ > - .align 8 > - .globl Multiboot2_Header_end > -_C_LABEL(Multiboot2_Header_end): > -#endif /* MULTIBOOT */ > - > /* > * Some hackage to deal with 64bit symbols in 32 bit mode. > * This may not be needed if things are cleaned up a little. > @@ -492,700 +440,6 @@ ENTRY(start) > /* Warm boot */ > movw $0x1234,0x472 > > -#if defined(MULTIBOOT) > - jmp .Lnative_loader > - > - > -multiboot2_entry: > - .code64 > - /* > - * multiboot2 entry point. We are left here without > - * stack and with no idea of where we were loaded in memory. > - * The only inputs are > - * %eax MULTIBOOT2_BOOTLOADER_MAGIC > - * %ebx pointer to multiboot_info > - * > - * Here we will: > - * - copy the kernel to 0x200000 (KERNTEXTOFF - KERNBASE) > - * as almost all the code in locore.S assume it is there. > - * This is derived from > - * src/sys/arch/i386/stand/efiboot/bootx64/startprog64.S > - * - copy multiboot_info, as done in multiboot_pre_reloc() from > - * src/sys/arch/x86/x86/multiboot2.c > - * Unfortunately we cannot call that function as there is > - * no simple way to build it as 32 bit code in a 64 bit kernel. > - * - Copy ELF symbols, also as in multiboot_pre_reloc() > - */ > - > - cli > - > - /* > - * Discover our load address and use it to get start address > - */ > - mov $_RELOC(tmpstk),%rsp > - call next > -next: pop %r8 > - sub $(next - start), %r8 > - > - /* > - * Save multiboot_info for later. We cannot use > - * temporary stack for that since we are going to > - * overwrite it. > - */ > - movl %ebx, (multiboot2_info_ptr - start)(%r8) > - > - /* > - * Get relocated multiboot2_loader entry point in %r9 > - */ > - mov $(KERNTEXTOFF - KERNBASE), %r9 > - add $(multiboot2_loader - kernel_text), %r9 > - > - /* Copy kernel */ > - mov $(KERNTEXTOFF - KERNBASE), %rdi /* dest */ > - mov %r8, %rsi > - sub $(start - kernel_text), %rsi /* src */ > - mov $(__kernel_end - kernel_text), %rcx /* size */ > - mov %rcx, %r12 > - movq %rdi, %r11 /* for misaligned check */ > - > -#if !defined(NO_OVERLAP) > - movq %rdi, %r13 > - subq %rsi, %r13 > -#endif > - > - shrq $3, %rcx /* count for copy by words */ > - jz 8f /* j if less than 8 bytes */ > - > - lea -8(%rdi, %r12), %r14 /* target address of last 8 */ > - mov -8(%rsi, %r12), %r15 /* get last word */ > -#if !defined(NO_OVERLAP) > - cmpq %r12, %r13 /* overlapping? */ > - jb 10f > -#endif > - > -/* > - * Non-overlaping, copy forwards. > - * Newer Intel cpus (Nehalem) will do 16byte read/write transfers > - * if %ecx is more than 76. > - * AMD might do something similar some day. > - */ > - and $7, %r11 /* destination misaligned ? */ > - jnz 12f > - rep > - movsq > - mov %r15, (%r14) /* write last word */ > - jmp .Lcopy_done > - > -/* > - * Destination misaligned > - * AMD say it is better to align the destination (not the source). > - * This will also re-align copies if the source and dest are both > - * misaligned by the same amount) > - * (I think Nehalem will use its accelerated copy if the source > - * and destination have the same alignment.) > - */ > -12: > - lea -9(%r11, %r12), %rcx /* post re-alignment count */ > - neg %r11 /* now -1 .. -7 */ > - mov (%rsi), %r12 /* get first word */ > - mov %rdi, %r13 /* target for first word */ > - lea 8(%rsi, %r11), %rsi > - lea 8(%rdi, %r11), %rdi > - shr $3, %rcx > - rep > - movsq > - mov %r12, (%r13) /* write first word */ > - mov %r15, (%r14) /* write last word */ > - jmp .Lcopy_done > - > -#if !defined(NO_OVERLAP) > -/* Must copy backwards. > - * Reverse copy is probably easy to code faster than 'rep movds' > - * since that requires (IIRC) an extra clock every 3 iterations (AMD). > - * However I don't suppose anything cares that much! > - * The big cost is the std/cld pair - reputedly 50+ cycles on Netburst P4. > - * The copy is aligned with the buffer start (more likely to > - * be a multiple of 8 than the end). > - */ > -10: > - lea -8(%rsi, %rcx, 8), %rsi > - lea -8(%rdi, %rcx, 8), %rdi > - std > - rep > - movsq > - cld > - mov %r15, (%r14) /* write last bytes */ > - jmp .Lcopy_done > -#endif > - > -/* Less than 8 bytes to copy, copy by bytes */ > -/* Intel Nehalem optimise 'rep movsb' for <= 7 bytes (9-15 clocks). > - * For longer transfers it is 50+ ! > - */ > -8: mov %r12, %rcx > - > -#if !defined(NO_OVERLAP) > - cmpq %r12, %r13 /* overlapping? */ > - jb 81f > -#endif > - > - /* nope, copy forwards. */ > - rep > - movsb > - jmp .Lcopy_done > - > -#if !defined(NO_OVERLAP) > -/* Must copy backwards */ > -81: > - lea -1(%rsi, %rcx), %rsi > - lea -1(%rdi, %rcx), %rdi > - std > - rep > - movsb > - cld > -#endif > - /* End of copy kernel */ > -.Lcopy_done: > - > - mov %r8, %rdi /* %rdi: loaded start address */ > - mov %r9, %rsi /* %rsi: kernel entry address */ > - > - /* Prepare jump address */ > - lea (multiboot2_loader32a - start)(%rdi), %rax > - movl %eax, (multiboot2_loader32r - start)(%rdi) > - > - /* Setup GDT */ > - lea (gdt - start)(%rdi), %rax > - mov %rax, (gdtrr - start)(%rdi) > - lgdt (gdtr - start)(%rdi) > - > - /* Jump to set %cs */ > - ljmp *(multiboot2_loader32r - start)(%rdi) > - > - .align 4 > - .code32 > -multiboot2_loader32a: > - movl $DATA_SEGMENT, %eax > - movw %ax, %ds > - movw %ax, %es > - movw %ax, %fs > - movw %ax, %gs > - movw %ax, %ss > - > - /* Already set new stack pointer */ > - movl %esp, %ebp > - > - /* Disable Paging in CR0 */ > - movl %cr0, %eax > - andl $(~CR0_PG), %eax > - movl %eax, %cr0 > - > - /* Disable PAE in CR4 */ > - movl %cr4, %eax > - andl $(~CR4_PAE), %eax > - movl %eax, %cr4 > - > - jmp multiboot2_loader32b > - > - .align 4 > -multiboot2_loader32b: > - xor %eax, %eax > - > - /* > - * Reload multiboot info from target location > - */ > - movl _RELOC(multiboot2_info_ptr), %ebx > - call *%esi > - > - .align 16 > -multiboot2_loader32r: > - .long 0 > - .long CODE_SEGMENT > - .align 16 > -gdt: > - .long 0, 0 > - .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9f, 0xcf, 0x00 > - .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x93, 0xcf, 0x00 > -gdtr: > - .word gdtr - gdt > -gdtrr: > - .quad 0 > - > -multiboot2_info_ptr: > - .long 0 > - > - .align 16 > -multiboot2_loader: > - /* > - * Here we would like to call multiboot2_pre_reloc() but > - * we do not yet run in long mode, which means we need > - * a 32 bit version of that function. Unfortunately, > - * mixing 32-bit and 64-bit object file at link time > - * does not work. As a result, we need to do the job > - * of multiboot2_pre_reloc() here in assembly. > - */ > -#if multiboot2_pre_reloc_would_be_built_as_ia32 > - movl $_RELOC(tmpstk),%esp > - mov %ebx,%edi /* Address of Multiboot information */ > - call _C_LABEL(multiboot2_pre_reloc) > -#else > - /* > - * Copy multiboot_info > - */ > - movl $_RELOC(multiboot_info),%edi > - movl %ebx,%esi > - movl (%ebx),%ecx > - shr $2,%ecx > - rep > - movsl > - > - /* > - * Set multiboot2_enabled > - */ > - movl $1,%eax > - movl %eax,RELOC(multiboot2_enabled) > - > - /* > - * Look for MULTIBOOT_TAG_TYPE_ELF_SECTIONS > - */ > - movl $_RELOC(multiboot_info),%esi > - movl (%esi),%ecx /* multiboot_info size */ > - movl %esi,%edx > - addl %ecx,%edx /* %edx: end of multiboot_info */ > - addl $8,%esi /* skip two words of multiboot_info header */ > -mbt_loop: > - movl (%esi),%ebx /* mbt->type */ > - cmpl $9,%ebx /* 9 for MULTIBOOT_TAG_TYPE_ELF_SECTIONS */ > - je found_elf_sections > - > - movl 4(%esi),%eax /* mbt->size */ > - addl %eax,%esi > - addl $7,%esi /* roundup(%esi,8) */ > - andl $~7,%esi > - > - cmpl %edx,%esi > - jle mbt_loop > - jmp elf_sections_done > - > -found_elf_sections: > - movl $0,%eax > - movl %esp,%ebp /* %ebp is esymp */ > - push %eax > - push $KERNBASE_LO /* kernbase */ > - push $_RELOC(end) /* void *end */ > - push %ebp /* int **esymp */ > - push $_RELOC(has_syms) /* bool *has_symsp */ > - push $_RELOC(Multiboot_Symbols)/* struct multiboot_symbol *ms */ > - push %esi /* struct multiboot_tag_elf_sections *mbt_elf */ > - call multiboot2_copy_syms32 > - > - /* Asjust esym as a 64 bit pointer if esymp was set */ > - movl (%ebp),%eax > - testl %eax,%eax /* esymp = NULL? */ > - jz elf_sections_done > - > - movl $RELOC(esym),%ebp > - movl %eax,(%ebp) > - movl $KERNBASE_HI,4(%ebp) > - > - jmp elf_sections_done > - > - /* > - * This is multiboot2_copy_syms() from > - * src/sys/arch/x86/x86/multiboot2.c > - * built with -m32 -mcmodel=32 -D_LOCORE_64 > - */ > -multiboot2_copy_syms32: > - push %ebp > - mov %esp,%ebp > - push %edi > - push %esi > - push %ebx > - sub $0x20,%esp > - mov 0x8(%ebp),%esi > - /* for (i = 0; i < mbt_elf->num && symtabp == NULL && */ > - mov 0x8(%esi),%ebx > - test %ebx,%ebx > - je copy_syms_4ce > - add $0x14,%esi > - mov %esi,%eax > - xor %edx,%edx > - jmp copy_syms_3a0 > -copy_syms_395: > - cmp %edx,%ebx > - jbe copy_syms_4ce > -copy_syms_39d: > - add $0x40,%eax > -copy_syms_3a0: > - add $0x1,%edx > - /* if ((shdrp->sh_type == SHT_SYMTAB) && */ > - cmpl $0x2,0x4(%eax) > - jne copy_syms_395 > - /* shdrp->sh_link != SHN_UNDEF) { */ > - mov 0x28(%eax),%ecx > - /* if ((shdrp->sh_type == SHT_SYMTAB) && */ > - test %ecx,%ecx > - je copy_syms_395 > - /* [shdrp->sh_link]; */ > - shl $0x6,%ecx > - /* shdrp2 = &((locore_Elf_Shdr *)mbt_elf->sections) */ > - add %esi,%ecx > - /* if (shdrp2->sh_type == SHT_STRTAB) { */ > - cmpl $0x3,0x4(%ecx) > - jne copy_syms_395 > - /* for (i = 0; i < mbt_elf->num && symtabp == NULL && */ > - cmp %ebx,%edx > - jae copy_syms_6d1 > - test %eax,%eax > - je copy_syms_608 > - /* if (symtabp == NULL || strtabp == NULL) */ > -copy_syms_3cb: > - test %ecx,%ecx > - lea 0x0(%esi),%esi > - je copy_syms_4ce > - /* symaddr = symtabp->sh_addr; */ > - mov 0x10(%eax),%edi > - mov %edi,-0x10(%ebp) > - mov 0x14(%eax),%ebx > - mov %ebx,-0x18(%ebp) > - /* straddr = strtabp->sh_addr; */ > - mov 0x10(%ecx),%esi > - mov %esi,-0x14(%ebp) > - mov 0x14(%ecx),%ebx > - mov %ebx,-0x20(%ebp) > - /* symsize = symtabp->sh_size; */ > - mov 0x20(%eax),%ebx > - /* strsize = strtabp->sh_size; */ > - mov 0x20(%ecx),%eax > - mov %eax,-0x1c(%ebp) > - cmp 0x18(%ebp),%edi > - jae copy_syms_4d6 > - cmp %esi,0x18(%ebp) > - ja copy_syms_4e0 > - jae copy_syms_54d > - /* cp2dst = (locore_Elf_Addr)(uintptr_t)endp + cp1size; */ > -copy_syms_40f: > - mov -0x1c(%ebp),%ecx > - mov %ecx,%eax > - xor %edx,%edx > - /* cp1dst = (locore_Elf_Addr)(uintptr_t)endp; */ > - mov 0x18(%ebp),%esi > - xor %edi,%edi > - /* cp2dst = (locore_Elf_Addr)(uintptr_t)endp + cp1size; */ > - add %esi,%eax > - adc %edi,%edx > - mov %eax,-0x2c(%ebp) > - mov %edx,-0x28(%ebp) > - /* (void)memcpy((void *)(uintptr_t)cp1dst, */ > - mov %ecx,%eax > - mov 0x18(%ebp),%edi > - mov -0x14(%ebp),%esi > - cmp $0x4,%ecx > - jae copy_syms_5e8 > -copy_syms_436: > - test $0x2,%al > - je copy_syms_43c > - movsw %ds:(%esi),%es:(%edi) > -copy_syms_43c: > - test $0x1,%al > - je copy_syms_441 > - movsb %ds:(%esi),%es:(%edi) > - /* (void)memcpy((void *)(uintptr_t)cp2dst, */ > -copy_syms_441: > - mov %ebx,%eax > - mov 0x18(%ebp),%edi > - mov -0x1c(%ebp),%esi > - add %esi,%edi > - mov -0x10(%ebp),%esi > - cmp $0x4,%ebx > - jae copy_syms_5c4 > -copy_syms_457: > - test $0x2,%al > - je copy_syms_45d > - movsw %ds:(%esi),%es:(%edi) > -copy_syms_45d: > - test $0x1,%al > - je copy_syms_462 > - movsb %ds:(%esi),%es:(%edi) > - /* symstart = (cp1src == symaddr) ? cp1dst : cp2dst; */ > -copy_syms_462: > - mov -0x18(%ebp),%edx > - mov -0x20(%ebp),%edi > - xor %edi,%edx > - mov -0x10(%ebp),%eax > - mov -0x14(%ebp),%ecx > - xor %ecx,%eax > - or %eax,%edx > - je copy_syms_6ba > - mov -0x2c(%ebp),%eax > - mov %eax,-0x24(%ebp) > - mov %ecx,-0x10(%ebp) > - mov %edi,-0x18(%ebp) > - /* strstart = (cp1src == straddr) ? cp1dst : cp2dst; */ > -copy_syms_486: > - mov -0x20(%ebp),%edx > - xor -0x18(%ebp),%edx > - mov -0x14(%ebp),%eax > - xor -0x10(%ebp),%eax > - or %eax,%edx > - je copy_syms_545 > -copy_syms_49a: > - mov -0x2c(%ebp),%esi > - /* ms->s_symstart = symstart + kernbase; */ > -copy_syms_49d: > - mov -0x24(%ebp),%eax > - add 0x1c(%ebp),%eax > - mov 0xc(%ebp),%edi > - mov %eax,(%edi) > - /* ms->s_symsize = symsize; */ > - mov %edi,%eax > - mov %ebx,0x4(%edi) > - /* ms->s_strstart = strstart + kernbase; */ > - add 0x1c(%ebp),%esi > - mov %esi,0x8(%edi) > - /* ms->s_strsize = strsize; */ > - mov -0x1c(%ebp),%edi > - mov %edi,0xc(%eax) > - /* *has_symsp = true; */ > - mov 0x10(%ebp),%eax > - movb $0x1,(%eax) > - /* *esymp = (int *)((uintptr_t)endp + symsize + strsize + kernbase); */ > - mov 0x18(%ebp),%eax > - add 0x1c(%ebp),%eax > - add %eax,%ebx > - add %edi,%ebx > - mov 0x14(%ebp),%eax > - mov %ebx,(%eax) > -copy_syms_4ce: > - add $0x20,%esp > - pop %ebx > - pop %esi > - pop %edi > - pop %ebp > - ret > -copy_syms_4d6: > - jbe copy_syms_54d > - mov -0x14(%ebp),%eax > - cmp %eax,0x18(%ebp) > - jbe copy_syms_54d > - /* cp1dst = (locore_Elf_Addr)(uintptr_t)endp; */ > -copy_syms_4e0: > - mov 0x18(%ebp),%eax > - mov %eax,-0x24(%ebp) > - /* cp2dst = (locore_Elf_Addr)(uintptr_t)endp + cp1size; */ > - mov %ebx,%eax > - xor %edx,%edx > - /* cp1dst = (locore_Elf_Addr)(uintptr_t)endp; */ > - mov 0x18(%ebp),%esi > - xor %edi,%edi > - /* cp2dst = (locore_Elf_Addr)(uintptr_t)endp + cp1size; */ > - add %esi,%eax > - adc %edi,%edx > - mov %eax,-0x2c(%ebp) > - mov %edx,-0x28(%ebp) > - /* (void)memcpy((void *)(uintptr_t)cp1dst, */ > - mov %ebx,%eax > - mov 0x18(%ebp),%edi > - mov -0x10(%ebp),%esi > - cmp $0x4,%ebx > - jae copy_syms_5a8 > -copy_syms_50a: > - test $0x2,%al > - jne copy_syms_57b > - test $0x1,%al > - jne copy_syms_578 > - /* (void)memcpy((void *)(uintptr_t)cp2dst, */ > -copy_syms_512: > - mov -0x1c(%ebp),%ecx > - mov %ecx,%eax > - mov 0x18(%ebp),%edi > - add %ebx,%edi > - mov -0x14(%ebp),%esi > - cmp $0x4,%ecx > - jae copy_syms_584 > -copy_syms_524: > - test $0x2,%al > - jne copy_syms_56c > - test $0x1,%al > - je copy_syms_486 > -copy_syms_530: > - movsb %ds:(%esi),%es:(%edi) > - /* strstart = (cp1src == straddr) ? cp1dst : cp2dst; */ > - mov -0x20(%ebp),%edx > - xor -0x18(%ebp),%edx > - mov -0x14(%ebp),%eax > - xor -0x10(%ebp),%eax > - or %eax,%edx > - jne copy_syms_49a > -copy_syms_545: > - mov 0x18(%ebp),%esi > - jmp copy_syms_49d > - /* if (symaddr < straddr) { */ > -copy_syms_54d: > - mov -0x20(%ebp),%edi > - cmp %edi,-0x18(%ebp) > - jb copy_syms_4e0 > - ja copy_syms_40f > - mov -0x14(%ebp),%edi > - cmp %edi,-0x10(%ebp) > - jb copy_syms_4e0 > - jmp copy_syms_40f > - /* (void)memcpy((void *)(uintptr_t)cp2dst, */ > -copy_syms_56c: > - movsw %ds:(%esi),%es:(%edi) > - test $0x1,%al > - je copy_syms_486 > - jmp copy_syms_530 > - /* (void)memcpy((void *)(uintptr_t)cp1dst, */ > -copy_syms_578: > - movsb %ds:(%esi),%es:(%edi) > - jmp copy_syms_512 > -copy_syms_57b: > - movsw %ds:(%esi),%es:(%edi) > - test $0x1,%al > - nop > - je copy_syms_512 > - jmp copy_syms_578 > - /* (void)memcpy((void *)(uintptr_t)cp2dst, */ > -copy_syms_584: > - test $0x1,%edi > - jne copy_syms_650 > -copy_syms_590: > - test $0x2,%edi > - jne copy_syms_63c > -copy_syms_59c: > - mov %eax,%ecx > - shr $0x2,%ecx > - rep movsl %ds:(%esi),%es:(%edi) > - jmp copy_syms_524 > - /* (void)memcpy((void *)(uintptr_t)cp1dst, */ > -copy_syms_5a8: > - test $0x1,%edi > - jne copy_syms_626 > -copy_syms_5b0: > - test $0x2,%edi > - jne copy_syms_615 > -copy_syms_5b8: > - mov %eax,%ecx > - shr $0x2,%ecx > - rep movsl %ds:(%esi),%es:(%edi) > - jmp copy_syms_50a > - /* (void)memcpy((void *)(uintptr_t)cp2dst, */ > -copy_syms_5c4: > - test $0x1,%edi > - jne copy_syms_666 > -copy_syms_5d0: > - test $0x2,%edi > - jne copy_syms_6a6 > -copy_syms_5dc: > - mov %eax,%ecx > - shr $0x2,%ecx > - rep movsl %ds:(%esi),%es:(%edi) > - jmp copy_syms_457 > - /* (void)memcpy((void *)(uintptr_t)cp1dst, */ > -copy_syms_5e8: > - test $0x1,%edi > - jne copy_syms_68d > -copy_syms_5f4: > - test $0x2,%edi > - jne copy_syms_679 > -copy_syms_5fc: > - mov %eax,%ecx > - shr $0x2,%ecx > - rep movsl %ds:(%esi),%es:(%edi) > - jmp copy_syms_436 > - /* for (i = 0; i < mbt_elf->num && symtabp == NULL && */ > -copy_syms_608: > - test %ecx,%ecx > - jne copy_syms_4ce > - jmp copy_syms_39d > - /* (void)memcpy((void *)(uintptr_t)cp1dst, */ > -copy_syms_615: > - movzwl (%esi),%edx > - mov %dx,(%edi) > - add $0x2,%edi > - add $0x2,%esi > - sub $0x2,%eax > - jmp copy_syms_5b8 > -copy_syms_626: > - movzbl (%esi),%eax > - mov %al,(%edi) > - mov 0x18(%ebp),%eax > - lea 0x1(%eax),%edi > - add $0x1,%esi > - lea -0x1(%ebx),%eax > - jmp copy_syms_5b0 > - /* (void)memcpy((void *)(uintptr_t)cp2dst, */ > -copy_syms_63c: > - movzwl (%esi),%edx > - mov %dx,(%edi) > - add $0x2,%edi > - add $0x2,%esi > - sub $0x2,%eax > - jmp copy_syms_59c > -copy_syms_650: > - movzbl (%esi),%eax > - mov %al,(%edi) > - add $0x1,%edi > - add $0x1,%esi > - mov -0x1c(%ebp),%eax > - sub $0x1,%eax > - jmp copy_syms_590 > -copy_syms_666: > - movzbl (%esi),%eax > - mov %al,(%edi) > - add $0x1,%edi > - add $0x1,%esi > - lea -0x1(%ebx),%eax > - jmp copy_syms_5d0 > - /* (void)memcpy((void *)(uintptr_t)cp1dst, */ > -copy_syms_679: > - movzwl (%esi),%edx > - mov %dx,(%edi) > - add $0x2,%edi > - add $0x2,%esi > - sub $0x2,%eax > - jmp copy_syms_5fc > -copy_syms_68d: > - movzbl (%esi),%eax > - mov %al,(%edi) > - mov 0x18(%ebp),%eax > - lea 0x1(%eax),%edi > - add $0x1,%esi > - mov -0x1c(%ebp),%eax > - sub $0x1,%eax > - jmp copy_syms_5f4 > - /* (void)memcpy((void *)(uintptr_t)cp2dst, */ > -copy_syms_6a6: > - movzwl (%esi),%edx > - mov %dx,(%edi) > - add $0x2,%edi > - add $0x2,%esi > - sub $0x2,%eax > - jmp copy_syms_5dc > -copy_syms_6ba: > - mov -0x14(%ebp),%eax > - mov %eax,-0x10(%ebp) > - mov -0x20(%ebp),%eax > - mov %eax,-0x18(%ebp) > - /* cp1dst = (locore_Elf_Addr)(uintptr_t)endp; */ > - mov 0x18(%ebp),%eax > - mov %eax,-0x24(%ebp) > - jmp copy_syms_486 > - /* if (symtabp == NULL || strtabp == NULL) */ > -copy_syms_6d1: > - test %eax,%eax > - jne copy_syms_3cb > - jmp copy_syms_4ce > -elf_sections_done: > -#endif > - > - jmp .Lbegin > - > - > -#endif /* MULTIBOOT */ > - > -.Lnative_loader: > /* > * Load parameters from the stack (32 bits): > * boothowto, [bootdev], bootinfo, esym, biosextmem, biosbasemem > @@ -1308,7 +562,6 @@ elf_sections_done: > * Done with the parameters! > */ > > -.Lbegin: > /* First, reset the PSL. */ > pushl $PSL_MBO > popfl > @@ -1624,16 +877,6 @@ longmode_hi: > leaq (USPACE-FRAMESIZE)(%rax),%rsp > xorq %rbp,%rbp /* mark end of frames */ > > -#if defined(MULTIBOOT) > - /* It is now safe to parse the Multiboot information structure > - * we saved before from C code. Note that we cannot delay its > - * parsing any more because initgdt (called below) needs to make > - * use of this information. > - */ > - pushq %rsi > - call _C_LABEL(multiboot2_post_reloc) > - popq %rsi > -#endif > xorw %ax,%ax > movw %ax,%gs > movw %ax,%fs > > Index: src/sys/arch/amd64/amd64/machdep.c > diff -u src/sys/arch/amd64/amd64/machdep.c:1.344 > src/sys/arch/amd64/amd64/machdep.c:1.345 > --- src/sys/arch/amd64/amd64/machdep.c:1.344 Fri Dec 13 20:14:25 2019 > +++ src/sys/arch/amd64/amd64/machdep.c Thu Jan 9 00:42:24 2020 > @@ -1,4 +1,4 @@ > -/* $NetBSD: machdep.c,v 1.344 2019/12/13 20:14:25 ad Exp $ */ > +/* $NetBSD: machdep.c,v 1.345 2020/01/09 00:42:24 manu Exp $ */ > > /* > * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011 > @@ -110,10 +110,9 @@ > */ > > #include <sys/cdefs.h> > -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.344 2019/12/13 20:14:25 ad Exp $"); > +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.345 2020/01/09 00:42:24 manu Exp > $"); > > #include "opt_modular.h" > -#include "opt_multiboot.h" > #include "opt_user_ldt.h" > #include "opt_ddb.h" > #include "opt_kgdb.h" > @@ -185,8 +184,6 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v > #include <x86/cpuvar.h> > #include <x86/machdep.h> > > -#include <arch/i386/include/multiboot.h> > - > #include <x86/x86/tsc.h> > > #include <dev/isa/isareg.h> > @@ -374,10 +371,6 @@ cpu_startup(void) > > initmsgbuf((void *)msgbuf_vaddr, round_page(sz)); > > -#ifdef MULTIBOOT > - multiboot2_print_info(); > -#endif > - > minaddr = 0; > > /* > @@ -1511,11 +1504,6 @@ init_x86_64_ksyms(void) > db_machine_init(); > #endif > > -#if defined(MULTIBOOT) > - if (multiboot2_ksyms_addsyms_elf()) > - return; > -#endif > - > #ifndef XENPV > symtab = lookup_bootinfo(BTINFO_SYMTAB); > if (symtab) { > > Index: src/sys/arch/amd64/conf/GENERIC > diff -u src/sys/arch/amd64/conf/GENERIC:1.553 > src/sys/arch/amd64/conf/GENERIC:1.554 > --- src/sys/arch/amd64/conf/GENERIC:1.553 Wed Jan 1 10:36:43 2020 > +++ src/sys/arch/amd64/conf/GENERIC Thu Jan 9 00:42:24 2020 > @@ -1,4 +1,4 @@ > -# $NetBSD: GENERIC,v 1.553 2020/01/01 10:36:43 ryo Exp $ > +# $NetBSD: GENERIC,v 1.554 2020/01/09 00:42:24 manu Exp $ > # > # GENERIC machine description file > # > @@ -22,12 +22,10 @@ include "arch/amd64/conf/std.amd64" > > options INCLUDE_CONFIG_FILE # embed config file in kernel binary > > -#ident "GENERIC-$Revision: 1.553 $" > +#ident "GENERIC-$Revision: 1.554 $" > > maxusers 64 # estimated number of users > > -#options MULTIBOOT # Multiboot support (see multiboot(8)) > - > # delay between "rebooting ..." message and hardware reset, in milliseconds > #options CPURESET_DELAY=2000 > > > Index: src/sys/arch/amd64/conf/files.amd64 > diff -u src/sys/arch/amd64/conf/files.amd64:1.114 > src/sys/arch/amd64/conf/files.amd64:1.115 > --- src/sys/arch/amd64/conf/files.amd64:1.114 Tue Dec 10 02:06:07 2019 > +++ src/sys/arch/amd64/conf/files.amd64 Thu Jan 9 00:42:24 2020 > @@ -1,4 +1,4 @@ > -# $NetBSD: files.amd64,v 1.114 2019/12/10 02:06:07 manu Exp $ > +# $NetBSD: files.amd64,v 1.115 2020/01/09 00:42:24 manu Exp $ > # > # new style config file for amd64 architecture > # > @@ -30,10 +30,6 @@ defflag opt_spectre.h SPECTRE_V2_GCC_MIT > defflag USER_LDT > defflag eisa.h EISA > > -# Multiboot support > -defflag opt_multiboot.h MULTIBOOT > -file arch/x86/x86/multiboot2.c multiboot > - > # Start code > file arch/amd64/amd64/locore.S machdep > file arch/amd64/amd64/vector.S machdep > > Index: src/sys/arch/amd64/conf/kern.ldscript > diff -u src/sys/arch/amd64/conf/kern.ldscript:1.30 > src/sys/arch/amd64/conf/kern.ldscript:1.31 > --- src/sys/arch/amd64/conf/kern.ldscript:1.30 Sun Dec 15 02:56:40 2019 > +++ src/sys/arch/amd64/conf/kern.ldscript Thu Jan 9 00:42:24 2020 > @@ -1,4 +1,4 @@ > -/* $NetBSD: kern.ldscript,v 1.30 2019/12/15 02:56:40 manu Exp $ */ > +/* $NetBSD: kern.ldscript,v 1.31 2020/01/09 00:42:24 manu Exp $ */ > > #include "assym.h" > > @@ -13,17 +13,7 @@ __LARGE_PAGE_SIZE = 0x200000 ; > ENTRY(_start) > SECTIONS > { > - /* > - * multiboot (file_offset) : AT (load_address) > - * file_offset must be below 32k for multiboot 2 specification > - * BIOS boot requires load_address above 0x200000 > - */ > - multiboot 0x1000 : AT (0x200000) > - { > - . = ALIGN(8); > - KEEP(*(multiboot)); > - } > - .text : AT (0x200000 + SIZEOF(multiboot)) > + .text : AT (ADDR(.text) & 0x0fffffff) > { > . = ALIGN(__PAGE_SIZE); > __text_user_start = . ; > -- Ryo ONODERA // r...@tetera.org PGP fingerprint = 82A2 DC91 76E0 A10A 8ABB FD1B F404 27FA C7D1 15F3