aboutsummaryrefslogtreecommitdiffstats
path: root/meta-microblaze/recipes-core/newlib/files/0007-Patch-Microblaze-newlib-port-for-microblaze-m64-flag.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-microblaze/recipes-core/newlib/files/0007-Patch-Microblaze-newlib-port-for-microblaze-m64-flag.patch')
-rw-r--r--meta-microblaze/recipes-core/newlib/files/0007-Patch-Microblaze-newlib-port-for-microblaze-m64-flag.patch1139
1 files changed, 1139 insertions, 0 deletions
diff --git a/meta-microblaze/recipes-core/newlib/files/0007-Patch-Microblaze-newlib-port-for-microblaze-m64-flag.patch b/meta-microblaze/recipes-core/newlib/files/0007-Patch-Microblaze-newlib-port-for-microblaze-m64-flag.patch
new file mode 100644
index 00000000..f3e20253
--- /dev/null
+++ b/meta-microblaze/recipes-core/newlib/files/0007-Patch-Microblaze-newlib-port-for-microblaze-m64-flag.patch
@@ -0,0 +1,1139 @@
+From e7b0c93274c2f51adc7c20c24a28d3cd5974fddc 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...
+
+Upstream-Status: Pending
+
+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.37.1 (Apple Git-137.1)
+