On Sat, Jan 04, 2020 at 08:43:16AM +0100, Maxime Villard wrote: > +.section multiboot,"",@note > Why @note? It will be in the .text anyway. Also why no dot in the section > name? That's supposed to be the naming convention.
The idea is that one day if ld gets more reasonable, it could go in non-loading note ection at the beginning of the binary, but if you prefer .text, let us go with that. On the section name, ELF specification says "Section names with a dot (.) prefix are reserved for the system" (TIS ELF specification version 1.2), section names without a dot are allowed, and we use plenty of them in our kernels (e.g.: link_set_* sections). Our naming convention is not obvious to me, nor what the specification means by "the system" here. My hunch would be to avoid using an abitratry name inside a reserved namespace, althought we already did it. If you have a strong opinion on it, I can stand a leading dot in the multiboot section name. > I don't know if you realize, but you landed a huge pile > of crap in the middle of the amd64 locore I have been working on this, but the priority was obviously the boot problem. Attached is my latest change set, including the locore cleanup you asked for. -- Emmanuel Dreyfus m...@netbsd.org
Index: sys/arch/amd64/amd64/locore.S =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/amd64/locore.S,v retrieving revision 1.195 diff -U4 -r1.195 locore.S --- sys/arch/amd64/amd64/locore.S 15 Dec 2019 02:58:21 -0000 1.195 +++ sys/arch/amd64/amd64/locore.S 5 Jan 2020 00:41:18 -0000 @@ -431,10 +431,10 @@ .size tmpstk, tmpstk - . .space 512 tmpstk: -.section multiboot,"a" #if defined(MULTIBOOT) +.section multiboot .align 8 .globl Multiboot2_Header _C_LABEL(Multiboot2_Header): .int MULTIBOOT2_HEADER_MAGIC @@ -473,9 +473,9 @@ .int 8 /* sizeof(struct multiboot_tag) */ .align 8 .globl Multiboot2_Header_end _C_LABEL(Multiboot2_Header_end): -#endif /* MULTIBOOT */ +#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. @@ -544,109 +544,13 @@ 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 + /* Assume non overlap and aligned size */ + shrq $3, %rcx 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 */ @@ -691,10 +595,10 @@ multiboot2_loader32b: xor %eax, %eax /* - * Reload multiboot info from target location - */ + * Reload multiboot info from target location + */ movl _RELOC(multiboot2_info_ptr), %ebx call *%esi .align 16 @@ -712,9 +616,9 @@ .quad 0 multiboot2_info_ptr: .long 0 - + .align 16 multiboot2_loader: /* * Here we would like to call multiboot2_pre_reloc() but @@ -724,9 +628,8 @@ * 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 /* @@ -741,10 +644,10 @@ /* * Set multiboot2_enabled */ - movl $1,%eax - movl %eax,RELOC(multiboot2_enabled) + movb $1,%al + movb %al,RELOC(multiboot2_enabled) /* * Look for MULTIBOOT_TAG_TYPE_ELF_SECTIONS */ @@ -776,408 +679,19 @@ 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 + call _C_LABEL(multiboot2_copy_syms32) - /* Asjust esym as a 64 bit pointer if esymp was set */ + /* Adjust 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 @@ -1629,11 +1143,15 @@ * 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. */ + movb _C_LABEL(multiboot2_enabled),%al + cmpb $0,%al + je no_multiboot2_post_reloc pushq %rsi call _C_LABEL(multiboot2_post_reloc) popq %rsi +no_multiboot2_post_reloc: #endif xorw %ax,%ax movw %ax,%gs movw %ax,%fs Index: sys/arch/amd64/conf/GENERIC =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/conf/GENERIC,v retrieving revision 1.551 diff -U4 -r1.551 GENERIC --- sys/arch/amd64/conf/GENERIC 14 Dec 2019 07:45:20 -0000 1.551 +++ sys/arch/amd64/conf/GENERIC 5 Jan 2020 00:41:18 -0000 @@ -25,9 +25,9 @@ #ident "GENERIC-$Revision: 1.551 $" maxusers 64 # estimated number of users -#options MULTIBOOT # Multiboot support (see multiboot(8)) +options MULTIBOOT # Multiboot support (see multiboot(8)) # delay between "rebooting ..." message and hardware reset, in milliseconds #options CPURESET_DELAY=2000 Index: sys/arch/amd64/conf/Makefile.amd64 =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/conf/Makefile.amd64,v retrieving revision 1.80 diff -U4 -r1.80 Makefile.amd64 --- sys/arch/amd64/conf/Makefile.amd64 14 Nov 2019 16:23:52 -0000 1.80 +++ sys/arch/amd64/conf/Makefile.amd64 5 Jan 2020 00:41:18 -0000 @@ -93,9 +93,9 @@ .if defined(KASLR) EXTRA_LINKFLAGS= --split-by-file=0x100000 -r -d KERNLDSCRIPT?= ${AMD64}/conf/kern.ldscript.kaslr .else -EXTRA_LINKFLAGS= -z max-page-size=0x200000 +EXTRA_LINKFLAGS= -z max-page-size=0x1000 KERNLDSCRIPT?= ${AMD64}/conf/kern.ldscript .endif LINKFLAGS_NORMAL= -X Index: sys/arch/amd64/conf/files.amd64 =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/conf/files.amd64,v retrieving revision 1.114 diff -U4 -r1.114 files.amd64 --- sys/arch/amd64/conf/files.amd64 10 Dec 2019 02:06:07 -0000 1.114 +++ sys/arch/amd64/conf/files.amd64 5 Jan 2020 00:41:18 -0000 @@ -32,8 +32,9 @@ # Multiboot support defflag opt_multiboot.h MULTIBOOT file arch/x86/x86/multiboot2.c multiboot +file arch/amd64/amd64/copy_syms32.S multiboot # Start code file arch/amd64/amd64/locore.S machdep file arch/amd64/amd64/vector.S machdep Index: sys/arch/amd64/conf/kern.ldscript =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/conf/kern.ldscript,v retrieving revision 1.30 diff -U4 -r1.30 kern.ldscript --- sys/arch/amd64/conf/kern.ldscript 15 Dec 2019 02:56:40 -0000 1.30 +++ sys/arch/amd64/conf/kern.ldscript 5 Jan 2020 00:41:18 -0000 @@ -12,20 +12,11 @@ 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) + .text : AT (ADDR(.text) & 0x0fffffff) { - . = ALIGN(8); KEEP(*(multiboot)); - } - .text : AT (0x200000 + SIZEOF(multiboot)) - { . = ALIGN(__PAGE_SIZE); __text_user_start = . ; *(.text.user) . = ALIGN(__PAGE_SIZE); --- /dev/null 2020-01-04 05:33:25.257148725 +0100 +++ sys/arch/amd64/amd64/copy_syms32.S 2019-12-31 03:02:13.628539586 +0100 @@ -0,0 +1,391 @@ +#include <machine/asm.h> + + .code32 + .globl _C_LABEL(multiboot2_copy_syms32) +/* + * This is multiboot2_copy_syms() from + * src/sys/arch/x86/x86/multiboot2.c + * built with -m32 -mcmodel=32 -D_LOCORE_64 + */ +_C_LABEL(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