choice
prompt "musl Version"
depends on TOOLCHAINOPTS && USE_MUSL
- default MUSL_VERSION_0_9_7
+ default MUSL_VERSION_0_9_8
help
Select the version of musl you wish to use.
- config MUSL_VERSION_0_9_7
- bool "musl 0.9.7"
+ config MUSL_VERSION_0_9_8
+ bool "musl 0.9.8"
endchoice
config MUSL_VERSION
string
depends on USE_MUSL
- default "0.9.7" if MUSL_VERSION_0_9_7
- default "0.9.7"
+ default "0.9.8" if MUSL_VERSION_0_9_8
+ default "0.9.8"
if !TOOLCHAINOPTS
- config MUSL_VERSION_0_9_7
+ config MUSL_VERSION_0_9_8
default y if USE_MUSL
bool
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=git://git.musl-libc.org/musl
PKG_SOURCE_SUBDIR=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=2df4f6f17b1f14684cb991c53c9ef0ddaa8c7bad
+PKG_SOURCE_VERSION:=e6dcebd5efa2d390f0a24dc11444024e9fd1990c
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
LIBC_SO_VERSION:=$(PKG_VERSION)
PATCH_DIR:=$(PATH_PREFIX)/patches-$(PKG_VERSION)
+++ /dev/null
-Date: Sat, 20 Oct 2012 22:15:44 +0200
-From: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
-To: musl@...ts.openwall.com
-Cc: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
-Subject: [PATCH 3/4] Import BSD functions defined in <netinet/ether.h> from NetBSD
-
-Signed-off-by: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
----
- include/netinet/ether.h | 14 ++++
- src/network/ethers.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 194 insertions(+)
- create mode 100644 include/netinet/ether.h
- create mode 100644 src/network/ethers.c
-
-diff --git a/include/netinet/ether.h b/include/netinet/ether.h
-new file mode 100644
-index 0000000..44c614e
---- /dev/null
-+++ b/include/netinet/ether.h
-@@ -0,0 +1,10 @@
-+#ifndef _NETINET_ETHER_H
-+#define _NETINET_ETHER_H
-+
-+char *ether_ntoa(const struct ether_addr *);
-+struct ether_addr *ether_aton(const char *);
-+int ether_ntohost(char *, const struct ether_addr *);
-+int ether_hostton(const char *, struct ether_addr *);
-+int ether_line(const char *, struct ether_addr *, char *);
-+
-+#endif /* !_NETINET_ETHER_H */
-diff --git a/src/network/ethers.c b/src/network/ethers.c
-new file mode 100644
-index 0000000..8014581
---- /dev/null
-+++ b/src/network/ethers.c
-@@ -0,0 +1,180 @@
-+/* Origin NetBSD: src/lib/libc/net/ethers.c */
-+
-+/*
-+ * ethers(3N) a la Sun.
-+ *
-+ * Written by Roland McGrath <roland@...b.com> 10/14/93.
-+ * Public domain.
-+ *
-+ * port for musl by Abdoulaye Walsimou GAYE <awg@...toolkit.org> 2012/10/15
-+ */
-+
-+#define _BSD_SOURCE
-+#include <net/ethernet.h>
-+#include <netinet/ether.h>
-+
-+#include <sys/param.h>
-+#include <assert.h>
-+#include <errno.h>
-+#include <paths.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#ifndef _PATH_ETHERS
-+#define _PATH_ETHERS "/etc/ethers"
-+#endif
-+
-+/*
-+ * ether_ntoa():
-+ * This function converts this structure into an ASCII string of the form
-+ * ``xx:xx:xx:xx:xx:xx'', consisting of 6 hexadecimal numbers separated
-+ * by colons. It returns a pointer to a static buffer that is reused for
-+ * each call.
-+ */
-+char *ether_ntoa(const struct ether_addr *e)
-+{
-+ static char a[18];
-+
-+ assert(e != NULL);
-+
-+ (void) snprintf(a, sizeof a, "%02x:%02x:%02x:%02x:%02x:%02x",
-+ e->ether_addr_octet[0], e->ether_addr_octet[1],
-+ e->ether_addr_octet[2], e->ether_addr_octet[3],
-+ e->ether_addr_octet[4], e->ether_addr_octet[5]);
-+ return a;
-+}
-+
-+/*
-+ * ether_aton():
-+ * This function converts an ASCII string of the same form and to a structure
-+ * containing the 6 octets of the address. It returns a pointer to a
-+ * static structure that is reused for each call.
-+ */
-+struct ether_addr *ether_aton(const char *s)
-+{
-+ static struct ether_addr n;
-+ unsigned int i[6];
-+
-+ assert(s != NULL);
-+
-+ if (sscanf(s, " %x:%x:%x:%x:%x:%x ", &i[0], &i[1],
-+ &i[2], &i[3], &i[4], &i[5]) == 6) {
-+ n.ether_addr_octet[0] = (unsigned char)i[0];
-+ n.ether_addr_octet[1] = (unsigned char)i[1];
-+ n.ether_addr_octet[2] = (unsigned char)i[2];
-+ n.ether_addr_octet[3] = (unsigned char)i[3];
-+ n.ether_addr_octet[4] = (unsigned char)i[4];
-+ n.ether_addr_octet[5] = (unsigned char)i[5];
-+ return &n;
-+ }
-+ return NULL;
-+}
-+
-+/*
-+ * ether_ntohost():
-+ * This function interrogates the data base mapping host names to Ethernet
-+ * addresses, /etc/ethers.
-+ * It looks up the given Ethernet address and writes the associated host name
-+ * into the character buffer passed.
-+ * It returns zero if it finds the requested host name and -1 if not.
-+ */
-+int ether_ntohost(char *hostname, const struct ether_addr *e)
-+{
-+ FILE *f;
-+ char *p;
-+ size_t len;
-+ struct ether_addr try;
-+
-+ assert(hostname != NULL);
-+ assert(e != NULL);
-+
-+ f = fopen(_PATH_ETHERS, "r");
-+ if (f == NULL)
-+ return -1;
-+ while ((p = fgetln(f, &len)) != NULL) {
-+ if (p[len - 1] != '\n')
-+ continue; /* skip lines w/o \n */
-+ p[--len] = '\0';
-+ if (ether_line(p, &try, hostname) == 0 &&
-+ memcmp(&try, e, sizeof try) == 0) {
-+ (void)fclose(f);
-+ return 0;
-+ }
-+ }
-+ (void)fclose(f);
-+ errno = ENOENT;
-+ return -1;
-+}
-+
-+/*
-+ * ether_hostton():
-+ * This function interrogates the data base mapping host names to Ethernet
-+ * addresses, /etc/ethers.
-+ * It looks up the given host name and writes the associated Ethernet address
-+ * into the structure passed.
-+ * It returns zero if it finds the requested address and -1 if not.
-+ */
-+int ether_hostton(const char *hostname, struct ether_addr *e)
-+{
-+ FILE *f;
-+ char *p;
-+ size_t len;
-+ char try[MAXHOSTNAMELEN + 1];
-+
-+ assert(hostname != NULL);
-+ assert(e != NULL);
-+
-+ f = fopen(_PATH_ETHERS, "r");
-+ if (f==NULL)
-+ return -1;
-+
-+ while ((p = fgetln(f, &len)) != NULL) {
-+ if (p[len - 1] != '\n')
-+ continue; /* skip lines w/o \n */
-+ p[--len] = '\0';
-+ if (ether_line(p, e, try) == 0 && strcmp(hostname, try) == 0) {
-+ (void)fclose(f);
-+ return 0;
-+ }
-+ }
-+ (void)fclose(f);
-+ errno = ENOENT;
-+ return -1;
-+}
-+
-+/*
-+ * ether_line():
-+ * This function parses a line from the /etc/ethers file and fills in the passed
-+ * ``struct ether_addr'' and character buffer with the Ethernet address and host
-+ * name on the line.
-+ * It returns zero if the line was successfully parsed and -1 if not.
-+ */
-+int ether_line(const char *l, struct ether_addr *e, char *hostname)
-+{
-+ unsigned int i[6];
-+
-+#define S2(arg) #arg
-+#define S1(arg) S2(arg)
-+ static const char fmt[] = " %x:%x:%x:%x:%x:%x"
-+ " %" S1(MAXHOSTNAMELEN) "s\n";
-+#undef S2
-+#undef S1
-+
-+ assert(l != NULL);
-+ assert(e != NULL);
-+ assert(hostname != NULL);
-+
-+ if (sscanf(l, fmt,
-+ &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], hostname) == 7) {
-+ e->ether_addr_octet[0] = (unsigned char)i[0];
-+ e->ether_addr_octet[1] = (unsigned char)i[1];
-+ e->ether_addr_octet[2] = (unsigned char)i[2];
-+ e->ether_addr_octet[3] = (unsigned char)i[3];
-+ e->ether_addr_octet[4] = (unsigned char)i[4];
-+ e->ether_addr_octet[5] = (unsigned char)i[5];
-+ return 0;
-+ }
-+ errno = EINVAL;
-+ return -1;
-+}
---
-1.7.9.5
-
+++ /dev/null
-diff -urN musl-0.9.7/src/setjmp/mips/longjmp.s musl-0.9.7.new/src/setjmp/mips/longjmp.s
---- musl-0.9.7/src/setjmp/mips/longjmp.s 2012-11-23 17:03:07.000000000 +0100
-+++ musl-0.9.7.new/src/setjmp/mips/longjmp.s 2012-11-23 21:52:57.353668480 +0100
-@@ -10,21 +10,7 @@
- bne $2, $0, 1f
- nop
- addu $2, $2, 1
--1: lw $8, 48($4)
-- ctc1 $8, $31
-- lwc1 $20, 56($4)
-- lwc1 $21, 60($4)
-- lwc1 $22, 64($4)
-- lwc1 $23, 68($4)
-- lwc1 $24, 72($4)
-- lwc1 $25, 76($4)
-- lwc1 $26, 80($4)
-- lwc1 $27, 84($4)
-- lwc1 $28, 88($4)
-- lwc1 $29, 92($4)
-- lwc1 $30, 96($4)
-- lwc1 $31, 100($4)
-- lw $ra, 0($4)
-+1: lw $ra, 0($4)
- lw $sp, 4($4)
- lw $16, 8($4)
- lw $17, 12($4)
-diff -urN musl-0.9.7/src/setjmp/mips/setjmp.s musl-0.9.7.new/src/setjmp/mips/setjmp.s
---- musl-0.9.7/src/setjmp/mips/setjmp.s 2012-11-23 17:03:07.000000000 +0100
-+++ musl-0.9.7.new/src/setjmp/mips/setjmp.s 2012-11-23 21:52:33.713667876 +0100
-@@ -21,19 +21,5 @@
- sw $23, 36($4)
- sw $30, 40($4)
- sw $28, 44($4)
-- cfc1 $8, $31
-- sw $8, 48($4)
-- swc1 $20, 56($4)
-- swc1 $21, 60($4)
-- swc1 $22, 64($4)
-- swc1 $23, 68($4)
-- swc1 $24, 72($4)
-- swc1 $25, 76($4)
-- swc1 $26, 80($4)
-- swc1 $27, 84($4)
-- swc1 $28, 88($4)
-- swc1 $29, 92($4)
-- swc1 $30, 96($4)
-- swc1 $31, 100($4)
- jr $ra
- li $2, 0
+++ /dev/null
-From 144dc4f479d49b8148f8b1b6b506b0f1096f911b Mon Sep 17 00:00:00 2001
-From: Rich Felker <dalias@aerifal.cx>
-Date: Fri, 23 Nov 2012 17:23:38 -0500
-Subject: [PATCH] fix termios constants on mips
-
----
- arch/mips/bits/termios.h | 31 +++++++++++++++++++++----------
- 1 file changed, 21 insertions(+), 10 deletions(-)
-
-diff --git a/arch/mips/bits/termios.h b/arch/mips/bits/termios.h
-index 9f6abd8..179af8e 100644
---- a/arch/mips/bits/termios.h
-+++ b/arch/mips/bits/termios.h
-@@ -14,19 +14,20 @@ struct termios
- #define VQUIT 1
- #define VERASE 2
- #define VKILL 3
--#define VEOF 4
-+#define VMIN 4
- #define VTIME 5
--#define VMIN 6
-+#define VEOL2 6
- #define VSWTC 7
-+#define VSWTCH 7
- #define VSTART 8
- #define VSTOP 9
- #define VSUSP 10
--#define VEOL 11
- #define VREPRINT 12
- #define VDISCARD 13
- #define VWERASE 14
- #define VLNEXT 15
--#define VEOL2 16
-+#define VEOF 16
-+#define VEOL 17
-
- #define IGNBRK 0000001
- #define BRKINT 0000002
-@@ -42,6 +43,7 @@ struct termios
- #define IXANY 0004000
- #define IXOFF 0010000
- #define IMAXBEL 0020000
-+#define IUTF8 0040000
-
- #define OPOST 0000001
- #define OLCUC 0000002
-@@ -94,7 +96,10 @@ struct termios
- #define B9600 0000015
- #define B19200 0000016
- #define B38400 0000017
-+#define EXTA 0000016
-+#define EXTB 0000017
-
-+#define BOTHER 0010000
- #define B57600 0010001
- #define B115200 0010002
- #define B230400 0010003
-@@ -124,26 +129,32 @@ struct termios
- #define PARODD 0001000
- #define HUPCL 0002000
- #define CLOCAL 0004000
-+#define CBAUDEX 0010000
-
-+#define CIBAUD 002003600000
-+#define CMSPAR 010000000000
- #define CRTSCTS 020000000000
-+#define IBSHIFT 16
-
- #define ISIG 0000001
- #define ICANON 0000002
-+#define XCASE 0000004
- #define ECHO 0000010
- #define ECHOE 0000020
- #define ECHOK 0000040
- #define ECHONL 0000100
- #define NOFLSH 0000200
--#define TOSTOP 0000400
--#define IEXTEN 0100000
--
--/* Extensions? */
--#define CBAUDEX 0010000
-+#define IEXTEN 0000400
- #define ECHOCTL 0001000
- #define ECHOPRT 0002000
- #define ECHOKE 0004000
--#define FLUSHO 0010000
-+#define FLUSHO 0020000
- #define PENDIN 0040000
-+#define TOSTOP 0100000
-+#define ITOSTOP 0100000
-+#define EXTPROC 0200000
-+
-+#define TIOCSER_TEMT 1
-
- #define TCOOFF 0
- #define TCOON 1
---
-1.7.10.4
-
--- /dev/null
+Date: Sat, 20 Oct 2012 22:15:44 +0200
+From: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
+To: musl@...ts.openwall.com
+Cc: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
+Subject: [PATCH 3/4] Import BSD functions defined in <netinet/ether.h> from NetBSD
+
+Signed-off-by: Abdoulaye Walsimou Gaye <awg@...toolkit.org>
+---
+ include/netinet/ether.h | 14 ++++
+ src/network/ethers.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 194 insertions(+)
+ create mode 100644 include/netinet/ether.h
+ create mode 100644 src/network/ethers.c
+
+diff --git a/include/netinet/ether.h b/include/netinet/ether.h
+new file mode 100644
+index 0000000..44c614e
+--- /dev/null
++++ b/include/netinet/ether.h
+@@ -0,0 +1,10 @@
++#ifndef _NETINET_ETHER_H
++#define _NETINET_ETHER_H
++
++char *ether_ntoa(const struct ether_addr *);
++struct ether_addr *ether_aton(const char *);
++int ether_ntohost(char *, const struct ether_addr *);
++int ether_hostton(const char *, struct ether_addr *);
++int ether_line(const char *, struct ether_addr *, char *);
++
++#endif /* !_NETINET_ETHER_H */
+diff --git a/src/network/ethers.c b/src/network/ethers.c
+new file mode 100644
+index 0000000..8014581
+--- /dev/null
++++ b/src/network/ethers.c
+@@ -0,0 +1,180 @@
++/* Origin NetBSD: src/lib/libc/net/ethers.c */
++
++/*
++ * ethers(3N) a la Sun.
++ *
++ * Written by Roland McGrath <roland@...b.com> 10/14/93.
++ * Public domain.
++ *
++ * port for musl by Abdoulaye Walsimou GAYE <awg@...toolkit.org> 2012/10/15
++ */
++
++#define _BSD_SOURCE
++#include <net/ethernet.h>
++#include <netinet/ether.h>
++
++#include <sys/param.h>
++#include <assert.h>
++#include <errno.h>
++#include <paths.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#ifndef _PATH_ETHERS
++#define _PATH_ETHERS "/etc/ethers"
++#endif
++
++/*
++ * ether_ntoa():
++ * This function converts this structure into an ASCII string of the form
++ * ``xx:xx:xx:xx:xx:xx'', consisting of 6 hexadecimal numbers separated
++ * by colons. It returns a pointer to a static buffer that is reused for
++ * each call.
++ */
++char *ether_ntoa(const struct ether_addr *e)
++{
++ static char a[18];
++
++ assert(e != NULL);
++
++ (void) snprintf(a, sizeof a, "%02x:%02x:%02x:%02x:%02x:%02x",
++ e->ether_addr_octet[0], e->ether_addr_octet[1],
++ e->ether_addr_octet[2], e->ether_addr_octet[3],
++ e->ether_addr_octet[4], e->ether_addr_octet[5]);
++ return a;
++}
++
++/*
++ * ether_aton():
++ * This function converts an ASCII string of the same form and to a structure
++ * containing the 6 octets of the address. It returns a pointer to a
++ * static structure that is reused for each call.
++ */
++struct ether_addr *ether_aton(const char *s)
++{
++ static struct ether_addr n;
++ unsigned int i[6];
++
++ assert(s != NULL);
++
++ if (sscanf(s, " %x:%x:%x:%x:%x:%x ", &i[0], &i[1],
++ &i[2], &i[3], &i[4], &i[5]) == 6) {
++ n.ether_addr_octet[0] = (unsigned char)i[0];
++ n.ether_addr_octet[1] = (unsigned char)i[1];
++ n.ether_addr_octet[2] = (unsigned char)i[2];
++ n.ether_addr_octet[3] = (unsigned char)i[3];
++ n.ether_addr_octet[4] = (unsigned char)i[4];
++ n.ether_addr_octet[5] = (unsigned char)i[5];
++ return &n;
++ }
++ return NULL;
++}
++
++/*
++ * ether_ntohost():
++ * This function interrogates the data base mapping host names to Ethernet
++ * addresses, /etc/ethers.
++ * It looks up the given Ethernet address and writes the associated host name
++ * into the character buffer passed.
++ * It returns zero if it finds the requested host name and -1 if not.
++ */
++int ether_ntohost(char *hostname, const struct ether_addr *e)
++{
++ FILE *f;
++ char *p;
++ size_t len;
++ struct ether_addr try;
++
++ assert(hostname != NULL);
++ assert(e != NULL);
++
++ f = fopen(_PATH_ETHERS, "r");
++ if (f == NULL)
++ return -1;
++ while ((p = fgetln(f, &len)) != NULL) {
++ if (p[len - 1] != '\n')
++ continue; /* skip lines w/o \n */
++ p[--len] = '\0';
++ if (ether_line(p, &try, hostname) == 0 &&
++ memcmp(&try, e, sizeof try) == 0) {
++ (void)fclose(f);
++ return 0;
++ }
++ }
++ (void)fclose(f);
++ errno = ENOENT;
++ return -1;
++}
++
++/*
++ * ether_hostton():
++ * This function interrogates the data base mapping host names to Ethernet
++ * addresses, /etc/ethers.
++ * It looks up the given host name and writes the associated Ethernet address
++ * into the structure passed.
++ * It returns zero if it finds the requested address and -1 if not.
++ */
++int ether_hostton(const char *hostname, struct ether_addr *e)
++{
++ FILE *f;
++ char *p;
++ size_t len;
++ char try[MAXHOSTNAMELEN + 1];
++
++ assert(hostname != NULL);
++ assert(e != NULL);
++
++ f = fopen(_PATH_ETHERS, "r");
++ if (f==NULL)
++ return -1;
++
++ while ((p = fgetln(f, &len)) != NULL) {
++ if (p[len - 1] != '\n')
++ continue; /* skip lines w/o \n */
++ p[--len] = '\0';
++ if (ether_line(p, e, try) == 0 && strcmp(hostname, try) == 0) {
++ (void)fclose(f);
++ return 0;
++ }
++ }
++ (void)fclose(f);
++ errno = ENOENT;
++ return -1;
++}
++
++/*
++ * ether_line():
++ * This function parses a line from the /etc/ethers file and fills in the passed
++ * ``struct ether_addr'' and character buffer with the Ethernet address and host
++ * name on the line.
++ * It returns zero if the line was successfully parsed and -1 if not.
++ */
++int ether_line(const char *l, struct ether_addr *e, char *hostname)
++{
++ unsigned int i[6];
++
++#define S2(arg) #arg
++#define S1(arg) S2(arg)
++ static const char fmt[] = " %x:%x:%x:%x:%x:%x"
++ " %" S1(MAXHOSTNAMELEN) "s\n";
++#undef S2
++#undef S1
++
++ assert(l != NULL);
++ assert(e != NULL);
++ assert(hostname != NULL);
++
++ if (sscanf(l, fmt,
++ &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], hostname) == 7) {
++ e->ether_addr_octet[0] = (unsigned char)i[0];
++ e->ether_addr_octet[1] = (unsigned char)i[1];
++ e->ether_addr_octet[2] = (unsigned char)i[2];
++ e->ether_addr_octet[3] = (unsigned char)i[3];
++ e->ether_addr_octet[4] = (unsigned char)i[4];
++ e->ether_addr_octet[5] = (unsigned char)i[5];
++ return 0;
++ }
++ errno = EINVAL;
++ return -1;
++}
+--
+1.7.9.5
+
--- /dev/null
+diff -urN musl-0.9.7/src/setjmp/mips/longjmp.s musl-0.9.7.new/src/setjmp/mips/longjmp.s
+--- musl-0.9.7/src/setjmp/mips/longjmp.s 2012-11-23 17:03:07.000000000 +0100
++++ musl-0.9.7.new/src/setjmp/mips/longjmp.s 2012-11-23 21:52:57.353668480 +0100
+@@ -10,21 +10,7 @@
+ bne $2, $0, 1f
+ nop
+ addu $2, $2, 1
+-1: lw $8, 48($4)
+- ctc1 $8, $31
+- lwc1 $20, 56($4)
+- lwc1 $21, 60($4)
+- lwc1 $22, 64($4)
+- lwc1 $23, 68($4)
+- lwc1 $24, 72($4)
+- lwc1 $25, 76($4)
+- lwc1 $26, 80($4)
+- lwc1 $27, 84($4)
+- lwc1 $28, 88($4)
+- lwc1 $29, 92($4)
+- lwc1 $30, 96($4)
+- lwc1 $31, 100($4)
+- lw $ra, 0($4)
++1: lw $ra, 0($4)
+ lw $sp, 4($4)
+ lw $16, 8($4)
+ lw $17, 12($4)
+diff -urN musl-0.9.7/src/setjmp/mips/setjmp.s musl-0.9.7.new/src/setjmp/mips/setjmp.s
+--- musl-0.9.7/src/setjmp/mips/setjmp.s 2012-11-23 17:03:07.000000000 +0100
++++ musl-0.9.7.new/src/setjmp/mips/setjmp.s 2012-11-23 21:52:33.713667876 +0100
+@@ -21,19 +21,5 @@
+ sw $23, 36($4)
+ sw $30, 40($4)
+ sw $28, 44($4)
+- cfc1 $8, $31
+- sw $8, 48($4)
+- swc1 $20, 56($4)
+- swc1 $21, 60($4)
+- swc1 $22, 64($4)
+- swc1 $23, 68($4)
+- swc1 $24, 72($4)
+- swc1 $25, 76($4)
+- swc1 $26, 80($4)
+- swc1 $27, 84($4)
+- swc1 $28, 88($4)
+- swc1 $29, 92($4)
+- swc1 $30, 96($4)
+- swc1 $31, 100($4)
+ jr $ra
+ li $2, 0