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

Reply via email to