| From 5040f7d8abb79bf4240d0b446e2d33d26680d9fc Mon Sep 17 00:00:00 2001 |
| From: Mahesh Bodapati <mbodapat@xilinx.com> |
| Date: Tue, 11 Sep 2018 14:32:20 +0530 |
| Subject: [PATCH 07/11] [Patch, Microblaze]: newlib port for microblaze m64 |
| flag... |
| |
| Conflicts: |
| libgloss/microblaze/_hw_exception_handler.S |
| libgloss/microblaze/_interrupt_handler.S |
| --- |
| libgloss/microblaze/_exception_handler.S | 6 +- |
| libgloss/microblaze/_hw_exception_handler.S | 7 +- |
| libgloss/microblaze/_interrupt_handler.S | 7 +- |
| libgloss/microblaze/_program_clean.S | 6 +- |
| libgloss/microblaze/_program_init.S | 6 +- |
| libgloss/microblaze/crt0.S | 53 ++++++++- |
| libgloss/microblaze/crt1.S | 54 +++++++-- |
| libgloss/microblaze/crt2.S | 52 +++++++-- |
| libgloss/microblaze/crt3.S | 32 +++++- |
| libgloss/microblaze/crt4.S | 37 +++++- |
| libgloss/microblaze/crtinit.S | 120 ++++++++++++++------ |
| libgloss/microblaze/linux-crt0.S | 60 ++++++++-- |
| libgloss/microblaze/linux-syscalls.S | 15 ++- |
| libgloss/microblaze/pgcrtinit.S | 59 +++++++++- |
| libgloss/microblaze/sim-crtinit.S | 31 +++++ |
| libgloss/microblaze/sim-pgcrtinit.S | 31 +++++ |
| newlib/libc/machine/microblaze/longjmp.S | 45 ++++++-- |
| newlib/libc/machine/microblaze/setjmp.S | 33 +++++- |
| 18 files changed, 563 insertions(+), 91 deletions(-) |
| |
| diff --git a/libgloss/microblaze/_exception_handler.S b/libgloss/microblaze/_exception_handler.S |
| index 7a91a781e..0fdff3fec 100644 |
| --- a/libgloss/microblaze/_exception_handler.S |
| +++ b/libgloss/microblaze/_exception_handler.S |
| @@ -30,7 +30,11 @@ |
| */ |
| |
| .text |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .weakext _exception_handler |
| .ent _exception_handler |
| .type _exception_handler, @function |
| diff --git a/libgloss/microblaze/_hw_exception_handler.S b/libgloss/microblaze/_hw_exception_handler.S |
| index 47df945c4..b951a6325 100644 |
| --- a/libgloss/microblaze/_hw_exception_handler.S |
| +++ b/libgloss/microblaze/_hw_exception_handler.S |
| @@ -32,8 +32,11 @@ |
| .text |
| .weakext _hw_exception_handler # HW Exception Handler Label |
| .type _hw_exception_handler, %function |
| - .align 2 |
| - |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| _hw_exception_handler: |
| rted r17, 0 |
| nop |
| diff --git a/libgloss/microblaze/_interrupt_handler.S b/libgloss/microblaze/_interrupt_handler.S |
| index 5bb7329cc..a0ef92df0 100644 |
| --- a/libgloss/microblaze/_interrupt_handler.S |
| +++ b/libgloss/microblaze/_interrupt_handler.S |
| @@ -32,8 +32,11 @@ |
| .text |
| .weakext _interrupt_handler # Interrupt Handler Label |
| .type _interrupt_handler, %function |
| - .align 2 |
| - |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| _interrupt_handler: |
| rtid r14, 0 |
| nop |
| diff --git a/libgloss/microblaze/_program_clean.S b/libgloss/microblaze/_program_clean.S |
| index c46059434..0d55d8ab8 100644 |
| --- a/libgloss/microblaze/_program_clean.S |
| +++ b/libgloss/microblaze/_program_clean.S |
| @@ -33,7 +33,11 @@ |
| # |
| |
| .text |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .globl _program_clean |
| .ent _program_clean |
| _program_clean: |
| diff --git a/libgloss/microblaze/_program_init.S b/libgloss/microblaze/_program_init.S |
| index 0daa42e14..862ef786b 100644 |
| --- a/libgloss/microblaze/_program_init.S |
| +++ b/libgloss/microblaze/_program_init.S |
| @@ -32,7 +32,11 @@ |
| # Dummy file to be replaced by LibGen |
| |
| .text |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .globl _program_init |
| .ent _program_init |
| _program_init: |
| diff --git a/libgloss/microblaze/crt0.S b/libgloss/microblaze/crt0.S |
| index 865a8c269..e4df73b66 100644 |
| --- a/libgloss/microblaze/crt0.S |
| +++ b/libgloss/microblaze/crt0.S |
| @@ -54,7 +54,11 @@ |
| |
| .globl _start |
| .section .vectors.reset, "ax" |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .ent _start |
| .type _start, @function |
| _start: |
| @@ -62,36 +66,64 @@ _start: |
| .end _start |
| |
| .section .vectors.sw_exception, "ax" |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| _vector_sw_exception: |
| brai _exception_handler |
| |
| .section .vectors.interrupt, "ax" |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| + |
| _vector_interrupt: |
| brai _interrupt_handler |
| |
| .section .vectors.hw_exception, "ax" |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| + |
| _vector_hw_exception: |
| brai _hw_exception_handler |
| |
| .section .text |
| .globl _start1 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| + |
| .ent _start1 |
| .type _start1, @function |
| _start1: |
| +#ifdef __arch64__ |
| + lli r13, r0, _SDA_BASE_ |
| + lli r2, r0, _SDA2_BASE_ |
| + lli r1, r0, _stack-32 |
| + brealid r15, _crtinit |
| + nop |
| + addlik r5, r3, 0 |
| + brealid r15, exit |
| + nop |
| +#else |
| la r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| la r2, r0, _SDA2_BASE_ |
| la r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| - |
| brlid r15, _crtinit /* Initialize BSS and run program */ |
| nop |
| |
| - brlid r15, exit /* Call exit with the return value of main */ |
| - addik r5, r3, 0 |
| - |
| + brlid r15, exit /* Call exit with the return value of main */ |
| + addik r5, r3, 0 |
| +#endif |
| /* Control does not reach here */ |
| .end _start1 |
| |
| @@ -101,9 +133,18 @@ _start1: |
| Our simple _exit |
| */ |
| .globl _exit |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| + |
| .ent _exit |
| .type _exit, @function |
| _exit: |
| - bri 0 |
| +#ifdef __arch64__ |
| + breai 0 |
| +#else |
| + bri 0 |
| +#endif |
| .end _exit |
| diff --git a/libgloss/microblaze/crt1.S b/libgloss/microblaze/crt1.S |
| index a8bf74937..b24eeb531 100644 |
| --- a/libgloss/microblaze/crt1.S |
| +++ b/libgloss/microblaze/crt1.S |
| @@ -53,36 +53,67 @@ |
| |
| |
| .section .vectors.sw_exception, "ax" |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| _vector_sw_exception: |
| brai _exception_handler |
| |
| .section .vectors.interrupt, "ax" |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| _vector_interrupt: |
| brai _interrupt_handler |
| |
| .section .vectors.hw_exception, "ax" |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| _vector_hw_exception: |
| brai _hw_exception_handler |
| |
| .section .text |
| .globl _start |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| .ent _start |
| .type _start, @function |
| _start: |
| +#ifdef __arch64__ |
| + lli r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| + lli r2, r0, _SDA2_BASE_ |
| + lli r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| + |
| + brealid r15, _crtinit /* Initialize BSS and run program */ |
| + nop |
| + addlik r5, r3, 0 |
| + brealid r15, exit |
| + nop |
| +#else |
| la r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| la r2, r0, _SDA2_BASE_ |
| - la r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| + la r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| |
| brlid r15, _crtinit /* Initialize BSS and run program */ |
| nop |
| |
| brlid r15, exit /* Call exit with the return value of main */ |
| addik r5, r3, 0 |
| - |
| +#endif |
| /* Control does not reach here */ |
| .end _start |
| |
| @@ -92,11 +123,18 @@ _start: |
| Our simple _exit |
| */ |
| .globl _exit |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .ent _exit |
| .type _exit, @function |
| _exit: |
| +#ifdef __arch64__ |
| + addl r3, r0, r5 |
| +#else |
| add r3, r0, r5 |
| +#endif |
| brki r16, 0x4 /* Return to hook in XMDSTUB */ |
| .end _exit |
| - |
| diff --git a/libgloss/microblaze/crt2.S b/libgloss/microblaze/crt2.S |
| index 34d9f951d..ae4c89ee0 100644 |
| --- a/libgloss/microblaze/crt2.S |
| +++ b/libgloss/microblaze/crt2.S |
| @@ -51,26 +51,56 @@ |
| */ |
| |
| .section .vectors.sw_exception, "ax" |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| _vector_sw_exception: |
| brai _exception_handler |
| |
| .section .vectors.interrupt, "ax" |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| _vector_interrupt: |
| brai _interrupt_handler |
| |
| .section .vectors.hw_exception, "ax" |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| _vector_hw_exception: |
| brai _hw_exception_handler |
| |
| .section .text |
| .globl _start |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| .ent _start |
| .type _start, @function |
| _start: |
| +#ifdef __arch64__ |
| + lli r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| + lli r2, r0, _SDA2_BASE_ |
| + lli r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| + brealid r15, _crtinit /* Initialize BSS and run program */ |
| + nop |
| + addlik r5, r3, 0 |
| + brealid r15, exit |
| + nop |
| +#else |
| la r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| la r2, r0, _SDA2_BASE_ |
| la r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| @@ -80,7 +110,7 @@ _start: |
| |
| brlid r15, exit /* Call exit with the return value of main */ |
| addik r5, r3, 0 |
| - |
| +#endif |
| /* Control does not reach here */ |
| |
| .end _start |
| @@ -90,9 +120,17 @@ _start: |
| Our simple _exit |
| */ |
| .globl _exit |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .ent _exit |
| .type _exit, @function |
| _exit: |
| - bri 0 |
| +#ifdef __arch64__ |
| + breai 0 |
| +#else |
| + bri 0 |
| +#endif |
| .end _exit |
| diff --git a/libgloss/microblaze/crt3.S b/libgloss/microblaze/crt3.S |
| index ebcf207f5..a8bc7839b 100644 |
| --- a/libgloss/microblaze/crt3.S |
| +++ b/libgloss/microblaze/crt3.S |
| @@ -53,10 +53,26 @@ |
| |
| .section .text |
| .globl _start |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .ent _start |
| .type _start, @function |
| _start: |
| +#ifdef __arch64__ |
| + lli r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| + lli r2, r0, _SDA2_BASE_ |
| + lli r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| + |
| + brealid r15, _crtinit /* Initialize BSS and run program */ |
| + nop |
| + |
| + addlik r5, r3, 0 |
| + brealid r15, exit /* Call exit with the return value of main */ |
| + nop |
| +#else |
| la r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| la r2, r0, _SDA2_BASE_ |
| la r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| @@ -66,7 +82,7 @@ _start: |
| |
| brlid r15, exit /* Call exit with the return value of main */ |
| addik r5, r3, 0 |
| - |
| +#endif |
| /* Control does not reach here */ |
| .end _start |
| |
| @@ -76,9 +92,17 @@ _start: |
| Our simple _exit |
| */ |
| .globl _exit |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .ent _exit |
| .type _exit, @function |
| _exit: |
| - bri 0 |
| +#ifdef __arch64__ |
| + breai 0 |
| +#else |
| + bri 0 |
| +#endif |
| .end _exit |
| diff --git a/libgloss/microblaze/crt4.S b/libgloss/microblaze/crt4.S |
| index 4cf0b01a4..54ba473ea 100644 |
| --- a/libgloss/microblaze/crt4.S |
| +++ b/libgloss/microblaze/crt4.S |
| @@ -53,10 +53,27 @@ |
| |
| .section .text |
| .globl _start |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| + |
| .ent _start |
| .type _start, @function |
| _start: |
| +#ifdef __arch64__ |
| + lli r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| + lli r2, r0, _SDA2_BASE_ |
| + lli r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| + |
| + brealid r15, _crtinit /* Initialize BSS and run program */ |
| + nop |
| + |
| + addlik r5, r3, 0 |
| + brealid r15, exit /* Call exit with the return value of main */ |
| + nop |
| +#else |
| la r13, r0, _SDA_BASE_ /* Set the Small Data Anchors and the stack pointer */ |
| la r2, r0, _SDA2_BASE_ |
| la r1, r0, _stack-32 /* 16 bytes (4 words are needed by crtinit for args and link reg */ |
| @@ -68,19 +85,27 @@ _start: |
| addik r5, r3, 0 |
| |
| /* Control does not reach here */ |
| - |
| +#endif |
| .end _start |
| |
| - |
| /* |
| _exit |
| Our simple _exit |
| */ |
| .globl _exit |
| - .align 2 |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| + .align 2 |
| +#endif |
| .ent _exit |
| .type _exit, @function |
| _exit: |
| - brlid r15,elf_process_exit |
| - nop |
| +#ifdef __arch64__ |
| + brealid r15,elf_process_exit |
| + nop |
| +#else |
| + brlid r15,elf_process_exit |
| + nop |
| +#endif |
| .end _exit |
| diff --git a/libgloss/microblaze/crtinit.S b/libgloss/microblaze/crtinit.S |
| index 86c6dfcb0..854117536 100644 |
| --- a/libgloss/microblaze/crtinit.S |
| +++ b/libgloss/microblaze/crtinit.S |
| @@ -29,59 +29,115 @@ |
| */ |
| |
| .globl _crtinit |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| .ent _crtinit |
| .type _crtinit, @function |
| _crtinit: |
| - addi r1, r1, -40 /* Save Link register */ |
| - swi r15, r1, 0 |
| +#ifdef __arch64__ |
| + addli r1, r1, -40 /* Save Link register */ |
| + sli r15, r1, 0 |
| |
| - addi r6, r0, __sbss_start /* clear SBSS */ |
| - addi r7, r0, __sbss_end |
| - rsub r18, r6, r7 |
| - blei r18, .Lendsbss |
| + addli r6, r0, __sbss_start /* clear SBSS */ |
| + addli r7, r0, __sbss_end |
| + rsubl r18, r6, r7 |
| + bealei r18, .Lendsbss |
| |
| .Lloopsbss: |
| - swi r0, r6, 0 |
| - addi r6, r6, 4 |
| - rsub r18, r6, r7 |
| - bgti r18, .Lloopsbss |
| + sli r0, r6, 0 |
| + addli r6, r6, 4 |
| + rsubl r18, r6, r7 |
| + beagti r18, .Lloopsbss |
| .Lendsbss: |
| - |
| - addi r6, r0, __bss_start /* clear BSS */ |
| - addi r7, r0, __bss_end |
| - rsub r18, r6, r7 |
| - blei r18, .Lendbss |
| + addli r6, r0, __bss_start /* clear BSS */ |
| + addli r7, r0, __bss_end |
| + rsubl r18, r6, r7 |
| + bealei r18, .Lendbss |
| .Lloopbss: |
| - swi r0, r6, 0 |
| - addi r6, r6, 4 |
| - rsub r18, r6, r7 |
| - bgti r18, .Lloopbss |
| + sli r0, r6, 0 |
| + addli r6, r6, 4 |
| + rsubl r18, r6, r7 |
| + beagti r18, .Lloopbss |
| .Lendbss: |
| |
| - brlid r15, _program_init /* Initialize the program */ |
| + brealid r15, _program_init /* Initialize the program */ |
| + nop |
| + brealid r15, __init /* Invoke language initialization functions */ |
| + nop |
| + |
| + addli r6, r0, 0 /* Initialize argc = 1 and argv = NULL and envp = NULL */ |
| + addli r7, r0, 0 |
| + addli r5, r0, 0 |
| + brealid r15, main /* Execute the program */ |
| nop |
| + addlik r19, r3, 0 /* Save return value */ |
| + |
| + brealid r15, __fini /* Invoke language cleanup functions */ |
| + nop |
| + |
| + brealid r15, _program_clean /* Cleanup the program */ |
| + nop |
| + |
| + ll r15, r1, r0 /* Return back to CRT */ |
| + |
| + addlik r3, r19, 0 /* Restore return value */ |
| + addli r1, r1, 40 |
| + rtsd r15, 8 |
| + nop |
| +#else |
| + addi r1, r1, -40 /* Save Link register */ |
| + swi r15, r1, 0 |
| + |
| + addi r6, r0, __sbss_start /* clear SBSS */ |
| + addi r7, r0, __sbss_end |
| + rsub r18, r6, r7 |
| + blei r18, .Lendsbss |
| + |
| +.Lloopsbss: |
| + swi r0, r6, 0 |
| + addi r6, r6, 4 |
| + rsub r18, r6, r7 |
| + bgti r18, .Lloopsbss |
| +.Lendsbss: |
| + |
| + addi r6, r0, __bss_start /* clear BSS */ |
| + addi r7, r0, __bss_end |
| + rsub r18, r6, r7 |
| + blei r18, .Lendbss |
| +.Lloopbss: |
| + swi r0, r6, 0 |
| + addi r6, r6, 4 |
| + rsub r18, r6, r7 |
| + bgti r18, .Lloopbss |
| +.Lendbss: |
| + |
| + brlid r15, _program_init /* Initialize the program */ |
| + nop |
| |
| brlid r15, __init /* Invoke language initialization functions */ |
| nop |
| - |
| - addi r6, r0, 0 /* Initialize argc = 1 and argv = NULL and envp = NULL */ |
| - addi r7, r0, 0 |
| - brlid r15, main /* Execute the program */ |
| - addi r5, r0, 0 |
| + |
| + addi r6, r0, 0 /* Initialize argc = 1 and argv = NULL and envp = NULL */ |
| + addi r7, r0, 0 |
| + brlid r15, main /* Execute the program */ |
| + addi r5, r0, 0 |
| |
| addik r19, r3, 0 /* Save return value */ |
| - |
| + |
| brlid r15, __fini /* Invoke language cleanup functions */ |
| nop |
| - |
| - brlid r15, _program_clean /* Cleanup the program */ |
| - nop |
| |
| - lw r15, r1, r0 /* Return back to CRT */ |
| + brlid r15, _program_clean /* Cleanup the program */ |
| + nop |
| + |
| + lw r15, r1, r0 /* Return back to CRT */ |
| |
| addik r3, r19, 0 /* Restore return value */ |
| - rtsd r15, 8 |
| - addi r1, r1, 40 |
| + rtsd r15, 8 |
| + addi r1, r1, 40 |
| +#endif |
| .end _crtinit |
| |
| diff --git a/libgloss/microblaze/linux-crt0.S b/libgloss/microblaze/linux-crt0.S |
| index 8650bb5d2..503439b2e 100644 |
| --- a/libgloss/microblaze/linux-crt0.S |
| +++ b/libgloss/microblaze/linux-crt0.S |
| @@ -18,26 +18,50 @@ |
| .ent _start |
| .type _start, @function |
| _start: |
| - la r13, r0, _SDA_BASE_ |
| - la r2, r0, _SDA2_BASE_ |
| +#ifdef __arch64__ |
| + lli r13, r0, _SDA_BASE_ |
| + lli r2, r0, _SDA2_BASE_ |
| |
| - brlid r15, __init |
| + brealid r15, __init |
| nop |
| |
| - lwi r5, r1, 0 |
| - addik r6, r1, 4 |
| + lli r5, r1, 0 |
| + addlik r6, r1, 4 |
| |
| # Add argc * 4. |
| - addk r7, r5, r5 |
| - addk r7, r7, r7 |
| + addlk r7, r5, r5 |
| + addlk r7, r7, r7 |
| |
| - brlid r15, main |
| # Now add 4 + r1 (i.e r6) in the delayslot. |
| - addk r7, r7, r6 |
| + addlk r7, r7, r6 |
| + brealid r15, main |
| + nop |
| + addlik r5, r3, 0 |
| + brealid r15, exit |
| + nop |
| + .size _start, . - _start |
| +#else |
| + la r13, r0, _SDA_BASE_ |
| + la r2, r0, _SDA2_BASE_ |
| + |
| + brlid r15, __init |
| + nop |
| + |
| + lwi r5, r1, 0 |
| + addik r6, r1, 4 |
| |
| - brlid r15, exit |
| + # Add argc * 4. |
| + addk r7, r5, r5 |
| + addk r7, r7, r7 |
| + |
| + brlid r15, main |
| + # Now add 4 + r1 (i.e r6) in the delayslot. |
| + addk r7, r7, r6 |
| + |
| + brlid r15, exit |
| addik r5, r3, 0 |
| - .size _start, . - _start |
| + .size _start, . - _start |
| +#endif |
| .end _start |
| |
| /* Replacement for the GCC provided crti.S. This one avoids the |
| @@ -45,14 +69,28 @@ _start: |
| insn exceptions when running in user-space). */ |
| .section .init, "ax" |
| .global __init |
| +#ifdef __arch64__ |
| + .align 3 |
| +__init: |
| + addlik r1, r1, -8 |
| + sl r15, r0, r1 |
| +#else |
| .align 2 |
| __init: |
| addik r1, r1, -8 |
| sw r15, r0, r1 |
| |
| +#endif |
| .section .fini, "ax" |
| .global __fini |
| +#ifdef __arch64__ |
| + .align 3 |
| +__fini: |
| + addlik r1, r1, -8 |
| + sl r15, r0, r1 |
| +#else |
| .align 2 |
| __fini: |
| addik r1, r1, -8 |
| sw r15, r0, r1 |
| +#endif |
| diff --git a/libgloss/microblaze/linux-syscalls.S b/libgloss/microblaze/linux-syscalls.S |
| index 506de78fd..8594f136e 100644 |
| --- a/libgloss/microblaze/linux-syscalls.S |
| +++ b/libgloss/microblaze/linux-syscalls.S |
| @@ -20,8 +20,9 @@ |
| #define GLOBAL(name) .global name; FUNC(name) |
| #define SIZE(name) .size name, .-name |
| |
| +#ifdef __arch64__ |
| # define SYSCALL_BODY(name) \ |
| - addik r12, r0, SYS_ ## name; \ |
| + addlik r12, r0, SYS_ ## name; \ |
| brki r14, 8; \ |
| rtsd r15, 8; \ |
| nop; |
| @@ -31,6 +32,18 @@ |
| SYSCALL_BODY(name); \ |
| SIZE(_ ## name) |
| |
| +#else |
| +# define SYSCALL_BODY(name) \ |
| + addik r12, r0, SYS_ ## name; \ |
| + brki r14, 8; \ |
| + rtsd r15, 8; \ |
| + nop; |
| + |
| +# define SYSCALL(name) \ |
| + GLOBAL(_ ## name); \ |
| + SYSCALL_BODY(name); \ |
| + SIZE(_ ## name) |
| +#endif |
| SYSCALL(brk) |
| SYSCALL(exit) |
| SYSCALL(read) |
| diff --git a/libgloss/microblaze/pgcrtinit.S b/libgloss/microblaze/pgcrtinit.S |
| index 25930821c..638dbd383 100644 |
| --- a/libgloss/microblaze/pgcrtinit.S |
| +++ b/libgloss/microblaze/pgcrtinit.S |
| @@ -29,10 +29,66 @@ |
| |
| |
| .globl _crtinit |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| .ent _crtinit |
| |
| _crtinit: |
| +#ifdef __arch64__ |
| + |
| + addli r1, r1, -40 /* Save Link register */ |
| + sli r15, r1, 0 |
| + |
| + addli r6, r0, __sbss_start /* clear SBSS */ |
| + addli r7, r0, __sbss_end |
| + rsubl r18, r6, r7 |
| + bealei r18, .Lendsbss |
| +.Lloopsbss: |
| + sli r0, r6, 0 |
| + addli r6, r6, 4 |
| + rsubl r18, r6, r7 |
| + beagti r18, .Lloopsbss |
| +.Lendsbss: |
| + |
| + addli r6, r0, __bss_start /* clear BSS */ |
| + addli r7, r0, __bss_end |
| + rsubl r18, r6, r7 |
| + bealei r18, .Lendbss |
| +.Lloopbss: |
| + sli r0, r6, 0 |
| + addli r6, r6, 4 |
| + rsubl r18, r6, r7 |
| + beagti r18, .Lloopbss |
| +.Lendbss: |
| + |
| + brealid r15, _program_init /* Initialize the program */ |
| + nop |
| + brealid r15, _profile_init /* Initialize profiling library */ |
| + nop |
| + brealid r15, __init /* Invoke language initialization functions */ |
| + nop |
| + addli r6, r0, 0 /* Initialize argc = 1 and argv = NULL and envp = NULL */ |
| + addli r7, r0, 0 |
| + addli r5, r0, 0 |
| + brealid r15, main /* Execute the program */ |
| + nop |
| + addlik r19, r3, 0 /* Save return value */ |
| + |
| + brealid r15, __fini /* Invoke language cleanup functions */ |
| + nop |
| + brealid r15, _profile_clean /* Cleanup profiling library */ |
| + nop |
| + brealid r15, _program_clean /* Cleanup the program */ |
| + nop |
| + ll r15, r1, r0 /* Return back to CRT */ |
| + addlik r3, r19, 0 /* Restore return value */ |
| + addli r1, r1, 40 |
| + rtsd r15, 8 |
| + nop |
| +#else |
| addi r1, r1, -40 /* Save Link register */ |
| swi r15, r1, 0 |
| |
| @@ -86,7 +142,8 @@ _crtinit: |
| |
| lw r15, r1, r0 /* Return back to CRT */ |
| addik r3, r19, 0 /* Restore return value */ |
| - rtsd r15, 8 |
| + rtsd r15, 8 |
| addi r1, r1, 40 |
| +#endif |
| .end _crtinit |
| |
| diff --git a/libgloss/microblaze/sim-crtinit.S b/libgloss/microblaze/sim-crtinit.S |
| index 74586d9a7..9892cb0bd 100644 |
| --- a/libgloss/microblaze/sim-crtinit.S |
| +++ b/libgloss/microblaze/sim-crtinit.S |
| @@ -35,10 +35,39 @@ |
| # |
| |
| .globl _crtinit |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| .ent _crtinit |
| |
| _crtinit: |
| +#ifdef __arch64__ |
| + addli r1, r1, -40 /* Save Link register */ |
| + sli r15, r1, 0 |
| + |
| + brealid r15, _program_init /* Initialize the program */ |
| + nop |
| + brealid r15, __init /* Invoke language initialization functions */ |
| + nop |
| + addli r6, r0, 0 /* Initialize argc = 1 and argv = NULL and envp = NULL */ |
| + addli r7, r0, 0 |
| + addli r5, r0, 0 |
| + brealid r15, main /* Execute the program */ |
| + nop |
| + addlik r19, r3, 0 /* Save return value */ |
| + |
| + brealid r15, __fini /* Invoke language cleanup functions */ |
| + nop |
| + brealid r15, _program_clean /* Cleanup the program */ |
| + nop |
| + ll r15, r1, r0 /* Return back to CRT */ |
| + addlik r3, r19, 0 /* Restore return value */ |
| + addli r1, r1, 40 |
| + rtsd r15, 8 |
| + nop |
| +#else |
| addi r1, r1, -40 /* Save Link register */ |
| swi r15, r1, 0 |
| |
| @@ -63,7 +92,9 @@ _crtinit: |
| |
| lw r15, r1, r0 /* Return back to CRT */ |
| addik r3, r19, 0 /* Restore return value */ |
| + |
| rtsd r15, 8 |
| addi r1, r1, 40 |
| +#endif |
| .end _crtinit |
| |
| diff --git a/libgloss/microblaze/sim-pgcrtinit.S b/libgloss/microblaze/sim-pgcrtinit.S |
| index 82ebccad4..939f5372f 100644 |
| --- a/libgloss/microblaze/sim-pgcrtinit.S |
| +++ b/libgloss/microblaze/sim-pgcrtinit.S |
| @@ -35,10 +35,40 @@ |
| # |
| |
| .globl _crtinit |
| +#ifdef __arch64__ |
| + .align 3 |
| +#else |
| .align 2 |
| +#endif |
| .ent _crtinit |
| |
| _crtinit: |
| +#ifdef __arch64__ |
| + addli r1, r1, -40 /* Save Link register */ |
| + sli r15, r1, 0 |
| + |
| + brealid r15, _program_init /* Initialize the program */ |
| + nop |
| + brealid r15, _profile_init /* Initialize profiling library */ |
| + nop |
| + brealid r15, __init /* Invoke language initialization functions */ |
| + nop |
| + addli r6, r0, 0 /* Initialize argc = 1 and argv = NULL and envp = NULL */ |
| + addli r7, r0, 0 |
| + addli r5, r0, 0 |
| + brealid r15, main /* Execute the program */ |
| + nop |
| + brealid r15, __fini /* Invoke language cleanup functions */ |
| + nop |
| + brealid r15, _profile_clean /* Cleanup profiling library */ |
| + nop |
| + brealid r15, _program_clean /* Cleanup the program */ |
| + nop |
| + ll r15, r1, r0 /* Return back to CRT */ |
| + addli r1, r1, 40 |
| + rtsd r15, 8 |
| + nop |
| +#else |
| addi r1, r1, -40 /* Save Link register */ |
| swi r15, r1, 0 |
| |
| @@ -68,5 +98,6 @@ _crtinit: |
| lw r15, r1, r0 /* Return back to CRT */ |
| rtsd r15, 8 |
| addi r1, r1, 40 |
| +#endif |
| .end _crtinit |
| |
| diff --git a/newlib/libc/machine/microblaze/longjmp.S b/newlib/libc/machine/microblaze/longjmp.S |
| index f972bbd88..5ed1c2626 100644 |
| --- a/newlib/libc/machine/microblaze/longjmp.S |
| +++ b/newlib/libc/machine/microblaze/longjmp.S |
| @@ -51,16 +51,46 @@ |
| |
| .globl longjmp |
| .section .text |
| -.align 2 |
| +#ifdef __arch64__ |
| +.align 3 |
| +#else |
| +.align 2 |
| +#endif |
| .ent longjmp |
| longjmp: |
| +#ifdef __arch64__ |
| + lli r1, r5, 0 |
| + lli r13, r5, 4 |
| + lli r14, r5, 8 |
| + lli r15, r5, 12 |
| + lli r16, r5, 16 |
| + lli r17, r5, 20 |
| + lli r18, r5, 24 |
| + lli r19, r5, 28 |
| + lli r20, r5, 32 |
| + lli r21, r5, 36 |
| + lli r22, r5, 40 |
| + lli r23, r5, 44 |
| + lli r24, r5, 48 |
| + lli r25, r5, 52 |
| + lli r26, r5, 56 |
| + lli r27, r5, 60 |
| + lli r28, r5, 64 |
| + lli r29, r5, 68 |
| + lli r30, r5, 72 |
| + lli r31, r5, 76 |
| + |
| + or r3, r0, r6 |
| + rtsd r15, 8 |
| + nop |
| +#else |
| lwi r1, r5, 0 |
| lwi r13, r5, 4 |
| lwi r14, r5, 8 |
| - lwi r15, r5, 12 |
| + lwi r15, r5, 12 |
| lwi r16, r5, 16 |
| lwi r17, r5, 20 |
| - lwi r18, r5, 24 |
| + lwi r18, r5, 24 |
| lwi r19, r5, 28 |
| lwi r20, r5, 32 |
| lwi r21, r5, 36 |
| @@ -69,12 +99,13 @@ longjmp: |
| lwi r24, r5, 48 |
| lwi r25, r5, 52 |
| lwi r26, r5, 56 |
| - lwi r27, r5, 60 |
| - lwi r28, r5, 64 |
| - lwi r29, r5, 68 |
| + lwi r27, r5, 60 |
| + lwi r28, r5, 64 |
| + lwi r29, r5, 68 |
| lwi r30, r5, 72 |
| - lwi r31, r5, 76 |
| + lwi r31, r5, 76 |
| |
| rtsd r15, 8 |
| or r3, r0, r6 |
| +#endif |
| .end longjmp |
| diff --git a/newlib/libc/machine/microblaze/setjmp.S b/newlib/libc/machine/microblaze/setjmp.S |
| index cdd87c76f..971862bcb 100644 |
| --- a/newlib/libc/machine/microblaze/setjmp.S |
| +++ b/newlib/libc/machine/microblaze/setjmp.S |
| @@ -50,9 +50,39 @@ |
| |
| .globl setjmp |
| .section .text |
| -.align 2 |
| +#ifdef __arch64__ |
| +.align 3 |
| +#else |
| +.align 2 |
| +#endif |
| .ent setjmp |
| setjmp: |
| +#ifdef __arch64__ |
| + sli r1, r5, 0 |
| + sli r13, r5, 4 |
| + sli r14, r5, 8 |
| + sli r15, r5, 12 |
| + sli r16, r5, 16 |
| + sli r17, r5, 20 |
| + sli r18, r5, 24 |
| + sli r19, r5, 28 |
| + sli r20, r5, 32 |
| + sli r21, r5, 36 |
| + sli r22, r5, 40 |
| + sli r23, r5, 44 |
| + sli r24, r5, 48 |
| + sli r25, r5, 52 |
| + sli r26, r5, 56 |
| + sli r27, r5, 60 |
| + sli r28, r5, 64 |
| + sli r29, r5, 68 |
| + sli r30, r5, 72 |
| + sli r31, r5, 76 |
| + |
| + or r3, r0, r0 |
| + rtsd r15, 8 |
| + nop |
| +#else |
| swi r1, r5, 0 |
| swi r13, r5, 4 |
| swi r14, r5, 8 |
| @@ -76,4 +106,5 @@ setjmp: |
| |
| rtsd r15, 8 |
| or r3, r0, r0 |
| +#endif |
| .end setjmp |
| -- |
| 2.17.1 |
| |