move software into misoc
authorSebastien Bourdeauducq <sb@m-labs.hk>
Mon, 28 Sep 2015 05:02:13 +0000 (13:02 +0800)
committerSebastien Bourdeauducq <sb@m-labs.hk>
Mon, 28 Sep 2015 07:30:19 +0000 (15:30 +0800)
170 files changed:
.gitignore
.gitmodules
build/.keep_me [deleted file]
common/sfl.h [deleted file]
misoc/software/bios/Makefile [new file with mode: 0644]
misoc/software/bios/boot-helper-lm32.S [new file with mode: 0644]
misoc/software/bios/boot-helper-or1k.S [new file with mode: 0644]
misoc/software/bios/boot.c [new file with mode: 0644]
misoc/software/bios/boot.h [new file with mode: 0644]
misoc/software/bios/dataflow.c [new file with mode: 0644]
misoc/software/bios/dataflow.h [new file with mode: 0644]
misoc/software/bios/isr.c [new file with mode: 0644]
misoc/software/bios/linker.ld [new file with mode: 0644]
misoc/software/bios/main.c [new file with mode: 0644]
misoc/software/bios/sdram.c [new file with mode: 0644]
misoc/software/bios/sdram.h [new file with mode: 0644]
misoc/software/bios/sfl.h [new file with mode: 0644]
misoc/software/common.mak [new file with mode: 0644]
misoc/software/compiler-rt [new submodule]
misoc/software/include/base/assert.h [new file with mode: 0644]
misoc/software/include/base/console.h [new file with mode: 0644]
misoc/software/include/base/crc.h [new file with mode: 0644]
misoc/software/include/base/ctype.h [new file with mode: 0644]
misoc/software/include/base/endian.h [new file with mode: 0644]
misoc/software/include/base/errno.h [new file with mode: 0644]
misoc/software/include/base/float.h [new file with mode: 0644]
misoc/software/include/base/id.h [new file with mode: 0644]
misoc/software/include/base/inttypes.h [new file with mode: 0644]
misoc/software/include/base/irq.h [new file with mode: 0644]
misoc/software/include/base/limits.h [new file with mode: 0644]
misoc/software/include/base/pthread.h [new file with mode: 0644]
misoc/software/include/base/spiflash.h [new file with mode: 0644]
misoc/software/include/base/spr-defs.h [new file with mode: 0644]
misoc/software/include/base/stdarg.h [new file with mode: 0644]
misoc/software/include/base/stdbool.h [new file with mode: 0644]
misoc/software/include/base/stddef.h [new file with mode: 0644]
misoc/software/include/base/stdint.h [new file with mode: 0644]
misoc/software/include/base/stdio.h [new file with mode: 0644]
misoc/software/include/base/stdlib.h [new file with mode: 0644]
misoc/software/include/base/string.h [new file with mode: 0644]
misoc/software/include/base/system.h [new file with mode: 0644]
misoc/software/include/base/time.h [new file with mode: 0644]
misoc/software/include/base/uart.h [new file with mode: 0644]
misoc/software/include/basec++/algorithm [new file with mode: 0644]
misoc/software/include/basec++/cstddef [new file with mode: 0644]
misoc/software/include/basec++/cstdlib [new file with mode: 0644]
misoc/software/include/basec++/new [new file with mode: 0644]
misoc/software/include/dyld/dlfcn.h [new file with mode: 0644]
misoc/software/include/dyld/dyld.h [new file with mode: 0644]
misoc/software/include/dyld/elf.h [new file with mode: 0644]
misoc/software/include/dyld/link.h [new file with mode: 0644]
misoc/software/include/hw/common.h [new file with mode: 0644]
misoc/software/include/hw/ethmac_mem.h [new file with mode: 0644]
misoc/software/include/hw/flags.h [new file with mode: 0644]
misoc/software/include/net/microudp.h [new file with mode: 0644]
misoc/software/include/net/tftp.h [new file with mode: 0644]
misoc/software/libbase/Makefile [new file with mode: 0644]
misoc/software/libbase/console.c [new file with mode: 0644]
misoc/software/libbase/crc16.c [new file with mode: 0644]
misoc/software/libbase/crc32.c [new file with mode: 0644]
misoc/software/libbase/crt0-lm32.S [new file with mode: 0644]
misoc/software/libbase/crt0-or1k.S [new file with mode: 0644]
misoc/software/libbase/errno.c [new file with mode: 0644]
misoc/software/libbase/exception.c [new file with mode: 0644]
misoc/software/libbase/id.c [new file with mode: 0644]
misoc/software/libbase/libc.c [new file with mode: 0644]
misoc/software/libbase/linker-sdram.ld [new file with mode: 0644]
misoc/software/libbase/qsort.c [new file with mode: 0644]
misoc/software/libbase/spiflash.c [new file with mode: 0644]
misoc/software/libbase/strtod.c [new file with mode: 0644]
misoc/software/libbase/system.c [new file with mode: 0644]
misoc/software/libbase/time.c [new file with mode: 0644]
misoc/software/libbase/uart.c [new file with mode: 0644]
misoc/software/libbase/vsnprintf.c [new file with mode: 0644]
misoc/software/libcompiler-rt/Makefile [new file with mode: 0644]
misoc/software/libdyld/Makefile [new file with mode: 0644]
misoc/software/libdyld/dyld.c [new file with mode: 0644]
misoc/software/libnet/Makefile [new file with mode: 0644]
misoc/software/libnet/microudp.c [new file with mode: 0644]
misoc/software/libnet/tftp.c [new file with mode: 0644]
misoc/software/libunwind/Makefile [new file with mode: 0644]
misoc/software/libunwind/__cxxabi_config.h [new file with mode: 0644]
misoc/software/memtest/Makefile [new file with mode: 0644]
misoc/software/memtest/isr.c [new file with mode: 0644]
misoc/software/memtest/main.c [new file with mode: 0644]
misoc/software/unwinder [new submodule]
software/bios/Makefile [deleted file]
software/bios/boot-helper-lm32.S [deleted file]
software/bios/boot-helper-or1k.S [deleted file]
software/bios/boot.c [deleted file]
software/bios/boot.h [deleted file]
software/bios/dataflow.c [deleted file]
software/bios/dataflow.h [deleted file]
software/bios/isr.c [deleted file]
software/bios/linker.ld [deleted file]
software/bios/main.c [deleted file]
software/bios/sdram.c [deleted file]
software/bios/sdram.h [deleted file]
software/common.mak [deleted file]
software/compiler-rt [deleted submodule]
software/include/base/assert.h [deleted file]
software/include/base/console.h [deleted file]
software/include/base/crc.h [deleted file]
software/include/base/ctype.h [deleted file]
software/include/base/endian.h [deleted file]
software/include/base/errno.h [deleted file]
software/include/base/float.h [deleted file]
software/include/base/id.h [deleted file]
software/include/base/inttypes.h [deleted file]
software/include/base/irq.h [deleted file]
software/include/base/limits.h [deleted file]
software/include/base/pthread.h [deleted file]
software/include/base/spiflash.h [deleted file]
software/include/base/spr-defs.h [deleted file]
software/include/base/stdarg.h [deleted file]
software/include/base/stdbool.h [deleted file]
software/include/base/stddef.h [deleted file]
software/include/base/stdint.h [deleted file]
software/include/base/stdio.h [deleted file]
software/include/base/stdlib.h [deleted file]
software/include/base/string.h [deleted file]
software/include/base/system.h [deleted file]
software/include/base/time.h [deleted file]
software/include/base/uart.h [deleted file]
software/include/basec++/algorithm [deleted file]
software/include/basec++/cstddef [deleted file]
software/include/basec++/cstdlib [deleted file]
software/include/basec++/new [deleted file]
software/include/dyld/dlfcn.h [deleted file]
software/include/dyld/dyld.h [deleted file]
software/include/dyld/elf.h [deleted file]
software/include/dyld/link.h [deleted file]
software/include/generated/.keep_me [deleted file]
software/include/hw/common.h [deleted file]
software/include/hw/ethmac_mem.h [deleted file]
software/include/hw/flags.h [deleted file]
software/include/net/microudp.h [deleted file]
software/include/net/tftp.h [deleted file]
software/libbase/Makefile [deleted file]
software/libbase/console.c [deleted file]
software/libbase/crc16.c [deleted file]
software/libbase/crc32.c [deleted file]
software/libbase/crt0-lm32.S [deleted file]
software/libbase/crt0-or1k.S [deleted file]
software/libbase/errno.c [deleted file]
software/libbase/exception.c [deleted file]
software/libbase/id.c [deleted file]
software/libbase/libc.c [deleted file]
software/libbase/linker-sdram.ld [deleted file]
software/libbase/qsort.c [deleted file]
software/libbase/spiflash.c [deleted file]
software/libbase/strtod.c [deleted file]
software/libbase/system.c [deleted file]
software/libbase/time.c [deleted file]
software/libbase/uart.c [deleted file]
software/libbase/vsnprintf.c [deleted file]
software/libcompiler-rt/Makefile [deleted file]
software/libdyld/Makefile [deleted file]
software/libdyld/dyld.c [deleted file]
software/libnet/Makefile [deleted file]
software/libnet/microudp.c [deleted file]
software/libnet/tftp.c [deleted file]
software/libunwind/Makefile [deleted file]
software/libunwind/__cxxabi_config.h [deleted file]
software/memtest/Makefile [deleted file]
software/memtest/isr.c [deleted file]
software/memtest/main.c [deleted file]
software/unwinder [deleted submodule]
tools/Makefile
tools/flterm.c [deleted file]

index 34f914fe8bdd2cff337a38445b28cde435665b45..1b365c46481bb6f5c4a109bd26896644d244b41d 100644 (file)
@@ -1,15 +1,3 @@
 __pycache__
-build/*
-*.o
-*.d
-*.a
-*.elf
-*.bin
-*.fbi
-tools/flterm
-tools/byteswap
-software/include/generated/*.h
-software/include/generated/*.ld
-software/include/generated/*.mak
 *.vcd
 outgoing
index 3b25a246f43da0cac1877c6ea56e93c393a9e34a..6fba9eca6faf72e022db93294fd543483c4083b8 100644 (file)
@@ -4,9 +4,9 @@
 [submodule "misoc/cores/mor1kx/verilog"]
        path = misoc/cores/mor1kx/verilog
        url = https://github.com/openrisc/mor1kx.git
-[submodule "software/compiler-rt"]
-       path = software/compiler-rt
+[submodule "misoc/software/compiler-rt"]
+       path = misoc/software/compiler-rt
        url = http://llvm.org/git/compiler-rt.git
-[submodule "software/unwinder"]
-       path = software/unwinder
+[submodule "misoc/software/unwinder"]
+       path = misoc/software/unwinder
        url = https://github.com/whitequark/libunwind
diff --git a/build/.keep_me b/build/.keep_me
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/common/sfl.h b/common/sfl.h
deleted file mode 100644 (file)
index c496aed..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef __SFL_H
-#define __SFL_H
-
-#define SFL_MAGIC_LEN 14
-#define SFL_MAGIC_REQ "sL5DdSMmkekro\n"
-#define SFL_MAGIC_ACK "z6IHG7cYDID6o\n"
-
-struct sfl_frame {
-       unsigned char length;
-       unsigned char crc[2];
-       unsigned char cmd;
-       unsigned char payload[255];
-} __attribute__((packed));
-
-/* General commands */
-#define SFL_CMD_ABORT          0x00
-#define SFL_CMD_LOAD           0x01
-#define SFL_CMD_JUMP           0x02
-
-/* Linux-specific commands */
-#define SFL_CMD_CMDLINE                0x03
-#define SFL_CMD_INITRDSTART    0x04
-#define SFL_CMD_INITRDEND      0x05
-
-/* Replies */
-#define SFL_ACK_SUCCESS                'K'
-#define SFL_ACK_CRCERROR       'C'
-#define SFL_ACK_UNKNOWN                'U'
-#define SFL_ACK_ERROR          'E'
-
-#endif /* __SFL_H */
diff --git a/misoc/software/bios/Makefile b/misoc/software/bios/Makefile
new file mode 100644 (file)
index 0000000..bd849f0
--- /dev/null
@@ -0,0 +1,45 @@
+MSCDIR=../..
+include $(MSCDIR)/software/common.mak
+
+OBJECTS=isr.o sdram.o main.o boot-helper-$(CPU).o boot.o dataflow.o
+
+all: bios.bin
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+%.bin: %.elf
+       $(OBJCOPY) -O binary $< $@
+       chmod -x $@
+       $(MSCDIR)/mkmscimg.py $@
+
+bios.elf: linker.ld $(OBJECTS) libs
+
+%.elf:
+       $(LD) $(LDFLAGS) -T $< -N -o $@ \
+               $(MSCDIR)/software/libbase/crt0-$(CPU).o \
+               $(OBJECTS) \
+               -L$(MSCDIR)/software/libnet \
+               -L$(MSCDIR)/software/libbase \
+               -L$(MSCDIR)/software/libcompiler-rt \
+               -lnet -lbase-nofloat -lcompiler-rt
+       chmod -x $@
+
+main.o: main.c
+       $(compile-dep)
+
+%.o: %.c
+       $(compile-dep)
+
+%.o: %.S
+       $(assemble)
+
+libs:
+       $(MAKE) -C $(MSCDIR)/software/libcompiler-rt
+       $(MAKE) -C $(MSCDIR)/software/libbase
+       $(MAKE) -C $(MSCDIR)/software/libnet
+
+clean:
+       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) bios.elf bios.bin .*~ *~
+
+.PHONY: all main.o clean libs
diff --git a/misoc/software/bios/boot-helper-lm32.S b/misoc/software/bios/boot-helper-lm32.S
new file mode 100644 (file)
index 0000000..bf3765c
--- /dev/null
@@ -0,0 +1,4 @@
+.section    .text, "ax", @progbits
+.global     boot_helper
+boot_helper:
+       call r4
diff --git a/misoc/software/bios/boot-helper-or1k.S b/misoc/software/bios/boot-helper-or1k.S
new file mode 100644 (file)
index 0000000..5023602
--- /dev/null
@@ -0,0 +1,5 @@
+.section    .text, "ax", @progbits
+.global     boot_helper
+boot_helper:
+       l.jr r6
+       l.nop
diff --git a/misoc/software/bios/boot.c b/misoc/software/bios/boot.c
new file mode 100644 (file)
index 0000000..0430aca
--- /dev/null
@@ -0,0 +1,282 @@
+#include <stdio.h>
+#include <console.h>
+#include <uart.h>
+#include <system.h>
+#include <crc.h>
+#include <string.h>
+#include <irq.h>
+
+#include <generated/mem.h>
+#include <generated/csr.h>
+
+#include <net/microudp.h>
+#include <net/tftp.h>
+#include "sfl.h"
+#include "boot.h"
+
+extern void boot_helper(unsigned int r1, unsigned int r2, unsigned int r3, unsigned int addr);
+
+static void __attribute__((noreturn)) boot(unsigned int r1, unsigned int r2, unsigned int r3, unsigned int addr)
+{
+       printf("Executing booted program.\n");
+       uart_sync();
+       irq_setmask(0);
+       irq_setie(0);
+       flush_cpu_icache();
+       boot_helper(r1, r2, r3, addr);
+       while(1);
+}
+
+static int check_ack(void)
+{
+       int recognized;
+       static const char str[SFL_MAGIC_LEN] = SFL_MAGIC_ACK;
+
+       timer0_en_write(0);
+       timer0_reload_write(0);
+       timer0_load_write(identifier_frequency_read()/4);
+       timer0_en_write(1);
+       timer0_update_value_write(1);
+       recognized = 0;
+       while(timer0_value_read()) {
+               if(uart_read_nonblock()) {
+                       char c;
+                       c = uart_read();
+                       if(c == str[recognized]) {
+                               recognized++;
+                               if(recognized == SFL_MAGIC_LEN)
+                                       return 1;
+                       } else {
+                               if(c == str[0])
+                                       recognized = 1;
+                               else
+                                       recognized = 0;
+                       }
+               }
+               timer0_update_value_write(1);
+       }
+       return 0;
+}
+
+#define MAX_FAILED 5
+
+void serialboot(void)
+{
+       struct sfl_frame frame;
+       int failed;
+       unsigned int cmdline_adr, initrdstart_adr, initrdend_adr;
+       static const char str[SFL_MAGIC_LEN+1] = SFL_MAGIC_REQ;
+       const char *c;
+
+       printf("Booting from serial...\n");
+
+       c = str;
+       while(*c) {
+               uart_write(*c);
+               c++;
+       }
+       if(!check_ack()) {
+               printf("Timeout\n");
+               return;
+       }
+
+       failed = 0;
+       cmdline_adr = initrdstart_adr = initrdend_adr = 0;
+       while(1) {
+               int i;
+               int actualcrc;
+               int goodcrc;
+
+               /* Grab one frame */
+               frame.length = uart_read();
+               frame.crc[0] = uart_read();
+               frame.crc[1] = uart_read();
+               frame.cmd = uart_read();
+               for(i=0;i<frame.length;i++)
+                       frame.payload[i] = uart_read();
+
+               /* Check CRC */
+               actualcrc = ((int)frame.crc[0] << 8)|(int)frame.crc[1];
+               goodcrc = crc16(&frame.cmd, frame.length+1);
+               if(actualcrc != goodcrc) {
+                       failed++;
+                       if(failed == MAX_FAILED) {
+                               printf("Too many consecutive errors, aborting");
+                               return;
+                       }
+                       uart_write(SFL_ACK_CRCERROR);
+                       continue;
+               }
+
+               /* CRC OK */
+               switch(frame.cmd) {
+                       case SFL_CMD_ABORT:
+                               failed = 0;
+                               uart_write(SFL_ACK_SUCCESS);
+                               return;
+                       case SFL_CMD_LOAD: {
+                               char *writepointer;
+
+                               failed = 0;
+                               writepointer = (char *)(
+                                        ((unsigned int)frame.payload[0] << 24)
+                                       |((unsigned int)frame.payload[1] << 16)
+                                       |((unsigned int)frame.payload[2] << 8)
+                                       |((unsigned int)frame.payload[3] << 0));
+                               for(i=4;i<frame.length;i++)
+                                       *(writepointer++) = frame.payload[i];
+                               uart_write(SFL_ACK_SUCCESS);
+                               break;
+                       }
+                       case SFL_CMD_JUMP: {
+                               unsigned int addr;
+
+                               failed = 0;
+                               addr =  ((unsigned int)frame.payload[0] << 24)
+                                       |((unsigned int)frame.payload[1] << 16)
+                                       |((unsigned int)frame.payload[2] << 8)
+                                       |((unsigned int)frame.payload[3] << 0);
+                               uart_write(SFL_ACK_SUCCESS);
+                               boot(cmdline_adr, initrdstart_adr, initrdend_adr, addr);
+                               break;
+                       }
+                       case SFL_CMD_CMDLINE:
+                               failed = 0;
+                               cmdline_adr =  ((unsigned int)frame.payload[0] << 24)
+                                             |((unsigned int)frame.payload[1] << 16)
+                                             |((unsigned int)frame.payload[2] << 8)
+                                             |((unsigned int)frame.payload[3] << 0);
+                               uart_write(SFL_ACK_SUCCESS);
+                               break;
+                       case SFL_CMD_INITRDSTART:
+                               failed = 0;
+                               initrdstart_adr =  ((unsigned int)frame.payload[0] << 24)
+                                                 |((unsigned int)frame.payload[1] << 16)
+                                                 |((unsigned int)frame.payload[2] << 8)
+                                                 |((unsigned int)frame.payload[3] << 0);
+                               uart_write(SFL_ACK_SUCCESS);
+                               break;
+                       case SFL_CMD_INITRDEND:
+                               failed = 0;
+                               initrdend_adr =  ((unsigned int)frame.payload[0] << 24)
+                                               |((unsigned int)frame.payload[1] << 16)
+                                               |((unsigned int)frame.payload[2] << 8)
+                                               |((unsigned int)frame.payload[3] << 0);
+                               uart_write(SFL_ACK_SUCCESS);
+                               break;
+                       default:
+                               failed++;
+                               if(failed == MAX_FAILED) {
+                                       printf("Too many consecutive errors, aborting");
+                                       return;
+                               }
+                               uart_write(SFL_ACK_UNKNOWN);
+                               break;
+               }
+       }
+}
+
+#ifdef CSR_ETHMAC_BASE
+
+#define LOCALIP1 192
+#define LOCALIP2 168
+#define LOCALIP3 0
+#define LOCALIP4 42
+#define REMOTEIP1 192
+#define REMOTEIP2 168
+#define REMOTEIP3 0
+#define REMOTEIP4 14
+
+static int tftp_get_v(unsigned int ip, const char *filename, char *buffer)
+{
+       int r;
+
+       r = tftp_get(ip, filename, buffer);
+       if(r > 0)
+               printf("Successfully downloaded %d bytes from %s over TFTP\n", r, filename);
+       else
+               printf("Unable to download %s over TFTP\n", filename);
+       return r;
+}
+
+static const unsigned char macadr[6] = {0x10, 0xe2, 0xd5, 0x00, 0x00, 0x00};
+
+void netboot(void)
+{
+       int size;
+       unsigned int cmdline_adr, initrdstart_adr, initrdend_adr;
+       unsigned int ip;
+
+       printf("Booting from network...\n");
+       printf("Local IP : %d.%d.%d.%d\n", LOCALIP1, LOCALIP2, LOCALIP3, LOCALIP4);
+       printf("Remote IP: %d.%d.%d.%d\n", REMOTEIP1, REMOTEIP2, REMOTEIP3, REMOTEIP4);
+
+       ip = IPTOINT(REMOTEIP1, REMOTEIP2, REMOTEIP3, REMOTEIP4);
+
+       microudp_start(macadr, IPTOINT(LOCALIP1, LOCALIP2, LOCALIP3, LOCALIP4));
+
+       if(tftp_get_v(ip, "boot.bin", (void *)MAIN_RAM_BASE) <= 0) {
+               printf("Network boot failed\n");
+               return;
+       }
+
+       cmdline_adr = MAIN_RAM_BASE+0x1000000;
+       size = tftp_get_v(ip, "cmdline.txt", (void *)cmdline_adr);
+       if(size <= 0) {
+               printf("No command line parameters found\n");
+               cmdline_adr = 0;
+       } else
+               *((char *)(cmdline_adr+size)) = 0x00;
+
+       initrdstart_adr = MAIN_RAM_BASE+0x1002000;
+       size = tftp_get_v(ip, "initrd.bin", (void *)initrdstart_adr);
+       if(size <= 0) {
+               printf("No initial ramdisk found\n");
+               initrdstart_adr = 0;
+               initrdend_adr = 0;
+       } else
+               initrdend_adr = initrdstart_adr + size;
+
+       boot(cmdline_adr, initrdstart_adr, initrdend_adr, MAIN_RAM_BASE);
+}
+
+#endif
+
+#ifdef FLASH_BOOT_ADDRESS
+void flashboot(void)
+{
+       unsigned int *flashbase;
+       unsigned int length;
+       unsigned int crc;
+       unsigned int got_crc;
+
+       printf("Booting from flash...\n");
+       flashbase = (unsigned int *)FLASH_BOOT_ADDRESS;
+       length = *flashbase++;
+       crc = *flashbase++;
+       if((length < 32) || (length > 4*1024*1024)) {
+               printf("Error: Invalid flash boot image length 0x%08x\n", length);
+               return;
+       }
+
+       printf("Loading %d bytes from flash...\n", length);
+       memcpy((void *)MAIN_RAM_BASE, flashbase, length);
+       got_crc = crc32((unsigned char *)MAIN_RAM_BASE, length);
+       if(crc != got_crc) {
+               printf("CRC failed (expected %08x, got %08x)\n", crc, got_crc);
+               return;
+       }
+       boot(0, 0, 0, MAIN_RAM_BASE);
+}
+#endif
+
+#ifdef ROM_BOOT_ADDRESS
+/* When firmware is small enough, it can be interesting to run code from an
+   embedded blockram memory (faster and not impacted by memory controller
+   activity). Define ROM_BOOT_ADDRESS for that and initialize the blockram
+   with the firmware data. */
+void romboot(void)
+{
+       boot(0, 0, 0, ROM_BOOT_ADDRESS);
+}
+#endif
diff --git a/misoc/software/bios/boot.h b/misoc/software/bios/boot.h
new file mode 100644 (file)
index 0000000..aa9cd88
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __BOOT_H
+#define __BOOT_H
+
+void serialboot(void);
+void netboot(void);
+void flashboot(void);
+void romboot(void);
+
+#endif /* __BOOT_H */
diff --git a/misoc/software/bios/dataflow.c b/misoc/software/bios/dataflow.c
new file mode 100644 (file)
index 0000000..d9aaa6a
--- /dev/null
@@ -0,0 +1,42 @@
+#include <stdio.h>
+
+#include "dataflow.h"
+
+void print_isd_info(unsigned int baseaddr)
+{
+       volatile unsigned int *regs;
+       int neps;
+       int nbytes;
+       int i, j;
+       int offset;
+       unsigned int ack_count, nack_count, cur_status;
+       
+       regs = (unsigned int *)baseaddr;
+       if((regs[0] != 0x6a) || (regs[1] != 0xb4)) {
+               printf("Incorrect magic number\n");
+               return;
+       }
+       neps = regs[2];
+       nbytes = (regs[3] + 7)/8;
+       
+       regs[4] = 1; // freeze
+       offset = 6; // regs[5] is reset
+       for(i=0;i<neps;i++) {
+               ack_count = 0;
+               for(j=0;j<nbytes;j++) {
+                       ack_count <<= 8;
+                       ack_count |= regs[offset++];
+               }
+               nack_count = 0;
+               for(j=0;j<nbytes;j++) {
+                       nack_count <<= 8;
+                       nack_count |= regs[offset++];
+               }
+               cur_status = regs[offset++];
+               printf("#%d: ACK_CNT:%10u   NAK_CNT:%10u %s %s\n",
+                       i, ack_count, nack_count,
+                       cur_status & 1 ? "stb" : "   ",
+                       cur_status & 2 ? "ack" : "   ");
+       }
+       regs[4] = 0; // unfreeze
+}
diff --git a/misoc/software/bios/dataflow.h b/misoc/software/bios/dataflow.h
new file mode 100644 (file)
index 0000000..9659830
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef __DATAFLOW_H
+#define __DATAFLOW_H
+
+void print_isd_info(unsigned int baseaddr);
+
+#endif /* __DATAFLOW_H */
+
diff --git a/misoc/software/bios/isr.c b/misoc/software/bios/isr.c
new file mode 100644 (file)
index 0000000..c49d31d
--- /dev/null
@@ -0,0 +1,14 @@
+#include <generated/csr.h>
+#include <irq.h>
+#include <uart.h>
+
+void isr(void);
+void isr(void)
+{
+       unsigned int irqs;
+       
+       irqs = irq_pending() & irq_getmask();
+       
+       if(irqs & (1 << UART_INTERRUPT))
+               uart_isr();
+}
diff --git a/misoc/software/bios/linker.ld b/misoc/software/bios/linker.ld
new file mode 100644 (file)
index 0000000..13b4bca
--- /dev/null
@@ -0,0 +1,54 @@
+INCLUDE generated/output_format.ld
+ENTRY(_start)
+
+INCLUDE generated/regions.ld
+
+SECTIONS
+{
+       .text :
+       {
+               _ftext = .;
+               *(.text .stub .text.* .gnu.linkonce.t.*)
+               _etext = .;
+       } > rom
+
+       .rodata :
+       {
+               . = ALIGN(4);
+               _frodata = .;
+               *(.rodata .rodata.* .gnu.linkonce.r.*)
+               *(.rodata1)
+
+               /* Make sure the file is aligned on disk as well
+                  as in memory; CRC calculation requires that. */
+               FILL(0);
+               . = ALIGN(4);
+               _erodata = .;
+       } > rom
+
+       .bss :
+       {
+               . = ALIGN(4);
+               _fbss = .;
+               *(.dynsbss)
+               *(.sbss .sbss.* .gnu.linkonce.sb.*)
+               *(.scommon)
+               *(.dynbss)
+               *(.bss .bss.* .gnu.linkonce.b.*)
+               *(COMMON)
+               . = ALIGN(4);
+               _ebss = .;
+               _end = .;
+       } > sram
+
+       /DISCARD/ :
+       {
+               *(.eh_frame)
+               *(.comment)
+               *(.data .data.* .gnu.linkonce.d.*)
+               *(.data1)
+               *(.sdata .sdata.* .gnu.linkonce.s.*)
+       }
+}
+
+PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram) - 4);
diff --git a/misoc/software/bios/main.c b/misoc/software/bios/main.c
new file mode 100644 (file)
index 0000000..3893141
--- /dev/null
@@ -0,0 +1,562 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <console.h>
+#include <string.h>
+#include <uart.h>
+#include <system.h>
+#include <id.h>
+#include <irq.h>
+#include <crc.h>
+
+#include <generated/csr.h>
+#include <generated/mem.h>
+#include <net/microudp.h>
+
+#include "sdram.h"
+#include "dataflow.h"
+#include "boot.h"
+
+/* General address space functions */
+
+#define NUMBER_OF_BYTES_ON_A_LINE 16
+static void dump_bytes(unsigned int *ptr, int count, unsigned addr)
+{
+       char *data = (char *)ptr;
+       int line_bytes = 0, i = 0;
+
+       putsnonl("Memory dump:");
+       while(count > 0){
+               line_bytes =
+                       (count > NUMBER_OF_BYTES_ON_A_LINE)?
+                               NUMBER_OF_BYTES_ON_A_LINE : count;
+
+               printf("\n0x%08x  ", addr);
+               for(i=0;i<line_bytes;i++)
+                       printf("%02x ", *(unsigned char *)(data+i));
+
+               for(;i<NUMBER_OF_BYTES_ON_A_LINE;i++)
+                       printf("   ");
+
+               printf(" ");
+
+               for(i=0;i<line_bytes;i++) {
+                       if((*(data+i) < 0x20) || (*(data+i) > 0x7e))
+                               printf(".");
+                       else
+                               printf("%c", *(data+i));
+               }
+
+               for(;i<NUMBER_OF_BYTES_ON_A_LINE;i++)
+                       printf(" ");
+
+               data += (char)line_bytes;
+               count -= line_bytes;
+               addr += line_bytes;
+       }
+       printf("\n");
+}
+
+static void mr(char *startaddr, char *len)
+{
+       char *c;
+       unsigned int *addr;
+       unsigned int length;
+
+       if(*startaddr == 0) {
+               printf("mr <address> [length]\n");
+               return;
+       }
+       addr = (unsigned *)strtoul(startaddr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect address\n");
+               return;
+       }
+       if(*len == 0) {
+               length = 4;
+       } else {
+               length = strtoul(len, &c, 0);
+               if(*c != 0) {
+                       printf("incorrect length\n");
+                       return;
+               }
+       }
+
+       dump_bytes(addr, length, (unsigned)addr);
+}
+
+static void mw(char *addr, char *value, char *count)
+{
+       char *c;
+       unsigned int *addr2;
+       unsigned int value2;
+       unsigned int count2;
+       unsigned int i;
+
+       if((*addr == 0) || (*value == 0)) {
+               printf("mw <address> <value> [count]\n");
+               return;
+       }
+       addr2 = (unsigned int *)strtoul(addr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect address\n");
+               return;
+       }
+       value2 = strtoul(value, &c, 0);
+       if(*c != 0) {
+               printf("incorrect value\n");
+               return;
+       }
+       if(*count == 0) {
+               count2 = 1;
+       } else {
+               count2 = strtoul(count, &c, 0);
+               if(*c != 0) {
+                       printf("incorrect count\n");
+                       return;
+               }
+       }
+       for (i=0;i<count2;i++) *addr2++ = value2;
+}
+
+static void mc(char *dstaddr, char *srcaddr, char *count)
+{
+       char *c;
+       unsigned int *dstaddr2;
+       unsigned int *srcaddr2;
+       unsigned int count2;
+       unsigned int i;
+
+       if((*dstaddr == 0) || (*srcaddr == 0)) {
+               printf("mc <dst> <src> [count]\n");
+               return;
+       }
+       dstaddr2 = (unsigned int *)strtoul(dstaddr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect destination address\n");
+               return;
+       }
+       srcaddr2 = (unsigned int *)strtoul(srcaddr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect source address\n");
+               return;
+       }
+       if(*count == 0) {
+               count2 = 1;
+       } else {
+               count2 = strtoul(count, &c, 0);
+               if(*c != 0) {
+                       printf("incorrect count\n");
+                       return;
+               }
+       }
+       for (i=0;i<count2;i++) *dstaddr2++ = *srcaddr2++;
+}
+
+static void crc(char *startaddr, char *len)
+{
+       char *c;
+       char *addr;
+       unsigned int length;
+
+       if((*startaddr == 0)||(*len == 0)) {
+               printf("crc <address> <length>\n");
+               return;
+       }
+       addr = (char *)strtoul(startaddr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect address\n");
+               return;
+       }
+       length = strtoul(len, &c, 0);
+       if(*c != 0) {
+               printf("incorrect length\n");
+               return;
+       }
+
+       printf("CRC32: %08x\n", crc32((unsigned char *)addr, length));
+}
+
+#ifdef __lm32__
+enum {
+       CSR_IE = 1, CSR_IM, CSR_IP, CSR_ICC, CSR_DCC, CSR_CC, CSR_CFG, CSR_EBA,
+       CSR_DC, CSR_DEBA, CSR_JTX, CSR_JRX, CSR_BP0, CSR_BP1, CSR_BP2, CSR_BP3,
+       CSR_WP0, CSR_WP1, CSR_WP2, CSR_WP3,
+};
+
+/* processor registers */
+static int parse_csr(const char *csr)
+{
+       if(!strcmp(csr, "ie"))   return CSR_IE;
+       if(!strcmp(csr, "im"))   return CSR_IM;
+       if(!strcmp(csr, "ip"))   return CSR_IP;
+       if(!strcmp(csr, "icc"))  return CSR_ICC;
+       if(!strcmp(csr, "dcc"))  return CSR_DCC;
+       if(!strcmp(csr, "cc"))   return CSR_CC;
+       if(!strcmp(csr, "cfg"))  return CSR_CFG;
+       if(!strcmp(csr, "eba"))  return CSR_EBA;
+       if(!strcmp(csr, "dc"))   return CSR_DC;
+       if(!strcmp(csr, "deba")) return CSR_DEBA;
+       if(!strcmp(csr, "jtx"))  return CSR_JTX;
+       if(!strcmp(csr, "jrx"))  return CSR_JRX;
+       if(!strcmp(csr, "bp0"))  return CSR_BP0;
+       if(!strcmp(csr, "bp1"))  return CSR_BP1;
+       if(!strcmp(csr, "bp2"))  return CSR_BP2;
+       if(!strcmp(csr, "bp3"))  return CSR_BP3;
+       if(!strcmp(csr, "wp0"))  return CSR_WP0;
+       if(!strcmp(csr, "wp1"))  return CSR_WP1;
+       if(!strcmp(csr, "wp2"))  return CSR_WP2;
+       if(!strcmp(csr, "wp3"))  return CSR_WP3;
+
+       return 0;
+}
+
+static void rcsr(char *csr)
+{
+       unsigned int csr2;
+       register unsigned int value;
+
+       if(*csr == 0) {
+               printf("rcsr <csr>\n");
+               return;
+       }
+
+       csr2 = parse_csr(csr);
+       if(csr2 == 0) {
+               printf("incorrect csr\n");
+               return;
+       }
+
+       switch(csr2) {
+               case CSR_IE:   asm volatile ("rcsr %0,ie":"=r"(value)); break;
+               case CSR_IM:   asm volatile ("rcsr %0,im":"=r"(value)); break;
+               case CSR_IP:   asm volatile ("rcsr %0,ip":"=r"(value)); break;
+               case CSR_CC:   asm volatile ("rcsr %0,cc":"=r"(value)); break;
+               case CSR_CFG:  asm volatile ("rcsr %0,cfg":"=r"(value)); break;
+               case CSR_EBA:  asm volatile ("rcsr %0,eba":"=r"(value)); break;
+               case CSR_DEBA: asm volatile ("rcsr %0,deba":"=r"(value)); break;
+               case CSR_JTX:  asm volatile ("rcsr %0,jtx":"=r"(value)); break;
+               case CSR_JRX:  asm volatile ("rcsr %0,jrx":"=r"(value)); break;
+               default: printf("csr write only\n"); return;
+       }
+
+       printf("%08x\n", value);
+}
+
+static void wcsr(char *csr, char *value)
+{
+       char *c;
+       unsigned int csr2;
+       register unsigned int value2;
+
+       if((*csr == 0) || (*value == 0)) {
+               printf("wcsr <csr> <address>\n");
+               return;
+       }
+
+       csr2 = parse_csr(csr);
+       if(csr2 == 0) {
+               printf("incorrect csr\n");
+               return;
+       }
+       value2 = strtoul(value, &c, 0);
+       if(*c != 0) {
+               printf("incorrect value\n");
+               return;
+       }
+
+       switch(csr2) {
+               case CSR_IE:   asm volatile ("wcsr ie,%0"::"r"(value2)); break;
+               case CSR_IM:   asm volatile ("wcsr im,%0"::"r"(value2)); break;
+               case CSR_ICC:  asm volatile ("wcsr icc,%0"::"r"(value2)); break;
+               case CSR_DCC:  asm volatile ("wcsr dcc,%0"::"r"(value2)); break;
+               case CSR_EBA:  asm volatile ("wcsr eba,%0"::"r"(value2)); break;
+               case CSR_DC:   asm volatile ("wcsr dcc,%0"::"r"(value2)); break;
+               case CSR_DEBA: asm volatile ("wcsr deba,%0"::"r"(value2)); break;
+               case CSR_JTX:  asm volatile ("wcsr jtx,%0"::"r"(value2)); break;
+               case CSR_JRX:  asm volatile ("wcsr jrx,%0"::"r"(value2)); break;
+               case CSR_BP0:  asm volatile ("wcsr bp0,%0"::"r"(value2)); break;
+               case CSR_BP1:  asm volatile ("wcsr bp1,%0"::"r"(value2)); break;
+               case CSR_BP2:  asm volatile ("wcsr bp2,%0"::"r"(value2)); break;
+               case CSR_BP3:  asm volatile ("wcsr bp3,%0"::"r"(value2)); break;
+               case CSR_WP0:  asm volatile ("wcsr wp0,%0"::"r"(value2)); break;
+               case CSR_WP1:  asm volatile ("wcsr wp1,%0"::"r"(value2)); break;
+               case CSR_WP2:  asm volatile ("wcsr wp2,%0"::"r"(value2)); break;
+               case CSR_WP3:  asm volatile ("wcsr wp3,%0"::"r"(value2)); break;
+               default: printf("csr read only\n"); return;
+       }
+}
+
+#endif /* __lm32__ */
+
+static void dfs(char *baseaddr)
+{
+       char *c;
+       unsigned int addr;
+
+       if(*baseaddr == 0) {
+               printf("dfs <address>\n");
+               return;
+       }
+       addr = strtoul(baseaddr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect address\n");
+               return;
+       }
+       print_isd_info(addr);
+}
+
+/* Init + command line */
+
+static void help(void)
+{
+       puts("MiSoC BIOS");
+       puts("Available commands:");
+       puts("mr         - read address space");
+       puts("mw         - write address space");
+       puts("mc         - copy address space");
+       puts("crc        - compute CRC32 of a part of the address space");
+#ifdef __lm32__
+       puts("rcsr       - read processor CSR");
+       puts("wcsr       - write processor CSR");
+#endif
+#ifdef CSR_ETHMAC_BASE
+       puts("netboot    - boot via TFTP");
+#endif
+       puts("serialboot - boot via SFL");
+#ifdef FLASH_BOOT_ADDRESS
+       puts("flashboot  - boot from flash");
+#endif
+#ifdef ROM_BOOT_ADDRESS
+       puts("romboot    - boot from embedded rom");
+#endif
+       puts("revision   - display revision");
+#ifdef CSR_SDRAM_BASE
+       puts("memtest    - run a memory test");
+#endif
+}
+
+static char *get_token(char **str)
+{
+       char *c, *d;
+
+       c = (char *)strchr(*str, ' ');
+       if(c == NULL) {
+               d = *str;
+               *str = *str+strlen(*str);
+               return d;
+       }
+       *c = 0;
+       d = *str;
+       *str = c+1;
+       return d;
+}
+
+static void do_command(char *c)
+{
+       char *token;
+
+       token = get_token(&c);
+
+       if(strcmp(token, "mr") == 0) mr(get_token(&c), get_token(&c));
+       else if(strcmp(token, "mw") == 0) mw(get_token(&c), get_token(&c), get_token(&c));
+       else if(strcmp(token, "mc") == 0) mc(get_token(&c), get_token(&c), get_token(&c));
+       else if(strcmp(token, "crc") == 0) crc(get_token(&c), get_token(&c));
+
+#ifdef L2_SIZE
+       else if(strcmp(token, "flushl2") == 0) flush_l2_cache();
+#endif
+
+#ifdef FLASH_BOOT_ADDRESS
+       else if(strcmp(token, "flashboot") == 0) flashboot();
+#endif
+#ifdef ROM_BOOT_ADDRESS
+       else if(strcmp(token, "romboot") == 0) romboot();
+#endif
+       else if(strcmp(token, "serialboot") == 0) serialboot();
+#ifdef CSR_ETHMAC_BASE
+       else if(strcmp(token, "netboot") == 0) netboot();
+#endif
+
+       else if(strcmp(token, "revision") == 0) printf("%08x\n", MSC_GIT_ID);
+
+       else if(strcmp(token, "help") == 0) help();
+
+#ifdef __lm32__
+       else if(strcmp(token, "rcsr") == 0) rcsr(get_token(&c));
+       else if(strcmp(token, "wcsr") == 0) wcsr(get_token(&c), get_token(&c));
+#endif
+
+#ifdef CSR_SDRAM_BASE
+       else if(strcmp(token, "sdrrow") == 0) sdrrow(get_token(&c));
+       else if(strcmp(token, "sdrsw") == 0) sdrsw();
+       else if(strcmp(token, "sdrhw") == 0) sdrhw();
+       else if(strcmp(token, "sdrrdbuf") == 0) sdrrdbuf(-1);
+       else if(strcmp(token, "sdrrd") == 0) sdrrd(get_token(&c), get_token(&c));
+       else if(strcmp(token, "sdrrderr") == 0) sdrrderr(get_token(&c));
+       else if(strcmp(token, "sdrwr") == 0) sdrwr(get_token(&c));
+#ifdef CSR_DDRPHY_BASE
+       else if(strcmp(token, "sdrwlon") == 0) sdrwlon();
+       else if(strcmp(token, "sdrwloff") == 0) sdrwloff();
+       else if(strcmp(token, "sdrlevel") == 0) sdrlevel();
+#endif
+       else if(strcmp(token, "memtest") == 0) memtest();
+       else if(strcmp(token, "sdrinit") == 0) sdrinit();
+#endif
+
+       else if(strcmp(token, "dfs") == 0) dfs(get_token(&c));
+
+       else if(strcmp(token, "") != 0)
+               printf("Command not found\n");
+}
+
+extern unsigned int _ftext, _erodata;
+
+static void crcbios(void)
+{
+       unsigned int offset_bios;
+       unsigned int length;
+       unsigned int expected_crc;
+       unsigned int actual_crc;
+
+       /*
+        * _erodata is located right after the end of the flat
+        * binary image. The CRC tool writes the 32-bit CRC here.
+        * We also use the address of _erodata to know the length
+        * of our code.
+        */
+       offset_bios = (unsigned int)&_ftext;
+       expected_crc = _erodata;
+       length = (unsigned int)&_erodata - offset_bios;
+       actual_crc = crc32((unsigned char *)offset_bios, length);
+       if(expected_crc == actual_crc)
+               printf("BIOS CRC passed (%08x)\n", actual_crc);
+       else {
+               printf("BIOS CRC failed (expected %08x, got %08x)\n", expected_crc, actual_crc);
+               printf("The system will continue, but expect problems.\n");
+       }
+}
+
+static void readstr(char *s, int size)
+{
+       char c[2];
+       int ptr;
+
+       c[1] = 0;
+       ptr = 0;
+       while(1) {
+               c[0] = readchar();
+               switch(c[0]) {
+                       case 0x7f:
+                       case 0x08:
+                               if(ptr > 0) {
+                                       ptr--;
+                                       putsnonl("\x08 \x08");
+                               }
+                               break;
+                       case 0x07:
+                               break;
+                       case '\r':
+                       case '\n':
+                               s[ptr] = 0x00;
+                               putsnonl("\n");
+                               return;
+                       default:
+                               putsnonl(c);
+                               s[ptr] = c[0];
+                               ptr++;
+                               break;
+               }
+       }
+}
+
+static int test_user_abort(void)
+{
+       char c;
+
+       printf("Automatic boot in 2 seconds...\n");
+       printf("Q/ESC: abort boot\n");
+       printf("F7:    boot from serial\n");
+#ifdef CSR_ETHMAC_BASE
+       printf("F8:    boot from network\n");
+#endif
+       timer0_en_write(0);
+       timer0_reload_write(0);
+       timer0_load_write(identifier_frequency_read()*2);
+       timer0_en_write(1);
+       timer0_update_value_write(1);
+       while(timer0_value_read()) {
+               if(readchar_nonblock()) {
+                       c = readchar();
+                       if((c == 'Q')||(c == '\e')) {
+                               puts("Aborted");
+                               return 0;
+                       }
+                       if(c == 0x06) {
+                               serialboot();
+                               return 0;
+                       }
+#ifdef CSR_ETHMAC_BASE
+                       if(c == 0x07) {
+                               netboot();
+                               return 0;
+                       }
+#endif
+               }
+               timer0_update_value_write(1);
+       }
+       return 1;
+}
+
+static void boot_sequence(void)
+{
+       if(test_user_abort()) {
+#ifdef FLASH_BOOT_ADDRESS
+               flashboot();
+#endif
+#ifdef ROM_BOOT_ADDRESS
+               romboot();
+#endif
+               serialboot();
+#ifdef CSR_ETHMAC_BASE
+#ifdef CSR_ETHPHY_MODE_DETECTION_MODE_ADDR
+               eth_mode();
+#endif
+               netboot();
+#endif
+               printf("No boot medium found\n");
+       }
+}
+
+int main(int i, char **c)
+{
+       char buffer[64];
+       int sdr_ok;
+
+       irq_setmask(0);
+       irq_setie(1);
+       uart_init();
+       puts("\nMiSoC BIOS   http://m-labs.hk\n"
+       "(c) Copyright 2007-2014 Sebastien Bourdeauducq");
+       printf("Revision %08x built "__DATE__" "__TIME__"\n\n", MSC_GIT_ID);
+       crcbios();
+       id_print();
+#ifdef CSR_ETHMAC_BASE
+       eth_init();
+#endif
+#ifdef CSR_SDRAM_BASE
+       sdr_ok = sdrinit();
+#else
+       sdr_ok = 1;
+#endif
+       if(sdr_ok)
+               boot_sequence();
+       else
+               printf("Memory initialization failed\n");
+
+       while(1) {
+               putsnonl("\e[1mBIOS>\e[0m ");
+               readstr(buffer, 64);
+               do_command(buffer);
+       }
+       return 0;
+}
diff --git a/misoc/software/bios/sdram.c b/misoc/software/bios/sdram.c
new file mode 100644 (file)
index 0000000..bb917df
--- /dev/null
@@ -0,0 +1,547 @@
+#include <generated/csr.h>
+#ifdef CSR_SDRAM_BASE
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <generated/sdram_phy.h>
+#include <generated/mem.h>
+#include <hw/flags.h>
+#include <system.h>
+
+#include "sdram.h"
+
+static void cdelay(int i)
+{
+       while(i > 0) {
+#if defined (__lm32__)
+               __asm__ volatile("nop");
+#elif defined (__or1k__)
+               __asm__ volatile("l.nop");
+#else
+#error Unsupported architecture
+#endif
+               i--;
+       }
+}
+
+void sdrsw(void)
+{
+       sdram_dfii_control_write(DFII_CONTROL_CKE|DFII_CONTROL_ODT|DFII_CONTROL_RESET_N);
+       printf("SDRAM now under software control\n");
+}
+
+void sdrhw(void)
+{
+       sdram_dfii_control_write(DFII_CONTROL_SEL);
+       printf("SDRAM now under hardware control\n");
+}
+
+void sdrrow(char *_row)
+{
+       char *c;
+       unsigned int row;
+
+       if(*_row == 0) {
+               sdram_dfii_pi0_address_write(0x0000);
+               sdram_dfii_pi0_baddress_write(0);
+               command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
+               cdelay(15);
+               printf("Precharged\n");
+       } else {
+               row = strtoul(_row, &c, 0);
+               if(*c != 0) {
+                       printf("incorrect row\n");
+                       return;
+               }
+               sdram_dfii_pi0_address_write(row);
+               sdram_dfii_pi0_baddress_write(0);
+               command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CS);
+               cdelay(15);
+               printf("Activated row %d\n", row);
+       }
+}
+
+void sdrrdbuf(int dq)
+{
+       int i, p;
+       int first_byte, step;
+
+       if(dq < 0) {
+               first_byte = 0;
+               step = 1;
+       } else {
+               first_byte = DFII_PIX_DATA_SIZE/2 - 1 - dq;
+               step = DFII_PIX_DATA_SIZE/2;
+       }
+
+       for(p=0;p<DFII_NPHASES;p++)
+               for(i=first_byte;i<DFII_PIX_DATA_SIZE;i+=step)
+                       printf("%02x", MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i));
+       printf("\n");
+}
+
+void sdrrd(char *startaddr, char *dq)
+{
+       char *c;
+       unsigned int addr;
+       int _dq;
+
+       if(*startaddr == 0) {
+               printf("sdrrd <address>\n");
+               return;
+       }
+       addr = strtoul(startaddr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect address\n");
+               return;
+       }
+       if(*dq == 0)
+               _dq = -1;
+       else {
+               _dq = strtoul(dq, &c, 0);
+               if(*c != 0) {
+                       printf("incorrect DQ\n");
+                       return;
+               }
+       }
+
+       sdram_dfii_pird_address_write(addr);
+       sdram_dfii_pird_baddress_write(0);
+       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
+       cdelay(15);
+       sdrrdbuf(_dq);
+}
+
+void sdrrderr(char *count)
+{
+       int addr;
+       char *c;
+       int _count;
+       int i, j, p;
+       unsigned char prev_data[DFII_NPHASES*DFII_PIX_DATA_SIZE];
+       unsigned char errs[DFII_NPHASES*DFII_PIX_DATA_SIZE];
+
+       if(*count == 0) {
+               printf("sdrrderr <count>\n");
+               return;
+       }
+       _count = strtoul(count, &c, 0);
+       if(*c != 0) {
+               printf("incorrect count\n");
+               return;
+       }
+
+       for(i=0;i<DFII_NPHASES*DFII_PIX_DATA_SIZE;i++)
+                       errs[i] = 0;
+       for(addr=0;addr<16;addr++) {
+               sdram_dfii_pird_address_write(addr*8);
+               sdram_dfii_pird_baddress_write(0);
+               command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
+               cdelay(15);
+               for(p=0;p<DFII_NPHASES;p++)
+                       for(i=0;i<DFII_PIX_DATA_SIZE;i++)
+                               prev_data[p*DFII_PIX_DATA_SIZE+i] = MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i);
+
+               for(j=0;j<_count;j++) {
+                       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
+                       cdelay(15);
+                       for(p=0;p<DFII_NPHASES;p++)
+                               for(i=0;i<DFII_PIX_DATA_SIZE;i++) {
+                                       unsigned char new_data;
+
+                                       new_data = MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i);
+                                       errs[p*DFII_PIX_DATA_SIZE+i] |= prev_data[p*DFII_PIX_DATA_SIZE+i] ^ new_data;
+                                       prev_data[p*DFII_PIX_DATA_SIZE+i] = new_data;
+                               }
+               }
+       }
+
+       for(i=0;i<DFII_NPHASES*DFII_PIX_DATA_SIZE;i++)
+               printf("%02x", errs[i]);
+       printf("\n");
+       for(p=0;p<DFII_NPHASES;p++)
+               for(i=0;i<DFII_PIX_DATA_SIZE;i++)
+                       printf("%2x", DFII_PIX_DATA_SIZE/2 - 1 - (i % (DFII_PIX_DATA_SIZE/2)));
+       printf("\n");
+}
+
+void sdrwr(char *startaddr)
+{
+       char *c;
+       unsigned int addr;
+       int i;
+       int p;
+
+       if(*startaddr == 0) {
+               printf("sdrrd <address>\n");
+               return;
+       }
+       addr = strtoul(startaddr, &c, 0);
+       if(*c != 0) {
+               printf("incorrect address\n");
+               return;
+       }
+
+       for(p=0;p<DFII_NPHASES;p++)
+               for(i=0;i<DFII_PIX_DATA_SIZE;i++)
+                       MMPTR(sdram_dfii_pix_wrdata_addr[p]+4*i) = 0x10*p + i;
+
+       sdram_dfii_piwr_address_write(addr);
+       sdram_dfii_piwr_baddress_write(0);
+       command_pwr(DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS|DFII_COMMAND_WRDATA);
+}
+
+#ifdef CSR_DDRPHY_BASE
+
+void sdrwlon(void)
+{
+       sdram_dfii_pi0_address_write(DDR3_MR1 | (1 << 7));
+       sdram_dfii_pi0_baddress_write(1);
+       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
+       ddrphy_wlevel_en_write(1);
+}
+
+void sdrwloff(void)
+{
+       sdram_dfii_pi0_address_write(DDR3_MR1);
+       sdram_dfii_pi0_baddress_write(1);
+       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
+       ddrphy_wlevel_en_write(0);
+}
+
+#define ERR_DDRPHY_DELAY 32
+
+static int write_level(int *delay, int *high_skew)
+{
+       int i;
+       int dq_address;
+       unsigned char dq;
+       int ok;
+
+       printf("Write leveling: ");
+
+       sdrwlon();
+       cdelay(100);
+       for(i=0;i<DFII_PIX_DATA_SIZE/2;i++) {
+               dq_address = sdram_dfii_pix_rddata_addr[0]+4*(DFII_PIX_DATA_SIZE/2-1-i);
+               ddrphy_dly_sel_write(1 << i);
+               ddrphy_wdly_dq_rst_write(1);
+               ddrphy_wdly_dqs_rst_write(1);
+
+               delay[i] = 0;
+
+               ddrphy_wlevel_strobe_write(1);
+               cdelay(10);
+               dq = MMPTR(dq_address);
+               if(dq != 0) {
+                       /*
+                        * Assume this DQ group has between 1 and 2 bit times of skew.
+                        * Bring DQS into the CK=0 zone before continuing leveling.
+                        */
+                       high_skew[i] = 1;
+                       while(dq != 0) {
+                               delay[i]++;
+                               if(delay[i] >= ERR_DDRPHY_DELAY)
+                                       break;
+                               ddrphy_wdly_dq_inc_write(1);
+                               ddrphy_wdly_dqs_inc_write(1);
+                               ddrphy_wlevel_strobe_write(1);
+                               cdelay(10);
+                               dq = MMPTR(dq_address);
+                        }
+               } else
+                       high_skew[i] = 0;
+
+               while(dq == 0) {
+                       delay[i]++;
+                       if(delay[i] >= ERR_DDRPHY_DELAY)
+                               break;
+                       ddrphy_wdly_dq_inc_write(1);
+                       ddrphy_wdly_dqs_inc_write(1);
+
+                       ddrphy_wlevel_strobe_write(1);
+                       cdelay(10);
+                       dq = MMPTR(dq_address);
+               }
+       }
+       sdrwloff();
+
+       ok = 1;
+       for(i=DFII_PIX_DATA_SIZE/2-1;i>=0;i--) {
+               printf("%2d%c ", delay[i], high_skew[i] ? '*' : ' ');
+               if(delay[i] >= ERR_DDRPHY_DELAY)
+                       ok = 0;
+       }
+
+       if(ok)
+               printf("completed\n");
+       else
+               printf("failed\n");
+
+       return ok;
+}
+
+static void read_bitslip(int *delay, int *high_skew)
+{
+       int bitslip_thr;
+       int i;
+
+       bitslip_thr = 0x7fffffff;
+       for(i=0;i<DFII_PIX_DATA_SIZE/2;i++)
+               if(high_skew[i] && (delay[i] < bitslip_thr))
+                       bitslip_thr = delay[i];
+       if(bitslip_thr == 0x7fffffff)
+               return;
+       bitslip_thr = bitslip_thr/2;
+
+       printf("Read bitslip: ");
+       for(i=DFII_PIX_DATA_SIZE/2-1;i>=0;i--)
+               if(delay[i] > bitslip_thr) {
+                       ddrphy_dly_sel_write(1 << i);
+                       /* 7-series SERDES in DDR mode needs 3 pulses for 1 bitslip */
+                       ddrphy_rdly_dq_bitslip_write(1);
+                       ddrphy_rdly_dq_bitslip_write(1);
+                       ddrphy_rdly_dq_bitslip_write(1);
+                       printf("%d ", i);
+               }
+       printf("\n");
+}
+
+static void read_delays(void)
+{
+       unsigned int prv;
+       unsigned char prs[DFII_NPHASES*DFII_PIX_DATA_SIZE];
+       int p, i, j;
+       int working;
+       int delay, delay_min, delay_max;
+
+       printf("Read delays: ");
+
+       /* Generate pseudo-random sequence */
+       prv = 42;
+       for(i=0;i<DFII_NPHASES*DFII_PIX_DATA_SIZE;i++) {
+               prv = 1664525*prv + 1013904223;
+               prs[i] = prv;
+       }
+
+       /* Activate */
+       sdram_dfii_pi0_address_write(0);
+       sdram_dfii_pi0_baddress_write(0);
+       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CS);
+       cdelay(15);
+
+       /* Write test pattern */
+       for(p=0;p<DFII_NPHASES;p++)
+               for(i=0;i<DFII_PIX_DATA_SIZE;i++)
+                       MMPTR(sdram_dfii_pix_wrdata_addr[p]+4*i) = prs[DFII_PIX_DATA_SIZE*p+i];
+       sdram_dfii_piwr_address_write(0);
+       sdram_dfii_piwr_baddress_write(0);
+       command_pwr(DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS|DFII_COMMAND_WRDATA);
+
+       /* Calibrate each DQ in turn */
+       sdram_dfii_pird_address_write(0);
+       sdram_dfii_pird_baddress_write(0);
+       for(i=0;i<DFII_PIX_DATA_SIZE/2;i++) {
+               ddrphy_dly_sel_write(1 << (DFII_PIX_DATA_SIZE/2-i-1));
+               delay = 0;
+
+               /* Find smallest working delay */
+               ddrphy_rdly_dq_rst_write(1);
+               while(1) {
+                       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
+                       cdelay(15);
+                       working = 1;
+                       for(p=0;p<DFII_NPHASES;p++) {
+                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i) != prs[DFII_PIX_DATA_SIZE*p+i])
+                                       working = 0;
+                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*(i+DFII_PIX_DATA_SIZE/2)) != prs[DFII_PIX_DATA_SIZE*p+i+DFII_PIX_DATA_SIZE/2])
+                                       working = 0;
+                       }
+                       if(working)
+                               break;
+                       delay++;
+                       if(delay >= ERR_DDRPHY_DELAY)
+                               break;
+                       ddrphy_rdly_dq_inc_write(1);
+               }
+               delay_min = delay;
+
+               /* Get a bit further into the working zone */
+               delay++;
+               ddrphy_rdly_dq_inc_write(1);
+
+               /* Find largest working delay */
+               while(1) {
+                       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
+                       cdelay(15);
+                       working = 1;
+                       for(p=0;p<DFII_NPHASES;p++) {
+                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i) != prs[DFII_PIX_DATA_SIZE*p+i])
+                                       working = 0;
+                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*(i+DFII_PIX_DATA_SIZE/2)) != prs[DFII_PIX_DATA_SIZE*p+i+DFII_PIX_DATA_SIZE/2])
+                                       working = 0;
+                       }
+                       if(!working)
+                               break;
+                       delay++;
+                       if(delay >= ERR_DDRPHY_DELAY)
+                               break;
+                       ddrphy_rdly_dq_inc_write(1);
+               }
+               delay_max = delay;
+
+               printf("%d:%02d-%02d  ", DFII_PIX_DATA_SIZE/2-i-1, delay_min, delay_max);
+
+               /* Set delay to the middle */
+               ddrphy_rdly_dq_rst_write(1);
+               for(j=0;j<(delay_min+delay_max)/2;j++)
+                       ddrphy_rdly_dq_inc_write(1);
+       }
+
+       /* Precharge */
+       sdram_dfii_pi0_address_write(0);
+       sdram_dfii_pi0_baddress_write(0);
+       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
+       cdelay(15);
+
+       printf("completed\n");
+}
+
+int sdrlevel(void)
+{
+       int delay[DFII_PIX_DATA_SIZE/2];
+       int high_skew[DFII_PIX_DATA_SIZE/2];
+
+       if(!write_level(delay, high_skew))
+               return 0;
+       read_bitslip(delay, high_skew);
+       read_delays();
+
+       return 1;
+}
+
+#endif /* CSR_DDRPHY_BASE */
+
+#define TEST_DATA_SIZE (2*1024*1024)
+#define TEST_DATA_RANDOM 1
+
+#define TEST_ADDR_SIZE (32*1024)
+#define TEST_ADDR_RANDOM 0
+
+#define ONEZERO 0xAAAAAAAA
+#define ZEROONE 0x55555555
+
+static unsigned int seed_to_data_32(unsigned int seed, int random)
+{
+       if (random)
+               return 1664525*seed + 1013904223;
+       else
+               return seed + 1;
+}
+
+static unsigned short seed_to_data_16(unsigned short seed, int random)
+{
+       if (random)
+               return 25173*seed + 13849;
+       else
+               return seed + 1;
+}
+
+int memtest_silent(void)
+{
+       volatile unsigned int *array = (unsigned int *)MAIN_RAM_BASE;
+       int i;
+       unsigned int seed_32;
+       unsigned short seed_16;
+       unsigned int error_cnt;
+
+       error_cnt = 0;
+
+       /* test data bus */
+       for(i=0;i<128;i++) {
+               array[i] = ONEZERO;
+       }
+       flush_cpu_dcache();
+       flush_l2_cache();
+       for(i=0;i<128;i++) {
+               if(array[i] != ONEZERO)
+                       error_cnt++;
+       }
+
+       for(i=0;i<128;i++) {
+               array[i] = ZEROONE;
+       }
+       flush_cpu_dcache();
+       flush_l2_cache();
+       for(i=0;i<128;i++) {
+               if(array[i] != ZEROONE)
+                       error_cnt++;
+       }
+
+       /* test counter or random data */
+       seed_32 = 0;
+       for(i=0;i<TEST_DATA_SIZE/4;i++) {
+               seed_32 = seed_to_data_32(seed_32, TEST_DATA_RANDOM);
+               array[i] = seed_32;
+       }
+
+       seed_32 = 0;
+       flush_cpu_dcache();
+       flush_l2_cache();
+       for(i=0;i<TEST_DATA_SIZE/4;i++) {
+               seed_32 = seed_to_data_32(seed_32, TEST_DATA_RANDOM);
+               if(array[i] != seed_32)
+                       error_cnt++;
+       }
+
+       /* test random addressing */
+       seed_16 = 0;
+       for(i=0;i<TEST_ADDR_SIZE/4;i++) {
+               seed_16 = seed_to_data_16(seed_16, TEST_ADDR_RANDOM);
+               array[(unsigned int) seed_16] = i;
+       }
+
+       seed_16 = 0;
+       flush_cpu_dcache();
+       flush_l2_cache();
+       for(i=0;i<TEST_ADDR_SIZE/4;i++) {
+               seed_16 = seed_to_data_16(seed_16, TEST_ADDR_RANDOM);
+               if(array[(unsigned int) seed_16] != i)
+                       error_cnt++;
+       }
+
+       return error_cnt;
+}
+
+int memtest(void)
+{
+       unsigned int e;
+
+       e = memtest_silent();
+       if(e != 0) {
+               printf("Memtest failed: %d/%d words incorrect\n", e, 2*128 + TEST_DATA_SIZE/4 + TEST_ADDR_SIZE/4);
+               return 0;
+       } else {
+               printf("Memtest OK\n");
+               return 1;
+       }
+}
+
+int sdrinit(void)
+{
+       printf("Initializing SDRAM...\n");
+
+       init_sequence();
+#ifdef CSR_DDRPHY_BASE
+       if(!sdrlevel())
+               return 0;
+#endif
+       sdram_dfii_control_write(DFII_CONTROL_SEL);
+       if(!memtest())
+               return 0;
+
+       return 1;
+}
+
+#endif
diff --git a/misoc/software/bios/sdram.h b/misoc/software/bios/sdram.h
new file mode 100644 (file)
index 0000000..c5d0984
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef __SDRAM_H
+#define __SDRAM_H
+
+#include <generated/csr.h>
+
+void sdrsw(void);
+void sdrhw(void);
+void sdrrow(char *_row);
+void sdrrdbuf(int dq);
+void sdrrd(char *startaddr, char *dq);
+void sdrrderr(char *count);
+void sdrwr(char *startaddr);
+
+#ifdef CSR_DDRPHY_BASE
+void sdrwlon(void);
+void sdrwloff(void);
+int sdrlevel(void);
+#endif
+
+int memtest_silent(void);
+int memtest(void);
+int sdrinit(void);
+
+#endif /* __SDRAM_H */
diff --git a/misoc/software/bios/sfl.h b/misoc/software/bios/sfl.h
new file mode 100644 (file)
index 0000000..c496aed
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef __SFL_H
+#define __SFL_H
+
+#define SFL_MAGIC_LEN 14
+#define SFL_MAGIC_REQ "sL5DdSMmkekro\n"
+#define SFL_MAGIC_ACK "z6IHG7cYDID6o\n"
+
+struct sfl_frame {
+       unsigned char length;
+       unsigned char crc[2];
+       unsigned char cmd;
+       unsigned char payload[255];
+} __attribute__((packed));
+
+/* General commands */
+#define SFL_CMD_ABORT          0x00
+#define SFL_CMD_LOAD           0x01
+#define SFL_CMD_JUMP           0x02
+
+/* Linux-specific commands */
+#define SFL_CMD_CMDLINE                0x03
+#define SFL_CMD_INITRDSTART    0x04
+#define SFL_CMD_INITRDEND      0x05
+
+/* Replies */
+#define SFL_ACK_SUCCESS                'K'
+#define SFL_ACK_CRCERROR       'C'
+#define SFL_ACK_UNKNOWN                'U'
+#define SFL_ACK_ERROR          'E'
+
+#endif /* __SFL_H */
diff --git a/misoc/software/common.mak b/misoc/software/common.mak
new file mode 100644 (file)
index 0000000..053ace1
--- /dev/null
@@ -0,0 +1,73 @@
+include $(MSCDIR)/software/include/generated/cpu.mak
+TARGET_PREFIX=$(TRIPLE)-
+
+RM ?= rm -f
+PYTHON ?= python3
+
+ifeq ($(CLANG),1)
+CC_normal      := clang -target $(TRIPLE) -integrated-as
+CX_normal      := clang++ -target $(TRIPLE) -integrated-as
+else
+CC_normal      := $(TARGET_PREFIX)gcc
+CX_normal      := $(TARGET_PREFIX)g++
+endif
+AR_normal      := $(TARGET_PREFIX)ar
+LD_normal      := $(TARGET_PREFIX)ld
+OBJCOPY_normal := $(TARGET_PREFIX)objcopy
+
+CC_quiet      = @echo " CC      " $@ && $(CC_normal)
+CX_quiet      = @echo " CX      " $@ && $(CX_normal)
+AR_quiet      = @echo " AR      " $@ && $(AR_normal)
+LD_quiet      = @echo " LD      " $@ && $(LD_normal)
+OBJCOPY_quiet = @echo " OBJCOPY " $@ && $(OBJCOPY_normal)
+
+MSC_GIT_ID := $(shell cd $(MSCDIR) && $(PYTHON) -c "from misoc.cores.identifier import get_id; print(hex(get_id()), end='')")
+
+ifeq ($(V),1)
+       CC = $(CC_normal)
+       CX = $(CX_normal)
+       AR = $(AR_normal)
+       LD = $(LD_normal)
+       OBJCOPY = $(OBJCOPY_normal)
+else
+       CC = $(CC_quiet)
+       CX = $(CX_quiet)
+       AR = $(AR_quiet)
+       LD = $(LD_quiet)
+       OBJCOPY = $(OBJCOPY_quiet)
+endif
+
+# Toolchain options
+#
+INCLUDES = -I$(MSCDIR)/software/include/base -I$(MSCDIR)/software/include -I$(MSCDIR)/common
+COMMONFLAGS = -Os $(CPUFLAGS) -fomit-frame-pointer -Wall -fno-builtin -nostdinc -DMSC_GIT_ID=$(MSC_GIT_ID) $(INCLUDES)
+CFLAGS = $(COMMONFLAGS) -fexceptions -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes
+CXXFLAGS = $(COMMONFLAGS) -std=c++11 -I$(MSCDIR)/software/include/basec++ -fexceptions -fno-rtti -ffreestanding
+LDFLAGS = -nostdlib -nodefaultlibs -L$(MSCDIR)/software/include
+
+# compile and generate dependencies, based on
+# http://scottmcpeak.com/autodepend/autodepend.html
+
+define compilexx-dep
+$(CX) -c $(CXXFLAGS) $(1) $< -o $*.o
+@$(CX_normal) -MM $(CXXFLAGS) $(1) $< > $*.d
+@mv -f $*.d $*.d.tmp
+@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
+@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
+       sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
+@rm -f $*.d.tmp
+endef
+
+define compile-dep
+$(CC) -c $(CFLAGS) $(1) $< -o $*.o
+@$(CC_normal) -MM $(CFLAGS) $(1) $< > $*.d
+@mv -f $*.d $*.d.tmp
+@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
+@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
+       sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
+@rm -f $*.d.tmp
+endef
+
+define assemble
+$(CC) -c $(CFLAGS) -o $*.o $<
+endef
diff --git a/misoc/software/compiler-rt b/misoc/software/compiler-rt
new file mode 160000 (submodule)
index 0000000..a144878
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit a1448787a069603414e716adc8a41f866e28a4b4
diff --git a/misoc/software/include/base/assert.h b/misoc/software/include/base/assert.h
new file mode 100644 (file)
index 0000000..7b80a28
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ASSERT_H
+#define __ASSERT_H
+
+#define assert(x)
+
+#endif /* __ASSERT_H */
diff --git a/misoc/software/include/base/console.h b/misoc/software/include/base/console.h
new file mode 100644 (file)
index 0000000..a1cf599
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef __CONSOLE_H
+#define __CONSOLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*console_write_hook)(char);
+typedef char (*console_read_hook)(void);
+typedef int (*console_read_nonblock_hook)(void);
+
+void console_set_write_hook(console_write_hook h);
+void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn);
+
+char readchar(void);
+int readchar_nonblock(void);
+
+void putsnonl(const char *s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CONSOLE_H */
diff --git a/misoc/software/include/base/crc.h b/misoc/software/include/base/crc.h
new file mode 100644 (file)
index 0000000..88c8d95
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __CRC_H
+#define __CRC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+unsigned short crc16(const unsigned char *buffer, int len);
+unsigned int crc32(const unsigned char *buffer, unsigned int len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/misoc/software/include/base/ctype.h b/misoc/software/include/base/ctype.h
new file mode 100644 (file)
index 0000000..6936859
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef __CTYPE_H
+#define __CTYPE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * NOTE! This ctype does not handle EOF like the standard C
+ * library is required to.
+ */
+
+#define _U     0x01    /* upper */
+#define _L     0x02    /* lower */
+#define _D     0x04    /* digit */
+#define _C     0x08    /* cntrl */
+#define _P     0x10    /* punct */
+#define _S     0x20    /* white space (space/lf/tab) */
+#define _X     0x40    /* hex digit */
+#define _SP    0x80    /* hard space (0x20) */
+
+extern const unsigned char _ctype[];
+
+#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
+
+#define isalnum(c)     ((__ismask(c)&(_U|_L|_D)) != 0)
+#define isalpha(c)     ((__ismask(c)&(_U|_L)) != 0)
+#define iscntrl(c)     ((__ismask(c)&(_C)) != 0)
+#define isdigit(c)     ((__ismask(c)&(_D)) != 0)
+#define isgraph(c)     ((__ismask(c)&(_P|_U|_L|_D)) != 0)
+#define islower(c)     ((__ismask(c)&(_L)) != 0)
+#define isprint(c)     ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
+#define ispunct(c)     ((__ismask(c)&(_P)) != 0)
+/* Note: isspace() must return false for %NUL-terminator */
+#define isspace(c)     ((__ismask(c)&(_S)) != 0)
+#define isupper(c)     ((__ismask(c)&(_U)) != 0)
+#define isxdigit(c)    ((__ismask(c)&(_D|_X)) != 0)
+
+#define isascii(c) (((unsigned char)(c))<=0x7f)
+#define toascii(c) (((unsigned char)(c))&0x7f)
+
+static inline unsigned char __tolower(unsigned char c)
+{
+       if (isupper(c))
+               c -= 'A'-'a';
+       return c;
+}
+
+static inline unsigned char __toupper(unsigned char c)
+{
+       if (islower(c))
+               c -= 'a'-'A';
+       return c;
+}
+
+#define tolower(c) __tolower(c)
+#define toupper(c) __toupper(c)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CTYPE_H */
diff --git a/misoc/software/include/base/endian.h b/misoc/software/include/base/endian.h
new file mode 100644 (file)
index 0000000..81cf215
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef __ENDIAN_H
+#define __ENDIAN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __LITTLE_ENDIAN 0
+#define __BIG_ENDIAN 1
+#define __BYTE_ORDER __BIG_ENDIAN
+
+static inline unsigned int le32toh(unsigned int val)
+{
+       return (val & 0xff) << 24 |
+               (val & 0xff00) << 8 |
+               (val & 0xff0000) >> 8 |
+               (val & 0xff000000) >> 24;
+}
+
+static inline unsigned short le16toh(unsigned short val)
+{
+       return (val & 0xff) << 8 |
+               (val & 0xff00) >> 8;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ENDIAN_H */
diff --git a/misoc/software/include/base/errno.h b/misoc/software/include/base/errno.h
new file mode 100644 (file)
index 0000000..be05873
--- /dev/null
@@ -0,0 +1,261 @@
+#ifndef __ERRNO_H
+#define __ERRNO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int errno;
+
+#define EPERM               1
+#define EPERM_STR           "Operation not permitted"
+#define ENOENT              2
+#define ENOENT_STR          "No such file or directory"
+#define ESRCH               3
+#define ESRCH_STR           "No such process"
+#define EINTR               4
+#define EINTR_STR           "Interrupted system call"
+#define EIO                 5
+#define EIO_STR             "I/O error"
+#define ENXIO               6
+#define ENXIO_STR           "No such device or address"
+#define E2BIG               7
+#define E2BIG_STR           "Arg list too long"
+#define ENOEXEC             8
+#define ENOEXEC_STR         "Exec format error"
+#define EBADF               9
+#define EBADF_STR           "Bad file number"
+#define ECHILD              10
+#define ECHILD_STR          "No child processes"
+#define EAGAIN              11
+#define EWOULDBLOCK         EAGAIN
+#define EAGAIN_STR          "Try again"
+#define ENOMEM              12
+#define ENOMEM_STR          "Out of memory"
+#define EACCES              13
+#define EACCES_STR          "Permission denied"
+#define EFAULT              14
+#define EFAULT_STR          "Bad address"
+#define ENOTBLK             15
+#define ENOTBLK_STR         "Block device required"
+#define EBUSY               16
+#define EBUSY_STR           "Device or resource busy"
+#define EEXIST              17
+#define EEXIST_STR          "File exists"
+#define EXDEV               18
+#define EXDEV_STR           "Cross-device link"
+#define ENODEV              19
+#define ENODEV_STR          "No such device"
+#define ENOTDIR             20
+#define ENOTDIR_STR         "Not a directory"
+#define EISDIR              21
+#define EISDIR_STR          "Is a directory"
+#define EINVAL              22
+#define EINVAL_STR          "Invalid argument"
+#define ENFILE              23
+#define ENFILE_STR          "File table overflow"
+#define EMFILE              24
+#define EMFILE_STR          "Too many open files"
+#define ENOTTY              25
+#define ENOTTY_STR          "Not a typewriter"
+#define ETXTBSY             26
+#define ETXTBSY_STR         "Text file busy"
+#define EFBIG               27
+#define EFBIG_STR           "File too large"
+#define ENOSPC              28
+#define ENOSPC_STR          "No space left on device"
+#define ESPIPE              29
+#define ESPIPE_STR          "Illegal seek"
+#define EROFS               30
+#define EROFS_STR           "Read-only file system"
+#define EMLINK              31
+#define EMLINK_STR          "Too many links"
+#define EPIPE               32
+#define EPIPE_STR           "Broken pipe"
+#define EDOM                33
+#define EDOM_STR            "Math argument out of domain of func"
+#define ERANGE              34
+#define ERANGE_STR          "Math result not representable"
+#define EDEADLK             35
+#define EDEADLOCK           EDEADLK
+#define EDEADLK_STR         "Resource deadlock would occur"
+#define ENAMETOOLONG        36
+#define ENAMETOOLONG_STR    "File name too long"
+#define ENOLCK              37
+#define ENOLCK_STR          "No record locks available"
+#define ENOSYS              38
+#define ENOSYS_STR          "Function not implemented"
+#define ENOTEMPTY           39
+#define ENOTEMPTY_STR       "Directory not empty"
+#define ELOOP               40
+#define ELOOP_STR           "Too many symbolic links encountered"
+#define ENOMSG              42
+#define ENOMSG_STR          "No message of desired type"
+#define EIDRM               43
+#define EIDRM_STR           "Identifier removed"
+#define ECHRNG              44
+#define ECHRNG_STR          "Channel number out of range"
+#define EL2NSYNC            45
+#define EL2NSYNC_STR        "Level 2 not synchronized"
+#define EL3HLT              46
+#define EL3HLT_STR          "Level 3 halted"
+#define EL3RST              47
+#define EL3RST_STR          "Level 3 reset"
+#define ELNRNG              48
+#define ELNRNG_STR          "Link number out of range"
+#define EUNATCH             49
+#define EUNATCH_STR         "Protocol driver not attached"
+#define ENOCSI              50
+#define ENOCSI_STR          "No CSI structure available"
+#define EL2HLT              51
+#define EL2HLT_STR          "Level 2 halted"
+#define EBADE               52
+#define EBADE_STR           "Invalid exchange"
+#define EBADR               53
+#define EBADR_STR           "Invalid request descriptor"
+#define EXFULL              54
+#define EXFULL_STR          "Exchange full"
+#define ENOANO              55
+#define ENOANO_STR          "No anode"
+#define EBADRQC             56
+#define EBADRQC_STR         "Invalid request code"
+#define EBADSLT             57
+#define EBADSLT_STR         "Invalid slot"
+#define EBFONT              59
+#define EBFONT_STR          "Bad font file format"
+#define ENOSTR              60
+#define ENOSTR_STR          "Device not a stream"
+#define ENODATA             61
+#define ENODATA_STR         "No data available"
+#define ETIME               62
+#define ETIME_STR           "Timer expired"
+#define ENOSR               63
+#define ENOSR_STR           "Out of streams resources"
+#define ENONET              64
+#define ENONET_STR          "Machine is not on the network"
+#define ENOPKG              65
+#define ENOPKG_STR          "Package not installed"
+#define EREMOTE             66
+#define EREMOTE_STR         "Object is remote"
+#define ENOLINK             67
+#define ENOLINK_STR         "Link has been severed"
+#define EADV                68
+#define EADV_STR            "Advertise error"
+#define ESRMNT              69
+#define ESRMNT_STR          "Srmount error"
+#define ECOMM               70
+#define ECOMM_STR           "Communication error on send"
+#define EPROTO              71
+#define EPROTO_STR          "Protocol error"
+#define EMULTIHOP           72
+#define EMULTIHOP_STR       "Multihop attempted"
+#define EDOTDOT             73
+#define EDOTDOT_STR         "RFS specific error"
+#define EBADMSG             74
+#define EBADMSG_STR         "Not a data message"
+#define EOVERFLOW           75
+#define EOVERFLOW_STR       "Value too large for defined data type"
+#define ENOTUNIQ            76
+#define ENOTUNIQ_STR        "Name not unique on network"
+#define EBADFD              77
+#define EBADFD_STR          "File descriptor in bad state"
+#define EREMCHG             78
+#define EREMCHG_STR         "Remote address changed"
+#define ELIBACC             79
+#define ELIBACC_STR         "Can not access a needed shared library"
+#define ELIBBAD             80
+#define ELIBBAD_STR         "Accessing a corrupted shared library"
+#define ELIBSCN             81
+#define ELIBSCN_STR         ".lib section in a.out corrupted"
+#define ELIBMAX             82
+#define ELIBMAX_STR         "Attempting to link in too many shared libraries"
+#define ELIBEXEC            83
+#define ELIBEXEC_STR        "Cannot exec a shared library directly"
+#define EILSEQ              84
+#define EILSEQ_STR          "Illegal byte sequence"
+#define ERESTART            85
+#define ERESTART_STR        "Interrupted system call should be restarted"
+#define ESTRPIPE            86
+#define ESTRPIPE_STR        "Streams pipe error"
+#define EUSERS              87
+#define EUSERS_STR          "Too many users"
+#define ENOTSOCK            88
+#define ENOTSOCK_STR        "Socket operation on non-socket"
+#define EDESTADDRREQ        89
+#define EDESTADDRREQ_STR    "Destination address required"
+#define EMSGSIZE            90
+#define EMSGSIZE_STR        "Message too long"
+#define EPROTOTYPE          91
+#define EPROTOTYPE_STR      "Protocol wrong type for socket"
+#define ENOPROTOOPT         92
+#define ENOPROTOOPT_STR     "Protocol not available"
+#define EPROTONOSUPPORT      93
+#define EPROTONOSUPPORT_STR "Protocol not supported"
+#define ESOCKTNOSUPPORT     94
+#define ESOCKTNOSUPPORT_STR "Socket type not supported"
+#define EOPNOTSUPP          95
+#define EOPNOTSUPP_STR      "Operation not supported on transport endpoint"
+#define EPFNOSUPPORT        96
+#define EPFNOSUPPORT_STR    "Protocol family not supported"
+#define EAFNOSUPPORT        97
+#define EAFNOSUPPORT_STR    "Address family not supported by protocol"
+#define EADDRINUSE          98
+#define EADDRINUSE_STR      "Address already in use"
+#define EADDRNOTAVAIL       99
+#define EADDRNOTAVAIL_STR   "Cannot assign requested address"
+#define ENETDOWN            100
+#define ENETDOWN_STR        "Network is down"
+#define ENETUNREACH         101
+#define ENETUNREACH_STR     "Network is unreachable"
+#define ENETRESET           102
+#define ENETRESET_STR       "Network dropped connection because of reset"
+#define ECONNABORTED        103
+#define ECONNABORTED_STR    "Software caused connection abort"
+#define ECONNRESET          104
+#define ECONNRESET_STR      "Connection reset by peer"
+#define ENOBUFS             105
+#define ENOBUFS_STR         "No buffer space available"
+#define EISCONN             106
+#define EISCONN_STR         "Transport endpoint is already connected"
+#define ENOTCONN            107
+#define ENOTCONN_STR        "Transport endpoint is not connected"
+#define ESHUTDOWN           108
+#define ESHUTDOWN_STR       "Cannot send after transport endpoint shutdown"
+#define ETOOMANYREFS        109
+#define ETOOMANYREFS_STR    "Too many references: cannot splice"
+#define ETIMEDOUT           110
+#define ETIMEDOUT_STR       "Connection timed out"
+#define ECONNREFUSED        111
+#define ECONNREFUSED_STR    "Connection refused"
+#define EHOSTDOWN           112
+#define EHOSTDOWN_STR       "Host is down"
+#define EHOSTUNREACH        113
+#define EHOSTUNREACH_STR    "No route to host"
+#define EALREADY            114
+#define EALREADY_STR        "Operation already in progress"
+#define EINPROGRESS         115
+#define EINPROGRESS_STR     "Operation now in progress"
+#define ESTALE              116
+#define ESTALE_STR          "Stale NFS file handle"
+#define EUCLEAN             117
+#define EUCLEAN_STR         "Structure needs cleaning"
+#define ENOTNAM             118
+#define ENOTNAM_STR         "Not a XENIX named type file"
+#define ENAVAIL             119
+#define ENAVAIL_STR         "No XENIX semaphores available"
+#define EISNAM              120
+#define EISNAM_STR          "Is a named type file"
+#define EREMOTEIO           121
+#define EREMOTEIO_STR       "Remote I/O error"
+#define EDQUOT              122
+#define EDQUOT_STR          "Quota exceeded"
+#define ENOMEDIUM           123
+#define ENOMEDIUM_STR       "No medium found"
+#define EMEDIUMTYPE         124
+#define EMEDIUMTYPE_STR     "Wrong medium type"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ERRNO_H */
diff --git a/misoc/software/include/base/float.h b/misoc/software/include/base/float.h
new file mode 100644 (file)
index 0000000..2d0bf67
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef __FLOAT_H
+#define __FLOAT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#define FLT_ROUNDS (__builtin_flt_rounds())
+#define FLT_RADIX __FLT_RADIX__
+
+#define FLT_MANT_DIG __FLT_MANT_DIG__
+#define DBL_MANT_DIG __DBL_MANT_DIG__
+#define LDBL_MANT_DIG __LDBL_MANT_DIG__
+
+#define DECIMAL_DIG __DECIMAL_DIG__
+
+#define FLT_DIG __FLT_DIG__
+#define DBL_DIG __DBL_DIG__
+#define LDBL_DIG __LDBL_DIG__
+
+#define FLT_MIN_EXP __FLT_MIN_EXP__
+#define DBL_MIN_EXP __DBL_MIN_EXP__
+#define LDBL_MIN_EXP __LDBL_MIN_EXP__
+
+#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__
+#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__
+#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__
+
+#define FLT_MAX_EXP __FLT_MAX_EXP__
+#define DBL_MAX_EXP __DBL_MAX_EXP__
+#define LDBL_MAX_EXP __LDBL_MAX_EXP__
+
+#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__
+#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__
+#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__
+
+#define FLT_MAX __FLT_MAX__
+#define DBL_MAX __DBL_MAX__
+#define LDBL_MAX __LDBL_MAX__
+
+#define FLT_EPSILON __FLT_EPSILON__
+#define DBL_EPSILON __DBL_EPSILON__
+#define LDBL_EPSILON __LDBL_EPSILON__
+
+#define FLT_MIN __FLT_MIN__
+#define DBL_MIN __DBL_MIN__
+#define LDBL_MIN __LDBL_MIN__
+
+#define FLT_TRUE_MIN __FLT_DENORM_MIN__
+#define DBL_TRUE_MIN __DBL_DENORM_MIN__
+#define LDBL_TRUE_MIN __LDBL_DENORM_MIN__
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __FLOAT_H */
diff --git a/misoc/software/include/base/id.h b/misoc/software/include/base/id.h
new file mode 100644 (file)
index 0000000..89b540f
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __ID_H
+#define __ID_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void get_sysid_formatted(char *sysid);
+void id_print(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ID_H */
diff --git a/misoc/software/include/base/inttypes.h b/misoc/software/include/base/inttypes.h
new file mode 100644 (file)
index 0000000..9e4534c
--- /dev/null
@@ -0,0 +1,229 @@
+/* Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/*
+ *      ISO C99: 7.8 Format conversion of integer types <inttypes.h>
+ */
+
+#ifndef __INTTYPES_H
+#define __INTTYPES_H
+
+# if __WORDSIZE == 64
+#  define __PRI64_PREFIX        "l"
+#  define __PRIPTR_PREFIX       "l"
+# else
+#  define __PRI64_PREFIX        "ll"
+#  define __PRIPTR_PREFIX
+# endif
+
+/* Macros for printing format specifiers.  */
+
+/* Decimal notation.  */
+# define PRId8          "d"
+# define PRId16         "d"
+# define PRId32         "d"
+# define PRId64         __PRI64_PREFIX "d"
+
+# define PRIdLEAST8     "d"
+# define PRIdLEAST16    "d"
+# define PRIdLEAST32    "d"
+# define PRIdLEAST64    __PRI64_PREFIX "d"
+
+# define PRIdFAST8      "d"
+# define PRIdFAST16     __PRIPTR_PREFIX "d"
+# define PRIdFAST32     __PRIPTR_PREFIX "d"
+# define PRIdFAST64     __PRI64_PREFIX "d"
+
+
+# define PRIi8          "i"
+# define PRIi16         "i"
+# define PRIi32         "i"
+# define PRIi64         __PRI64_PREFIX "i"
+
+# define PRIiLEAST8     "i"
+# define PRIiLEAST16    "i"
+# define PRIiLEAST32    "i"
+# define PRIiLEAST64    __PRI64_PREFIX "i"
+
+# define PRIiFAST8      "i"
+# define PRIiFAST16     __PRIPTR_PREFIX "i"
+# define PRIiFAST32     __PRIPTR_PREFIX "i"
+# define PRIiFAST64     __PRI64_PREFIX "i"
+
+/* Octal notation.  */
+# define PRIo8          "o"
+# define PRIo16         "o"
+# define PRIo32         "o"
+# define PRIo64         __PRI64_PREFIX "o"
+
+# define PRIoLEAST8     "o"
+# define PRIoLEAST16    "o"
+# define PRIoLEAST32    "o"
+# define PRIoLEAST64    __PRI64_PREFIX "o"
+
+# define PRIoFAST8      "o"
+# define PRIoFAST16     __PRIPTR_PREFIX "o"
+# define PRIoFAST32     __PRIPTR_PREFIX "o"
+# define PRIoFAST64     __PRI64_PREFIX "o"
+
+/* Unsigned integers.  */
+# define PRIu8          "u"
+# define PRIu16         "u"
+# define PRIu32         "u"
+# define PRIu64         __PRI64_PREFIX "u"
+
+# define PRIuLEAST8     "u"
+# define PRIuLEAST16    "u"
+# define PRIuLEAST32    "u"
+# define PRIuLEAST64    __PRI64_PREFIX "u"
+
+# define PRIuFAST8      "u"
+# define PRIuFAST16     __PRIPTR_PREFIX "u"
+# define PRIuFAST32     __PRIPTR_PREFIX "u"
+# define PRIuFAST64     __PRI64_PREFIX "u"
+
+/* lowercase hexadecimal notation.  */
+# define PRIx8          "x"
+# define PRIx16         "x"
+# define PRIx32         "x"
+# define PRIx64         __PRI64_PREFIX "x"
+
+# define PRIxLEAST8     "x"
+# define PRIxLEAST16    "x"
+# define PRIxLEAST32    "x"
+# define PRIxLEAST64    __PRI64_PREFIX "x"
+
+# define PRIxFAST8      "x"
+# define PRIxFAST16     __PRIPTR_PREFIX "x"
+# define PRIxFAST32     __PRIPTR_PREFIX "x"
+# define PRIxFAST64     __PRI64_PREFIX "x"
+
+/* UPPERCASE hexadecimal notation.  */
+# define PRIX8          "X"
+# define PRIX16         "X"
+# define PRIX32         "X"
+# define PRIX64         __PRI64_PREFIX "X"
+
+# define PRIXLEAST8     "X"
+# define PRIXLEAST16    "X"
+# define PRIXLEAST32    "X"
+# define PRIXLEAST64    __PRI64_PREFIX "X"
+
+# define PRIXFAST8      "X"
+# define PRIXFAST16     __PRIPTR_PREFIX "X"
+# define PRIXFAST32     __PRIPTR_PREFIX "X"
+# define PRIXFAST64     __PRI64_PREFIX "X"
+
+/* Macros for printing `intmax_t' and `uintmax_t'.  */
+# define PRIdMAX        __PRI64_PREFIX "d"
+# define PRIiMAX        __PRI64_PREFIX "i"
+# define PRIoMAX        __PRI64_PREFIX "o"
+# define PRIuMAX        __PRI64_PREFIX "u"
+# define PRIxMAX        __PRI64_PREFIX "x"
+# define PRIXMAX        __PRI64_PREFIX "X"
+
+
+/* Macros for printing `intptr_t' and `uintptr_t'.  */
+# define PRIdPTR        __PRIPTR_PREFIX "d"
+# define PRIiPTR        __PRIPTR_PREFIX "i"
+# define PRIoPTR        __PRIPTR_PREFIX "o"
+# define PRIuPTR        __PRIPTR_PREFIX "u"
+# define PRIxPTR        __PRIPTR_PREFIX "x"
+# define PRIXPTR        __PRIPTR_PREFIX "X"
+
+/* Macros for scanning format specifiers.  */
+
+/* Signed decimal notation.  */
+# define SCNd8          "hhd"
+# define SCNd16         "hd"
+# define SCNd32         "d"
+# define SCNd64         __PRI64_PREFIX "d"
+
+# define SCNdLEAST8     "hhd"
+# define SCNdLEAST16    "hd"
+# define SCNdLEAST32    "d"
+# define SCNdLEAST64    __PRI64_PREFIX "d"
+
+# define SCNdFAST8      "hhd"
+# define SCNdFAST16     __PRIPTR_PREFIX "d"
+# define SCNdFAST32     __PRIPTR_PREFIX "d"
+# define SCNdFAST64     __PRI64_PREFIX "d"
+
+/* Unsigned decimal notation.  */
+# define SCNu8          "hhu"
+# define SCNu16         "hu"
+# define SCNu32         "u"
+# define SCNu64         __PRI64_PREFIX "u"
+
+# define SCNuLEAST8     "hhu"
+# define SCNuLEAST16    "hu"
+# define SCNuLEAST32    "u"
+# define SCNuLEAST64    __PRI64_PREFIX "u"
+
+# define SCNuFAST8      "hhu"
+# define SCNuFAST16     __PRIPTR_PREFIX "u"
+# define SCNuFAST32     __PRIPTR_PREFIX "u"
+# define SCNuFAST64     __PRI64_PREFIX "u"
+
+/* Octal notation.  */
+# define SCNo8          "hho"
+# define SCNo16         "ho"
+# define SCNo32         "o"
+# define SCNo64         __PRI64_PREFIX "o"
+
+# define SCNoLEAST8     "hho"
+# define SCNoLEAST16    "ho"
+# define SCNoLEAST32    "o"
+# define SCNoLEAST64    __PRI64_PREFIX "o"
+
+# define SCNoFAST8      "hho"
+# define SCNoFAST16     __PRIPTR_PREFIX "o"
+# define SCNoFAST32     __PRIPTR_PREFIX "o"
+# define SCNoFAST64     __PRI64_PREFIX "o"
+
+/* Hexadecimal notation.  */
+# define SCNx8          "hhx"
+# define SCNx16         "hx"
+# define SCNx32         "x"
+# define SCNx64         __PRI64_PREFIX "x"
+
+# define SCNxLEAST8     "hhx"
+# define SCNxLEAST16    "hx"
+# define SCNxLEAST32    "x"
+# define SCNxLEAST64    __PRI64_PREFIX "x"
+
+# define SCNxFAST8      "hhx"
+# define SCNxFAST16     __PRIPTR_PREFIX "x"
+# define SCNxFAST32     __PRIPTR_PREFIX "x"
+# define SCNxFAST64     __PRI64_PREFIX "x"
+
+
+/* Macros for scanning `intmax_t' and `uintmax_t'.  */
+# define SCNdMAX        __PRI64_PREFIX "d"
+# define SCNiMAX        __PRI64_PREFIX "i"
+# define SCNoMAX        __PRI64_PREFIX "o"
+# define SCNuMAX        __PRI64_PREFIX "u"
+# define SCNxMAX        __PRI64_PREFIX "x"
+
+/* Macros for scaning `intptr_t' and `uintptr_t'.  */
+# define SCNdPTR        __PRIPTR_PREFIX "d"
+# define SCNiPTR        __PRIPTR_PREFIX "i"
+# define SCNoPTR        __PRIPTR_PREFIX "o"
+# define SCNuPTR        __PRIPTR_PREFIX "u"
+# define SCNxPTR        __PRIPTR_PREFIX "x"
+
+#endif /* __INTTYPES_H */
diff --git a/misoc/software/include/base/irq.h b/misoc/software/include/base/irq.h
new file mode 100644 (file)
index 0000000..54da2f0
--- /dev/null
@@ -0,0 +1,80 @@
+#ifndef __IRQ_H
+#define __IRQ_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __or1k__
+#include <system.h>
+#endif
+
+static inline unsigned int irq_getie(void)
+{
+#if defined (__lm32__)
+       unsigned int ie;
+       __asm__ __volatile__("rcsr %0, IE" : "=r" (ie));
+       return ie;
+#elif defined (__or1k__)
+       return !!(mfspr(SPR_SR) & SPR_SR_IEE);
+#else
+#error Unsupported architecture
+#endif
+}
+
+static inline void irq_setie(unsigned int ie)
+{
+#if defined (__lm32__)
+       __asm__ __volatile__("wcsr IE, %0" : : "r" (ie));
+#elif defined (__or1k__)
+       if (ie & 0x1)
+               mtspr(SPR_SR, mfspr(SPR_SR) | SPR_SR_IEE);
+       else
+               mtspr(SPR_SR, mfspr(SPR_SR) & ~SPR_SR_IEE);
+#else
+#error Unsupported architecture
+#endif
+}
+
+static inline unsigned int irq_getmask(void)
+{
+#if defined (__lm32__)
+       unsigned int mask;
+       __asm__ __volatile__("rcsr %0, IM" : "=r" (mask));
+       return mask;
+#elif defined (__or1k__)
+       return mfspr(SPR_PICMR);
+#else
+#error Unsupported architecture
+#endif
+}
+
+static inline void irq_setmask(unsigned int mask)
+{
+#if defined (__lm32__)
+       __asm__ __volatile__("wcsr IM, %0" : : "r" (mask));
+#elif defined (__or1k__)
+       mtspr(SPR_PICMR, mask);
+#else
+#error Unsupported architecture
+#endif
+}
+
+static inline unsigned int irq_pending(void)
+{
+#if defined (__lm32__)
+       unsigned int pending;
+       __asm__ __volatile__("rcsr %0, IP" : "=r" (pending));
+       return pending;
+#elif defined (__or1k__)
+       return mfspr(SPR_PICSR);
+#else
+#error Unsupported architecture
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IRQ_H */
diff --git a/misoc/software/include/base/limits.h b/misoc/software/include/base/limits.h
new file mode 100644 (file)
index 0000000..49ac6ff
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef __LIMITS_H
+#define __LIMITS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ULONG_MAX 0xffffffff
+
+#define UINT_MAX 0xffffffff
+#define INT_MIN 0x80000000
+#define INT_MAX 0x7fffffff
+
+#define USHRT_MAX 0xffff
+#define SHRT_MIN 0x8000
+#define SHRT_MAX 0x7fff
+
+#define UCHAR_MAX 0xff
+
+#define CHAR_BIT 8
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LIMITS_H */
diff --git a/misoc/software/include/base/pthread.h b/misoc/software/include/base/pthread.h
new file mode 100644 (file)
index 0000000..b78aa1e
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef __PTHREAD_H
+#define __PTHREAD_H
+
+typedef int pthread_rwlock_t;
+
+#define PTHREAD_RWLOCK_INITIALIZER 0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inline int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
+  { return 0; }
+inline int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
+  { return 0; }
+inline int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
+  { return 0; }
+inline int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
+  { return 0; }
+int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
+  { return 0; }
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __PTHREAD_H */
diff --git a/misoc/software/include/base/spiflash.h b/misoc/software/include/base/spiflash.h
new file mode 100644 (file)
index 0000000..a4ff495
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef __SPIFLASH_H
+#define __SPIFLASH_H
+
+void write_to_flash_page(unsigned int addr, const unsigned char *c, unsigned int len);
+void erase_flash_sector(unsigned int addr);
+void write_to_flash(unsigned int addr, const unsigned char *c, unsigned int len);
+
+#endif /* __SPIFLASH_H */
diff --git a/misoc/software/include/base/spr-defs.h b/misoc/software/include/base/spr-defs.h
new file mode 100644 (file)
index 0000000..e073a50
--- /dev/null
@@ -0,0 +1,696 @@
+/* spr-defs.h - Special purpose registers definitions file
+       
+   Copyright (C) 2000 Damjan Lampret
+   Copyright (C) 2008, 2010 Embecosm Limited
+   
+   Contributor Damjan Lampret <lampret@opencores.org>
+   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 3 of the License, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+   more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program.  If not, see <http:  www.gnu.org/licenses/>.  */
+
+/* ----------------------------------------------------------------------------
+   This code is commented throughout for use with Doxygen.
+   --------------------------------------------------------------------------*/
+#ifndef SPR_DEFS__H
+#define SPR_DEFS__H
+
+/* Definition of special-purpose registers (SPRs). */
+
+#define MAX_GRPS (32)
+#define MAX_SPRS_PER_GRP_BITS (11)
+#define MAX_SPRS_PER_GRP (1 << MAX_SPRS_PER_GRP_BITS)
+#define MAX_SPRS (0x10000)
+
+/* Base addresses for the groups */
+#define SPRGROUP_SYS   (0<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_DMMU  (1<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_IMMU  (2<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_DC    (3<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_IC    (4<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_MAC   (5<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_D     (6<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_PC    (7<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_PM    (8<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_PIC   (9<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_TT    (10<< MAX_SPRS_PER_GRP_BITS)
+#define SPRGROUP_FP    (11<< MAX_SPRS_PER_GRP_BITS)
+
+/* System control and status group */
+#define SPR_VR         (SPRGROUP_SYS + 0)
+#define SPR_UPR                (SPRGROUP_SYS + 1)
+#define SPR_CPUCFGR    (SPRGROUP_SYS + 2)
+#define SPR_DMMUCFGR   (SPRGROUP_SYS + 3)
+#define SPR_IMMUCFGR   (SPRGROUP_SYS + 4)
+#define SPR_DCCFGR     (SPRGROUP_SYS + 5)
+#define SPR_ICCFGR     (SPRGROUP_SYS + 6)
+#define SPR_DCFGR      (SPRGROUP_SYS + 7)
+#define SPR_PCCFGR     (SPRGROUP_SYS + 8)
+#define SPR_VR2        (SPRGROUP_SYS + 9)
+#define SPR_AVR        (SPRGROUP_SYS + 10)
+#define SPR_EVBAR      (SPRGROUP_SYS + 11)
+#define SPR_AECR       (SPRGROUP_SYS + 12)
+#define SPR_AESR       (SPRGROUP_SYS + 13)
+#define SPR_NPC         (SPRGROUP_SYS + 16)  /* CZ 21/06/01 */
+#define SPR_SR         (SPRGROUP_SYS + 17)  /* CZ 21/06/01 */
+#define SPR_PPC         (SPRGROUP_SYS + 18)  /* CZ 21/06/01 */
+#define SPR_FPCSR       (SPRGROUP_SYS + 20)  /* CZ 21/06/01 */
+#define SPR_ISR_BASE    (SPRGROUP_SYS + 21)
+#define SPR_EPCR_BASE  (SPRGROUP_SYS + 32)  /* CZ 21/06/01 */
+#define SPR_EPCR_LAST  (SPRGROUP_SYS + 47)  /* CZ 21/06/01 */
+#define SPR_EEAR_BASE  (SPRGROUP_SYS + 48)
+#define SPR_EEAR_LAST  (SPRGROUP_SYS + 63)
+#define SPR_ESR_BASE   (SPRGROUP_SYS + 64)
+#define SPR_ESR_LAST   (SPRGROUP_SYS + 79)
+#define SPR_GPR_BASE   (SPRGROUP_SYS + 1024)
+
+/* Data MMU group */
+#define SPR_DMMUCR     (SPRGROUP_DMMU + 0)
+#define SPR_DTLBEIR     (SPRGROUP_DMMU + 2)
+#define SPR_DTLBMR_BASE(WAY)   (SPRGROUP_DMMU + 0x200 + (WAY) * 0x100)
+#define SPR_DTLBMR_LAST(WAY)   (SPRGROUP_DMMU + 0x27f + (WAY) * 0x100)
+#define SPR_DTLBTR_BASE(WAY)   (SPRGROUP_DMMU + 0x280 + (WAY) * 0x100)
+#define SPR_DTLBTR_LAST(WAY)   (SPRGROUP_DMMU + 0x2ff + (WAY) * 0x100)
+
+/* Instruction MMU group */
+#define SPR_IMMUCR     (SPRGROUP_IMMU + 0)
+#define SPR_ITLBEIR     (SPRGROUP_IMMU + 2)
+#define SPR_ITLBMR_BASE(WAY)   (SPRGROUP_IMMU + 0x200 + (WAY) * 0x100)
+#define SPR_ITLBMR_LAST(WAY)   (SPRGROUP_IMMU + 0x27f + (WAY) * 0x100)
+#define SPR_ITLBTR_BASE(WAY)   (SPRGROUP_IMMU + 0x280 + (WAY) * 0x100)
+#define SPR_ITLBTR_LAST(WAY)   (SPRGROUP_IMMU + 0x2ff + (WAY) * 0x100)
+
+/* Data cache group */
+#define SPR_DCCR       (SPRGROUP_DC + 0)
+#define SPR_DCBPR      (SPRGROUP_DC + 1)
+#define SPR_DCBFR      (SPRGROUP_DC + 2)
+#define SPR_DCBIR      (SPRGROUP_DC + 3)
+#define SPR_DCBWR      (SPRGROUP_DC + 4)
+#define SPR_DCBLR      (SPRGROUP_DC + 5)
+#define SPR_DCR_BASE(WAY)      (SPRGROUP_DC + 0x200 + (WAY) * 0x200)
+#define SPR_DCR_LAST(WAY)      (SPRGROUP_DC + 0x3ff + (WAY) * 0x200)
+
+/* Instruction cache group */
+#define SPR_ICCR       (SPRGROUP_IC + 0)
+#define SPR_ICBPR      (SPRGROUP_IC + 1)
+#define SPR_ICBIR      (SPRGROUP_IC + 2)
+#define SPR_ICBLR      (SPRGROUP_IC + 3)
+#define SPR_ICR_BASE(WAY)      (SPRGROUP_IC + 0x200 + (WAY) * 0x200)
+#define SPR_ICR_LAST(WAY)      (SPRGROUP_IC + 0x3ff + (WAY) * 0x200)
+
+/* MAC group */
+#define SPR_MACLO      (SPRGROUP_MAC + 1)
+#define SPR_MACHI      (SPRGROUP_MAC + 2)
+
+/* Debug group */
+#define SPR_DVR(N)     (SPRGROUP_D + (N))
+#define SPR_DCR(N)     (SPRGROUP_D + 8 + (N))
+#define SPR_DMR1       (SPRGROUP_D + 16)
+#define SPR_DMR2       (SPRGROUP_D + 17)
+#define SPR_DWCR0      (SPRGROUP_D + 18)
+#define SPR_DWCR1      (SPRGROUP_D + 19)
+#define SPR_DSR                (SPRGROUP_D + 20)
+#define SPR_DRR                (SPRGROUP_D + 21)
+
+/* Performance counters group */
+#define SPR_PCCR(N)    (SPRGROUP_PC + (N))
+#define SPR_PCMR(N)    (SPRGROUP_PC + 8 + (N))
+
+/* Power management group */
+#define SPR_PMR (SPRGROUP_PM + 0)
+
+/* PIC group */
+#define SPR_PICMR (SPRGROUP_PIC + 0)
+#define SPR_PICPR (SPRGROUP_PIC + 1)
+#define SPR_PICSR (SPRGROUP_PIC + 2)
+
+/* Tick Timer group */
+#define SPR_TTMR (SPRGROUP_TT + 0)
+#define SPR_TTCR (SPRGROUP_TT + 1)
+
+/*
+ * Bit definitions for the Version Register
+ *
+ */
+#define SPR_VR_VER     0xff000000  /* Processor version */
+#define SPR_VR_CFG     0x00ff0000  /* Processor configuration */
+#define SPR_VR_RES     0x0000ff80  /* Reserved */
+#define SPR_VR_UVRP    0x00000040  /* Updated version register present */
+#define SPR_VR_REV     0x0000003f  /* Processor revision */
+
+#define SPR_VR_VER_OFF 24
+#define SPR_VR_CFG_OFF 16
+#define SPR_VR_UVRP_OFF        6
+#define SPR_VR_REV_OFF 0
+
+/*
+ * Bit definitions for the Unit Present Register
+ *
+ */
+#define SPR_UPR_UP        0x00000001  /* UPR present */
+#define SPR_UPR_DCP       0x00000002  /* Data cache present */
+#define SPR_UPR_ICP       0x00000004  /* Instruction cache present */
+#define SPR_UPR_DMP       0x00000008  /* Data MMU present */
+#define SPR_UPR_IMP       0x00000010  /* Instruction MMU present */
+#define SPR_UPR_MP        0x00000020  /* MAC present */
+#define SPR_UPR_DUP       0x00000040  /* Debug unit present */
+#define SPR_UPR_PCUP      0x00000080  /* Performance counters unit present */
+#define SPR_UPR_PMP       0x00000100  /* Power management present */
+#define SPR_UPR_PICP      0x00000200  /* PIC present */
+#define SPR_UPR_TTP       0x00000400  /* Tick timer present */
+#define SPR_UPR_RES       0x00fe0000  /* Reserved */
+#define SPR_UPR_CUP       0xff000000  /* Context units present */
+
+/*
+ * JPB: Bit definitions for the CPU configuration register
+ *
+ */
+#define SPR_CPUCFGR_NSGF   0x0000000f  /* Number of shadow GPR files */
+#define SPR_CPUCFGR_CGF           0x00000010  /* Custom GPR file */
+#define SPR_CPUCFGR_OB32S  0x00000020  /* ORBIS32 supported */
+#define SPR_CPUCFGR_OB64S  0x00000040  /* ORBIS64 supported */
+#define SPR_CPUCFGR_OF32S  0x00000080  /* ORFPX32 supported */
+#define SPR_CPUCFGR_OF64S  0x00000100  /* ORFPX64 supported */
+#define SPR_CPUCFGR_OV64S  0x00000200  /* ORVDX64 supported */
+#define SPR_CPUCFGR_ND     0x00000400  /* No delay-slot */
+#define SPR_CPUCFGR_AVRP   0x00000800  /* Architecture version register present */
+#define SPR_CPUCFGR_EVBARP 0x00001000  /* Exception vector base address register 
+                                         present */
+#define SPR_CPUCFGR_ISRP   0x00002000  /* Implementation-specific registers present */
+#define SPR_CPUCFGR_AECSRP 0x00004000  /* Arithmetic exception control/status 
+                                         registers present */
+#define SPR_CPUCFGR_RES           0xffff8000  /* Reserved */
+
+/*
+ * Bit definitions for the Version Register 2
+ *
+ */
+#define SPR_VR2_CPUID   0xff000000  /* Unique CPU identifier */
+#define SPR_VR2_VER    0x00ffffff  /* Version */
+
+#define SPR_VR2_CPUID_OFF   24
+#define SPR_VR2_VER_OFF     0
+
+#define SPR_VR2_CPUID_OR1KSIM   0x00
+#define SPR_VR2_CPUID_MOR1KX    0x01
+#define SPR_VR2_CPUID_OR1200    0x12
+#define SPR_VR2_CPUID_ALTOR32   0x32
+#define SPR_VR2_CPUID_OR10      0x10
+
+
+/*
+ * Bit definitions for the Architecture Version register
+ *
+ */
+#define SPR_AVR_MAJ     0xff000000  /* Major architecture version number */
+#define SPR_AVR_MIN     0x00ff0000  /* Minor architecture version number */
+#define SPR_AVR_REV     0x0000ff00  /* Architecture revision number */
+#define SPR_AVR_RES    0x000000ff  /* Reserved */
+
+#define SPR_AVR_MAJ_OFF 24
+#define SPR_AVR_MIN_OFF 16
+#define SPR_AVR_REV_OFF 8
+
+/*
+ * Bit definitions for the Exception Base Address register
+ *
+ */
+#define SPR_EVBAR_EVBA  0xffffe000  /* Exception vector base address */
+#define SPR_EVBAR_RES   0x00001fff  /* Reserved */
+
+#define SPR_EVBAR_EVBA_OFF 13
+
+/*
+ * Bit definitions for the Arithmetic Exception Control register
+ *
+ */
+#define SPR_AECR_CYADDE  0x00000001  /* Carry on add/subtract exception */
+#define SPR_AECR_OVADDE  0x00000002  /* Overflow on add/subtract exception */
+#define SPR_AECR_CYMULE  0x00000004  /* Carry on multiply exception */
+#define SPR_AECR_OVMULE  0x00000008  /* Overflow on multiply exception */
+#define SPR_AECR_DBZE    0x00000010  /* Divide by zero exception */
+#define SPR_AECR_CYMACADDE  0x00000020  /* Carry on MAC add/subtract exception */
+#define SPR_AECR_OVMACADDE  0x00000040  /* Overflow on MAC add/subtract exception */
+
+#define SPR_AECR_CYADDE_OFF 0
+#define SPR_AECR_OVADDE_OFF 1
+#define SPR_AECR_CYMULE_OFF 2
+#define SPR_AECR_OVMULE_OFF 3
+#define SPR_AECR_DBZE_OFF   4
+#define SPR_AECR_CYMACADDE_OFF 5
+#define SPR_AECR_OVMACADDE_OFF 6
+
+
+/*
+ * Bit definitions for the Arithmetic Exception Status register
+ *
+ */
+#define SPR_AESR_CYADDE  0x00000001  /* Carry on add/subtract exception */
+#define SPR_AESR_OVADDE  0x00000002  /* Overflow on add/subtract exception */
+#define SPR_AESR_CYMULE  0x00000004  /* Carry on multiply exception */
+#define SPR_AESR_OVMULE  0x00000008  /* Overflow on multiply exception */
+#define SPR_AESR_DBZE    0x00000010  /* Divide by zero exception */
+#define SPR_AESR_CYMACADDE  0x00000020  /* Carry on MAC add/subtract exception */
+#define SPR_AESR_OVMACADDE  0x00000040  /* Overflow on MAC add/subtract exception */
+
+#define SPR_AESR_CYADDE_OFF 0
+#define SPR_AESR_OVADDE_OFF 1
+#define SPR_AESR_CYMULE_OFF 2
+#define SPR_AESR_OVMULE_OFF 3
+#define SPR_AESR_DBZE_OFF   4
+#define SPR_AESR_CYMACADDE_OFF 5
+#define SPR_AESR_OVMACADDE_OFF 6
+
+/*
+ * JPB: Bit definitions for the Debug configuration register and other
+ * constants.
+ *
+ */
+
+#define SPR_DCFGR_NDP      0x00000007  /* Number of matchpoints mask */
+#define SPR_DCFGR_NDP1     0x00000000  /* One matchpoint supported */
+#define SPR_DCFGR_NDP2     0x00000001  /* Two matchpoints supported */
+#define SPR_DCFGR_NDP3     0x00000002  /* Three matchpoints supported */
+#define SPR_DCFGR_NDP4     0x00000003  /* Four matchpoints supported */
+#define SPR_DCFGR_NDP5     0x00000004  /* Five matchpoints supported */
+#define SPR_DCFGR_NDP6     0x00000005  /* Six matchpoints supported */
+#define SPR_DCFGR_NDP7     0x00000006  /* Seven matchpoints supported */
+#define SPR_DCFGR_NDP8     0x00000007  /* Eight matchpoints supported */
+#define SPR_DCFGR_WPCI     0x00000008  /* Watchpoint counters implemented */
+
+#define MATCHPOINTS_TO_NDP(n) (1 == n ? SPR_DCFGR_NDP1 : \
+                               2 == n ? SPR_DCFGR_NDP2 : \
+                               3 == n ? SPR_DCFGR_NDP3 : \
+                               4 == n ? SPR_DCFGR_NDP4 : \
+                               5 == n ? SPR_DCFGR_NDP5 : \
+                               6 == n ? SPR_DCFGR_NDP6 : \
+                               7 == n ? SPR_DCFGR_NDP7 : SPR_DCFGR_NDP8)
+#define MAX_MATCHPOINTS  8
+#define MAX_WATCHPOINTS  (MAX_MATCHPOINTS + 2)
+
+/*
+ * Bit definitions for the Supervision Register
+ *
+ */
+#define SPR_SR_SM          0x00000001  /* Supervisor Mode */
+#define SPR_SR_TEE         0x00000002  /* Tick timer Exception Enable */
+#define SPR_SR_IEE         0x00000004  /* Interrupt Exception Enable */
+#define SPR_SR_DCE         0x00000008  /* Data Cache Enable */
+#define SPR_SR_ICE         0x00000010  /* Instruction Cache Enable */
+#define SPR_SR_DME         0x00000020  /* Data MMU Enable */
+#define SPR_SR_IME         0x00000040  /* Instruction MMU Enable */
+#define SPR_SR_LEE         0x00000080  /* Little Endian Enable */
+#define SPR_SR_CE          0x00000100  /* CID Enable */
+#define SPR_SR_F           0x00000200  /* Condition Flag */
+#define SPR_SR_CY          0x00000400  /* Carry flag */
+#define SPR_SR_OV          0x00000800  /* Overflow flag */
+#define SPR_SR_OVE         0x00001000  /* Overflow flag Exception */
+#define SPR_SR_DSX         0x00002000  /* Delay Slot Exception */
+#define SPR_SR_EPH         0x00004000  /* Exception Prefix High */
+#define SPR_SR_FO          0x00008000  /* Fixed one */
+#define SPR_SR_SUMRA       0x00010000  /* Supervisor SPR read access */
+#define SPR_SR_RES         0x0ffe0000  /* Reserved */
+#define SPR_SR_CID         0xf0000000  /* Context ID */
+
+/*
+ * Bit definitions for the Data MMU Control Register
+ *
+ */
+#define SPR_DMMUCR_P2S    0x0000003e  /* Level 2 Page Size */
+#define SPR_DMMUCR_P1S    0x000007c0  /* Level 1 Page Size */
+#define SPR_DMMUCR_VADDR_WIDTH 0x0000f800  /* Virtual ADDR Width */
+#define SPR_DMMUCR_PADDR_WIDTH 0x000f0000  /* Physical ADDR Width */
+
+/*
+ * Bit definitions for the Instruction MMU Control Register
+ *
+ */
+#define SPR_IMMUCR_P2S    0x0000003e  /* Level 2 Page Size */
+#define SPR_IMMUCR_P1S    0x000007c0  /* Level 1 Page Size */
+#define SPR_IMMUCR_VADDR_WIDTH 0x0000f800  /* Virtual ADDR Width */
+#define SPR_IMMUCR_PADDR_WIDTH 0x000f0000  /* Physical ADDR Width */
+
+/*
+ * Bit definitions for the Data TLB Match Register
+ *
+ */
+#define SPR_DTLBMR_V      0x00000001  /* Valid */
+#define SPR_DTLBMR_PL1    0x00000002  /* Page Level 1 (if 0 then PL2) */
+#define SPR_DTLBMR_CID    0x0000003c  /* Context ID */
+#define SPR_DTLBMR_LRU    0x000000c0  /* Least Recently Used */
+#define SPR_DTLBMR_VPN    0xffffe000  /* Virtual Page Number */
+
+/*
+ * Bit definitions for the Data TLB Translate Register
+ *
+ */
+#define SPR_DTLBTR_CC     0x00000001  /* Cache Coherency */
+#define SPR_DTLBTR_CI     0x00000002  /* Cache Inhibit */
+#define SPR_DTLBTR_WBC    0x00000004  /* Write-Back Cache */
+#define SPR_DTLBTR_WOM    0x00000008  /* Weakly-Ordered Memory */
+#define SPR_DTLBTR_A      0x00000010  /* Accessed */
+#define SPR_DTLBTR_D      0x00000020  /* Dirty */
+#define SPR_DTLBTR_URE    0x00000040  /* User Read Enable */
+#define SPR_DTLBTR_UWE    0x00000080  /* User Write Enable */
+#define SPR_DTLBTR_SRE    0x00000100  /* Supervisor Read Enable */
+#define SPR_DTLBTR_SWE    0x00000200  /* Supervisor Write Enable */
+#define SPR_DTLBTR_PPN    0xffffe000  /* Physical Page Number */
+
+#define DTLB_PR_NOLIMIT  ( SPR_DTLBTR_URE  | \
+                          SPR_DTLBTR_UWE  | \
+                          SPR_DTLBTR_SRE  | \
+                          SPR_DTLBTR_SWE  )
+
+/*
+ * Bit definitions for the Instruction TLB Match Register
+ *
+ */
+#define SPR_ITLBMR_V      0x00000001  /* Valid */
+#define SPR_ITLBMR_PL1    0x00000002  /* Page Level 1 (if 0 then PL2) */
+#define SPR_ITLBMR_CID    0x0000003c  /* Context ID */
+#define SPR_ITLBMR_LRU    0x000000c0  /* Least Recently Used */
+#define SPR_ITLBMR_VPN    0xffffe000  /* Virtual Page Number */
+
+/*
+ * Bit definitions for the Instruction TLB Translate Register
+ *
+ */
+#define SPR_ITLBTR_CC     0x00000001  /* Cache Coherency */
+#define SPR_ITLBTR_CI     0x00000002  /* Cache Inhibit */
+#define SPR_ITLBTR_WBC    0x00000004  /* Write-Back Cache */
+#define SPR_ITLBTR_WOM    0x00000008  /* Weakly-Ordered Memory */
+#define SPR_ITLBTR_A      0x00000010  /* Accessed */
+#define SPR_ITLBTR_D      0x00000020  /* Dirty */
+#define SPR_ITLBTR_SXE    0x00000040  /* User Read Enable */
+#define SPR_ITLBTR_UXE    0x00000080  /* User Write Enable */
+#define SPR_ITLBTR_PPN    0xffffe000  /* Physical Page Number */
+
+#define ITLB_PR_NOLIMIT  ( SPR_ITLBTR_SXE  |   \
+                          SPR_ITLBTR_UXE  )
+
+
+/*
+ * Bit definitions for Data Cache Control register
+ *
+ */
+#define SPR_DCCR_EW       0x000000ff  /* Enable ways */
+
+/*
+ * Bit definitions for Insn Cache Control register
+ *
+ */
+#define SPR_ICCR_EW       0x000000ff  /* Enable ways */
+
+/*
+ * Bit definitions for Data Cache Configuration Register
+ *
+ */
+
+#define SPR_DCCFGR_NCW         0x00000007
+#define SPR_DCCFGR_NCS         0x00000078
+#define SPR_DCCFGR_CBS         0x00000080
+#define SPR_DCCFGR_CWS         0x00000100
+#define SPR_DCCFGR_CCRI                0x00000200
+#define SPR_DCCFGR_CBIRI       0x00000400
+#define SPR_DCCFGR_CBPRI       0x00000800
+#define SPR_DCCFGR_CBLRI       0x00001000
+#define SPR_DCCFGR_CBFRI       0x00002000
+#define SPR_DCCFGR_CBWBRI      0x00004000
+
+#define SPR_DCCFGR_NCW_OFF      0
+#define SPR_DCCFGR_NCS_OFF      3
+#define SPR_DCCFGR_CBS_OFF     7
+
+/*
+ * Bit definitions for Instruction Cache Configuration Register
+ *
+ */
+#define SPR_ICCFGR_NCW         0x00000007
+#define SPR_ICCFGR_NCS         0x00000078
+#define SPR_ICCFGR_CBS         0x00000080
+#define SPR_ICCFGR_CCRI                0x00000200
+#define SPR_ICCFGR_CBIRI       0x00000400
+#define SPR_ICCFGR_CBPRI       0x00000800
+#define SPR_ICCFGR_CBLRI       0x00001000
+
+#define SPR_ICCFGR_NCW_OFF      0
+#define SPR_ICCFGR_NCS_OFF      3
+#define SPR_ICCFGR_CBS_OFF     7
+
+/*
+ * Bit definitions for Data MMU Configuration Register
+ *
+ */
+
+#define SPR_DMMUCFGR_NTW       0x00000003
+#define SPR_DMMUCFGR_NTS       0x0000001C
+#define SPR_DMMUCFGR_NAE       0x000000E0
+#define SPR_DMMUCFGR_CRI       0x00000100
+#define SPR_DMMUCFGR_PRI        0x00000200
+#define SPR_DMMUCFGR_TEIRI     0x00000400
+#define SPR_DMMUCFGR_HTR       0x00000800
+
+#define SPR_DMMUCFGR_NTW_OFF   0
+#define SPR_DMMUCFGR_NTS_OFF   2
+
+/*
+ * Bit definitions for Instruction MMU Configuration Register
+ *
+ */
+
+#define SPR_IMMUCFGR_NTW       0x00000003
+#define SPR_IMMUCFGR_NTS       0x0000001C
+#define SPR_IMMUCFGR_NAE       0x000000E0
+#define SPR_IMMUCFGR_CRI       0x00000100
+#define SPR_IMMUCFGR_PRI       0x00000200
+#define SPR_IMMUCFGR_TEIRI     0x00000400
+#define SPR_IMMUCFGR_HTR       0x00000800
+
+#define SPR_IMMUCFGR_NTW_OFF   0
+#define SPR_IMMUCFGR_NTS_OFF   2
+
+/*
+ * Bit definitions for Debug Control registers
+ *
+ */
+#define SPR_DCR_DP     0x00000001  /* DVR/DCR present */
+#define SPR_DCR_CC     0x0000000e  /* Compare condition */
+#define SPR_DCR_SC     0x00000010  /* Signed compare */
+#define SPR_DCR_CT     0x000000e0  /* Compare to */
+
+/* Bit results with SPR_DCR_CC mask */
+#define SPR_DCR_CC_MASKED 0x00000000
+#define SPR_DCR_CC_EQUAL  0x00000002
+#define SPR_DCR_CC_LESS   0x00000004
+#define SPR_DCR_CC_LESSE  0x00000006
+#define SPR_DCR_CC_GREAT  0x00000008
+#define SPR_DCR_CC_GREATE 0x0000000a
+#define SPR_DCR_CC_NEQUAL 0x0000000c
+
+/* Bit results with SPR_DCR_CT mask */
+#define SPR_DCR_CT_DISABLED 0x00000000
+#define SPR_DCR_CT_IFEA     0x00000020
+#define SPR_DCR_CT_LEA      0x00000040
+#define SPR_DCR_CT_SEA      0x00000060
+#define SPR_DCR_CT_LD       0x00000080
+#define SPR_DCR_CT_SD       0x000000a0
+#define SPR_DCR_CT_LSEA     0x000000c0
+#define SPR_DCR_CT_LSD     0x000000e0
+/* SPR_DCR_CT_LSD doesn't seem to be implemented anywhere in or1ksim. 2004-1-30 HP */
+
+/*
+ * Bit definitions for Debug Mode 1 register
+ *
+ */
+#define SPR_DMR1_CW       0x000fffff  /* Chain register pair data */
+#define SPR_DMR1_CW0_AND  0x00000001
+#define SPR_DMR1_CW0_OR   0x00000002
+#define SPR_DMR1_CW0     (SPR_DMR1_CW0_AND | SPR_DMR1_CW0_OR)
+#define SPR_DMR1_CW1_AND  0x00000004
+#define SPR_DMR1_CW1_OR   0x00000008
+#define SPR_DMR1_CW1     (SPR_DMR1_CW1_AND | SPR_DMR1_CW1_OR)
+#define SPR_DMR1_CW2_AND  0x00000010
+#define SPR_DMR1_CW2_OR   0x00000020
+#define SPR_DMR1_CW2     (SPR_DMR1_CW2_AND | SPR_DMR1_CW2_OR)
+#define SPR_DMR1_CW3_AND  0x00000040
+#define SPR_DMR1_CW3_OR   0x00000080
+#define SPR_DMR1_CW3     (SPR_DMR1_CW3_AND | SPR_DMR1_CW3_OR)
+#define SPR_DMR1_CW4_AND  0x00000100
+#define SPR_DMR1_CW4_OR   0x00000200
+#define SPR_DMR1_CW4     (SPR_DMR1_CW4_AND | SPR_DMR1_CW4_OR)
+#define SPR_DMR1_CW5_AND  0x00000400
+#define SPR_DMR1_CW5_OR   0x00000800
+#define SPR_DMR1_CW5     (SPR_DMR1_CW5_AND | SPR_DMR1_CW5_OR)
+#define SPR_DMR1_CW6_AND  0x00001000
+#define SPR_DMR1_CW6_OR   0x00002000
+#define SPR_DMR1_CW6     (SPR_DMR1_CW6_AND | SPR_DMR1_CW6_OR)
+#define SPR_DMR1_CW7_AND  0x00004000
+#define SPR_DMR1_CW7_OR   0x00008000
+#define SPR_DMR1_CW7     (SPR_DMR1_CW7_AND | SPR_DMR1_CW7_OR)
+#define SPR_DMR1_CW8_AND  0x00010000
+#define SPR_DMR1_CW8_OR   0x00020000
+#define SPR_DMR1_CW8     (SPR_DMR1_CW8_AND | SPR_DMR1_CW8_OR)
+#define SPR_DMR1_CW9_AND  0x00040000
+#define SPR_DMR1_CW9_OR   0x00080000
+#define SPR_DMR1_CW9     (SPR_DMR1_CW9_AND | SPR_DMR1_CW9_OR)
+#define SPR_DMR1_RES1      0x00300000  /* Reserved */
+#define SPR_DMR1_ST      0x00400000  /* Single-step trace*/
+#define SPR_DMR1_BT      0x00800000  /* Branch trace */
+#define SPR_DMR1_RES2    0xff000000  /* Reserved */
+
+/*
+ * Bit definitions for Debug Mode 2 register. AWTC and WGB corrected by JPB
+ *
+ */
+#define SPR_DMR2_WCE0     0x00000001  /* Watchpoint counter 0 enable */
+#define SPR_DMR2_WCE1     0x00000002  /* Watchpoint counter 0 enable */
+#define SPR_DMR2_AWTC     0x00000ffc  /* Assign watchpoints to counters */
+#define SPR_DMR2_AWTC_OFF           2  /* Bit offset to AWTC field */
+#define SPR_DMR2_WGB      0x003ff000  /* Watchpoints generating breakpoint */
+#define SPR_DMR2_WGB_OFF           12  /* Bit offset to WGB field */
+#define SPR_DMR2_WBS      0xffc00000  /* JPB: Watchpoint status */
+#define SPR_DMR2_WBS_OFF           22  /* Bit offset to WBS field */
+
+/*
+ * Bit definitions for Debug watchpoint counter registers
+ *
+ */
+#define SPR_DWCR_COUNT     0x0000ffff  /* Count */
+#define SPR_DWCR_MATCH     0xffff0000  /* Match */
+#define SPR_DWCR_MATCH_OFF          16  /* Match bit offset */
+
+/*
+ * Bit definitions for Debug stop register
+ *
+ */
+#define SPR_DSR_RSTE   0x00000001  /* Reset exception */
+#define SPR_DSR_BUSEE  0x00000002  /* Bus error exception */
+#define SPR_DSR_DPFE   0x00000004  /* Data Page Fault exception */
+#define SPR_DSR_IPFE   0x00000008  /* Insn Page Fault exception */
+#define SPR_DSR_TTE    0x00000010  /* Tick Timer exception */
+#define SPR_DSR_AE     0x00000020  /* Alignment exception */
+#define SPR_DSR_IIE    0x00000040  /* Illegal Instruction exception */
+#define SPR_DSR_IE     0x00000080  /* Interrupt exception */
+#define SPR_DSR_DME    0x00000100  /* DTLB miss exception */
+#define SPR_DSR_IME    0x00000200  /* ITLB miss exception */
+#define SPR_DSR_RE     0x00000400  /* Range exception */
+#define SPR_DSR_SCE    0x00000800  /* System call exception */
+#define SPR_DSR_FPE     0x00001000  /* Floating Point Exception */
+#define SPR_DSR_TE     0x00002000  /* Trap exception */
+
+/*
+ * Bit definitions for Debug reason register
+ *
+ */
+#define SPR_DRR_RSTE   0x00000001  /* Reset exception */
+#define SPR_DRR_BUSEE  0x00000002  /* Bus error exception */
+#define SPR_DRR_DPFE   0x00000004  /* Data Page Fault exception */
+#define SPR_DRR_IPFE   0x00000008  /* Insn Page Fault exception */
+#define SPR_DRR_TTE    0x00000010  /* Tick Timer exception */
+#define SPR_DRR_AE     0x00000020  /* Alignment exception */
+#define SPR_DRR_IIE    0x00000040  /* Illegal Instruction exception */
+#define SPR_DRR_IE     0x00000080  /* Interrupt exception */
+#define SPR_DRR_DME    0x00000100  /* DTLB miss exception */
+#define SPR_DRR_IME    0x00000200  /* ITLB miss exception */
+#define SPR_DRR_RE     0x00000400  /* Range exception */
+#define SPR_DRR_SCE    0x00000800  /* System call exception */
+#define SPR_DRR_FPE     0x00001000  /* Floating Point Exception */
+#define SPR_DRR_TE     0x00002000  /* Trap exception */
+
+/*
+ * Bit definitions for Performance counters mode registers
+ *
+ */
+#define SPR_PCMR_CP    0x00000001  /* Counter present */
+#define SPR_PCMR_UMRA  0x00000002  /* User mode read access */
+#define SPR_PCMR_CISM  0x00000004  /* Count in supervisor mode */
+#define SPR_PCMR_CIUM  0x00000008  /* Count in user mode */
+#define SPR_PCMR_LA    0x00000010  /* Load access event */
+#define SPR_PCMR_SA    0x00000020  /* Store access event */
+#define SPR_PCMR_IF    0x00000040  /* Instruction fetch event*/
+#define SPR_PCMR_DCM   0x00000080  /* Data cache miss event */
+#define SPR_PCMR_ICM   0x00000100  /* Insn cache miss event */
+#define SPR_PCMR_IFS   0x00000200  /* Insn fetch stall event */
+#define SPR_PCMR_LSUS  0x00000400  /* LSU stall event */
+#define SPR_PCMR_BS    0x00000800  /* Branch stall event */
+#define SPR_PCMR_DTLBM 0x00001000  /* DTLB miss event */
+#define SPR_PCMR_ITLBM 0x00002000  /* ITLB miss event */
+#define SPR_PCMR_DDS   0x00004000  /* Data dependency stall event */
+#define SPR_PCMR_WPE   0x03ff8000  /* Watchpoint events */
+
+/* 
+ * Bit definitions for the Power management register
+ *
+ */
+#define SPR_PMR_SDF    0x0000000f  /* Slow down factor */
+#define SPR_PMR_DME    0x00000010  /* Doze mode enable */
+#define SPR_PMR_SME    0x00000020  /* Sleep mode enable */
+#define SPR_PMR_DCGE   0x00000040  /* Dynamic clock gating enable */
+#define SPR_PMR_SUME   0x00000080  /* Suspend mode enable */
+
+/*
+ * Bit definitions for PICMR
+ *
+ */
+#define SPR_PICMR_IUM  0xfffffffc  /* Interrupt unmask */
+
+/*
+ * Bit definitions for PICPR
+ *
+ */
+#define SPR_PICPR_IPRIO        0xfffffffc  /* Interrupt priority */
+
+/*
+ * Bit definitions for PICSR
+ *
+ */
+#define SPR_PICSR_IS   0xffffffff  /* Interrupt status */
+
+/*
+ * Bit definitions for Tick Timer Control Register
+ *
+ */
+#define SPR_TTCR_PERIOD        0x0fffffff  /* Time Period */
+#define SPR_TTMR_PERIOD        SPR_TTCR_PERIOD
+#define SPR_TTMR_IP    0x10000000  /* Interrupt Pending */
+#define SPR_TTMR_IE    0x20000000  /* Interrupt Enable */
+#define SPR_TTMR_RT    0x40000000  /* Restart tick */
+#define SPR_TTMR_SR     0x80000000  /* Single run */
+#define SPR_TTMR_CR     0xc0000000  /* Continuous run */
+#define SPR_TTMR_M      0xc0000000  /* Tick mode */
+
+/*
+ * Bit definitions for the FP Control Status Register
+ *
+ */
+#define SPR_FPCSR_FPEE  0x00000001  /* Floating Point Exception Enable */
+#define SPR_FPCSR_RM    0x00000006  /* Rounding Mode */
+#define SPR_FPCSR_OVF   0x00000008  /* Overflow Flag */
+#define SPR_FPCSR_UNF   0x00000010  /* Underflow Flag */
+#define SPR_FPCSR_SNF   0x00000020  /* SNAN Flag */
+#define SPR_FPCSR_QNF   0x00000040  /* QNAN Flag */
+#define SPR_FPCSR_ZF    0x00000080  /* Zero Flag */
+#define SPR_FPCSR_IXF   0x00000100  /* Inexact Flag */
+#define SPR_FPCSR_IVF   0x00000200  /* Invalid Flag */
+#define SPR_FPCSR_INF   0x00000400  /* Infinity Flag */
+#define SPR_FPCSR_DZF   0x00000800  /* Divide By Zero Flag */
+#define SPR_FPCSR_ALLF (SPR_FPCSR_OVF | SPR_FPCSR_UNF | SPR_FPCSR_SNF | \
+                       SPR_FPCSR_QNF | SPR_FPCSR_ZF | SPR_FPCSR_IXF |  \
+                       SPR_FPCSR_IVF | SPR_FPCSR_INF | SPR_FPCSR_DZF)
+
+#define FPCSR_RM_RN (0<<1)
+#define FPCSR_RM_RZ (1<<1)
+#define FPCSR_RM_RIP (2<<1)
+#define FPCSR_RM_RIN (3<<1)
+
+#endif /* SPR_DEFS__H */
diff --git a/misoc/software/include/base/stdarg.h b/misoc/software/include/base/stdarg.h
new file mode 100644 (file)
index 0000000..6df5093
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef __STDARG_H
+#define __STDARG_H
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define va_start(v, l) __builtin_va_start((v), l)
+#define va_arg(ap, type) __builtin_va_arg((ap), type)
+#define va_copy(aq, ap) __builtin_va_copy((aq), (ap))
+#define va_end(ap) __builtin_va_end(ap)
+#define va_list __builtin_va_list
+
+int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
+int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
+int vsprintf(char *buf, const char *fmt, va_list args);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STDARG_H */
diff --git a/misoc/software/include/base/stdbool.h b/misoc/software/include/base/stdbool.h
new file mode 100644 (file)
index 0000000..d58bb58
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef __STDBOOL_H
+#define __STDBOOL_H
+
+#define bool _Bool
+#define true 1
+#define false 0
+
+#endif /* __STDBOOL_H */
diff --git a/misoc/software/include/base/stddef.h b/misoc/software/include/base/stddef.h
new file mode 100644 (file)
index 0000000..d1afa95
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef __STDDEF_H
+#define __STDDEF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+
+typedef unsigned long size_t;
+typedef long ptrdiff_t;
+
+#define offsetof(s,m) (size_t)&(((s *)0)->m)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STDDEF_H */
diff --git a/misoc/software/include/base/stdint.h b/misoc/software/include/base/stdint.h
new file mode 100644 (file)
index 0000000..90332e3
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef __STDINT_H
+#define __STDINT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int intptr_t;
+typedef unsigned int uintptr_t;
+
+typedef unsigned long long uint64_t;
+typedef unsigned int uint32_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+
+typedef long long int64_t;
+typedef int int32_t;
+typedef short int16_t;
+typedef char int8_t;
+
+#define __int_c_join(a, b) a ## b
+#define __int_c(v, suffix) __int_c_join(v, suffix)
+#define __uint_c(v, suffix) __int_c_join(v##U, suffix)
+
+#define INT64_C(v) __int_c(v, LL)
+#define UINT64_C(v) __uint_c(v, LL)
+#define INT32_C(v) v
+#define UINT32_C(v) v##U
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STDINT_H */
diff --git a/misoc/software/include/base/stdio.h b/misoc/software/include/base/stdio.h
new file mode 100644 (file)
index 0000000..5e872d6
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef __STDIO_H
+#define __STDIO_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int putchar(int c);
+int puts(const char *s);
+
+int snprintf(char *buf, size_t size, const char *fmt, ...);
+int scnprintf(char *buf, size_t size, const char *fmt, ...);
+int sprintf(char *buf, const char *fmt, ...);
+
+int printf(const char *fmt, ...);
+
+/* Not sure this belongs here... */
+typedef long long loff_t;
+typedef long off_t;
+typedef int mode_t;
+typedef int dev_t;
+
+/*
+ * Note: this library does not provide FILE operations.
+ * User code must implement them.
+ */
+
+#ifndef BUFSIZ
+#define BUFSIZ 1024
+#endif
+
+#ifndef EOF
+#define EOF -1
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET       0
+#endif
+
+#ifndef SEEK_CUR
+#define SEEK_CUR       1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END       2
+#endif
+
+typedef int FILE;
+
+extern FILE *stdin;
+extern FILE *stdout;
+extern FILE *stderr;
+
+int fprintf(FILE *stream, const char *format, ...);
+int fflush(FILE *stream);
+
+FILE *fopen(const char *path, const char *mode);
+FILE *freopen(const char *path, const char *mode, FILE *stream);
+char *fgets(char *s, int size, FILE *stream);
+size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
+int getc(FILE *stream);
+int fputc(int c, FILE *stream);
+int ferror(FILE *stream);
+int feof(FILE *stream);
+int fclose(FILE *fp);
+
+int fseek(FILE *stream, long offset, int whence);
+long ftell(FILE *stream);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STDIO_H */
diff --git a/misoc/software/include/base/stdlib.h b/misoc/software/include/base/stdlib.h
new file mode 100644 (file)
index 0000000..4b9bd04
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * MiSoC
+ * Copyright (C) 2007, 2008, 2009, 2011 Sebastien Bourdeauducq
+ * Copyright (C) Linux kernel developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __STDLIB_H
+#define __STDLIB_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PRINTF_ZEROPAD 1               /* pad with zero */
+#define PRINTF_SIGN    2               /* unsigned/signed long */
+#define PRINTF_PLUS    4               /* show plus */
+#define PRINTF_SPACE   8               /* space if plus */
+#define PRINTF_LEFT    16              /* left justified */
+#define PRINTF_SPECIAL 32              /* 0x */
+#define PRINTF_LARGE   64              /* use 'ABCDEF' instead of 'abcdef' */
+
+#define likely(x) x
+#define unlikely(x) x
+
+static inline int abs(int x)
+{
+       return x > 0 ? x : -x;
+}
+
+static inline long int labs(long int x)
+{
+       return x > 0 ? x : -x;
+}
+
+unsigned long strtoul(const char *nptr, char **endptr, int base);
+long strtol(const char *nptr, char **endptr, int base);
+double strtod(const char *str, char **endptr);
+
+int skip_atoi(const char **s);
+static inline int atoi(const char *nptr) {
+       return strtol(nptr, NULL, 10);
+}
+static inline long atol(const char *nptr) {
+       return (long)atoi(nptr);
+}
+char *number(char *buf, char *end, unsigned long num, int base, int size, int precision, int type);
+
+#define   RAND_MAX        2147483647
+
+unsigned int rand(void);
+void srand(unsigned int seed);
+void abort(void) __attribute__((noreturn));
+
+void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
+
+/*
+ * The following functions are not provided by this library.
+ */
+
+char *getenv(const char *name);
+
+void *malloc(size_t size);
+void free(void *ptr);
+void *realloc(void *ptr, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STDLIB_H */
diff --git a/misoc/software/include/base/string.h b/misoc/software/include/base/string.h
new file mode 100644 (file)
index 0000000..4d0716b
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * MiSoC
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
+ * Copyright (C) Linus Torvalds and Linux kernel developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __STRING_H
+#define __STRING_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char *strchr(const char *s, int c);
+char *strpbrk(const char *,const char *);
+char *strrchr(const char *s, int c);
+char *strnchr(const char *s, size_t count, int c);
+char *strcpy(char *dest, const char *src);
+char *strncpy(char *dest, const char *src, size_t count);
+int strcmp(const char *cs, const char *ct);
+int strncmp(const char *cs, const char *ct, size_t count);
+char *strcat(char *dest, const char *src);
+char *strncat(char *dest, const char *src, size_t n);
+size_t strlen(const char *s);
+size_t strnlen(const char *s, size_t count);
+size_t strspn(const char *s, const char *accept);
+int memcmp(const void *cs, const void *ct, size_t count);
+void *memset(void *s, int c, size_t count);
+void *memcpy(void *to, const void *from, size_t n);
+void *memmove(void *dest, const void *src, size_t count);
+char *strstr(const char *s1, const char *s2);
+void *memchr(const void *s, int c, size_t n);
+
+char *strerror(int errnum);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STRING_H */
diff --git a/misoc/software/include/base/system.h b/misoc/software/include/base/system.h
new file mode 100644 (file)
index 0000000..014dbf4
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef __SYSTEM_H
+#define __SYSTEM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void flush_cpu_icache(void);
+void flush_cpu_dcache(void);
+void flush_l2_cache(void);
+
+#ifdef __or1k__
+#include <spr-defs.h>
+static inline unsigned long mfspr(unsigned long add)
+{
+       unsigned long ret;
+
+       __asm__ __volatile__ ("l.mfspr %0,r0,%1" : "=r" (ret) : "K" (add));
+
+       return ret;
+}
+
+static inline void mtspr(unsigned long add, unsigned long val)
+{
+       __asm__ __volatile__ ("l.mtspr r0,%1,%0" : : "K" (add), "r" (val));
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SYSTEM_H */
diff --git a/misoc/software/include/base/time.h b/misoc/software/include/base/time.h
new file mode 100644 (file)
index 0000000..3408390
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __TIME_H
+#define __TIME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void time_init(void);
+int elapsed(int *last_event, int period);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIME_H */
diff --git a/misoc/software/include/base/uart.h b/misoc/software/include/base/uart.h
new file mode 100644 (file)
index 0000000..3d8a4fc
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __UART_H
+#define __UART_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void uart_init(void);
+void uart_isr(void);
+void uart_sync(void);
+
+void uart_write(char c);
+char uart_read(void);
+int uart_read_nonblock(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/misoc/software/include/basec++/algorithm b/misoc/software/include/basec++/algorithm
new file mode 100644 (file)
index 0000000..cb9b614
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef __CXX_ALGORITHM
+#define __CXX_ALGORITHM
+
+#endif /* __CXX_ALGORITHM */
diff --git a/misoc/software/include/basec++/cstddef b/misoc/software/include/basec++/cstddef
new file mode 100644 (file)
index 0000000..5291f1b
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __CXX_CSTDDEF
+#define __CXX_CSTDDEF
+
+#include <stddef.h>
+
+namespace std {
+  using ::size_t;
+  using ::ptrdiff_t;
+}
+
+#endif /* __CXX_CSTDDEF */
diff --git a/misoc/software/include/basec++/cstdlib b/misoc/software/include/basec++/cstdlib
new file mode 100644 (file)
index 0000000..6501ea9
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __CXX_CSTDLIB
+#define __CXX_CSTDLIB
+
+#include <stdlib.h>
+
+#endif /* __CXX_CSTDLIB */
diff --git a/misoc/software/include/basec++/new b/misoc/software/include/basec++/new
new file mode 100644 (file)
index 0000000..aa2f1a8
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __CXX_NEW
+#define __CXX_NEW
+
+#include <cstddef>
+
+inline void* operator new (std::size_t size, void* ptr) noexcept
+  { return ptr; }
+
+#endif /* __CXX_NEW */
diff --git a/misoc/software/include/dyld/dlfcn.h b/misoc/software/include/dyld/dlfcn.h
new file mode 100644 (file)
index 0000000..cf679f7
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef __DLFCN_H
+#define __DLFCN_H
+
+typedef struct
+{
+  const char *dli_fname;        /* File name of defining object.  */
+  void *dli_fbase;              /* Load address of that object.  */
+  const char *dli_sname;        /* Name of nearest symbol.  */
+  void *dli_saddr;              /* Exact value of nearest symbol.  */
+} Dl_info;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int dl_iterate_phdr (int (*__callback) (struct dl_phdr_info *,
+                                               size_t, void *),
+                            void *__data);
+
+/* Fill in *INFO with the following information about ADDRESS.
+   Returns 0 iff no shared object's segments contain that address.  */
+extern int dladdr (const void *__address, Dl_info *__info);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DLFCN_H */
diff --git a/misoc/software/include/dyld/dyld.h b/misoc/software/include/dyld/dyld.h
new file mode 100644 (file)
index 0000000..6bd55be
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef __DYLD_H
+#define __DYLD_H
+
+#include <elf.h>
+
+struct dyld_info {
+    Elf32_Addr base;
+    const void *init;
+    const char *strtab;
+    const Elf32_Sym *symtab;
+    struct {
+        Elf32_Word nbucket;
+        Elf32_Word nchain;
+        const Elf32_Word *bucket;
+        const Elf32_Word *chain;
+    } hash;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int dyld_load(const void *shlib, Elf32_Addr base,
+              Elf32_Addr (*resolve_import)(const char *),
+              struct dyld_info *info, const char **error_out);
+void *dyld_lookup(const char *symbol, struct dyld_info *info);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DYLD_H */
diff --git a/misoc/software/include/dyld/elf.h b/misoc/software/include/dyld/elf.h
new file mode 100644 (file)
index 0000000..c84c28a
--- /dev/null
@@ -0,0 +1,3343 @@
+/* This file defines standard ELF types, structures, and macros.
+   Copyright (C) 1995-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _ELF_H
+#define        _ELF_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Standard ELF types.  */
+
+#include <stdint.h>
+
+/* Type for a 16-bit quantity.  */
+typedef uint16_t Elf32_Half;
+typedef uint16_t Elf64_Half;
+
+/* Types for signed and unsigned 32-bit quantities.  */
+typedef uint32_t Elf32_Word;
+typedef        int32_t  Elf32_Sword;
+typedef uint32_t Elf64_Word;
+typedef        int32_t  Elf64_Sword;
+
+/* Types for signed and unsigned 64-bit quantities.  */
+typedef uint64_t Elf32_Xword;
+typedef        int64_t  Elf32_Sxword;
+typedef uint64_t Elf64_Xword;
+typedef        int64_t  Elf64_Sxword;
+
+/* Type of addresses.  */
+typedef uint32_t Elf32_Addr;
+typedef uint64_t Elf64_Addr;
+
+/* Type of file offsets.  */
+typedef uint32_t Elf32_Off;
+typedef uint64_t Elf64_Off;
+
+/* Type for section indices, which are 16-bit quantities.  */
+typedef uint16_t Elf32_Section;
+typedef uint16_t Elf64_Section;
+
+/* Type for version symbol information.  */
+typedef Elf32_Half Elf32_Versym;
+typedef Elf64_Half Elf64_Versym;
+
+
+/* The ELF file header.  This appears at the start of every ELF file.  */
+
+#define EI_NIDENT (16)
+
+typedef struct
+{
+  unsigned char        e_ident[EI_NIDENT];     /* Magic number and other info */
+  Elf32_Half   e_type;                 /* Object file type */
+  Elf32_Half   e_machine;              /* Architecture */
+  Elf32_Word   e_version;              /* Object file version */
+  Elf32_Addr   e_entry;                /* Entry point virtual address */
+  Elf32_Off    e_phoff;                /* Program header table file offset */
+  Elf32_Off    e_shoff;                /* Section header table file offset */
+  Elf32_Word   e_flags;                /* Processor-specific flags */
+  Elf32_Half   e_ehsize;               /* ELF header size in bytes */
+  Elf32_Half   e_phentsize;            /* Program header table entry size */
+  Elf32_Half   e_phnum;                /* Program header table entry count */
+  Elf32_Half   e_shentsize;            /* Section header table entry size */
+  Elf32_Half   e_shnum;                /* Section header table entry count */
+  Elf32_Half   e_shstrndx;             /* Section header string table index */
+} Elf32_Ehdr;
+
+typedef struct
+{
+  unsigned char        e_ident[EI_NIDENT];     /* Magic number and other info */
+  Elf64_Half   e_type;                 /* Object file type */
+  Elf64_Half   e_machine;              /* Architecture */
+  Elf64_Word   e_version;              /* Object file version */
+  Elf64_Addr   e_entry;                /* Entry point virtual address */
+  Elf64_Off    e_phoff;                /* Program header table file offset */
+  Elf64_Off    e_shoff;                /* Section header table file offset */
+  Elf64_Word   e_flags;                /* Processor-specific flags */
+  Elf64_Half   e_ehsize;               /* ELF header size in bytes */
+  Elf64_Half   e_phentsize;            /* Program header table entry size */
+  Elf64_Half   e_phnum;                /* Program header table entry count */
+  Elf64_Half   e_shentsize;            /* Section header table entry size */
+  Elf64_Half   e_shnum;                /* Section header table entry count */
+  Elf64_Half   e_shstrndx;             /* Section header string table index */
+} Elf64_Ehdr;
+
+/* Fields in the e_ident array.  The EI_* macros are indices into the
+   array.  The macros under each EI_* macro are the values the byte
+   may have.  */
+
+#define EI_MAG0                0               /* File identification byte 0 index */
+#define ELFMAG0                0x7f            /* Magic number byte 0 */
+
+#define EI_MAG1                1               /* File identification byte 1 index */
+#define ELFMAG1                'E'             /* Magic number byte 1 */
+
+#define EI_MAG2                2               /* File identification byte 2 index */
+#define ELFMAG2                'L'             /* Magic number byte 2 */
+
+#define EI_MAG3                3               /* File identification byte 3 index */
+#define ELFMAG3                'F'             /* Magic number byte 3 */
+
+/* Conglomeration of the identification bytes, for easy testing as a word.  */
+#define        ELFMAG          "\177ELF"
+#define        SELFMAG         4
+
+#define EI_CLASS       4               /* File class byte index */
+#define ELFCLASSNONE   0               /* Invalid class */
+#define ELFCLASS32     1               /* 32-bit objects */
+#define ELFCLASS64     2               /* 64-bit objects */
+#define ELFCLASSNUM    3
+
+#define EI_DATA                5               /* Data encoding byte index */
+#define ELFDATANONE    0               /* Invalid data encoding */
+#define ELFDATA2LSB    1               /* 2's complement, little endian */
+#define ELFDATA2MSB    2               /* 2's complement, big endian */
+#define ELFDATANUM     3
+
+#define EI_VERSION     6               /* File version byte index */
+                                       /* Value must be EV_CURRENT */
+
+#define EI_OSABI       7               /* OS ABI identification */
+#define ELFOSABI_NONE          0       /* UNIX System V ABI */
+#define ELFOSABI_SYSV          0       /* Alias.  */
+#define ELFOSABI_HPUX          1       /* HP-UX */
+#define ELFOSABI_NETBSD                2       /* NetBSD.  */
+#define ELFOSABI_GNU           3       /* Object uses GNU ELF extensions.  */
+#define ELFOSABI_LINUX         ELFOSABI_GNU /* Compatibility alias.  */
+#define ELFOSABI_SOLARIS       6       /* Sun Solaris.  */
+#define ELFOSABI_AIX           7       /* IBM AIX.  */
+#define ELFOSABI_IRIX          8       /* SGI Irix.  */
+#define ELFOSABI_FREEBSD       9       /* FreeBSD.  */
+#define ELFOSABI_TRU64         10      /* Compaq TRU64 UNIX.  */
+#define ELFOSABI_MODESTO       11      /* Novell Modesto.  */
+#define ELFOSABI_OPENBSD       12      /* OpenBSD.  */
+#define ELFOSABI_ARM_AEABI     64      /* ARM EABI */
+#define ELFOSABI_ARM           97      /* ARM */
+#define ELFOSABI_STANDALONE    255     /* Standalone (embedded) application */
+
+#define EI_ABIVERSION  8               /* ABI version */
+
+#define EI_PAD         9               /* Byte index of padding bytes */
+
+/* Legal values for e_type (object file type).  */
+
+#define ET_NONE                0               /* No file type */
+#define ET_REL         1               /* Relocatable file */
+#define ET_EXEC                2               /* Executable file */
+#define ET_DYN         3               /* Shared object file */
+#define ET_CORE                4               /* Core file */
+#define        ET_NUM          5               /* Number of defined types */
+#define ET_LOOS                0xfe00          /* OS-specific range start */
+#define ET_HIOS                0xfeff          /* OS-specific range end */
+#define ET_LOPROC      0xff00          /* Processor-specific range start */
+#define ET_HIPROC      0xffff          /* Processor-specific range end */
+
+/* Legal values for e_machine (architecture).  */
+
+#define EM_NONE                 0              /* No machine */
+#define EM_M32          1              /* AT&T WE 32100 */
+#define EM_SPARC        2              /* SUN SPARC */
+#define EM_386          3              /* Intel 80386 */
+#define EM_68K          4              /* Motorola m68k family */
+#define EM_88K          5              /* Motorola m88k family */
+#define EM_860          7              /* Intel 80860 */
+#define EM_MIPS                 8              /* MIPS R3000 big-endian */
+#define EM_S370                 9              /* IBM System/370 */
+#define EM_MIPS_RS3_LE 10              /* MIPS R3000 little-endian */
+
+#define EM_PARISC      15              /* HPPA */
+#define EM_VPP500      17              /* Fujitsu VPP500 */
+#define EM_SPARC32PLUS 18              /* Sun's "v8plus" */
+#define EM_960         19              /* Intel 80960 */
+#define EM_PPC         20              /* PowerPC */
+#define EM_PPC64       21              /* PowerPC 64-bit */
+#define EM_S390                22              /* IBM S390 */
+
+#define EM_V800                36              /* NEC V800 series */
+#define EM_FR20                37              /* Fujitsu FR20 */
+#define EM_RH32                38              /* TRW RH-32 */
+#define EM_RCE         39              /* Motorola RCE */
+#define EM_ARM         40              /* ARM */
+#define EM_FAKE_ALPHA  41              /* Digital Alpha */
+#define EM_SH          42              /* Hitachi SH */
+#define EM_SPARCV9     43              /* SPARC v9 64-bit */
+#define EM_TRICORE     44              /* Siemens Tricore */
+#define EM_ARC         45              /* Argonaut RISC Core */
+#define EM_H8_300      46              /* Hitachi H8/300 */
+#define EM_H8_300H     47              /* Hitachi H8/300H */
+#define EM_H8S         48              /* Hitachi H8S */
+#define EM_H8_500      49              /* Hitachi H8/500 */
+#define EM_IA_64       50              /* Intel Merced */
+#define EM_MIPS_X      51              /* Stanford MIPS-X */
+#define EM_COLDFIRE    52              /* Motorola Coldfire */
+#define EM_68HC12      53              /* Motorola M68HC12 */
+#define EM_MMA         54              /* Fujitsu MMA Multimedia Accelerator*/
+#define EM_PCP         55              /* Siemens PCP */
+#define EM_NCPU                56              /* Sony nCPU embeeded RISC */
+#define EM_NDR1                57              /* Denso NDR1 microprocessor */
+#define EM_STARCORE    58              /* Motorola Start*Core processor */
+#define EM_ME16                59              /* Toyota ME16 processor */
+#define EM_ST100       60              /* STMicroelectronic ST100 processor */
+#define EM_TINYJ       61              /* Advanced Logic Corp. Tinyj emb.fam*/
+#define EM_X86_64      62              /* AMD x86-64 architecture */
+#define EM_PDSP                63              /* Sony DSP Processor */
+
+#define EM_FX66                66              /* Siemens FX66 microcontroller */
+#define EM_ST9PLUS     67              /* STMicroelectronics ST9+ 8/16 mc */
+#define EM_ST7         68              /* STmicroelectronics ST7 8 bit mc */
+#define EM_68HC16      69              /* Motorola MC68HC16 microcontroller */
+#define EM_68HC11      70              /* Motorola MC68HC11 microcontroller */
+#define EM_68HC08      71              /* Motorola MC68HC08 microcontroller */
+#define EM_68HC05      72              /* Motorola MC68HC05 microcontroller */
+#define EM_SVX         73              /* Silicon Graphics SVx */
+#define EM_ST19                74              /* STMicroelectronics ST19 8 bit mc */
+#define EM_VAX         75              /* Digital VAX */
+#define EM_CRIS                76              /* Axis Communications 32-bit embedded processor */
+#define EM_JAVELIN     77              /* Infineon Technologies 32-bit embedded processor */
+#define EM_FIREPATH    78              /* Element 14 64-bit DSP Processor */
+#define EM_ZSP         79              /* LSI Logic 16-bit DSP Processor */
+#define EM_MMIX                80              /* Donald Knuth's educational 64-bit processor */
+#define EM_HUANY       81              /* Harvard University machine-independent object files */
+#define EM_PRISM       82              /* SiTera Prism */
+#define EM_AVR         83              /* Atmel AVR 8-bit microcontroller */
+#define EM_FR30                84              /* Fujitsu FR30 */
+#define EM_D10V                85              /* Mitsubishi D10V */
+#define EM_D30V                86              /* Mitsubishi D30V */
+#define EM_V850                87              /* NEC v850 */
+#define EM_M32R                88              /* Mitsubishi M32R */
+#define EM_MN10300     89              /* Matsushita MN10300 */
+#define EM_MN10200     90              /* Matsushita MN10200 */
+#define EM_PJ          91              /* picoJava */
+#define EM_OPENRISC    92              /* OpenRISC 32-bit embedded processor */
+#define EM_ARC_A5      93              /* ARC Cores Tangent-A5 */
+#define EM_XTENSA      94              /* Tensilica Xtensa Architecture */
+#define EM_AARCH64     183             /* ARM AARCH64 */
+#define EM_TILEPRO     188             /* Tilera TILEPro */
+#define EM_MICROBLAZE  189             /* Xilinx MicroBlaze */
+#define EM_TILEGX      191             /* Tilera TILE-Gx */
+#define EM_NUM         192
+
+/* If it is necessary to assign new unofficial EM_* values, please
+   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
+   chances of collision with official or non-GNU unofficial values.  */
+
+#define EM_ALPHA       0x9026
+
+/* Legal values for e_version (version).  */
+
+#define EV_NONE                0               /* Invalid ELF version */
+#define EV_CURRENT     1               /* Current version */
+#define EV_NUM         2
+
+/* Section header.  */
+
+typedef struct
+{
+  Elf32_Word   sh_name;                /* Section name (string tbl index) */
+  Elf32_Word   sh_type;                /* Section type */
+  Elf32_Word   sh_flags;               /* Section flags */
+  Elf32_Addr   sh_addr;                /* Section virtual addr at execution */
+  Elf32_Off    sh_offset;              /* Section file offset */
+  Elf32_Word   sh_size;                /* Section size in bytes */
+  Elf32_Word   sh_link;                /* Link to another section */
+  Elf32_Word   sh_info;                /* Additional section information */
+  Elf32_Word   sh_addralign;           /* Section alignment */
+  Elf32_Word   sh_entsize;             /* Entry size if section holds table */
+} Elf32_Shdr;
+
+typedef struct
+{
+  Elf64_Word   sh_name;                /* Section name (string tbl index) */
+  Elf64_Word   sh_type;                /* Section type */
+  Elf64_Xword  sh_flags;               /* Section flags */
+  Elf64_Addr   sh_addr;                /* Section virtual addr at execution */
+  Elf64_Off    sh_offset;              /* Section file offset */
+  Elf64_Xword  sh_size;                /* Section size in bytes */
+  Elf64_Word   sh_link;                /* Link to another section */
+  Elf64_Word   sh_info;                /* Additional section information */
+  Elf64_Xword  sh_addralign;           /* Section alignment */
+  Elf64_Xword  sh_entsize;             /* Entry size if section holds table */
+} Elf64_Shdr;
+
+/* Special section indices.  */
+
+#define SHN_UNDEF      0               /* Undefined section */
+#define SHN_LORESERVE  0xff00          /* Start of reserved indices */
+#define SHN_LOPROC     0xff00          /* Start of processor-specific */
+#define SHN_BEFORE     0xff00          /* Order section before all others
+                                          (Solaris).  */
+#define SHN_AFTER      0xff01          /* Order section after all others
+                                          (Solaris).  */
+#define SHN_HIPROC     0xff1f          /* End of processor-specific */
+#define SHN_LOOS       0xff20          /* Start of OS-specific */
+#define SHN_HIOS       0xff3f          /* End of OS-specific */
+#define SHN_ABS                0xfff1          /* Associated symbol is absolute */
+#define SHN_COMMON     0xfff2          /* Associated symbol is common */
+#define SHN_XINDEX     0xffff          /* Index is in extra table.  */
+#define SHN_HIRESERVE  0xffff          /* End of reserved indices */
+
+/* Legal values for sh_type (section type).  */
+
+#define SHT_NULL         0             /* Section header table entry unused */
+#define SHT_PROGBITS     1             /* Program data */
+#define SHT_SYMTAB       2             /* Symbol table */
+#define SHT_STRTAB       3             /* String table */
+#define SHT_RELA         4             /* Relocation entries with addends */
+#define SHT_HASH         5             /* Symbol hash table */
+#define SHT_DYNAMIC      6             /* Dynamic linking information */
+#define SHT_NOTE         7             /* Notes */
+#define SHT_NOBITS       8             /* Program space with no data (bss) */
+#define SHT_REL                  9             /* Relocation entries, no addends */
+#define SHT_SHLIB        10            /* Reserved */
+#define SHT_DYNSYM       11            /* Dynamic linker symbol table */
+#define SHT_INIT_ARRAY   14            /* Array of constructors */
+#define SHT_FINI_ARRAY   15            /* Array of destructors */
+#define SHT_PREINIT_ARRAY 16           /* Array of pre-constructors */
+#define SHT_GROUP        17            /* Section group */
+#define SHT_SYMTAB_SHNDX  18           /* Extended section indeces */
+#define        SHT_NUM           19            /* Number of defined types.  */
+#define SHT_LOOS         0x60000000    /* Start OS-specific.  */
+#define SHT_GNU_ATTRIBUTES 0x6ffffff5  /* Object attributes.  */
+#define SHT_GNU_HASH     0x6ffffff6    /* GNU-style hash table.  */
+#define SHT_GNU_LIBLIST          0x6ffffff7    /* Prelink library list */
+#define SHT_CHECKSUM     0x6ffffff8    /* Checksum for DSO content.  */
+#define SHT_LOSUNW       0x6ffffffa    /* Sun-specific low bound.  */
+#define SHT_SUNW_move    0x6ffffffa
+#define SHT_SUNW_COMDAT   0x6ffffffb
+#define SHT_SUNW_syminfo  0x6ffffffc
+#define SHT_GNU_verdef   0x6ffffffd    /* Version definition section.  */
+#define SHT_GNU_verneed          0x6ffffffe    /* Version needs section.  */
+#define SHT_GNU_versym   0x6fffffff    /* Version symbol table.  */
+#define SHT_HISUNW       0x6fffffff    /* Sun-specific high bound.  */
+#define SHT_HIOS         0x6fffffff    /* End OS-specific type */
+#define SHT_LOPROC       0x70000000    /* Start of processor-specific */
+#define SHT_HIPROC       0x7fffffff    /* End of processor-specific */
+#define SHT_LOUSER       0x80000000    /* Start of application-specific */
+#define SHT_HIUSER       0x8fffffff    /* End of application-specific */
+
+/* Legal values for sh_flags (section flags).  */
+
+#define SHF_WRITE           (1 << 0)   /* Writable */
+#define SHF_ALLOC           (1 << 1)   /* Occupies memory during execution */
+#define SHF_EXECINSTR       (1 << 2)   /* Executable */
+#define SHF_MERGE           (1 << 4)   /* Might be merged */
+#define SHF_STRINGS         (1 << 5)   /* Contains nul-terminated strings */
+#define SHF_INFO_LINK       (1 << 6)   /* `sh_info' contains SHT index */
+#define SHF_LINK_ORDER      (1 << 7)   /* Preserve order after combining */
+#define SHF_OS_NONCONFORMING (1 << 8)  /* Non-standard OS specific handling
+                                          required */
+#define SHF_GROUP           (1 << 9)   /* Section is member of a group.  */
+#define SHF_TLS                     (1 << 10)  /* Section hold thread-local data.  */
+#define SHF_MASKOS          0x0ff00000 /* OS-specific.  */
+#define SHF_MASKPROC        0xf0000000 /* Processor-specific */
+#define SHF_ORDERED         (1 << 30)  /* Special ordering requirement
+                                          (Solaris).  */
+#define SHF_EXCLUDE         (1 << 31)  /* Section is excluded unless
+                                          referenced or allocated (Solaris).*/
+
+/* Section group handling.  */
+#define GRP_COMDAT     0x1             /* Mark group as COMDAT.  */
+
+/* Symbol table entry.  */
+
+typedef struct
+{
+  Elf32_Word   st_name;                /* Symbol name (string tbl index) */
+  Elf32_Addr   st_value;               /* Symbol value */
+  Elf32_Word   st_size;                /* Symbol size */
+  unsigned char        st_info;                /* Symbol type and binding */
+  unsigned char        st_other;               /* Symbol visibility */
+  Elf32_Section        st_shndx;               /* Section index */
+} Elf32_Sym;
+
+typedef struct
+{
+  Elf64_Word   st_name;                /* Symbol name (string tbl index) */
+  unsigned char        st_info;                /* Symbol type and binding */
+  unsigned char st_other;              /* Symbol visibility */
+  Elf64_Section        st_shndx;               /* Section index */
+  Elf64_Addr   st_value;               /* Symbol value */
+  Elf64_Xword  st_size;                /* Symbol size */
+} Elf64_Sym;
+
+/* The syminfo section if available contains additional information about
+   every dynamic symbol.  */
+
+typedef struct
+{
+  Elf32_Half si_boundto;               /* Direct bindings, symbol bound to */
+  Elf32_Half si_flags;                 /* Per symbol flags */
+} Elf32_Syminfo;
+
+typedef struct
+{
+  Elf64_Half si_boundto;               /* Direct bindings, symbol bound to */
+  Elf64_Half si_flags;                 /* Per symbol flags */
+} Elf64_Syminfo;
+
+/* Possible values for si_boundto.  */
+#define SYMINFO_BT_SELF                0xffff  /* Symbol bound to self */
+#define SYMINFO_BT_PARENT      0xfffe  /* Symbol bound to parent */
+#define SYMINFO_BT_LOWRESERVE  0xff00  /* Beginning of reserved entries */
+
+/* Possible bitmasks for si_flags.  */
+#define SYMINFO_FLG_DIRECT     0x0001  /* Direct bound symbol */
+#define SYMINFO_FLG_PASSTHRU   0x0002  /* Pass-thru symbol for translator */
+#define SYMINFO_FLG_COPY       0x0004  /* Symbol is a copy-reloc */
+#define SYMINFO_FLG_LAZYLOAD   0x0008  /* Symbol bound to object to be lazy
+                                          loaded */
+/* Syminfo version values.  */
+#define SYMINFO_NONE           0
+#define SYMINFO_CURRENT                1
+#define SYMINFO_NUM            2
+
+
+/* How to extract and insert information held in the st_info field.  */
+
+#define ELF32_ST_BIND(val)             (((unsigned char) (val)) >> 4)
+#define ELF32_ST_TYPE(val)             ((val) & 0xf)
+#define ELF32_ST_INFO(bind, type)      (((bind) << 4) + ((type) & 0xf))
+
+/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */
+#define ELF64_ST_BIND(val)             ELF32_ST_BIND (val)
+#define ELF64_ST_TYPE(val)             ELF32_ST_TYPE (val)
+#define ELF64_ST_INFO(bind, type)      ELF32_ST_INFO ((bind), (type))
+
+/* Legal values for ST_BIND subfield of st_info (symbol binding).  */
+
+#define STB_LOCAL      0               /* Local symbol */
+#define STB_GLOBAL     1               /* Global symbol */
+#define STB_WEAK       2               /* Weak symbol */
+#define        STB_NUM         3               /* Number of defined types.  */
+#define STB_LOOS       10              /* Start of OS-specific */
+#define STB_GNU_UNIQUE 10              /* Unique symbol.  */
+#define STB_HIOS       12              /* End of OS-specific */
+#define STB_LOPROC     13              /* Start of processor-specific */
+#define STB_HIPROC     15              /* End of processor-specific */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
+
+#define STT_NOTYPE     0               /* Symbol type is unspecified */
+#define STT_OBJECT     1               /* Symbol is a data object */
+#define STT_FUNC       2               /* Symbol is a code object */
+#define STT_SECTION    3               /* Symbol associated with a section */
+#define STT_FILE       4               /* Symbol's name is file name */
+#define STT_COMMON     5               /* Symbol is a common data object */
+#define STT_TLS                6               /* Symbol is thread-local data object*/
+#define        STT_NUM         7               /* Number of defined types.  */
+#define STT_LOOS       10              /* Start of OS-specific */
+#define STT_GNU_IFUNC  10              /* Symbol is indirect code object */
+#define STT_HIOS       12              /* End of OS-specific */
+#define STT_LOPROC     13              /* Start of processor-specific */
+#define STT_HIPROC     15              /* End of processor-specific */
+
+
+/* Symbol table indices are found in the hash buckets and chain table
+   of a symbol hash table section.  This special index value indicates
+   the end of a chain, meaning no further symbols are found in that bucket.  */
+
+#define STN_UNDEF      0               /* End of a chain.  */
+
+
+/* How to extract and insert information held in the st_other field.  */
+
+#define ELF32_ST_VISIBILITY(o) ((o) & 0x03)
+
+/* For ELF64 the definitions are the same.  */
+#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o)
+
+/* Symbol visibility specification encoded in the st_other field.  */
+#define STV_DEFAULT    0               /* Default symbol visibility rules */
+#define STV_INTERNAL   1               /* Processor specific hidden class */
+#define STV_HIDDEN     2               /* Sym unavailable in other modules */
+#define STV_PROTECTED  3               /* Not preemptible, not exported */
+
+
+/* Relocation table entry without addend (in section of type SHT_REL).  */
+
+typedef struct
+{
+  Elf32_Addr   r_offset;               /* Address */
+  Elf32_Word   r_info;                 /* Relocation type and symbol index */
+} Elf32_Rel;
+
+/* I have seen two different definitions of the Elf64_Rel and
+   Elf64_Rela structures, so we'll leave them out until Novell (or
+   whoever) gets their act together.  */
+/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */
+
+typedef struct
+{
+  Elf64_Addr   r_offset;               /* Address */
+  Elf64_Xword  r_info;                 /* Relocation type and symbol index */
+} Elf64_Rel;
+
+/* Relocation table entry with addend (in section of type SHT_RELA).  */
+
+typedef struct
+{
+  Elf32_Addr   r_offset;               /* Address */
+  Elf32_Word   r_info;                 /* Relocation type and symbol index */
+  Elf32_Sword  r_addend;               /* Addend */
+} Elf32_Rela;
+
+typedef struct
+{
+  Elf64_Addr   r_offset;               /* Address */
+  Elf64_Xword  r_info;                 /* Relocation type and symbol index */
+  Elf64_Sxword r_addend;               /* Addend */
+} Elf64_Rela;
+
+/* How to extract and insert information held in the r_info field.  */
+
+#define ELF32_R_SYM(val)               ((val) >> 8)
+#define ELF32_R_TYPE(val)              ((val) & 0xff)
+#define ELF32_R_INFO(sym, type)                (((sym) << 8) + ((type) & 0xff))
+
+#define ELF64_R_SYM(i)                 ((i) >> 32)
+#define ELF64_R_TYPE(i)                        ((i) & 0xffffffff)
+#define ELF64_R_INFO(sym,type)         ((((Elf64_Xword) (sym)) << 32) + (type))
+
+/* Program segment header.  */
+
+typedef struct
+{
+  Elf32_Word   p_type;                 /* Segment type */
+  Elf32_Off    p_offset;               /* Segment file offset */
+  Elf32_Addr   p_vaddr;                /* Segment virtual address */
+  Elf32_Addr   p_paddr;                /* Segment physical address */
+  Elf32_Word   p_filesz;               /* Segment size in file */
+  Elf32_Word   p_memsz;                /* Segment size in memory */
+  Elf32_Word   p_flags;                /* Segment flags */
+  Elf32_Word   p_align;                /* Segment alignment */
+} Elf32_Phdr;
+
+typedef struct
+{
+  Elf64_Word   p_type;                 /* Segment type */
+  Elf64_Word   p_flags;                /* Segment flags */
+  Elf64_Off    p_offset;               /* Segment file offset */
+  Elf64_Addr   p_vaddr;                /* Segment virtual address */
+  Elf64_Addr   p_paddr;                /* Segment physical address */
+  Elf64_Xword  p_filesz;               /* Segment size in file */
+  Elf64_Xword  p_memsz;                /* Segment size in memory */
+  Elf64_Xword  p_align;                /* Segment alignment */
+} Elf64_Phdr;
+
+/* Special value for e_phnum.  This indicates that the real number of
+   program headers is too large to fit into e_phnum.  Instead the real
+   value is in the field sh_info of section 0.  */
+
+#define PN_XNUM                0xffff
+
+/* Legal values for p_type (segment type).  */
+
+#define        PT_NULL         0               /* Program header table entry unused */
+#define PT_LOAD                1               /* Loadable program segment */
+#define PT_DYNAMIC     2               /* Dynamic linking information */
+#define PT_INTERP      3               /* Program interpreter */
+#define PT_NOTE                4               /* Auxiliary information */
+#define PT_SHLIB       5               /* Reserved */
+#define PT_PHDR                6               /* Entry for header table itself */
+#define PT_TLS         7               /* Thread-local storage segment */
+#define        PT_NUM          8               /* Number of defined types */
+#define PT_LOOS                0x60000000      /* Start of OS-specific */
+#define PT_GNU_EH_FRAME        0x6474e550      /* GCC .eh_frame_hdr segment */
+#define PT_GNU_STACK   0x6474e551      /* Indicates stack executability */
+#define PT_GNU_RELRO   0x6474e552      /* Read-only after relocation */
+#define PT_LOSUNW      0x6ffffffa
+#define PT_SUNWBSS     0x6ffffffa      /* Sun Specific segment */
+#define PT_SUNWSTACK   0x6ffffffb      /* Stack segment */
+#define PT_HISUNW      0x6fffffff
+#define PT_HIOS                0x6fffffff      /* End of OS-specific */
+#define PT_LOPROC      0x70000000      /* Start of processor-specific */
+#define PT_HIPROC      0x7fffffff      /* End of processor-specific */
+
+/* Legal values for p_flags (segment flags).  */
+
+#define PF_X           (1 << 0)        /* Segment is executable */
+#define PF_W           (1 << 1)        /* Segment is writable */
+#define PF_R           (1 << 2)        /* Segment is readable */
+#define PF_MASKOS      0x0ff00000      /* OS-specific */
+#define PF_MASKPROC    0xf0000000      /* Processor-specific */
+
+/* Legal values for note segment descriptor types for core files. */
+
+#define NT_PRSTATUS    1               /* Contains copy of prstatus struct */
+#define NT_FPREGSET    2               /* Contains copy of fpregset struct */
+#define NT_PRPSINFO    3               /* Contains copy of prpsinfo struct */
+#define NT_PRXREG      4               /* Contains copy of prxregset struct */
+#define NT_TASKSTRUCT  4               /* Contains copy of task structure */
+#define NT_PLATFORM    5               /* String from sysinfo(SI_PLATFORM) */
+#define NT_AUXV                6               /* Contains copy of auxv array */
+#define NT_GWINDOWS    7               /* Contains copy of gwindows struct */
+#define NT_ASRS                8               /* Contains copy of asrset struct */
+#define NT_PSTATUS     10              /* Contains copy of pstatus struct */
+#define NT_PSINFO      13              /* Contains copy of psinfo struct */
+#define NT_PRCRED      14              /* Contains copy of prcred struct */
+#define NT_UTSNAME     15              /* Contains copy of utsname struct */
+#define NT_LWPSTATUS   16              /* Contains copy of lwpstatus struct */
+#define NT_LWPSINFO    17              /* Contains copy of lwpinfo struct */
+#define NT_PRFPXREG    20              /* Contains copy of fprxregset struct */
+#define NT_SIGINFO     0x53494749      /* Contains copy of siginfo_t,
+                                          size might increase */
+#define NT_FILE                0x46494c45      /* Contains information about mapped
+                                          files */
+#define NT_PRXFPREG    0x46e62b7f      /* Contains copy of user_fxsr_struct */
+#define NT_PPC_VMX     0x100           /* PowerPC Altivec/VMX registers */
+#define NT_PPC_SPE     0x101           /* PowerPC SPE/EVR registers */
+#define NT_PPC_VSX     0x102           /* PowerPC VSX registers */
+#define NT_386_TLS     0x200           /* i386 TLS slots (struct user_desc) */
+#define NT_386_IOPERM  0x201           /* x86 io permission bitmap (1=deny) */
+#define NT_X86_XSTATE  0x202           /* x86 extended state using xsave */
+#define NT_S390_HIGH_GPRS      0x300   /* s390 upper register halves */
+#define NT_S390_TIMER  0x301           /* s390 timer register */
+#define NT_S390_TODCMP 0x302           /* s390 TOD clock comparator register */
+#define NT_S390_TODPREG        0x303           /* s390 TOD programmable register */
+#define NT_S390_CTRS   0x304           /* s390 control registers */
+#define NT_S390_PREFIX 0x305           /* s390 prefix register */
+#define NT_S390_LAST_BREAK     0x306   /* s390 breaking event address */
+#define NT_S390_SYSTEM_CALL    0x307   /* s390 system call restart data */
+#define NT_S390_TDB    0x308           /* s390 transaction diagnostic block */
+#define NT_ARM_VFP     0x400           /* ARM VFP/NEON registers */
+#define NT_ARM_TLS     0x401           /* ARM TLS register */
+#define NT_ARM_HW_BREAK        0x402           /* ARM hardware breakpoint registers */
+#define NT_ARM_HW_WATCH        0x403           /* ARM hardware watchpoint registers */
+
+/* Legal values for the note segment descriptor types for object files.  */
+
+#define NT_VERSION     1               /* Contains a version string.  */
+
+
+/* Dynamic section entry.  */
+
+typedef struct
+{
+  Elf32_Sword  d_tag;                  /* Dynamic entry type */
+  union
+    {
+      Elf32_Word d_val;                        /* Integer value */
+      Elf32_Addr d_ptr;                        /* Address value */
+    } d_un;
+} Elf32_Dyn;
+
+typedef struct
+{
+  Elf64_Sxword d_tag;                  /* Dynamic entry type */
+  union
+    {
+      Elf64_Xword d_val;               /* Integer value */
+      Elf64_Addr d_ptr;                        /* Address value */
+    } d_un;
+} Elf64_Dyn;
+
+/* Legal values for d_tag (dynamic entry type).  */
+
+#define DT_NULL                0               /* Marks end of dynamic section */
+#define DT_NEEDED      1               /* Name of needed library */
+#define DT_PLTRELSZ    2               /* Size in bytes of PLT relocs */
+#define DT_PLTGOT      3               /* Processor defined value */
+#define DT_HASH                4               /* Address of symbol hash table */
+#define DT_STRTAB      5               /* Address of string table */
+#define DT_SYMTAB      6               /* Address of symbol table */
+#define DT_RELA                7               /* Address of Rela relocs */
+#define DT_RELASZ      8               /* Total size of Rela relocs */
+#define DT_RELAENT     9               /* Size of one Rela reloc */
+#define DT_STRSZ       10              /* Size of string table */
+#define DT_SYMENT      11              /* Size of one symbol table entry */
+#define DT_INIT                12              /* Address of init function */
+#define DT_FINI                13              /* Address of termination function */
+#define DT_SONAME      14              /* Name of shared object */
+#define DT_RPATH       15              /* Library search path (deprecated) */
+#define DT_SYMBOLIC    16              /* Start symbol search here */
+#define DT_REL         17              /* Address of Rel relocs */
+#define DT_RELSZ       18              /* Total size of Rel relocs */
+#define DT_RELENT      19              /* Size of one Rel reloc */
+#define DT_PLTREL      20              /* Type of reloc in PLT */
+#define DT_DEBUG       21              /* For debugging; unspecified */
+#define DT_TEXTREL     22              /* Reloc might modify .text */
+#define DT_JMPREL      23              /* Address of PLT relocs */
+#define        DT_BIND_NOW     24              /* Process relocations of object */
+#define        DT_INIT_ARRAY   25              /* Array with addresses of init fct */
+#define        DT_FINI_ARRAY   26              /* Array with addresses of fini fct */
+#define        DT_INIT_ARRAYSZ 27              /* Size in bytes of DT_INIT_ARRAY */
+#define        DT_FINI_ARRAYSZ 28              /* Size in bytes of DT_FINI_ARRAY */
+#define DT_RUNPATH     29              /* Library search path */
+#define DT_FLAGS       30              /* Flags for the object being loaded */
+#define DT_ENCODING    32              /* Start of encoded range */
+#define DT_PREINIT_ARRAY 32            /* Array with addresses of preinit fct*/
+#define DT_PREINIT_ARRAYSZ 33          /* size in bytes of DT_PREINIT_ARRAY */
+#define        DT_NUM          34              /* Number used */
+#define DT_LOOS                0x6000000d      /* Start of OS-specific */
+#define DT_HIOS                0x6ffff000      /* End of OS-specific */
+#define DT_LOPROC      0x70000000      /* Start of processor-specific */
+#define DT_HIPROC      0x7fffffff      /* End of processor-specific */
+#define        DT_PROCNUM      DT_MIPS_NUM     /* Most used by any processor */
+
+/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
+   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
+   approach.  */
+#define DT_VALRNGLO    0x6ffffd00
+#define DT_GNU_PRELINKED 0x6ffffdf5    /* Prelinking timestamp */
+#define DT_GNU_CONFLICTSZ 0x6ffffdf6   /* Size of conflict section */
+#define DT_GNU_LIBLISTSZ 0x6ffffdf7    /* Size of library list */
+#define DT_CHECKSUM    0x6ffffdf8
+#define DT_PLTPADSZ    0x6ffffdf9
+#define DT_MOVEENT     0x6ffffdfa
+#define DT_MOVESZ      0x6ffffdfb
+#define DT_FEATURE_1   0x6ffffdfc      /* Feature selection (DTF_*).  */
+#define DT_POSFLAG_1   0x6ffffdfd      /* Flags for DT_* entries, effecting
+                                          the following DT_* entry.  */
+#define DT_SYMINSZ     0x6ffffdfe      /* Size of syminfo table (in bytes) */
+#define DT_SYMINENT    0x6ffffdff      /* Entry size of syminfo */
+#define DT_VALRNGHI    0x6ffffdff
+#define DT_VALTAGIDX(tag)      (DT_VALRNGHI - (tag))   /* Reverse order! */
+#define DT_VALNUM 12
+
+/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
+   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
+
+   If any adjustment is made to the ELF object after it has been
+   built these entries will need to be adjusted.  */
+#define DT_ADDRRNGLO   0x6ffffe00
+#define DT_GNU_HASH    0x6ffffef5      /* GNU-style hash table.  */
+#define DT_TLSDESC_PLT 0x6ffffef6
+#define DT_TLSDESC_GOT 0x6ffffef7
+#define DT_GNU_CONFLICT        0x6ffffef8      /* Start of conflict section */
+#define DT_GNU_LIBLIST 0x6ffffef9      /* Library list */
+#define DT_CONFIG      0x6ffffefa      /* Configuration information.  */
+#define DT_DEPAUDIT    0x6ffffefb      /* Dependency auditing.  */
+#define DT_AUDIT       0x6ffffefc      /* Object auditing.  */
+#define        DT_PLTPAD       0x6ffffefd      /* PLT padding.  */
+#define        DT_MOVETAB      0x6ffffefe      /* Move table.  */
+#define DT_SYMINFO     0x6ffffeff      /* Syminfo table.  */
+#define DT_ADDRRNGHI   0x6ffffeff
+#define DT_ADDRTAGIDX(tag)     (DT_ADDRRNGHI - (tag))  /* Reverse order! */
+#define DT_ADDRNUM 11
+
+/* The versioning entry types.  The next are defined as part of the
+   GNU extension.  */
+#define DT_VERSYM      0x6ffffff0
+
+#define DT_RELACOUNT   0x6ffffff9
+#define DT_RELCOUNT    0x6ffffffa
+
+/* These were chosen by Sun.  */
+#define DT_FLAGS_1     0x6ffffffb      /* State flags, see DF_1_* below.  */
+#define        DT_VERDEF       0x6ffffffc      /* Address of version definition
+                                          table */
+#define        DT_VERDEFNUM    0x6ffffffd      /* Number of version definitions */
+#define        DT_VERNEED      0x6ffffffe      /* Address of table with needed
+                                          versions */
+#define        DT_VERNEEDNUM   0x6fffffff      /* Number of needed versions */
+#define DT_VERSIONTAGIDX(tag)  (DT_VERNEEDNUM - (tag)) /* Reverse order! */
+#define DT_VERSIONTAGNUM 16
+
+/* Sun added these machine-independent extensions in the "processor-specific"
+   range.  Be compatible.  */
+#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
+#define DT_FILTER       0x7fffffff      /* Shared object to get values from */
+#define DT_EXTRATAGIDX(tag)    ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
+#define DT_EXTRANUM    3
+
+/* Values of `d_un.d_val' in the DT_FLAGS entry.  */
+#define DF_ORIGIN      0x00000001      /* Object may use DF_ORIGIN */
+#define DF_SYMBOLIC    0x00000002      /* Symbol resolutions starts here */
+#define DF_TEXTREL     0x00000004      /* Object contains text relocations */
+#define DF_BIND_NOW    0x00000008      /* No lazy binding for this object */
+#define DF_STATIC_TLS  0x00000010      /* Module uses the static TLS model */
+
+/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
+   entry in the dynamic section.  */
+#define DF_1_NOW       0x00000001      /* Set RTLD_NOW for this object.  */
+#define DF_1_GLOBAL    0x00000002      /* Set RTLD_GLOBAL for this object.  */
+#define DF_1_GROUP     0x00000004      /* Set RTLD_GROUP for this object.  */
+#define DF_1_NODELETE  0x00000008      /* Set RTLD_NODELETE for this object.*/
+#define DF_1_LOADFLTR  0x00000010      /* Trigger filtee loading at runtime.*/
+#define DF_1_INITFIRST 0x00000020      /* Set RTLD_INITFIRST for this object*/
+#define DF_1_NOOPEN    0x00000040      /* Set RTLD_NOOPEN for this object.  */
+#define DF_1_ORIGIN    0x00000080      /* $ORIGIN must be handled.  */
+#define DF_1_DIRECT    0x00000100      /* Direct binding enabled.  */
+#define DF_1_TRANS     0x00000200
+#define DF_1_INTERPOSE 0x00000400      /* Object is used to interpose.  */
+#define DF_1_NODEFLIB  0x00000800      /* Ignore default lib search path.  */
+#define DF_1_NODUMP    0x00001000      /* Object can't be dldump'ed.  */
+#define DF_1_CONFALT   0x00002000      /* Configuration alternative created.*/
+#define DF_1_ENDFILTEE 0x00004000      /* Filtee terminates filters search. */
+#define        DF_1_DISPRELDNE 0x00008000      /* Disp reloc applied at build time. */
+#define        DF_1_DISPRELPND 0x00010000      /* Disp reloc applied at run-time.  */
+#define        DF_1_NODIRECT   0x00020000      /* Object has no-direct binding. */
+#define        DF_1_IGNMULDEF  0x00040000
+#define        DF_1_NOKSYMS    0x00080000
+#define        DF_1_NOHDR      0x00100000
+#define        DF_1_EDITED     0x00200000      /* Object is modified after built.  */
+#define        DF_1_NORELOC    0x00400000
+#define        DF_1_SYMINTPOSE 0x00800000      /* Object has individual interposers.  */
+#define        DF_1_GLOBAUDIT  0x01000000      /* Global auditing required.  */
+#define        DF_1_SINGLETON  0x02000000      /* Singleton symbols are used.  */
+
+/* Flags for the feature selection in DT_FEATURE_1.  */
+#define DTF_1_PARINIT  0x00000001
+#define DTF_1_CONFEXP  0x00000002
+
+/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */
+#define DF_P1_LAZYLOAD 0x00000001      /* Lazyload following object.  */
+#define DF_P1_GROUPPERM        0x00000002      /* Symbols from next object are not
+                                          generally available.  */
+
+/* Version definition sections.  */
+
+typedef struct
+{
+  Elf32_Half   vd_version;             /* Version revision */
+  Elf32_Half   vd_flags;               /* Version information */
+  Elf32_Half   vd_ndx;                 /* Version Index */
+  Elf32_Half   vd_cnt;                 /* Number of associated aux entries */
+  Elf32_Word   vd_hash;                /* Version name hash value */
+  Elf32_Word   vd_aux;                 /* Offset in bytes to verdaux array */
+  Elf32_Word   vd_next;                /* Offset in bytes to next verdef
+                                          entry */
+} Elf32_Verdef;
+
+typedef struct
+{
+  Elf64_Half   vd_version;             /* Version revision */
+  Elf64_Half   vd_flags;               /* Version information */
+  Elf64_Half   vd_ndx;                 /* Version Index */
+  Elf64_Half   vd_cnt;                 /* Number of associated aux entries */
+  Elf64_Word   vd_hash;                /* Version name hash value */
+  Elf64_Word   vd_aux;                 /* Offset in bytes to verdaux array */
+  Elf64_Word   vd_next;                /* Offset in bytes to next verdef
+                                          entry */
+} Elf64_Verdef;
+
+
+/* Legal values for vd_version (version revision).  */
+#define VER_DEF_NONE   0               /* No version */
+#define VER_DEF_CURRENT        1               /* Current version */
+#define VER_DEF_NUM    2               /* Given version number */
+
+/* Legal values for vd_flags (version information flags).  */
+#define VER_FLG_BASE   0x1             /* Version definition of file itself */
+#define VER_FLG_WEAK   0x2             /* Weak version identifier */
+
+/* Versym symbol index values.  */
+#define        VER_NDX_LOCAL           0       /* Symbol is local.  */
+#define        VER_NDX_GLOBAL          1       /* Symbol is global.  */
+#define        VER_NDX_LORESERVE       0xff00  /* Beginning of reserved entries.  */
+#define        VER_NDX_ELIMINATE       0xff01  /* Symbol is to be eliminated.  */
+
+/* Auxialiary version information.  */
+
+typedef struct
+{
+  Elf32_Word   vda_name;               /* Version or dependency names */
+  Elf32_Word   vda_next;               /* Offset in bytes to next verdaux
+                                          entry */
+} Elf32_Verdaux;
+
+typedef struct
+{
+  Elf64_Word   vda_name;               /* Version or dependency names */
+  Elf64_Word   vda_next;               /* Offset in bytes to next verdaux
+                                          entry */
+} Elf64_Verdaux;
+
+
+/* Version dependency section.  */
+
+typedef struct
+{
+  Elf32_Half   vn_version;             /* Version of structure */
+  Elf32_Half   vn_cnt;                 /* Number of associated aux entries */
+  Elf32_Word   vn_file;                /* Offset of filename for this
+                                          dependency */
+  Elf32_Word   vn_aux;                 /* Offset in bytes to vernaux array */
+  Elf32_Word   vn_next;                /* Offset in bytes to next verneed
+                                          entry */
+} Elf32_Verneed;
+
+typedef struct
+{
+  Elf64_Half   vn_version;             /* Version of structure */
+  Elf64_Half   vn_cnt;                 /* Number of associated aux entries */
+  Elf64_Word   vn_file;                /* Offset of filename for this
+                                          dependency */
+  Elf64_Word   vn_aux;                 /* Offset in bytes to vernaux array */
+  Elf64_Word   vn_next;                /* Offset in bytes to next verneed
+                                          entry */
+} Elf64_Verneed;
+
+
+/* Legal values for vn_version (version revision).  */
+#define VER_NEED_NONE   0              /* No version */
+#define VER_NEED_CURRENT 1             /* Current version */
+#define VER_NEED_NUM    2              /* Given version number */
+
+/* Auxiliary needed version information.  */
+
+typedef struct
+{
+  Elf32_Word   vna_hash;               /* Hash value of dependency name */
+  Elf32_Half   vna_flags;              /* Dependency specific information */
+  Elf32_Half   vna_other;              /* Unused */
+  Elf32_Word   vna_name;               /* Dependency name string offset */
+  Elf32_Word   vna_next;               /* Offset in bytes to next vernaux
+                                          entry */
+} Elf32_Vernaux;
+
+typedef struct
+{
+  Elf64_Word   vna_hash;               /* Hash value of dependency name */
+  Elf64_Half   vna_flags;              /* Dependency specific information */
+  Elf64_Half   vna_other;              /* Unused */
+  Elf64_Word   vna_name;               /* Dependency name string offset */
+  Elf64_Word   vna_next;               /* Offset in bytes to next vernaux
+                                          entry */
+} Elf64_Vernaux;
+
+
+/* Legal values for vna_flags.  */
+#define VER_FLG_WEAK   0x2             /* Weak version identifier */
+
+
+/* Auxiliary vector.  */
+
+/* This vector is normally only used by the program interpreter.  The
+   usual definition in an ABI supplement uses the name auxv_t.  The
+   vector is not usually defined in a standard <elf.h> file, but it
+   can't hurt.  We rename it to avoid conflicts.  The sizes of these
+   types are an arrangement between the exec server and the program
+   interpreter, so we don't fully specify them here.  */
+
+typedef struct
+{
+  uint32_t a_type;             /* Entry type */
+  union
+    {
+      uint32_t a_val;          /* Integer value */
+      /* We use to have pointer elements added here.  We cannot do that,
+        though, since it does not work when using 32-bit definitions
+        on 64-bit platforms and vice versa.  */
+    } a_un;
+} Elf32_auxv_t;
+
+typedef struct
+{
+  uint64_t a_type;             /* Entry type */
+  union
+    {
+      uint64_t a_val;          /* Integer value */
+      /* We use to have pointer elements added here.  We cannot do that,
+        though, since it does not work when using 32-bit definitions
+        on 64-bit platforms and vice versa.  */
+    } a_un;
+} Elf64_auxv_t;
+
+/* Note section contents.  Each entry in the note section begins with
+   a header of a fixed form.  */
+
+typedef struct
+{
+  Elf32_Word n_namesz;                 /* Length of the note's name.  */
+  Elf32_Word n_descsz;                 /* Length of the note's descriptor.  */
+  Elf32_Word n_type;                   /* Type of the note.  */
+} Elf32_Nhdr;
+
+typedef struct
+{
+  Elf64_Word n_namesz;                 /* Length of the note's name.  */
+  Elf64_Word n_descsz;                 /* Length of the note's descriptor.  */
+  Elf64_Word n_type;                   /* Type of the note.  */
+} Elf64_Nhdr;
+
+/* Known names of notes.  */
+
+/* Solaris entries in the note section have this name.  */
+#define ELF_NOTE_SOLARIS       "SUNW Solaris"
+
+/* Note entries for GNU systems have this name.  */
+#define ELF_NOTE_GNU           "GNU"
+
+
+/* Defined types of notes for Solaris.  */
+
+/* Value of descriptor (one word) is desired pagesize for the binary.  */
+#define ELF_NOTE_PAGESIZE_HINT 1
+
+
+/* Defined note types for GNU systems.  */
+
+/* ABI information.  The descriptor consists of words:
+   word 0: OS descriptor
+   word 1: major version of the ABI
+   word 2: minor version of the ABI
+   word 3: subminor version of the ABI
+*/
+#define NT_GNU_ABI_TAG 1
+#define ELF_NOTE_ABI   NT_GNU_ABI_TAG /* Old name.  */
+
+/* Known OSes.  These values can appear in word 0 of an
+   NT_GNU_ABI_TAG note section entry.  */
+#define ELF_NOTE_OS_LINUX      0
+#define ELF_NOTE_OS_GNU                1
+#define ELF_NOTE_OS_SOLARIS2   2
+#define ELF_NOTE_OS_FREEBSD    3
+
+/* Synthetic hwcap information.  The descriptor begins with two words:
+   word 0: number of entries
+   word 1: bitmask of enabled entries
+   Then follow variable-length entries, one byte followed by a
+   '\0'-terminated hwcap name string.  The byte gives the bit
+   number to test if enabled, (1U << bit) & bitmask.  */
+#define NT_GNU_HWCAP   2
+
+/* Build ID bits as generated by ld --build-id.
+   The descriptor consists of any nonzero number of bytes.  */
+#define NT_GNU_BUILD_ID        3
+
+/* Version note generated by GNU gold containing a version string.  */
+#define NT_GNU_GOLD_VERSION    4
+
+
+/* Move records.  */
+typedef struct
+{
+  Elf32_Xword m_value;         /* Symbol value.  */
+  Elf32_Word m_info;           /* Size and index.  */
+  Elf32_Word m_poffset;                /* Symbol offset.  */
+  Elf32_Half m_repeat;         /* Repeat count.  */
+  Elf32_Half m_stride;         /* Stride info.  */
+} Elf32_Move;
+
+typedef struct
+{
+  Elf64_Xword m_value;         /* Symbol value.  */
+  Elf64_Xword m_info;          /* Size and index.  */
+  Elf64_Xword m_poffset;       /* Symbol offset.  */
+  Elf64_Half m_repeat;         /* Repeat count.  */
+  Elf64_Half m_stride;         /* Stride info.  */
+} Elf64_Move;
+
+/* Macro to construct move records.  */
+#define ELF32_M_SYM(info)      ((info) >> 8)
+#define ELF32_M_SIZE(info)     ((unsigned char) (info))
+#define ELF32_M_INFO(sym, size)        (((sym) << 8) + (unsigned char) (size))
+
+#define ELF64_M_SYM(info)      ELF32_M_SYM (info)
+#define ELF64_M_SIZE(info)     ELF32_M_SIZE (info)
+#define ELF64_M_INFO(sym, size)        ELF32_M_INFO (sym, size)
+
+
+/* Motorola 68k specific definitions.  */
+
+/* Values for Elf32_Ehdr.e_flags.  */
+#define EF_CPU32       0x00810000
+
+/* m68k relocs.  */
+
+#define R_68K_NONE     0               /* No reloc */
+#define R_68K_32       1               /* Direct 32 bit  */
+#define R_68K_16       2               /* Direct 16 bit  */
+#define R_68K_8                3               /* Direct 8 bit  */
+#define R_68K_PC32     4               /* PC relative 32 bit */
+#define R_68K_PC16     5               /* PC relative 16 bit */
+#define R_68K_PC8      6               /* PC relative 8 bit */
+#define R_68K_GOT32    7               /* 32 bit PC relative GOT entry */
+#define R_68K_GOT16    8               /* 16 bit PC relative GOT entry */
+#define R_68K_GOT8     9               /* 8 bit PC relative GOT entry */
+#define R_68K_GOT32O   10              /* 32 bit GOT offset */
+#define R_68K_GOT16O   11              /* 16 bit GOT offset */
+#define R_68K_GOT8O    12              /* 8 bit GOT offset */
+#define R_68K_PLT32    13              /* 32 bit PC relative PLT address */
+#define R_68K_PLT16    14              /* 16 bit PC relative PLT address */
+#define R_68K_PLT8     15              /* 8 bit PC relative PLT address */
+#define R_68K_PLT32O   16              /* 32 bit PLT offset */
+#define R_68K_PLT16O   17              /* 16 bit PLT offset */
+#define R_68K_PLT8O    18              /* 8 bit PLT offset */
+#define R_68K_COPY     19              /* Copy symbol at runtime */
+#define R_68K_GLOB_DAT 20              /* Create GOT entry */
+#define R_68K_JMP_SLOT 21              /* Create PLT entry */
+#define R_68K_RELATIVE 22              /* Adjust by program base */
+#define R_68K_TLS_GD32      25          /* 32 bit GOT offset for GD */
+#define R_68K_TLS_GD16      26          /* 16 bit GOT offset for GD */
+#define R_68K_TLS_GD8       27          /* 8 bit GOT offset for GD */
+#define R_68K_TLS_LDM32     28          /* 32 bit GOT offset for LDM */
+#define R_68K_TLS_LDM16     29          /* 16 bit GOT offset for LDM */
+#define R_68K_TLS_LDM8      30          /* 8 bit GOT offset for LDM */
+#define R_68K_TLS_LDO32     31          /* 32 bit module-relative offset */
+#define R_68K_TLS_LDO16     32          /* 16 bit module-relative offset */
+#define R_68K_TLS_LDO8      33          /* 8 bit module-relative offset */
+#define R_68K_TLS_IE32      34          /* 32 bit GOT offset for IE */
+#define R_68K_TLS_IE16      35          /* 16 bit GOT offset for IE */
+#define R_68K_TLS_IE8       36          /* 8 bit GOT offset for IE */
+#define R_68K_TLS_LE32      37          /* 32 bit offset relative to
+                                          static TLS block */
+#define R_68K_TLS_LE16      38          /* 16 bit offset relative to
+                                          static TLS block */
+#define R_68K_TLS_LE8       39          /* 8 bit offset relative to
+                                          static TLS block */
+#define R_68K_TLS_DTPMOD32  40          /* 32 bit module number */
+#define R_68K_TLS_DTPREL32  41          /* 32 bit module-relative offset */
+#define R_68K_TLS_TPREL32   42          /* 32 bit TP-relative offset */
+/* Keep this the last entry.  */
+#define R_68K_NUM      43
+
+/* Intel 80386 specific definitions.  */
+
+/* i386 relocs.  */
+
+#define R_386_NONE        0            /* No reloc */
+#define R_386_32          1            /* Direct 32 bit  */
+#define R_386_PC32        2            /* PC relative 32 bit */
+#define R_386_GOT32       3            /* 32 bit GOT entry */
+#define R_386_PLT32       4            /* 32 bit PLT address */
+#define R_386_COPY        5            /* Copy symbol at runtime */
+#define R_386_GLOB_DAT    6            /* Create GOT entry */
+#define R_386_JMP_SLOT    7            /* Create PLT entry */
+#define R_386_RELATIVE    8            /* Adjust by program base */
+#define R_386_GOTOFF      9            /* 32 bit offset to GOT */
+#define R_386_GOTPC       10           /* 32 bit PC relative offset to GOT */
+#define R_386_32PLT       11
+#define R_386_TLS_TPOFF           14           /* Offset in static TLS block */
+#define R_386_TLS_IE      15           /* Address of GOT entry for static TLS
+                                          block offset */
+#define R_386_TLS_GOTIE           16           /* GOT entry for static TLS block
+                                          offset */
+#define R_386_TLS_LE      17           /* Offset relative to static TLS
+                                          block */
+#define R_386_TLS_GD      18           /* Direct 32 bit for GNU version of
+                                          general dynamic thread local data */
+#define R_386_TLS_LDM     19           /* Direct 32 bit for GNU version of
+                                          local dynamic thread local data
+                                          in LE code */
+#define R_386_16          20
+#define R_386_PC16        21
+#define R_386_8                   22
+#define R_386_PC8         23
+#define R_386_TLS_GD_32           24           /* Direct 32 bit for general dynamic
+                                          thread local data */
+#define R_386_TLS_GD_PUSH  25          /* Tag for pushl in GD TLS code */
+#define R_386_TLS_GD_CALL  26          /* Relocation for call to
+                                          __tls_get_addr() */
+#define R_386_TLS_GD_POP   27          /* Tag for popl in GD TLS code */
+#define R_386_TLS_LDM_32   28          /* Direct 32 bit for local dynamic
+                                          thread local data in LE code */
+#define R_386_TLS_LDM_PUSH 29          /* Tag for pushl in LDM TLS code */
+#define R_386_TLS_LDM_CALL 30          /* Relocation for call to
+                                          __tls_get_addr() in LDM code */
+#define R_386_TLS_LDM_POP  31          /* Tag for popl in LDM TLS code */
+#define R_386_TLS_LDO_32   32          /* Offset relative to TLS block */
+#define R_386_TLS_IE_32           33           /* GOT entry for negated static TLS
+                                          block offset */
+#define R_386_TLS_LE_32           34           /* Negated offset relative to static
+                                          TLS block */
+#define R_386_TLS_DTPMOD32 35          /* ID of module containing symbol */
+#define R_386_TLS_DTPOFF32 36          /* Offset in TLS block */
+#define R_386_TLS_TPOFF32  37          /* Negated offset in static TLS block */
+#define R_386_SIZE32      38           /* 32-bit symbol size */
+#define R_386_TLS_GOTDESC  39          /* GOT offset for TLS descriptor.  */
+#define R_386_TLS_DESC_CALL 40         /* Marker of call through TLS
+                                          descriptor for
+                                          relaxation.  */
+#define R_386_TLS_DESC     41          /* TLS descriptor containing
+                                          pointer to code and to
+                                          argument, returning the TLS
+                                          offset for the symbol.  */
+#define R_386_IRELATIVE           42           /* Adjust indirectly by program base */
+/* Keep this the last entry.  */
+#define R_386_NUM         43
+
+/* SUN SPARC specific definitions.  */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
+
+#define STT_SPARC_REGISTER     13      /* Global register reserved to app. */
+
+/* Values for Elf64_Ehdr.e_flags.  */
+
+#define EF_SPARCV9_MM          3
+#define EF_SPARCV9_TSO         0
+#define EF_SPARCV9_PSO         1
+#define EF_SPARCV9_RMO         2
+#define EF_SPARC_LEDATA                0x800000 /* little endian data */
+#define EF_SPARC_EXT_MASK      0xFFFF00
+#define EF_SPARC_32PLUS                0x000100 /* generic V8+ features */
+#define EF_SPARC_SUN_US1       0x000200 /* Sun UltraSPARC1 extensions */
+#define EF_SPARC_HAL_R1                0x000400 /* HAL R1 extensions */
+#define EF_SPARC_SUN_US3       0x000800 /* Sun UltraSPARCIII extensions */
+
+/* SPARC relocs.  */
+
+#define R_SPARC_NONE           0       /* No reloc */
+#define R_SPARC_8              1       /* Direct 8 bit */
+#define R_SPARC_16             2       /* Direct 16 bit */
+#define R_SPARC_32             3       /* Direct 32 bit */
+#define R_SPARC_DISP8          4       /* PC relative 8 bit */
+#define R_SPARC_DISP16         5       /* PC relative 16 bit */
+#define R_SPARC_DISP32         6       /* PC relative 32 bit */
+#define R_SPARC_WDISP30                7       /* PC relative 30 bit shifted */
+#define R_SPARC_WDISP22                8       /* PC relative 22 bit shifted */
+#define R_SPARC_HI22           9       /* High 22 bit */
+#define R_SPARC_22             10      /* Direct 22 bit */
+#define R_SPARC_13             11      /* Direct 13 bit */
+#define R_SPARC_LO10           12      /* Truncated 10 bit */
+#define R_SPARC_GOT10          13      /* Truncated 10 bit GOT entry */
+#define R_SPARC_GOT13          14      /* 13 bit GOT entry */
+#define R_SPARC_GOT22          15      /* 22 bit GOT entry shifted */
+#define R_SPARC_PC10           16      /* PC relative 10 bit truncated */
+#define R_SPARC_PC22           17      /* PC relative 22 bit shifted */
+#define R_SPARC_WPLT30         18      /* 30 bit PC relative PLT address */
+#define R_SPARC_COPY           19      /* Copy symbol at runtime */
+#define R_SPARC_GLOB_DAT       20      /* Create GOT entry */
+#define R_SPARC_JMP_SLOT       21      /* Create PLT entry */
+#define R_SPARC_RELATIVE       22      /* Adjust by program base */
+#define R_SPARC_UA32           23      /* Direct 32 bit unaligned */
+
+/* Additional Sparc64 relocs.  */
+
+#define R_SPARC_PLT32          24      /* Direct 32 bit ref to PLT entry */
+#define R_SPARC_HIPLT22                25      /* High 22 bit PLT entry */
+#define R_SPARC_LOPLT10                26      /* Truncated 10 bit PLT entry */
+#define R_SPARC_PCPLT32                27      /* PC rel 32 bit ref to PLT entry */
+#define R_SPARC_PCPLT22                28      /* PC rel high 22 bit PLT entry */
+#define R_SPARC_PCPLT10                29      /* PC rel trunc 10 bit PLT entry */
+#define R_SPARC_10             30      /* Direct 10 bit */
+#define R_SPARC_11             31      /* Direct 11 bit */
+#define R_SPARC_64             32      /* Direct 64 bit */
+#define R_SPARC_OLO10          33      /* 10bit with secondary 13bit addend */
+#define R_SPARC_HH22           34      /* Top 22 bits of direct 64 bit */
+#define R_SPARC_HM10           35      /* High middle 10 bits of ... */
+#define R_SPARC_LM22           36      /* Low middle 22 bits of ... */
+#define R_SPARC_PC_HH22                37      /* Top 22 bits of pc rel 64 bit */
+#define R_SPARC_PC_HM10                38      /* High middle 10 bit of ... */
+#define R_SPARC_PC_LM22                39      /* Low miggle 22 bits of ... */
+#define R_SPARC_WDISP16                40      /* PC relative 16 bit shifted */
+#define R_SPARC_WDISP19                41      /* PC relative 19 bit shifted */
+#define R_SPARC_GLOB_JMP       42      /* was part of v9 ABI but was removed */
+#define R_SPARC_7              43      /* Direct 7 bit */
+#define R_SPARC_5              44      /* Direct 5 bit */
+#define R_SPARC_6              45      /* Direct 6 bit */
+#define R_SPARC_DISP64         46      /* PC relative 64 bit */
+#define R_SPARC_PLT64          47      /* Direct 64 bit ref to PLT entry */
+#define R_SPARC_HIX22          48      /* High 22 bit complemented */
+#define R_SPARC_LOX10          49      /* Truncated 11 bit complemented */
+#define R_SPARC_H44            50      /* Direct high 12 of 44 bit */
+#define R_SPARC_M44            51      /* Direct mid 22 of 44 bit */
+#define R_SPARC_L44            52      /* Direct low 10 of 44 bit */
+#define R_SPARC_REGISTER       53      /* Global register usage */
+#define R_SPARC_UA64           54      /* Direct 64 bit unaligned */
+#define R_SPARC_UA16           55      /* Direct 16 bit unaligned */
+#define R_SPARC_TLS_GD_HI22    56
+#define R_SPARC_TLS_GD_LO10    57
+#define R_SPARC_TLS_GD_ADD     58
+#define R_SPARC_TLS_GD_CALL    59
+#define R_SPARC_TLS_LDM_HI22   60
+#define R_SPARC_TLS_LDM_LO10   61
+#define R_SPARC_TLS_LDM_ADD    62
+#define R_SPARC_TLS_LDM_CALL   63
+#define R_SPARC_TLS_LDO_HIX22  64
+#define R_SPARC_TLS_LDO_LOX10  65
+#define R_SPARC_TLS_LDO_ADD    66
+#define R_SPARC_TLS_IE_HI22    67
+#define R_SPARC_TLS_IE_LO10    68
+#define R_SPARC_TLS_IE_LD      69
+#define R_SPARC_TLS_IE_LDX     70
+#define R_SPARC_TLS_IE_ADD     71
+#define R_SPARC_TLS_LE_HIX22   72
+#define R_SPARC_TLS_LE_LOX10   73
+#define R_SPARC_TLS_DTPMOD32   74
+#define R_SPARC_TLS_DTPMOD64   75
+#define R_SPARC_TLS_DTPOFF32   76
+#define R_SPARC_TLS_DTPOFF64   77
+#define R_SPARC_TLS_TPOFF32    78
+#define R_SPARC_TLS_TPOFF64    79
+#define R_SPARC_GOTDATA_HIX22  80
+#define R_SPARC_GOTDATA_LOX10  81
+#define R_SPARC_GOTDATA_OP_HIX22       82
+#define R_SPARC_GOTDATA_OP_LOX10       83
+#define R_SPARC_GOTDATA_OP     84
+#define R_SPARC_H34            85
+#define R_SPARC_SIZE32         86
+#define R_SPARC_SIZE64         87
+#define R_SPARC_WDISP10                88
+#define R_SPARC_JMP_IREL       248
+#define R_SPARC_IRELATIVE      249
+#define R_SPARC_GNU_VTINHERIT  250
+#define R_SPARC_GNU_VTENTRY    251
+#define R_SPARC_REV32          252
+/* Keep this the last entry.  */
+#define R_SPARC_NUM            253
+
+/* For Sparc64, legal values for d_tag of Elf64_Dyn.  */
+
+#define DT_SPARC_REGISTER      0x70000001
+#define DT_SPARC_NUM           2
+
+/* MIPS R3000 specific definitions.  */
+
+/* Legal values for e_flags field of Elf32_Ehdr.  */
+
+#define EF_MIPS_NOREORDER      1     /* A .noreorder directive was used.  */
+#define EF_MIPS_PIC            2     /* Contains PIC code.  */
+#define EF_MIPS_CPIC           4     /* Uses PIC calling sequence.  */
+#define EF_MIPS_XGOT           8
+#define EF_MIPS_64BIT_WHIRL    16
+#define EF_MIPS_ABI2           32
+#define EF_MIPS_ABI_ON32       64
+#define EF_MIPS_NAN2008        1024  /* Uses IEEE 754-2008 NaN encoding.  */
+#define EF_MIPS_ARCH           0xf0000000 /* MIPS architecture level.  */
+
+/* Legal values for MIPS architecture level.  */
+
+#define EF_MIPS_ARCH_1         0x00000000 /* -mips1 code.  */
+#define EF_MIPS_ARCH_2         0x10000000 /* -mips2 code.  */
+#define EF_MIPS_ARCH_3         0x20000000 /* -mips3 code.  */
+#define EF_MIPS_ARCH_4         0x30000000 /* -mips4 code.  */
+#define EF_MIPS_ARCH_5         0x40000000 /* -mips5 code.  */
+#define EF_MIPS_ARCH_32                0x50000000 /* MIPS32 code.  */
+#define EF_MIPS_ARCH_64                0x60000000 /* MIPS64 code.  */
+#define EF_MIPS_ARCH_32R2      0x70000000 /* MIPS32r2 code.  */
+#define EF_MIPS_ARCH_64R2      0x80000000 /* MIPS64r2 code.  */
+
+/* The following are unofficial names and should not be used.  */
+
+#define E_MIPS_ARCH_1          EF_MIPS_ARCH_1
+#define E_MIPS_ARCH_2          EF_MIPS_ARCH_2
+#define E_MIPS_ARCH_3          EF_MIPS_ARCH_3
+#define E_MIPS_ARCH_4          EF_MIPS_ARCH_4
+#define E_MIPS_ARCH_5          EF_MIPS_ARCH_5
+#define E_MIPS_ARCH_32         EF_MIPS_ARCH_32
+#define E_MIPS_ARCH_64         EF_MIPS_ARCH_64
+
+/* Special section indices.  */
+
+#define SHN_MIPS_ACOMMON       0xff00  /* Allocated common symbols.  */
+#define SHN_MIPS_TEXT          0xff01  /* Allocated test symbols.  */
+#define SHN_MIPS_DATA          0xff02  /* Allocated data symbols.  */
+#define SHN_MIPS_SCOMMON       0xff03  /* Small common symbols.  */
+#define SHN_MIPS_SUNDEFINED    0xff04  /* Small undefined symbols.  */
+
+/* Legal values for sh_type field of Elf32_Shdr.  */
+
+#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link.  */
+#define SHT_MIPS_MSYM          0x70000001
+#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols.  */
+#define SHT_MIPS_GPTAB         0x70000003 /* Global data area sizes.  */
+#define SHT_MIPS_UCODE         0x70000004 /* Reserved for SGI/MIPS compilers */
+#define SHT_MIPS_DEBUG         0x70000005 /* MIPS ECOFF debugging info.  */
+#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information.  */
+#define SHT_MIPS_PACKAGE       0x70000007
+#define SHT_MIPS_PACKSYM       0x70000008
+#define SHT_MIPS_RELD          0x70000009
+#define SHT_MIPS_IFACE         0x7000000b
+#define SHT_MIPS_CONTENT       0x7000000c
+#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */
+#define SHT_MIPS_SHDR          0x70000010
+#define SHT_MIPS_FDESC         0x70000011
+#define SHT_MIPS_EXTSYM                0x70000012
+#define SHT_MIPS_DENSE         0x70000013
+#define SHT_MIPS_PDESC         0x70000014
+#define SHT_MIPS_LOCSYM                0x70000015
+#define SHT_MIPS_AUXSYM                0x70000016
+#define SHT_MIPS_OPTSYM                0x70000017
+#define SHT_MIPS_LOCSTR                0x70000018
+#define SHT_MIPS_LINE          0x70000019
+#define SHT_MIPS_RFDESC                0x7000001a
+#define SHT_MIPS_DELTASYM      0x7000001b
+#define SHT_MIPS_DELTAINST     0x7000001c
+#define SHT_MIPS_DELTACLASS    0x7000001d
+#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */
+#define SHT_MIPS_DELTADECL     0x7000001f
+#define SHT_MIPS_SYMBOL_LIB    0x70000020
+#define SHT_MIPS_EVENTS                0x70000021 /* Event section.  */
+#define SHT_MIPS_TRANSLATE     0x70000022
+#define SHT_MIPS_PIXIE         0x70000023
+#define SHT_MIPS_XLATE         0x70000024
+#define SHT_MIPS_XLATE_DEBUG   0x70000025
+#define SHT_MIPS_WHIRL         0x70000026
+#define SHT_MIPS_EH_REGION     0x70000027
+#define SHT_MIPS_XLATE_OLD     0x70000028
+#define SHT_MIPS_PDR_EXCEPTION 0x70000029
+
+/* Legal values for sh_flags field of Elf32_Shdr.  */
+
+#define SHF_MIPS_GPREL         0x10000000 /* Must be in global data area.  */
+#define SHF_MIPS_MERGE         0x20000000
+#define SHF_MIPS_ADDR          0x40000000
+#define SHF_MIPS_STRINGS       0x80000000
+#define SHF_MIPS_NOSTRIP       0x08000000
+#define SHF_MIPS_LOCAL         0x04000000
+#define SHF_MIPS_NAMES         0x02000000
+#define SHF_MIPS_NODUPE                0x01000000
+
+
+/* Symbol tables.  */
+
+/* MIPS specific values for `st_other'.  */
+#define STO_MIPS_DEFAULT               0x0
+#define STO_MIPS_INTERNAL              0x1
+#define STO_MIPS_HIDDEN                        0x2
+#define STO_MIPS_PROTECTED             0x3
+#define STO_MIPS_PLT                   0x8
+#define STO_MIPS_SC_ALIGN_UNUSED       0xff
+
+/* MIPS specific values for `st_info'.  */
+#define STB_MIPS_SPLIT_COMMON          13
+
+/* Entries found in sections of type SHT_MIPS_GPTAB.  */
+
+typedef union
+{
+  struct
+    {
+      Elf32_Word gt_current_g_value;   /* -G value used for compilation.  */
+      Elf32_Word gt_unused;            /* Not used.  */
+    } gt_header;                       /* First entry in section.  */
+  struct
+    {
+      Elf32_Word gt_g_value;           /* If this value were used for -G.  */
+      Elf32_Word gt_bytes;             /* This many bytes would be used.  */
+    } gt_entry;                                /* Subsequent entries in section.  */
+} Elf32_gptab;
+
+/* Entry found in sections of type SHT_MIPS_REGINFO.  */
+
+typedef struct
+{
+  Elf32_Word ri_gprmask;               /* General registers used.  */
+  Elf32_Word ri_cprmask[4];            /* Coprocessor registers used.  */
+  Elf32_Sword ri_gp_value;             /* $gp register value.  */
+} Elf32_RegInfo;
+
+/* Entries found in sections of type SHT_MIPS_OPTIONS.  */
+
+typedef struct
+{
+  unsigned char kind;          /* Determines interpretation of the
+                                  variable part of descriptor.  */
+  unsigned char size;          /* Size of descriptor, including header.  */
+  Elf32_Section section;       /* Section header index of section affected,
+                                  0 for global options.  */
+  Elf32_Word info;             /* Kind-specific information.  */
+} Elf_Options;
+
+/* Values for `kind' field in Elf_Options.  */
+
+#define ODK_NULL       0       /* Undefined.  */
+#define ODK_REGINFO    1       /* Register usage information.  */
+#define ODK_EXCEPTIONS 2       /* Exception processing options.  */
+#define ODK_PAD                3       /* Section padding options.  */
+#define ODK_HWPATCH    4       /* Hardware workarounds performed */
+#define ODK_FILL       5       /* record the fill value used by the linker. */
+#define ODK_TAGS       6       /* reserve space for desktop tools to write. */
+#define ODK_HWAND      7       /* HW workarounds.  'AND' bits when merging. */
+#define ODK_HWOR       8       /* HW workarounds.  'OR' bits when merging.  */
+
+/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */
+
+#define OEX_FPU_MIN    0x1f    /* FPE's which MUST be enabled.  */
+#define OEX_FPU_MAX    0x1f00  /* FPE's which MAY be enabled.  */
+#define OEX_PAGE0      0x10000 /* page zero must be mapped.  */
+#define OEX_SMM                0x20000 /* Force sequential memory mode?  */
+#define OEX_FPDBUG     0x40000 /* Force floating point debug mode?  */
+#define OEX_PRECISEFP  OEX_FPDBUG
+#define OEX_DISMISS    0x80000 /* Dismiss invalid address faults?  */
+
+#define OEX_FPU_INVAL  0x10
+#define OEX_FPU_DIV0   0x08
+#define OEX_FPU_OFLO   0x04
+#define OEX_FPU_UFLO   0x02
+#define OEX_FPU_INEX   0x01
+
+/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */
+
+#define OHW_R4KEOP     0x1     /* R4000 end-of-page patch.  */
+#define OHW_R8KPFETCH  0x2     /* may need R8000 prefetch patch.  */
+#define OHW_R5KEOP     0x4     /* R5000 end-of-page patch.  */
+#define OHW_R5KCVTL    0x8     /* R5000 cvt.[ds].l bug.  clean=1.  */
+
+#define OPAD_PREFIX    0x1
+#define OPAD_POSTFIX   0x2
+#define OPAD_SYMBOL    0x4
+
+/* Entry found in `.options' section.  */
+
+typedef struct
+{
+  Elf32_Word hwp_flags1;       /* Extra flags.  */
+  Elf32_Word hwp_flags2;       /* Extra flags.  */
+} Elf_Options_Hw;
+
+/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */
+
+#define OHWA0_R4KEOP_CHECKED   0x00000001
+#define OHWA1_R4KEOP_CLEAN     0x00000002
+
+/* MIPS relocs.  */
+
+#define R_MIPS_NONE            0       /* No reloc */
+#define R_MIPS_16              1       /* Direct 16 bit */
+#define R_MIPS_32              2       /* Direct 32 bit */
+#define R_MIPS_REL32           3       /* PC relative 32 bit */
+#define R_MIPS_26              4       /* Direct 26 bit shifted */
+#define R_MIPS_HI16            5       /* High 16 bit */
+#define R_MIPS_LO16            6       /* Low 16 bit */
+#define R_MIPS_GPREL16         7       /* GP relative 16 bit */
+#define R_MIPS_LITERAL         8       /* 16 bit literal entry */
+#define R_MIPS_GOT16           9       /* 16 bit GOT entry */
+#define R_MIPS_PC16            10      /* PC relative 16 bit */
+#define R_MIPS_CALL16          11      /* 16 bit GOT entry for function */
+#define R_MIPS_GPREL32         12      /* GP relative 32 bit */
+
+#define R_MIPS_SHIFT5          16
+#define R_MIPS_SHIFT6          17
+#define R_MIPS_64              18
+#define R_MIPS_GOT_DISP                19
+#define R_MIPS_GOT_PAGE                20
+#define R_MIPS_GOT_OFST                21
+#define R_MIPS_GOT_HI16                22
+#define R_MIPS_GOT_LO16                23
+#define R_MIPS_SUB             24
+#define R_MIPS_INSERT_A                25
+#define R_MIPS_INSERT_B                26
+#define R_MIPS_DELETE          27
+#define R_MIPS_HIGHER          28
+#define R_MIPS_HIGHEST         29
+#define R_MIPS_CALL_HI16       30
+#define R_MIPS_CALL_LO16       31
+#define R_MIPS_SCN_DISP                32
+#define R_MIPS_REL16           33
+#define R_MIPS_ADD_IMMEDIATE   34
+#define R_MIPS_PJUMP           35
+#define R_MIPS_RELGOT          36
+#define R_MIPS_JALR            37
+#define R_MIPS_TLS_DTPMOD32    38      /* Module number 32 bit */
+#define R_MIPS_TLS_DTPREL32    39      /* Module-relative offset 32 bit */
+#define R_MIPS_TLS_DTPMOD64    40      /* Module number 64 bit */
+#define R_MIPS_TLS_DTPREL64    41      /* Module-relative offset 64 bit */
+#define R_MIPS_TLS_GD          42      /* 16 bit GOT offset for GD */
+#define R_MIPS_TLS_LDM         43      /* 16 bit GOT offset for LDM */
+#define R_MIPS_TLS_DTPREL_HI16 44      /* Module-relative offset, high 16 bits */
+#define R_MIPS_TLS_DTPREL_LO16 45      /* Module-relative offset, low 16 bits */
+#define R_MIPS_TLS_GOTTPREL    46      /* 16 bit GOT offset for IE */
+#define R_MIPS_TLS_TPREL32     47      /* TP-relative offset, 32 bit */
+#define R_MIPS_TLS_TPREL64     48      /* TP-relative offset, 64 bit */
+#define R_MIPS_TLS_TPREL_HI16  49      /* TP-relative offset, high 16 bits */
+#define R_MIPS_TLS_TPREL_LO16  50      /* TP-relative offset, low 16 bits */
+#define R_MIPS_GLOB_DAT                51
+#define R_MIPS_COPY            126
+#define R_MIPS_JUMP_SLOT        127
+/* Keep this the last entry.  */
+#define R_MIPS_NUM             128
+
+/* Legal values for p_type field of Elf32_Phdr.  */
+
+#define PT_MIPS_REGINFO        0x70000000      /* Register usage information */
+#define PT_MIPS_RTPROC  0x70000001     /* Runtime procedure table. */
+#define PT_MIPS_OPTIONS 0x70000002
+
+/* Special program header types.  */
+
+#define PF_MIPS_LOCAL  0x10000000
+
+/* Legal values for d_tag field of Elf32_Dyn.  */
+
+#define DT_MIPS_RLD_VERSION  0x70000001        /* Runtime linker interface version */
+#define DT_MIPS_TIME_STAMP   0x70000002        /* Timestamp */
+#define DT_MIPS_ICHECKSUM    0x70000003        /* Checksum */
+#define DT_MIPS_IVERSION     0x70000004        /* Version string (string tbl index) */
+#define DT_MIPS_FLAGS       0x70000005 /* Flags */
+#define DT_MIPS_BASE_ADDRESS 0x70000006        /* Base address */
+#define DT_MIPS_MSYM        0x70000007
+#define DT_MIPS_CONFLICT     0x70000008        /* Address of CONFLICT section */
+#define DT_MIPS_LIBLIST             0x70000009 /* Address of LIBLIST section */
+#define DT_MIPS_LOCAL_GOTNO  0x7000000a        /* Number of local GOT entries */
+#define DT_MIPS_CONFLICTNO   0x7000000b        /* Number of CONFLICT entries */
+#define DT_MIPS_LIBLISTNO    0x70000010        /* Number of LIBLIST entries */
+#define DT_MIPS_SYMTABNO     0x70000011        /* Number of DYNSYM entries */
+#define DT_MIPS_UNREFEXTNO   0x70000012        /* First external DYNSYM */
+#define DT_MIPS_GOTSYM      0x70000013 /* First GOT entry in DYNSYM */
+#define DT_MIPS_HIPAGENO     0x70000014        /* Number of GOT page table entries */
+#define DT_MIPS_RLD_MAP             0x70000016 /* Address of run time loader map.  */
+#define DT_MIPS_DELTA_CLASS  0x70000017        /* Delta C++ class definition.  */
+#define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in
+                                               DT_MIPS_DELTA_CLASS.  */
+#define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */
+#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
+                                               DT_MIPS_DELTA_INSTANCE.  */
+#define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */
+#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
+                                            DT_MIPS_DELTA_RELOC.  */
+#define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta
+                                          relocations refer to.  */
+#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
+                                          DT_MIPS_DELTA_SYM.  */
+#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
+                                            class declaration.  */
+#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
+                                               DT_MIPS_DELTA_CLASSSYM.  */
+#define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */
+#define DT_MIPS_PIXIE_INIT   0x70000023
+#define DT_MIPS_SYMBOL_LIB   0x70000024
+#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
+#define DT_MIPS_LOCAL_GOTIDX 0x70000026
+#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
+#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
+#define DT_MIPS_OPTIONS             0x70000029 /* Address of .options.  */
+#define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */
+#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
+#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
+#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
+                                                   function stored in GOT.  */
+#define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added
+                                          by rld on dlopen() calls.  */
+#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
+#define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */
+#define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */
+/* The address of .got.plt in an executable using the new non-PIC ABI.  */
+#define DT_MIPS_PLTGOT      0x70000032
+/* The base of the PLT in an executable using the new non-PIC ABI if that
+   PLT is writable.  For a non-writable PLT, this is omitted or has a zero
+   value.  */
+#define DT_MIPS_RWPLT        0x70000034
+#define DT_MIPS_NUM         0x35
+
+/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */
+
+#define RHF_NONE                  0            /* No flags */
+#define RHF_QUICKSTART            (1 << 0)     /* Use quickstart */
+#define RHF_NOTPOT                (1 << 1)     /* Hash size not power of 2 */
+#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)    /* Ignore LD_LIBRARY_PATH */
+#define RHF_NO_MOVE               (1 << 3)
+#define RHF_SGI_ONLY              (1 << 4)
+#define RHF_GUARANTEE_INIT        (1 << 5)
+#define RHF_DELTA_C_PLUS_PLUS     (1 << 6)
+#define RHF_GUARANTEE_START_INIT   (1 << 7)
+#define RHF_PIXIE                 (1 << 8)
+#define RHF_DEFAULT_DELAY_LOAD    (1 << 9)
+#define RHF_REQUICKSTART          (1 << 10)
+#define RHF_REQUICKSTARTED        (1 << 11)
+#define RHF_CORD                  (1 << 12)
+#define RHF_NO_UNRES_UNDEF        (1 << 13)
+#define RHF_RLD_ORDER_SAFE        (1 << 14)
+
+/* Entries found in sections of type SHT_MIPS_LIBLIST.  */
+
+typedef struct
+{
+  Elf32_Word l_name;           /* Name (string table index) */
+  Elf32_Word l_time_stamp;     /* Timestamp */
+  Elf32_Word l_checksum;       /* Checksum */
+  Elf32_Word l_version;                /* Interface version */
+  Elf32_Word l_flags;          /* Flags */
+} Elf32_Lib;
+
+typedef struct
+{
+  Elf64_Word l_name;           /* Name (string table index) */
+  Elf64_Word l_time_stamp;     /* Timestamp */
+  Elf64_Word l_checksum;       /* Checksum */
+  Elf64_Word l_version;                /* Interface version */
+  Elf64_Word l_flags;          /* Flags */
+} Elf64_Lib;
+
+
+/* Legal values for l_flags.  */
+
+#define LL_NONE                  0
+#define LL_EXACT_MATCH   (1 << 0)      /* Require exact match */
+#define LL_IGNORE_INT_VER (1 << 1)     /* Ignore interface version */
+#define LL_REQUIRE_MINOR  (1 << 2)
+#define LL_EXPORTS       (1 << 3)
+#define LL_DELAY_LOAD    (1 << 4)
+#define LL_DELTA         (1 << 5)
+
+/* Entries found in sections of type SHT_MIPS_CONFLICT.  */
+
+typedef Elf32_Addr Elf32_Conflict;
+
+
+/* HPPA specific definitions.  */
+
+/* Legal values for e_flags field of Elf32_Ehdr.  */
+
+#define EF_PARISC_TRAPNIL      0x00010000 /* Trap nil pointer dereference.  */
+#define EF_PARISC_EXT          0x00020000 /* Program uses arch. extensions. */
+#define EF_PARISC_LSB          0x00040000 /* Program expects little endian. */
+#define EF_PARISC_WIDE         0x00080000 /* Program expects wide mode.  */
+#define EF_PARISC_NO_KABP      0x00100000 /* No kernel assisted branch
+                                             prediction.  */
+#define EF_PARISC_LAZYSWAP     0x00400000 /* Allow lazy swapping.  */
+#define EF_PARISC_ARCH         0x0000ffff /* Architecture version.  */
+
+/* Defined values for `e_flags & EF_PARISC_ARCH' are:  */
+
+#define EFA_PARISC_1_0             0x020b /* PA-RISC 1.0 big-endian.  */
+#define EFA_PARISC_1_1             0x0210 /* PA-RISC 1.1 big-endian.  */
+#define EFA_PARISC_2_0             0x0214 /* PA-RISC 2.0 big-endian.  */
+
+/* Additional section indeces.  */
+
+#define SHN_PARISC_ANSI_COMMON 0xff00     /* Section for tenatively declared
+                                             symbols in ANSI C.  */
+#define SHN_PARISC_HUGE_COMMON 0xff01     /* Common blocks in huge model.  */
+
+/* Legal values for sh_type field of Elf32_Shdr.  */
+
+#define SHT_PARISC_EXT         0x70000000 /* Contains product specific ext. */
+#define SHT_PARISC_UNWIND      0x70000001 /* Unwind information.  */
+#define SHT_PARISC_DOC         0x70000002 /* Debug info for optimized code. */
+
+/* Legal values for sh_flags field of Elf32_Shdr.  */
+
+#define SHF_PARISC_SHORT       0x20000000 /* Section with short addressing. */
+#define SHF_PARISC_HUGE                0x40000000 /* Section far from gp.  */
+#define SHF_PARISC_SBP         0x80000000 /* Static branch prediction code. */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
+
+#define STT_PARISC_MILLICODE   13      /* Millicode function entry point.  */
+
+#define STT_HP_OPAQUE          (STT_LOOS + 0x1)
+#define STT_HP_STUB            (STT_LOOS + 0x2)
+
+/* HPPA relocs.  */
+
+#define R_PARISC_NONE          0       /* No reloc.  */
+#define R_PARISC_DIR32         1       /* Direct 32-bit reference.  */
+#define R_PARISC_DIR21L                2       /* Left 21 bits of eff. address.  */
+#define R_PARISC_DIR17R                3       /* Right 17 bits of eff. address.  */
+#define R_PARISC_DIR17F                4       /* 17 bits of eff. address.  */
+#define R_PARISC_DIR14R                6       /* Right 14 bits of eff. address.  */
+#define R_PARISC_PCREL32       9       /* 32-bit rel. address.  */
+#define R_PARISC_PCREL21L      10      /* Left 21 bits of rel. address.  */
+#define R_PARISC_PCREL17R      11      /* Right 17 bits of rel. address.  */
+#define R_PARISC_PCREL17F      12      /* 17 bits of rel. address.  */
+#define R_PARISC_PCREL14R      14      /* Right 14 bits of rel. address.  */
+#define R_PARISC_DPREL21L      18      /* Left 21 bits of rel. address.  */
+#define R_PARISC_DPREL14R      22      /* Right 14 bits of rel. address.  */
+#define R_PARISC_GPREL21L      26      /* GP-relative, left 21 bits.  */
+#define R_PARISC_GPREL14R      30      /* GP-relative, right 14 bits.  */
+#define R_PARISC_LTOFF21L      34      /* LT-relative, left 21 bits.  */
+#define R_PARISC_LTOFF14R      38      /* LT-relative, right 14 bits.  */
+#define R_PARISC_SECREL32      41      /* 32 bits section rel. address.  */
+#define R_PARISC_SEGBASE       48      /* No relocation, set segment base.  */
+#define R_PARISC_SEGREL32      49      /* 32 bits segment rel. address.  */
+#define R_PARISC_PLTOFF21L     50      /* PLT rel. address, left 21 bits.  */
+#define R_PARISC_PLTOFF14R     54      /* PLT rel. address, right 14 bits.  */
+#define R_PARISC_LTOFF_FPTR32  57      /* 32 bits LT-rel. function pointer. */
+#define R_PARISC_LTOFF_FPTR21L 58      /* LT-rel. fct ptr, left 21 bits. */
+#define R_PARISC_LTOFF_FPTR14R 62      /* LT-rel. fct ptr, right 14 bits. */
+#define R_PARISC_FPTR64                64      /* 64 bits function address.  */
+#define R_PARISC_PLABEL32      65      /* 32 bits function address.  */
+#define R_PARISC_PLABEL21L     66      /* Left 21 bits of fdesc address.  */
+#define R_PARISC_PLABEL14R     70      /* Right 14 bits of fdesc address.  */
+#define R_PARISC_PCREL64       72      /* 64 bits PC-rel. address.  */
+#define R_PARISC_PCREL22F      74      /* 22 bits PC-rel. address.  */
+#define R_PARISC_PCREL14WR     75      /* PC-rel. address, right 14 bits.  */
+#define R_PARISC_PCREL14DR     76      /* PC rel. address, right 14 bits.  */
+#define R_PARISC_PCREL16F      77      /* 16 bits PC-rel. address.  */
+#define R_PARISC_PCREL16WF     78      /* 16 bits PC-rel. address.  */
+#define R_PARISC_PCREL16DF     79      /* 16 bits PC-rel. address.  */
+#define R_PARISC_DIR64         80      /* 64 bits of eff. address.  */
+#define R_PARISC_DIR14WR       83      /* 14 bits of eff. address.  */
+#define R_PARISC_DIR14DR       84      /* 14 bits of eff. address.  */
+#define R_PARISC_DIR16F                85      /* 16 bits of eff. address.  */
+#define R_PARISC_DIR16WF       86      /* 16 bits of eff. address.  */
+#define R_PARISC_DIR16DF       87      /* 16 bits of eff. address.  */
+#define R_PARISC_GPREL64       88      /* 64 bits of GP-rel. address.  */
+#define R_PARISC_GPREL14WR     91      /* GP-rel. address, right 14 bits.  */
+#define R_PARISC_GPREL14DR     92      /* GP-rel. address, right 14 bits.  */
+#define R_PARISC_GPREL16F      93      /* 16 bits GP-rel. address.  */
+#define R_PARISC_GPREL16WF     94      /* 16 bits GP-rel. address.  */
+#define R_PARISC_GPREL16DF     95      /* 16 bits GP-rel. address.  */
+#define R_PARISC_LTOFF64       96      /* 64 bits LT-rel. address.  */
+#define R_PARISC_LTOFF14WR     99      /* LT-rel. address, right 14 bits.  */
+#define R_PARISC_LTOFF14DR     100     /* LT-rel. address, right 14 bits.  */
+#define R_PARISC_LTOFF16F      101     /* 16 bits LT-rel. address.  */
+#define R_PARISC_LTOFF16WF     102     /* 16 bits LT-rel. address.  */
+#define R_PARISC_LTOFF16DF     103     /* 16 bits LT-rel. address.  */
+#define R_PARISC_SECREL64      104     /* 64 bits section rel. address.  */
+#define R_PARISC_SEGREL64      112     /* 64 bits segment rel. address.  */
+#define R_PARISC_PLTOFF14WR    115     /* PLT-rel. address, right 14 bits.  */
+#define R_PARISC_PLTOFF14DR    116     /* PLT-rel. address, right 14 bits.  */
+#define R_PARISC_PLTOFF16F     117     /* 16 bits LT-rel. address.  */
+#define R_PARISC_PLTOFF16WF    118     /* 16 bits PLT-rel. address.  */
+#define R_PARISC_PLTOFF16DF    119     /* 16 bits PLT-rel. address.  */
+#define R_PARISC_LTOFF_FPTR64  120     /* 64 bits LT-rel. function ptr.  */
+#define R_PARISC_LTOFF_FPTR14WR        123     /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR14DR        124     /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR16F 125     /* 16 bits LT-rel. function ptr.  */
+#define R_PARISC_LTOFF_FPTR16WF        126     /* 16 bits LT-rel. function ptr.  */
+#define R_PARISC_LTOFF_FPTR16DF        127     /* 16 bits LT-rel. function ptr.  */
+#define R_PARISC_LORESERVE     128
+#define R_PARISC_COPY          128     /* Copy relocation.  */
+#define R_PARISC_IPLT          129     /* Dynamic reloc, imported PLT */
+#define R_PARISC_EPLT          130     /* Dynamic reloc, exported PLT */
+#define R_PARISC_TPREL32       153     /* 32 bits TP-rel. address.  */
+#define R_PARISC_TPREL21L      154     /* TP-rel. address, left 21 bits.  */
+#define R_PARISC_TPREL14R      158     /* TP-rel. address, right 14 bits.  */
+#define R_PARISC_LTOFF_TP21L   162     /* LT-TP-rel. address, left 21 bits. */
+#define R_PARISC_LTOFF_TP14R   166     /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14F   167     /* 14 bits LT-TP-rel. address.  */
+#define R_PARISC_TPREL64       216     /* 64 bits TP-rel. address.  */
+#define R_PARISC_TPREL14WR     219     /* TP-rel. address, right 14 bits.  */
+#define R_PARISC_TPREL14DR     220     /* TP-rel. address, right 14 bits.  */
+#define R_PARISC_TPREL16F      221     /* 16 bits TP-rel. address.  */
+#define R_PARISC_TPREL16WF     222     /* 16 bits TP-rel. address.  */
+#define R_PARISC_TPREL16DF     223     /* 16 bits TP-rel. address.  */
+#define R_PARISC_LTOFF_TP64    224     /* 64 bits LT-TP-rel. address.  */
+#define R_PARISC_LTOFF_TP14WR  227     /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14DR  228     /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP16F   229     /* 16 bits LT-TP-rel. address.  */
+#define R_PARISC_LTOFF_TP16WF  230     /* 16 bits LT-TP-rel. address.  */
+#define R_PARISC_LTOFF_TP16DF  231     /* 16 bits LT-TP-rel. address.  */
+#define R_PARISC_GNU_VTENTRY   232
+#define R_PARISC_GNU_VTINHERIT 233
+#define R_PARISC_TLS_GD21L     234     /* GD 21-bit left.  */
+#define R_PARISC_TLS_GD14R     235     /* GD 14-bit right.  */
+#define R_PARISC_TLS_GDCALL    236     /* GD call to __t_g_a.  */
+#define R_PARISC_TLS_LDM21L    237     /* LD module 21-bit left.  */
+#define R_PARISC_TLS_LDM14R    238     /* LD module 14-bit right.  */
+#define R_PARISC_TLS_LDMCALL   239     /* LD module call to __t_g_a.  */
+#define R_PARISC_TLS_LDO21L    240     /* LD offset 21-bit left.  */
+#define R_PARISC_TLS_LDO14R    241     /* LD offset 14-bit right.  */
+#define R_PARISC_TLS_DTPMOD32  242     /* DTP module 32-bit.  */
+#define R_PARISC_TLS_DTPMOD64  243     /* DTP module 64-bit.  */
+#define R_PARISC_TLS_DTPOFF32  244     /* DTP offset 32-bit.  */
+#define R_PARISC_TLS_DTPOFF64  245     /* DTP offset 32-bit.  */
+#define R_PARISC_TLS_LE21L     R_PARISC_TPREL21L
+#define R_PARISC_TLS_LE14R     R_PARISC_TPREL14R
+#define R_PARISC_TLS_IE21L     R_PARISC_LTOFF_TP21L
+#define R_PARISC_TLS_IE14R     R_PARISC_LTOFF_TP14R
+#define R_PARISC_TLS_TPREL32   R_PARISC_TPREL32
+#define R_PARISC_TLS_TPREL64   R_PARISC_TPREL64
+#define R_PARISC_HIRESERVE     255
+
+/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.  */
+
+#define PT_HP_TLS              (PT_LOOS + 0x0)
+#define PT_HP_CORE_NONE                (PT_LOOS + 0x1)
+#define PT_HP_CORE_VERSION     (PT_LOOS + 0x2)
+#define PT_HP_CORE_KERNEL      (PT_LOOS + 0x3)
+#define PT_HP_CORE_COMM                (PT_LOOS + 0x4)
+#define PT_HP_CORE_PROC                (PT_LOOS + 0x5)
+#define PT_HP_CORE_LOADABLE    (PT_LOOS + 0x6)
+#define PT_HP_CORE_STACK       (PT_LOOS + 0x7)
+#define PT_HP_CORE_SHM         (PT_LOOS + 0x8)
+#define PT_HP_CORE_MMF         (PT_LOOS + 0x9)
+#define PT_HP_PARALLEL         (PT_LOOS + 0x10)
+#define PT_HP_FASTBIND         (PT_LOOS + 0x11)
+#define PT_HP_OPT_ANNOT                (PT_LOOS + 0x12)
+#define PT_HP_HSL_ANNOT                (PT_LOOS + 0x13)
+#define PT_HP_STACK            (PT_LOOS + 0x14)
+
+#define PT_PARISC_ARCHEXT      0x70000000
+#define PT_PARISC_UNWIND       0x70000001
+
+/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.  */
+
+#define PF_PARISC_SBP          0x08000000
+
+#define PF_HP_PAGE_SIZE                0x00100000
+#define PF_HP_FAR_SHARED       0x00200000
+#define PF_HP_NEAR_SHARED      0x00400000
+#define PF_HP_CODE             0x01000000
+#define PF_HP_MODIFY           0x02000000
+#define PF_HP_LAZYSWAP         0x04000000
+#define PF_HP_SBP              0x08000000
+
+
+/* Alpha specific definitions.  */
+
+/* Legal values for e_flags field of Elf64_Ehdr.  */
+
+#define EF_ALPHA_32BIT         1       /* All addresses must be < 2GB.  */
+#define EF_ALPHA_CANRELAX      2       /* Relocations for relaxing exist.  */
+
+/* Legal values for sh_type field of Elf64_Shdr.  */
+
+/* These two are primerily concerned with ECOFF debugging info.  */
+#define SHT_ALPHA_DEBUG                0x70000001
+#define SHT_ALPHA_REGINFO      0x70000002
+
+/* Legal values for sh_flags field of Elf64_Shdr.  */
+
+#define SHF_ALPHA_GPREL                0x10000000
+
+/* Legal values for st_other field of Elf64_Sym.  */
+#define STO_ALPHA_NOPV         0x80    /* No PV required.  */
+#define STO_ALPHA_STD_GPLOAD   0x88    /* PV only used for initial ldgp.  */
+
+/* Alpha relocs.  */
+
+#define R_ALPHA_NONE           0       /* No reloc */
+#define R_ALPHA_REFLONG                1       /* Direct 32 bit */
+#define R_ALPHA_REFQUAD                2       /* Direct 64 bit */
+#define R_ALPHA_GPREL32                3       /* GP relative 32 bit */
+#define R_ALPHA_LITERAL                4       /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE         5       /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP         6       /* Add displacement to GP */
+#define R_ALPHA_BRADDR         7       /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT           8       /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16         9       /* PC relative 16 bit */
+#define R_ALPHA_SREL32         10      /* PC relative 32 bit */
+#define R_ALPHA_SREL64         11      /* PC relative 64 bit */
+#define R_ALPHA_GPRELHIGH      17      /* GP relative 32 bit, high 16 bits */
+#define R_ALPHA_GPRELLOW       18      /* GP relative 32 bit, low 16 bits */
+#define R_ALPHA_GPREL16                19      /* GP relative 16 bit */
+#define R_ALPHA_COPY           24      /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT       25      /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT       26      /* Create PLT entry */
+#define R_ALPHA_RELATIVE       27      /* Adjust by program base */
+#define R_ALPHA_TLS_GD_HI      28
+#define R_ALPHA_TLSGD          29
+#define R_ALPHA_TLS_LDM                30
+#define R_ALPHA_DTPMOD64       31
+#define R_ALPHA_GOTDTPREL      32
+#define R_ALPHA_DTPREL64       33
+#define R_ALPHA_DTPRELHI       34
+#define R_ALPHA_DTPRELLO       35
+#define R_ALPHA_DTPREL16       36
+#define R_ALPHA_GOTTPREL       37
+#define R_ALPHA_TPREL64                38
+#define R_ALPHA_TPRELHI                39
+#define R_ALPHA_TPRELLO                40
+#define R_ALPHA_TPREL16                41
+/* Keep this the last entry.  */
+#define R_ALPHA_NUM            46
+
+/* Magic values of the LITUSE relocation addend.  */
+#define LITUSE_ALPHA_ADDR      0
+#define LITUSE_ALPHA_BASE      1
+#define LITUSE_ALPHA_BYTOFF    2
+#define LITUSE_ALPHA_JSR       3
+#define LITUSE_ALPHA_TLS_GD    4
+#define LITUSE_ALPHA_TLS_LDM   5
+
+/* Legal values for d_tag of Elf64_Dyn.  */
+#define DT_ALPHA_PLTRO         (DT_LOPROC + 0)
+#define DT_ALPHA_NUM           1
+
+/* PowerPC specific declarations */
+
+/* Values for Elf32/64_Ehdr.e_flags.  */
+#define EF_PPC_EMB             0x80000000      /* PowerPC embedded flag */
+
+/* Cygnus local bits below */
+#define EF_PPC_RELOCATABLE     0x00010000      /* PowerPC -mrelocatable flag*/
+#define EF_PPC_RELOCATABLE_LIB 0x00008000      /* PowerPC -mrelocatable-lib
+                                                  flag */
+
+/* PowerPC relocations defined by the ABIs */
+#define R_PPC_NONE             0
+#define R_PPC_ADDR32           1       /* 32bit absolute address */
+#define R_PPC_ADDR24           2       /* 26bit address, 2 bits ignored.  */
+#define R_PPC_ADDR16           3       /* 16bit absolute address */
+#define R_PPC_ADDR16_LO                4       /* lower 16bit of absolute address */
+#define R_PPC_ADDR16_HI                5       /* high 16bit of absolute address */
+#define R_PPC_ADDR16_HA                6       /* adjusted high 16bit */
+#define R_PPC_ADDR14           7       /* 16bit address, 2 bits ignored */
+#define R_PPC_ADDR14_BRTAKEN   8
+#define R_PPC_ADDR14_BRNTAKEN  9
+#define R_PPC_REL24            10      /* PC relative 26 bit */
+#define R_PPC_REL14            11      /* PC relative 16 bit */
+#define R_PPC_REL14_BRTAKEN    12
+#define R_PPC_REL14_BRNTAKEN   13
+#define R_PPC_GOT16            14
+#define R_PPC_GOT16_LO         15
+#define R_PPC_GOT16_HI         16
+#define R_PPC_GOT16_HA         17
+#define R_PPC_PLTREL24         18
+#define R_PPC_COPY             19
+#define R_PPC_GLOB_DAT         20
+#define R_PPC_JMP_SLOT         21
+#define R_PPC_RELATIVE         22
+#define R_PPC_LOCAL24PC                23
+#define R_PPC_UADDR32          24
+#define R_PPC_UADDR16          25
+#define R_PPC_REL32            26
+#define R_PPC_PLT32            27
+#define R_PPC_PLTREL32         28
+#define R_PPC_PLT16_LO         29
+#define R_PPC_PLT16_HI         30
+#define R_PPC_PLT16_HA         31
+#define R_PPC_SDAREL16         32
+#define R_PPC_SECTOFF          33
+#define R_PPC_SECTOFF_LO       34
+#define R_PPC_SECTOFF_HI       35
+#define R_PPC_SECTOFF_HA       36
+
+/* PowerPC relocations defined for the TLS access ABI.  */
+#define R_PPC_TLS              67 /* none      (sym+add)@tls */
+#define R_PPC_DTPMOD32         68 /* word32    (sym+add)@dtpmod */
+#define R_PPC_TPREL16          69 /* half16*   (sym+add)@tprel */
+#define R_PPC_TPREL16_LO       70 /* half16    (sym+add)@tprel@l */
+#define R_PPC_TPREL16_HI       71 /* half16    (sym+add)@tprel@h */
+#define R_PPC_TPREL16_HA       72 /* half16    (sym+add)@tprel@ha */
+#define R_PPC_TPREL32          73 /* word32    (sym+add)@tprel */
+#define R_PPC_DTPREL16         74 /* half16*   (sym+add)@dtprel */
+#define R_PPC_DTPREL16_LO      75 /* half16    (sym+add)@dtprel@l */
+#define R_PPC_DTPREL16_HI      76 /* half16    (sym+add)@dtprel@h */
+#define R_PPC_DTPREL16_HA      77 /* half16    (sym+add)@dtprel@ha */
+#define R_PPC_DTPREL32         78 /* word32    (sym+add)@dtprel */
+#define R_PPC_GOT_TLSGD16      79 /* half16*   (sym+add)@got@tlsgd */
+#define R_PPC_GOT_TLSGD16_LO   80 /* half16    (sym+add)@got@tlsgd@l */
+#define R_PPC_GOT_TLSGD16_HI   81 /* half16    (sym+add)@got@tlsgd@h */
+#define R_PPC_GOT_TLSGD16_HA   82 /* half16    (sym+add)@got@tlsgd@ha */
+#define R_PPC_GOT_TLSLD16      83 /* half16*   (sym+add)@got@tlsld */
+#define R_PPC_GOT_TLSLD16_LO   84 /* half16    (sym+add)@got@tlsld@l */
+#define R_PPC_GOT_TLSLD16_HI   85 /* half16    (sym+add)@got@tlsld@h */
+#define R_PPC_GOT_TLSLD16_HA   86 /* half16    (sym+add)@got@tlsld@ha */
+#define R_PPC_GOT_TPREL16      87 /* half16*   (sym+add)@got@tprel */
+#define R_PPC_GOT_TPREL16_LO   88 /* half16    (sym+add)@got@tprel@l */
+#define R_PPC_GOT_TPREL16_HI   89 /* half16    (sym+add)@got@tprel@h */
+#define R_PPC_GOT_TPREL16_HA   90 /* half16    (sym+add)@got@tprel@ha */
+#define R_PPC_GOT_DTPREL16     91 /* half16*   (sym+add)@got@dtprel */
+#define R_PPC_GOT_DTPREL16_LO  92 /* half16*   (sym+add)@got@dtprel@l */
+#define R_PPC_GOT_DTPREL16_HI  93 /* half16*   (sym+add)@got@dtprel@h */
+#define R_PPC_GOT_DTPREL16_HA  94 /* half16*   (sym+add)@got@dtprel@ha */
+
+/* The remaining relocs are from the Embedded ELF ABI, and are not
+   in the SVR4 ELF ABI.  */
+#define R_PPC_EMB_NADDR32      101
+#define R_PPC_EMB_NADDR16      102
+#define R_PPC_EMB_NADDR16_LO   103
+#define R_PPC_EMB_NADDR16_HI   104
+#define R_PPC_EMB_NADDR16_HA   105
+#define R_PPC_EMB_SDAI16       106
+#define R_PPC_EMB_SDA2I16      107
+#define R_PPC_EMB_SDA2REL      108
+#define R_PPC_EMB_SDA21                109     /* 16 bit offset in SDA */
+#define R_PPC_EMB_MRKREF       110
+#define R_PPC_EMB_RELSEC16     111
+#define R_PPC_EMB_RELST_LO     112
+#define R_PPC_EMB_RELST_HI     113
+#define R_PPC_EMB_RELST_HA     114
+#define R_PPC_EMB_BIT_FLD      115
+#define R_PPC_EMB_RELSDA       116     /* 16 bit relative offset in SDA */
+
+/* Diab tool relocations.  */
+#define R_PPC_DIAB_SDA21_LO    180     /* like EMB_SDA21, but lower 16 bit */
+#define R_PPC_DIAB_SDA21_HI    181     /* like EMB_SDA21, but high 16 bit */
+#define R_PPC_DIAB_SDA21_HA    182     /* like EMB_SDA21, adjusted high 16 */
+#define R_PPC_DIAB_RELSDA_LO   183     /* like EMB_RELSDA, but lower 16 bit */
+#define R_PPC_DIAB_RELSDA_HI   184     /* like EMB_RELSDA, but high 16 bit */
+#define R_PPC_DIAB_RELSDA_HA   185     /* like EMB_RELSDA, adjusted high 16 */
+
+/* GNU extension to support local ifunc.  */
+#define R_PPC_IRELATIVE                248
+
+/* GNU relocs used in PIC code sequences.  */
+#define R_PPC_REL16            249     /* half16   (sym+add-.) */
+#define R_PPC_REL16_LO         250     /* half16   (sym+add-.)@l */
+#define R_PPC_REL16_HI         251     /* half16   (sym+add-.)@h */
+#define R_PPC_REL16_HA         252     /* half16   (sym+add-.)@ha */
+
+/* This is a phony reloc to handle any old fashioned TOC16 references
+   that may still be in object files.  */
+#define R_PPC_TOC16            255
+
+/* PowerPC specific values for the Dyn d_tag field.  */
+#define DT_PPC_GOT             (DT_LOPROC + 0)
+#define DT_PPC_NUM             1
+
+/* PowerPC64 relocations defined by the ABIs */
+#define R_PPC64_NONE           R_PPC_NONE
+#define R_PPC64_ADDR32         R_PPC_ADDR32 /* 32bit absolute address */
+#define R_PPC64_ADDR24         R_PPC_ADDR24 /* 26bit address, word aligned */
+#define R_PPC64_ADDR16         R_PPC_ADDR16 /* 16bit absolute address */
+#define R_PPC64_ADDR16_LO      R_PPC_ADDR16_LO /* lower 16bits of address */
+#define R_PPC64_ADDR16_HI      R_PPC_ADDR16_HI /* high 16bits of address. */
+#define R_PPC64_ADDR16_HA      R_PPC_ADDR16_HA /* adjusted high 16bits.  */
+#define R_PPC64_ADDR14         R_PPC_ADDR14 /* 16bit address, word aligned */
+#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN
+#define R_PPC64_ADDR14_BRNTAKEN        R_PPC_ADDR14_BRNTAKEN
+#define R_PPC64_REL24          R_PPC_REL24 /* PC-rel. 26 bit, word aligned */
+#define R_PPC64_REL14          R_PPC_REL14 /* PC relative 16 bit */
+#define R_PPC64_REL14_BRTAKEN  R_PPC_REL14_BRTAKEN
+#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN
+#define R_PPC64_GOT16          R_PPC_GOT16
+#define R_PPC64_GOT16_LO       R_PPC_GOT16_LO
+#define R_PPC64_GOT16_HI       R_PPC_GOT16_HI
+#define R_PPC64_GOT16_HA       R_PPC_GOT16_HA
+
+#define R_PPC64_COPY           R_PPC_COPY
+#define R_PPC64_GLOB_DAT       R_PPC_GLOB_DAT
+#define R_PPC64_JMP_SLOT       R_PPC_JMP_SLOT
+#define R_PPC64_RELATIVE       R_PPC_RELATIVE
+
+#define R_PPC64_UADDR32                R_PPC_UADDR32
+#define R_PPC64_UADDR16                R_PPC_UADDR16
+#define R_PPC64_REL32          R_PPC_REL32
+#define R_PPC64_PLT32          R_PPC_PLT32
+#define R_PPC64_PLTREL32       R_PPC_PLTREL32
+#define R_PPC64_PLT16_LO       R_PPC_PLT16_LO
+#define R_PPC64_PLT16_HI       R_PPC_PLT16_HI
+#define R_PPC64_PLT16_HA       R_PPC_PLT16_HA
+
+#define R_PPC64_SECTOFF                R_PPC_SECTOFF
+#define R_PPC64_SECTOFF_LO     R_PPC_SECTOFF_LO
+#define R_PPC64_SECTOFF_HI     R_PPC_SECTOFF_HI
+#define R_PPC64_SECTOFF_HA     R_PPC_SECTOFF_HA
+#define R_PPC64_ADDR30         37 /* word30 (S + A - P) >> 2 */
+#define R_PPC64_ADDR64         38 /* doubleword64 S + A */
+#define R_PPC64_ADDR16_HIGHER  39 /* half16 #higher(S + A) */
+#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */
+#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */
+#define R_PPC64_ADDR16_HIGHESTA        42 /* half16 #highesta(S + A) */
+#define R_PPC64_UADDR64                43 /* doubleword64 S + A */
+#define R_PPC64_REL64          44 /* doubleword64 S + A - P */
+#define R_PPC64_PLT64          45 /* doubleword64 L + A */
+#define R_PPC64_PLTREL64       46 /* doubleword64 L + A - P */
+#define R_PPC64_TOC16          47 /* half16* S + A - .TOC */
+#define R_PPC64_TOC16_LO       48 /* half16 #lo(S + A - .TOC.) */
+#define R_PPC64_TOC16_HI       49 /* half16 #hi(S + A - .TOC.) */
+#define R_PPC64_TOC16_HA       50 /* half16 #ha(S + A - .TOC.) */
+#define R_PPC64_TOC            51 /* doubleword64 .TOC */
+#define R_PPC64_PLTGOT16       52 /* half16* M + A */
+#define R_PPC64_PLTGOT16_LO    53 /* half16 #lo(M + A) */
+#define R_PPC64_PLTGOT16_HI    54 /* half16 #hi(M + A) */
+#define R_PPC64_PLTGOT16_HA    55 /* half16 #ha(M + A) */
+
+#define R_PPC64_ADDR16_DS      56 /* half16ds* (S + A) >> 2 */
+#define R_PPC64_ADDR16_LO_DS   57 /* half16ds  #lo(S + A) >> 2 */
+#define R_PPC64_GOT16_DS       58 /* half16ds* (G + A) >> 2 */
+#define R_PPC64_GOT16_LO_DS    59 /* half16ds  #lo(G + A) >> 2 */
+#define R_PPC64_PLT16_LO_DS    60 /* half16ds  #lo(L + A) >> 2 */
+#define R_PPC64_SECTOFF_DS     61 /* half16ds* (R + A) >> 2 */
+#define R_PPC64_SECTOFF_LO_DS  62 /* half16ds  #lo(R + A) >> 2 */
+#define R_PPC64_TOC16_DS       63 /* half16ds* (S + A - .TOC.) >> 2 */
+#define R_PPC64_TOC16_LO_DS    64 /* half16ds  #lo(S + A - .TOC.) >> 2 */
+#define R_PPC64_PLTGOT16_DS    65 /* half16ds* (M + A) >> 2 */
+#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds  #lo(M + A) >> 2 */
+
+/* PowerPC64 relocations defined for the TLS access ABI.  */
+#define R_PPC64_TLS            67 /* none      (sym+add)@tls */
+#define R_PPC64_DTPMOD64       68 /* doubleword64 (sym+add)@dtpmod */
+#define R_PPC64_TPREL16                69 /* half16*   (sym+add)@tprel */
+#define R_PPC64_TPREL16_LO     70 /* half16    (sym+add)@tprel@l */
+#define R_PPC64_TPREL16_HI     71 /* half16    (sym+add)@tprel@h */
+#define R_PPC64_TPREL16_HA     72 /* half16    (sym+add)@tprel@ha */
+#define R_PPC64_TPREL64                73 /* doubleword64 (sym+add)@tprel */
+#define R_PPC64_DTPREL16       74 /* half16*   (sym+add)@dtprel */
+#define R_PPC64_DTPREL16_LO    75 /* half16    (sym+add)@dtprel@l */
+#define R_PPC64_DTPREL16_HI    76 /* half16    (sym+add)@dtprel@h */
+#define R_PPC64_DTPREL16_HA    77 /* half16    (sym+add)@dtprel@ha */
+#define R_PPC64_DTPREL64       78 /* doubleword64 (sym+add)@dtprel */
+#define R_PPC64_GOT_TLSGD16    79 /* half16*   (sym+add)@got@tlsgd */
+#define R_PPC64_GOT_TLSGD16_LO 80 /* half16    (sym+add)@got@tlsgd@l */
+#define R_PPC64_GOT_TLSGD16_HI 81 /* half16    (sym+add)@got@tlsgd@h */
+#define R_PPC64_GOT_TLSGD16_HA 82 /* half16    (sym+add)@got@tlsgd@ha */
+#define R_PPC64_GOT_TLSLD16    83 /* half16*   (sym+add)@got@tlsld */
+#define R_PPC64_GOT_TLSLD16_LO 84 /* half16    (sym+add)@got@tlsld@l */
+#define R_PPC64_GOT_TLSLD16_HI 85 /* half16    (sym+add)@got@tlsld@h */
+#define R_PPC64_GOT_TLSLD16_HA 86 /* half16    (sym+add)@got@tlsld@ha */
+#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */
+#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */
+#define R_PPC64_GOT_TPREL16_HI 89 /* half16    (sym+add)@got@tprel@h */
+#define R_PPC64_GOT_TPREL16_HA 90 /* half16    (sym+add)@got@tprel@ha */
+#define R_PPC64_GOT_DTPREL16_DS        91 /* half16ds* (sym+add)@got@dtprel */
+#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */
+#define R_PPC64_GOT_DTPREL16_HI        93 /* half16    (sym+add)@got@dtprel@h */
+#define R_PPC64_GOT_DTPREL16_HA        94 /* half16    (sym+add)@got@dtprel@ha */
+#define R_PPC64_TPREL16_DS     95 /* half16ds* (sym+add)@tprel */
+#define R_PPC64_TPREL16_LO_DS  96 /* half16ds  (sym+add)@tprel@l */
+#define R_PPC64_TPREL16_HIGHER 97 /* half16    (sym+add)@tprel@higher */
+#define R_PPC64_TPREL16_HIGHERA        98 /* half16    (sym+add)@tprel@highera */
+#define R_PPC64_TPREL16_HIGHEST        99 /* half16    (sym+add)@tprel@highest */
+#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */
+#define R_PPC64_DTPREL16_DS    101 /* half16ds* (sym+add)@dtprel */
+#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */
+#define R_PPC64_DTPREL16_HIGHER        103 /* half16   (sym+add)@dtprel@higher */
+#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */
+#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */
+#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16        (sym+add)@dtprel@highesta */
+#define R_PPC64_TLSGD          107 /* none     (sym+add)@tlsgd */
+#define R_PPC64_TLSLD          108 /* none     (sym+add)@tlsld */
+#define R_PPC64_TOCSAVE                109 /* none */
+
+/* Added when HA and HI relocs were changed to report overflows.  */
+#define R_PPC64_ADDR16_HIGH    110
+#define R_PPC64_ADDR16_HIGHA   111
+#define R_PPC64_TPREL16_HIGH   112
+#define R_PPC64_TPREL16_HIGHA  113
+#define R_PPC64_DTPREL16_HIGH  114
+#define R_PPC64_DTPREL16_HIGHA 115
+
+/* GNU extension to support local ifunc.  */
+#define R_PPC64_JMP_IREL       247
+#define R_PPC64_IRELATIVE      248
+#define R_PPC64_REL16          249     /* half16   (sym+add-.) */
+#define R_PPC64_REL16_LO       250     /* half16   (sym+add-.)@l */
+#define R_PPC64_REL16_HI       251     /* half16   (sym+add-.)@h */
+#define R_PPC64_REL16_HA       252     /* half16   (sym+add-.)@ha */
+
+/* e_flags bits specifying ABI.
+   1 for original function descriptor using ABI,
+   2 for revised ABI without function descriptors,
+   0 for unspecified or not using any features affected by the differences.  */
+#define EF_PPC64_ABI   3
+
+/* PowerPC64 specific values for the Dyn d_tag field.  */
+#define DT_PPC64_GLINK  (DT_LOPROC + 0)
+#define DT_PPC64_OPD   (DT_LOPROC + 1)
+#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
+#define DT_PPC64_OPT   (DT_LOPROC + 3)
+#define DT_PPC64_NUM    3
+
+/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry.  */
+#define PPC64_OPT_TLS          1
+#define PPC64_OPT_MULTI_TOC    2
+
+/* PowerPC64 specific values for the Elf64_Sym st_other field.  */
+#define STO_PPC64_LOCAL_BIT    5
+#define STO_PPC64_LOCAL_MASK   (7 << STO_PPC64_LOCAL_BIT)
+#define PPC64_LOCAL_ENTRY_OFFSET(other)                                \
+ (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2)
+
+
+/* ARM specific declarations */
+
+/* Processor specific flags for the ELF header e_flags field.  */
+#define EF_ARM_RELEXEC         0x01
+#define EF_ARM_HASENTRY                0x02
+#define EF_ARM_INTERWORK       0x04
+#define EF_ARM_APCS_26         0x08
+#define EF_ARM_APCS_FLOAT      0x10
+#define EF_ARM_PIC             0x20
+#define EF_ARM_ALIGN8          0x40 /* 8-bit structure alignment is in use */
+#define EF_ARM_NEW_ABI         0x80
+#define EF_ARM_OLD_ABI         0x100
+#define EF_ARM_SOFT_FLOAT      0x200
+#define EF_ARM_VFP_FLOAT       0x400
+#define EF_ARM_MAVERICK_FLOAT  0x800
+
+#define EF_ARM_ABI_FLOAT_SOFT  0x200   /* NB conflicts with EF_ARM_SOFT_FLOAT */
+#define EF_ARM_ABI_FLOAT_HARD  0x400   /* NB conflicts with EF_ARM_VFP_FLOAT */
+
+
+/* Other constants defined in the ARM ELF spec. version B-01.  */
+/* NB. These conflict with values defined above.  */
+#define EF_ARM_SYMSARESORTED   0x04
+#define EF_ARM_DYNSYMSUSESEGIDX        0x08
+#define EF_ARM_MAPSYMSFIRST    0x10
+#define EF_ARM_EABIMASK                0XFF000000
+
+/* Constants defined in AAELF.  */
+#define EF_ARM_BE8         0x00800000
+#define EF_ARM_LE8         0x00400000
+
+#define EF_ARM_EABI_VERSION(flags)     ((flags) & EF_ARM_EABIMASK)
+#define EF_ARM_EABI_UNKNOWN    0x00000000
+#define EF_ARM_EABI_VER1       0x01000000
+#define EF_ARM_EABI_VER2       0x02000000
+#define EF_ARM_EABI_VER3       0x03000000
+#define EF_ARM_EABI_VER4       0x04000000
+#define EF_ARM_EABI_VER5       0x05000000
+
+/* Additional symbol types for Thumb.  */
+#define STT_ARM_TFUNC          STT_LOPROC /* A Thumb function.  */
+#define STT_ARM_16BIT          STT_HIPROC /* A Thumb label.  */
+
+/* ARM-specific values for sh_flags */
+#define SHF_ARM_ENTRYSECT      0x10000000 /* Section contains an entry point */
+#define SHF_ARM_COMDEF         0x80000000 /* Section may be multiply defined
+                                             in the input to a link step.  */
+
+/* ARM-specific program header flags */
+#define PF_ARM_SB              0x10000000 /* Segment contains the location
+                                             addressed by the static base. */
+#define PF_ARM_PI              0x20000000 /* Position-independent segment.  */
+#define PF_ARM_ABS             0x40000000 /* Absolute segment.  */
+
+/* Processor specific values for the Phdr p_type field.  */
+#define PT_ARM_EXIDX           (PT_LOPROC + 1) /* ARM unwind segment.  */
+
+/* Processor specific values for the Shdr sh_type field.  */
+#define SHT_ARM_EXIDX          (SHT_LOPROC + 1) /* ARM unwind section.  */
+#define SHT_ARM_PREEMPTMAP     (SHT_LOPROC + 2) /* Preemption details.  */
+#define SHT_ARM_ATTRIBUTES     (SHT_LOPROC + 3) /* ARM attributes section.  */
+
+
+/* AArch64 relocs.  */
+
+#define R_AARCH64_NONE            0    /* No relocation.  */
+#define R_AARCH64_ABS64         257    /* Direct 64 bit. */
+#define R_AARCH64_ABS32         258    /* Direct 32 bit.  */
+#define R_AARCH64_ABS16                259     /* Direct 16-bit.  */
+#define R_AARCH64_PREL64       260     /* PC-relative 64-bit.  */
+#define R_AARCH64_PREL32       261     /* PC-relative 32-bit.  */
+#define R_AARCH64_PREL16       262     /* PC-relative 16-bit.  */
+#define R_AARCH64_MOVW_UABS_G0 263     /* Dir. MOVZ imm. from bits 15:0.  */
+#define R_AARCH64_MOVW_UABS_G0_NC 264  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_UABS_G1 265     /* Dir. MOVZ imm. from bits 31:16.  */
+#define R_AARCH64_MOVW_UABS_G1_NC 266  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_UABS_G2 267     /* Dir. MOVZ imm. from bits 47:32.  */
+#define R_AARCH64_MOVW_UABS_G2_NC 268  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_UABS_G3 269     /* Dir. MOV{K,Z} imm. from 63:48.  */
+#define R_AARCH64_MOVW_SABS_G0 270     /* Dir. MOV{N,Z} imm. from 15:0.  */
+#define R_AARCH64_MOVW_SABS_G1 271     /* Dir. MOV{N,Z} imm. from 31:16.  */
+#define R_AARCH64_MOVW_SABS_G2 272     /* Dir. MOV{N,Z} imm. from 47:32.  */
+#define R_AARCH64_LD_PREL_LO19 273     /* PC-rel. LD imm. from bits 20:2.  */
+#define R_AARCH64_ADR_PREL_LO21        274     /* PC-rel. ADR imm. from bits 20:0.  */
+#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12.  */
+#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check.  */
+#define R_AARCH64_ADD_ABS_LO12_NC 277  /* Dir. ADD imm. from bits 11:0.  */
+#define R_AARCH64_LDST8_ABS_LO12_NC 278        /* Likewise for LD/ST; no check. */
+#define R_AARCH64_TSTBR14      279     /* PC-rel. TBZ/TBNZ imm. from 15:2.  */
+#define R_AARCH64_CONDBR19     280     /* PC-rel. cond. br. imm. from 20:2. */
+#define R_AARCH64_JUMP26       282     /* PC-rel. B imm. from bits 27:2.  */
+#define R_AARCH64_CALL26       283     /* Likewise for CALL.  */
+#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1.  */
+#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2.  */
+#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3.  */
+#define R_AARCH64_MOVW_PREL_G0 287     /* PC-rel. MOV{N,Z} imm. from 15:0.  */
+#define R_AARCH64_MOVW_PREL_G0_NC 288  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_PREL_G1 289     /* PC-rel. MOV{N,Z} imm. from 31:16. */
+#define R_AARCH64_MOVW_PREL_G1_NC 290  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_PREL_G2 291     /* PC-rel. MOV{N,Z} imm. from 47:32. */
+#define R_AARCH64_MOVW_PREL_G2_NC 292  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_PREL_G3 293     /* PC-rel. MOV{N,Z} imm. from 63:48. */
+#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4.  */
+#define R_AARCH64_MOVW_GOTOFF_G0 300   /* GOT-rel. off. MOV{N,Z} imm. 15:0. */
+#define R_AARCH64_MOVW_GOTOFF_G0_NC 301        /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_GOTOFF_G1 302   /* GOT-rel. o. MOV{N,Z} imm. 31:16.  */
+#define R_AARCH64_MOVW_GOTOFF_G1_NC 303        /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_GOTOFF_G2 304   /* GOT-rel. o. MOV{N,Z} imm. 47:32.  */
+#define R_AARCH64_MOVW_GOTOFF_G2_NC 305        /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_GOTOFF_G3 306   /* GOT-rel. o. MOV{N,Z} imm. 63:48.  */
+#define R_AARCH64_GOTREL64     307     /* GOT-relative 64-bit.  */
+#define R_AARCH64_GOTREL32     308     /* GOT-relative 32-bit.  */
+#define R_AARCH64_GOT_LD_PREL19        309     /* PC-rel. GOT off. load imm. 20:2.  */
+#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3.  */
+#define R_AARCH64_ADR_GOT_PAGE 311     /* P-page-rel. GOT off. ADRP 32:12.  */
+#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3.  */
+#define R_AARCH64_LD64_GOTPAGE_LO15 313        /* GOT-page-rel. GOT off. LD/ST 14:3 */
+#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0.  */
+#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12.  */
+#define R_AARCH64_TLSGD_ADD_LO12_NC 514        /* direct ADD imm. from 11:0.  */
+#define R_AARCH64_TLSGD_MOVW_G1        515     /* GOT-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0.  */
+#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model.  */
+#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model.  */
+#define R_AARCH64_TLSLD_ADD_LO12_NC 519        /* Like 514; local dynamic model.  */
+#define R_AARCH64_TLSLD_MOVW_G1        520     /* Like 515; local dynamic model.  */
+#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model.  */
+#define R_AARCH64_TLSLD_LD_PREL19 522  /* TLS PC-rel. load imm. 20:2.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0.  */
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check.  */
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0.  */
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1.  */
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2.  */
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3.  */
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check.  */
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0.  */
+#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12.  */
+#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3.  */
+#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12.  */
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0.  */
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check.  */
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0.  */
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1.  */
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check.  */
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2.  */
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check.  */
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3.  */
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check.  */
+#define R_AARCH64_TLSDESC_LD_PREL19 560        /* PC-rel. load immediate 20:2.  */
+#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0.  */
+#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12.  */
+#define R_AARCH64_TLSDESC_LD64_LO12 563        /* Direct LD off. from 11:3.  */
+#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0.  */
+#define R_AARCH64_TLSDESC_OFF_G1 565   /* GOT-rel. MOV{N,Z} imm. 31:16.  */
+#define R_AARCH64_TLSDESC_OFF_G0_NC 566        /* GOT-rel. MOVK imm. 15:0; no ck.  */
+#define R_AARCH64_TLSDESC_LDR  567     /* Relax LDR.  */
+#define R_AARCH64_TLSDESC_ADD  568     /* Relax ADD.  */
+#define R_AARCH64_TLSDESC_CALL 569     /* Relax BLR.  */
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4.  */
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check.  */
+#define R_AARCH64_COPY         1024    /* Copy symbol at runtime.  */
+#define R_AARCH64_GLOB_DAT     1025    /* Create GOT entry.  */
+#define R_AARCH64_JUMP_SLOT    1026    /* Create PLT entry.  */
+#define R_AARCH64_RELATIVE     1027    /* Adjust by program base.  */
+#define R_AARCH64_TLS_DTPMOD64 1028    /* Module number, 64 bit.  */
+#define R_AARCH64_TLS_DTPREL64 1029    /* Module-relative offset, 64 bit.  */
+#define R_AARCH64_TLS_TPREL64  1030    /* TP-relative offset, 64 bit.  */
+#define R_AARCH64_TLSDESC      1031    /* TLS Descriptor.  */
+#define R_AARCH64_IRELATIVE    1032    /* STT_GNU_IFUNC relocation.  */
+
+/* ARM relocs.  */
+
+#define R_ARM_NONE             0       /* No reloc */
+#define R_ARM_PC24             1       /* Deprecated PC relative 26
+                                          bit branch.  */
+#define R_ARM_ABS32            2       /* Direct 32 bit  */
+#define R_ARM_REL32            3       /* PC relative 32 bit */
+#define R_ARM_PC13             4
+#define R_ARM_ABS16            5       /* Direct 16 bit */
+#define R_ARM_ABS12            6       /* Direct 12 bit */
+#define R_ARM_THM_ABS5         7       /* Direct & 0x7C (LDR, STR).  */
+#define R_ARM_ABS8             8       /* Direct 8 bit */
+#define R_ARM_SBREL32          9
+#define R_ARM_THM_PC22         10      /* PC relative 24 bit (Thumb32 BL).  */
+#define R_ARM_THM_PC8          11      /* PC relative & 0x3FC
+                                          (Thumb16 LDR, ADD, ADR).  */
+#define R_ARM_AMP_VCALL9       12
+#define R_ARM_SWI24            13      /* Obsolete static relocation.  */
+#define R_ARM_TLS_DESC         13      /* Dynamic relocation.  */
+#define R_ARM_THM_SWI8         14      /* Reserved.  */
+#define R_ARM_XPC25            15      /* Reserved.  */
+#define R_ARM_THM_XPC22                16      /* Reserved.  */
+#define R_ARM_TLS_DTPMOD32     17      /* ID of module containing symbol */
+#define R_ARM_TLS_DTPOFF32     18      /* Offset in TLS block */
+#define R_ARM_TLS_TPOFF32      19      /* Offset in static TLS block */
+#define R_ARM_COPY             20      /* Copy symbol at runtime */
+#define R_ARM_GLOB_DAT         21      /* Create GOT entry */
+#define R_ARM_JUMP_SLOT                22      /* Create PLT entry */
+#define R_ARM_RELATIVE         23      /* Adjust by program base */
+#define R_ARM_GOTOFF           24      /* 32 bit offset to GOT */
+#define R_ARM_GOTPC            25      /* 32 bit PC relative offset to GOT */
+#define R_ARM_GOT32            26      /* 32 bit GOT entry */
+#define R_ARM_PLT32            27      /* Deprecated, 32 bit PLT address.  */
+#define R_ARM_CALL             28      /* PC relative 24 bit (BL, BLX).  */
+#define R_ARM_JUMP24           29      /* PC relative 24 bit
+                                          (B, BL<cond>).  */
+#define R_ARM_THM_JUMP24       30      /* PC relative 24 bit (Thumb32 B.W).  */
+#define R_ARM_BASE_ABS         31      /* Adjust by program base.  */
+#define R_ARM_ALU_PCREL_7_0    32      /* Obsolete.  */
+#define R_ARM_ALU_PCREL_15_8   33      /* Obsolete.  */
+#define R_ARM_ALU_PCREL_23_15  34      /* Obsolete.  */
+#define R_ARM_LDR_SBREL_11_0   35      /* Deprecated, prog. base relative.  */
+#define R_ARM_ALU_SBREL_19_12  36      /* Deprecated, prog. base relative.  */
+#define R_ARM_ALU_SBREL_27_20  37      /* Deprecated, prog. base relative.  */
+#define R_ARM_TARGET1          38
+#define R_ARM_SBREL31          39      /* Program base relative.  */
+#define R_ARM_V4BX             40
+#define R_ARM_TARGET2          41
+#define R_ARM_PREL31           42      /* 32 bit PC relative.  */
+#define R_ARM_MOVW_ABS_NC      43      /* Direct 16-bit (MOVW).  */
+#define R_ARM_MOVT_ABS         44      /* Direct high 16-bit (MOVT).  */
+#define R_ARM_MOVW_PREL_NC     45      /* PC relative 16-bit (MOVW).  */
+#define R_ARM_MOVT_PREL                46      /* PC relative (MOVT).  */
+#define R_ARM_THM_MOVW_ABS_NC  47      /* Direct 16 bit (Thumb32 MOVW).  */
+#define R_ARM_THM_MOVT_ABS     48      /* Direct high 16 bit
+                                          (Thumb32 MOVT).  */
+#define R_ARM_THM_MOVW_PREL_NC 49      /* PC relative 16 bit
+                                          (Thumb32 MOVW).  */
+#define R_ARM_THM_MOVT_PREL    50      /* PC relative high 16 bit
+                                          (Thumb32 MOVT).  */
+#define R_ARM_THM_JUMP19       51      /* PC relative 20 bit
+                                          (Thumb32 B<cond>.W).  */
+#define R_ARM_THM_JUMP6                52      /* PC relative X & 0x7E
+                                          (Thumb16 CBZ, CBNZ).  */
+#define R_ARM_THM_ALU_PREL_11_0        53      /* PC relative 12 bit
+                                          (Thumb32 ADR.W).  */
+#define R_ARM_THM_PC12         54      /* PC relative 12 bit
+                                          (Thumb32 LDR{D,SB,H,SH}).  */
+#define R_ARM_ABS32_NOI                55      /* Direct 32-bit.  */
+#define R_ARM_REL32_NOI                56      /* PC relative 32-bit.  */
+#define R_ARM_ALU_PC_G0_NC     57      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G0                58      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G1_NC     59      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G1                60      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G2                61      /* PC relative (ADD, SUB).  */
+#define R_ARM_LDR_PC_G1                62      /* PC relative (LDR,STR,LDRB,STRB).  */
+#define R_ARM_LDR_PC_G2                63      /* PC relative (LDR,STR,LDRB,STRB).  */
+#define R_ARM_LDRS_PC_G0       64      /* PC relative (STR{D,H},
+                                          LDR{D,SB,H,SH}).  */
+#define R_ARM_LDRS_PC_G1       65      /* PC relative (STR{D,H},
+                                          LDR{D,SB,H,SH}).  */
+#define R_ARM_LDRS_PC_G2       66      /* PC relative (STR{D,H},
+                                          LDR{D,SB,H,SH}).  */
+#define R_ARM_LDC_PC_G0                67      /* PC relative (LDC, STC).  */
+#define R_ARM_LDC_PC_G1                68      /* PC relative (LDC, STC).  */
+#define R_ARM_LDC_PC_G2                69      /* PC relative (LDC, STC).  */
+#define R_ARM_ALU_SB_G0_NC     70      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G0                71      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G1_NC     72      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G1                73      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G2                74      /* Program base relative (ADD,SUB).  */
+#define R_ARM_LDR_SB_G0                75      /* Program base relative (LDR,
+                                          STR, LDRB, STRB).  */
+#define R_ARM_LDR_SB_G1                76      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDR_SB_G2                77      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDRS_SB_G0       78      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDRS_SB_G1       79      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDRS_SB_G2       80      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDC_SB_G0                81      /* Program base relative (LDC,STC).  */
+#define R_ARM_LDC_SB_G1                82      /* Program base relative (LDC,STC).  */
+#define R_ARM_LDC_SB_G2                83      /* Program base relative (LDC,STC).  */
+#define R_ARM_MOVW_BREL_NC     84      /* Program base relative 16
+                                          bit (MOVW).  */
+#define R_ARM_MOVT_BREL                85      /* Program base relative high
+                                          16 bit (MOVT).  */
+#define R_ARM_MOVW_BREL                86      /* Program base relative 16
+                                          bit (MOVW).  */
+#define R_ARM_THM_MOVW_BREL_NC 87      /* Program base relative 16
+                                          bit (Thumb32 MOVW).  */
+#define R_ARM_THM_MOVT_BREL    88      /* Program base relative high
+                                          16 bit (Thumb32 MOVT).  */
+#define R_ARM_THM_MOVW_BREL    89      /* Program base relative 16
+                                          bit (Thumb32 MOVW).  */
+#define R_ARM_TLS_GOTDESC      90
+#define R_ARM_TLS_CALL         91
+#define R_ARM_TLS_DESCSEQ      92      /* TLS relaxation.  */
+#define R_ARM_THM_TLS_CALL     93
+#define R_ARM_PLT32_ABS                94
+#define R_ARM_GOT_ABS          95      /* GOT entry.  */
+#define R_ARM_GOT_PREL         96      /* PC relative GOT entry.  */
+#define R_ARM_GOT_BREL12       97      /* GOT entry relative to GOT
+                                          origin (LDR).  */
+#define R_ARM_GOTOFF12         98      /* 12 bit, GOT entry relative
+                                          to GOT origin (LDR, STR).  */
+#define R_ARM_GOTRELAX         99
+#define R_ARM_GNU_VTENTRY      100
+#define R_ARM_GNU_VTINHERIT    101
+#define R_ARM_THM_PC11         102     /* PC relative & 0xFFE (Thumb16 B).  */
+#define R_ARM_THM_PC9          103     /* PC relative & 0x1FE
+                                          (Thumb16 B/B<cond>).  */
+#define R_ARM_TLS_GD32         104     /* PC-rel 32 bit for global dynamic
+                                          thread local data */
+#define R_ARM_TLS_LDM32                105     /* PC-rel 32 bit for local dynamic
+                                          thread local data */
+#define R_ARM_TLS_LDO32                106     /* 32 bit offset relative to TLS
+                                          block */
+#define R_ARM_TLS_IE32         107     /* PC-rel 32 bit for GOT entry of
+                                          static TLS block offset */
+#define R_ARM_TLS_LE32         108     /* 32 bit offset relative to static
+                                          TLS block */
+#define R_ARM_TLS_LDO12                109     /* 12 bit relative to TLS
+                                          block (LDR, STR).  */
+#define R_ARM_TLS_LE12         110     /* 12 bit relative to static
+                                          TLS block (LDR, STR).  */
+#define R_ARM_TLS_IE12GP       111     /* 12 bit GOT entry relative
+                                          to GOT origin (LDR).  */
+#define R_ARM_ME_TOO           128     /* Obsolete.  */
+#define R_ARM_THM_TLS_DESCSEQ  129
+#define R_ARM_THM_TLS_DESCSEQ16        129
+#define R_ARM_THM_TLS_DESCSEQ32        130
+#define R_ARM_THM_GOT_BREL12   131     /* GOT entry relative to GOT
+                                          origin, 12 bit (Thumb32 LDR).  */
+#define R_ARM_IRELATIVE                160
+#define R_ARM_RXPC25           249
+#define R_ARM_RSBREL32         250
+#define R_ARM_THM_RPC22                251
+#define R_ARM_RREL32           252
+#define R_ARM_RABS22           253
+#define R_ARM_RPC24            254
+#define R_ARM_RBASE            255
+/* Keep this the last entry.  */
+#define R_ARM_NUM              256
+
+/* IA-64 specific declarations.  */
+
+/* Processor specific flags for the Ehdr e_flags field.  */
+#define EF_IA_64_MASKOS                0x0000000f      /* os-specific flags */
+#define EF_IA_64_ABI64         0x00000010      /* 64-bit ABI */
+#define EF_IA_64_ARCH          0xff000000      /* arch. version mask */
+
+/* Processor specific values for the Phdr p_type field.  */
+#define PT_IA_64_ARCHEXT       (PT_LOPROC + 0) /* arch extension bits */
+#define PT_IA_64_UNWIND                (PT_LOPROC + 1) /* ia64 unwind bits */
+#define PT_IA_64_HP_OPT_ANOT   (PT_LOOS + 0x12)
+#define PT_IA_64_HP_HSL_ANOT   (PT_LOOS + 0x13)
+#define PT_IA_64_HP_STACK      (PT_LOOS + 0x14)
+
+/* Processor specific flags for the Phdr p_flags field.  */
+#define PF_IA_64_NORECOV       0x80000000      /* spec insns w/o recovery */
+
+/* Processor specific values for the Shdr sh_type field.  */
+#define SHT_IA_64_EXT          (SHT_LOPROC + 0) /* extension bits */
+#define SHT_IA_64_UNWIND       (SHT_LOPROC + 1) /* unwind bits */
+
+/* Processor specific flags for the Shdr sh_flags field.  */
+#define SHF_IA_64_SHORT                0x10000000      /* section near gp */
+#define SHF_IA_64_NORECOV      0x20000000      /* spec insns w/o recovery */
+
+/* Processor specific values for the Dyn d_tag field.  */
+#define DT_IA_64_PLT_RESERVE   (DT_LOPROC + 0)
+#define DT_IA_64_NUM           1
+
+/* IA-64 relocations.  */
+#define R_IA64_NONE            0x00    /* none */
+#define R_IA64_IMM14           0x21    /* symbol + addend, add imm14 */
+#define R_IA64_IMM22           0x22    /* symbol + addend, add imm22 */
+#define R_IA64_IMM64           0x23    /* symbol + addend, mov imm64 */
+#define R_IA64_DIR32MSB                0x24    /* symbol + addend, data4 MSB */
+#define R_IA64_DIR32LSB                0x25    /* symbol + addend, data4 LSB */
+#define R_IA64_DIR64MSB                0x26    /* symbol + addend, data8 MSB */
+#define R_IA64_DIR64LSB                0x27    /* symbol + addend, data8 LSB */
+#define R_IA64_GPREL22         0x2a    /* @gprel(sym + add), add imm22 */
+#define R_IA64_GPREL64I                0x2b    /* @gprel(sym + add), mov imm64 */
+#define R_IA64_GPREL32MSB      0x2c    /* @gprel(sym + add), data4 MSB */
+#define R_IA64_GPREL32LSB      0x2d    /* @gprel(sym + add), data4 LSB */
+#define R_IA64_GPREL64MSB      0x2e    /* @gprel(sym + add), data8 MSB */
+#define R_IA64_GPREL64LSB      0x2f    /* @gprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF22         0x32    /* @ltoff(sym + add), add imm22 */
+#define R_IA64_LTOFF64I                0x33    /* @ltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF22                0x3a    /* @pltoff(sym + add), add imm22 */
+#define R_IA64_PLTOFF64I       0x3b    /* @pltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF64MSB     0x3e    /* @pltoff(sym + add), data8 MSB */
+#define R_IA64_PLTOFF64LSB     0x3f    /* @pltoff(sym + add), data8 LSB */
+#define R_IA64_FPTR64I         0x43    /* @fptr(sym + add), mov imm64 */
+#define R_IA64_FPTR32MSB       0x44    /* @fptr(sym + add), data4 MSB */
+#define R_IA64_FPTR32LSB       0x45    /* @fptr(sym + add), data4 LSB */
+#define R_IA64_FPTR64MSB       0x46    /* @fptr(sym + add), data8 MSB */
+#define R_IA64_FPTR64LSB       0x47    /* @fptr(sym + add), data8 LSB */
+#define R_IA64_PCREL60B                0x48    /* @pcrel(sym + add), brl */
+#define R_IA64_PCREL21B                0x49    /* @pcrel(sym + add), ptb, call */
+#define R_IA64_PCREL21M                0x4a    /* @pcrel(sym + add), chk.s */
+#define R_IA64_PCREL21F                0x4b    /* @pcrel(sym + add), fchkf */
+#define R_IA64_PCREL32MSB      0x4c    /* @pcrel(sym + add), data4 MSB */
+#define R_IA64_PCREL32LSB      0x4d    /* @pcrel(sym + add), data4 LSB */
+#define R_IA64_PCREL64MSB      0x4e    /* @pcrel(sym + add), data8 MSB */
+#define R_IA64_PCREL64LSB      0x4f    /* @pcrel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_FPTR22    0x52    /* @ltoff(@fptr(s+a)), imm22 */
+#define R_IA64_LTOFF_FPTR64I   0x53    /* @ltoff(@fptr(s+a)), imm64 */
+#define R_IA64_LTOFF_FPTR32MSB 0x54    /* @ltoff(@fptr(s+a)), data4 MSB */
+#define R_IA64_LTOFF_FPTR32LSB 0x55    /* @ltoff(@fptr(s+a)), data4 LSB */
+#define R_IA64_LTOFF_FPTR64MSB 0x56    /* @ltoff(@fptr(s+a)), data8 MSB */
+#define R_IA64_LTOFF_FPTR64LSB 0x57    /* @ltoff(@fptr(s+a)), data8 LSB */
+#define R_IA64_SEGREL32MSB     0x5c    /* @segrel(sym + add), data4 MSB */
+#define R_IA64_SEGREL32LSB     0x5d    /* @segrel(sym + add), data4 LSB */
+#define R_IA64_SEGREL64MSB     0x5e    /* @segrel(sym + add), data8 MSB */
+#define R_IA64_SEGREL64LSB     0x5f    /* @segrel(sym + add), data8 LSB */
+#define R_IA64_SECREL32MSB     0x64    /* @secrel(sym + add), data4 MSB */
+#define R_IA64_SECREL32LSB     0x65    /* @secrel(sym + add), data4 LSB */
+#define R_IA64_SECREL64MSB     0x66    /* @secrel(sym + add), data8 MSB */
+#define R_IA64_SECREL64LSB     0x67    /* @secrel(sym + add), data8 LSB */
+#define R_IA64_REL32MSB                0x6c    /* data 4 + REL */
+#define R_IA64_REL32LSB                0x6d    /* data 4 + REL */
+#define R_IA64_REL64MSB                0x6e    /* data 8 + REL */
+#define R_IA64_REL64LSB                0x6f    /* data 8 + REL */
+#define R_IA64_LTV32MSB                0x74    /* symbol + addend, data4 MSB */
+#define R_IA64_LTV32LSB                0x75    /* symbol + addend, data4 LSB */
+#define R_IA64_LTV64MSB                0x76    /* symbol + addend, data8 MSB */
+#define R_IA64_LTV64LSB                0x77    /* symbol + addend, data8 LSB */
+#define R_IA64_PCREL21BI       0x79    /* @pcrel(sym + add), 21bit inst */
+#define R_IA64_PCREL22         0x7a    /* @pcrel(sym + add), 22bit inst */
+#define R_IA64_PCREL64I                0x7b    /* @pcrel(sym + add), 64bit inst */
+#define R_IA64_IPLTMSB         0x80    /* dynamic reloc, imported PLT, MSB */
+#define R_IA64_IPLTLSB         0x81    /* dynamic reloc, imported PLT, LSB */
+#define R_IA64_COPY            0x84    /* copy relocation */
+#define R_IA64_SUB             0x85    /* Addend and symbol difference */
+#define R_IA64_LTOFF22X                0x86    /* LTOFF22, relaxable.  */
+#define R_IA64_LDXMOV          0x87    /* Use of LTOFF22X.  */
+#define R_IA64_TPREL14         0x91    /* @tprel(sym + add), imm14 */
+#define R_IA64_TPREL22         0x92    /* @tprel(sym + add), imm22 */
+#define R_IA64_TPREL64I                0x93    /* @tprel(sym + add), imm64 */
+#define R_IA64_TPREL64MSB      0x96    /* @tprel(sym + add), data8 MSB */
+#define R_IA64_TPREL64LSB      0x97    /* @tprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_TPREL22   0x9a    /* @ltoff(@tprel(s+a)), imm2 */
+#define R_IA64_DTPMOD64MSB     0xa6    /* @dtpmod(sym + add), data8 MSB */
+#define R_IA64_DTPMOD64LSB     0xa7    /* @dtpmod(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPMOD22  0xaa    /* @ltoff(@dtpmod(sym + add)), imm22 */
+#define R_IA64_DTPREL14                0xb1    /* @dtprel(sym + add), imm14 */
+#define R_IA64_DTPREL22                0xb2    /* @dtprel(sym + add), imm22 */
+#define R_IA64_DTPREL64I       0xb3    /* @dtprel(sym + add), imm64 */
+#define R_IA64_DTPREL32MSB     0xb4    /* @dtprel(sym + add), data4 MSB */
+#define R_IA64_DTPREL32LSB     0xb5    /* @dtprel(sym + add), data4 LSB */
+#define R_IA64_DTPREL64MSB     0xb6    /* @dtprel(sym + add), data8 MSB */
+#define R_IA64_DTPREL64LSB     0xb7    /* @dtprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPREL22  0xba    /* @ltoff(@dtprel(s+a)), imm22 */
+
+/* SH specific declarations */
+
+/* Processor specific flags for the ELF header e_flags field.  */
+#define EF_SH_MACH_MASK                0x1f
+#define EF_SH_UNKNOWN          0x0
+#define EF_SH1                 0x1
+#define EF_SH2                 0x2
+#define EF_SH3                 0x3
+#define EF_SH_DSP              0x4
+#define EF_SH3_DSP             0x5
+#define EF_SH4AL_DSP           0x6
+#define EF_SH3E                        0x8
+#define EF_SH4                 0x9
+#define EF_SH2E                        0xb
+#define EF_SH4A                        0xc
+#define EF_SH2A                        0xd
+#define EF_SH4_NOFPU           0x10
+#define EF_SH4A_NOFPU          0x11
+#define EF_SH4_NOMMU_NOFPU     0x12
+#define EF_SH2A_NOFPU          0x13
+#define EF_SH3_NOMMU           0x14
+#define EF_SH2A_SH4_NOFPU      0x15
+#define EF_SH2A_SH3_NOFPU      0x16
+#define EF_SH2A_SH4            0x17
+#define EF_SH2A_SH3E           0x18
+
+/* SH relocs.  */
+#define        R_SH_NONE               0
+#define        R_SH_DIR32              1
+#define        R_SH_REL32              2
+#define        R_SH_DIR8WPN            3
+#define        R_SH_IND12W             4
+#define        R_SH_DIR8WPL            5
+#define        R_SH_DIR8WPZ            6
+#define        R_SH_DIR8BP             7
+#define        R_SH_DIR8W              8
+#define        R_SH_DIR8L              9
+#define        R_SH_SWITCH16           25
+#define        R_SH_SWITCH32           26
+#define        R_SH_USES               27
+#define        R_SH_COUNT              28
+#define        R_SH_ALIGN              29
+#define        R_SH_CODE               30
+#define        R_SH_DATA               31
+#define        R_SH_LABEL              32
+#define        R_SH_SWITCH8            33
+#define        R_SH_GNU_VTINHERIT      34
+#define        R_SH_GNU_VTENTRY        35
+#define        R_SH_TLS_GD_32          144
+#define        R_SH_TLS_LD_32          145
+#define        R_SH_TLS_LDO_32         146
+#define        R_SH_TLS_IE_32          147
+#define        R_SH_TLS_LE_32          148
+#define        R_SH_TLS_DTPMOD32       149
+#define        R_SH_TLS_DTPOFF32       150
+#define        R_SH_TLS_TPOFF32        151
+#define        R_SH_GOT32              160
+#define        R_SH_PLT32              161
+#define        R_SH_COPY               162
+#define        R_SH_GLOB_DAT           163
+#define        R_SH_JMP_SLOT           164
+#define        R_SH_RELATIVE           165
+#define        R_SH_GOTOFF             166
+#define        R_SH_GOTPC              167
+/* Keep this the last entry.  */
+#define        R_SH_NUM                256
+
+/* S/390 specific definitions.  */
+
+/* Valid values for the e_flags field.  */
+
+#define EF_S390_HIGH_GPRS    0x00000001  /* High GPRs kernel facility needed.  */
+
+/* Additional s390 relocs */
+
+#define R_390_NONE             0       /* No reloc.  */
+#define R_390_8                        1       /* Direct 8 bit.  */
+#define R_390_12               2       /* Direct 12 bit.  */
+#define R_390_16               3       /* Direct 16 bit.  */
+#define R_390_32               4       /* Direct 32 bit.  */
+#define R_390_PC32             5       /* PC relative 32 bit.  */
+#define R_390_GOT12            6       /* 12 bit GOT offset.  */
+#define R_390_GOT32            7       /* 32 bit GOT offset.  */
+#define R_390_PLT32            8       /* 32 bit PC relative PLT address.  */
+#define R_390_COPY             9       /* Copy symbol at runtime.  */
+#define R_390_GLOB_DAT         10      /* Create GOT entry.  */
+#define R_390_JMP_SLOT         11      /* Create PLT entry.  */
+#define R_390_RELATIVE         12      /* Adjust by program base.  */
+#define R_390_GOTOFF32         13      /* 32 bit offset to GOT.         */
+#define R_390_GOTPC            14      /* 32 bit PC relative offset to GOT.  */
+#define R_390_GOT16            15      /* 16 bit GOT offset.  */
+#define R_390_PC16             16      /* PC relative 16 bit.  */
+#define R_390_PC16DBL          17      /* PC relative 16 bit shifted by 1.  */
+#define R_390_PLT16DBL         18      /* 16 bit PC rel. PLT shifted by 1.  */
+#define R_390_PC32DBL          19      /* PC relative 32 bit shifted by 1.  */
+#define R_390_PLT32DBL         20      /* 32 bit PC rel. PLT shifted by 1.  */
+#define R_390_GOTPCDBL         21      /* 32 bit PC rel. GOT shifted by 1.  */
+#define R_390_64               22      /* Direct 64 bit.  */
+#define R_390_PC64             23      /* PC relative 64 bit.  */
+#define R_390_GOT64            24      /* 64 bit GOT offset.  */
+#define R_390_PLT64            25      /* 64 bit PC relative PLT address.  */
+#define R_390_GOTENT           26      /* 32 bit PC rel. to GOT entry >> 1. */
+#define R_390_GOTOFF16         27      /* 16 bit offset to GOT. */
+#define R_390_GOTOFF64         28      /* 64 bit offset to GOT. */
+#define R_390_GOTPLT12         29      /* 12 bit offset to jump slot.  */
+#define R_390_GOTPLT16         30      /* 16 bit offset to jump slot.  */
+#define R_390_GOTPLT32         31      /* 32 bit offset to jump slot.  */
+#define R_390_GOTPLT64         32      /* 64 bit offset to jump slot.  */
+#define R_390_GOTPLTENT                33      /* 32 bit rel. offset to jump slot.  */
+#define R_390_PLTOFF16         34      /* 16 bit offset from GOT to PLT. */
+#define R_390_PLTOFF32         35      /* 32 bit offset from GOT to PLT. */
+#define R_390_PLTOFF64         36      /* 16 bit offset from GOT to PLT. */
+#define R_390_TLS_LOAD         37      /* Tag for load insn in TLS code.  */
+#define R_390_TLS_GDCALL       38      /* Tag for function call in general
+                                          dynamic TLS code. */
+#define R_390_TLS_LDCALL       39      /* Tag for function call in local
+                                          dynamic TLS code. */
+#define R_390_TLS_GD32         40      /* Direct 32 bit for general dynamic
+                                          thread local data.  */
+#define R_390_TLS_GD64         41      /* Direct 64 bit for general dynamic
+                                         thread local data.  */
+#define R_390_TLS_GOTIE12      42      /* 12 bit GOT offset for static TLS
+                                          block offset.  */
+#define R_390_TLS_GOTIE32      43      /* 32 bit GOT offset for static TLS
+                                          block offset.  */
+#define R_390_TLS_GOTIE64      44      /* 64 bit GOT offset for static TLS
+                                          block offset. */
+#define R_390_TLS_LDM32                45      /* Direct 32 bit for local dynamic
+                                          thread local data in LE code.  */
+#define R_390_TLS_LDM64                46      /* Direct 64 bit for local dynamic
+                                          thread local data in LE code.  */
+#define R_390_TLS_IE32         47      /* 32 bit address of GOT entry for
+                                          negated static TLS block offset.  */
+#define R_390_TLS_IE64         48      /* 64 bit address of GOT entry for
+                                          negated static TLS block offset.  */
+#define R_390_TLS_IEENT                49      /* 32 bit rel. offset to GOT entry for
+                                          negated static TLS block offset.  */
+#define R_390_TLS_LE32         50      /* 32 bit negated offset relative to
+                                          static TLS block.  */
+#define R_390_TLS_LE64         51      /* 64 bit negated offset relative to
+                                          static TLS block.  */
+#define R_390_TLS_LDO32                52      /* 32 bit offset relative to TLS
+                                          block.  */
+#define R_390_TLS_LDO64                53      /* 64 bit offset relative to TLS
+                                          block.  */
+#define R_390_TLS_DTPMOD       54      /* ID of module containing symbol.  */
+#define R_390_TLS_DTPOFF       55      /* Offset in TLS block.  */
+#define R_390_TLS_TPOFF                56      /* Negated offset in static TLS
+                                          block.  */
+#define R_390_20               57      /* Direct 20 bit.  */
+#define R_390_GOT20            58      /* 20 bit GOT offset.  */
+#define R_390_GOTPLT20         59      /* 20 bit offset to jump slot.  */
+#define R_390_TLS_GOTIE20      60      /* 20 bit GOT offset for static TLS
+                                          block offset.  */
+#define R_390_IRELATIVE         61      /* STT_GNU_IFUNC relocation.  */
+/* Keep this the last entry.  */
+#define R_390_NUM              62
+
+
+/* CRIS relocations.  */
+#define R_CRIS_NONE            0
+#define R_CRIS_8               1
+#define R_CRIS_16              2
+#define R_CRIS_32              3
+#define R_CRIS_8_PCREL         4
+#define R_CRIS_16_PCREL                5
+#define R_CRIS_32_PCREL                6
+#define R_CRIS_GNU_VTINHERIT   7
+#define R_CRIS_GNU_VTENTRY     8
+#define R_CRIS_COPY            9
+#define R_CRIS_GLOB_DAT                10
+#define R_CRIS_JUMP_SLOT       11
+#define R_CRIS_RELATIVE                12
+#define R_CRIS_16_GOT          13
+#define R_CRIS_32_GOT          14
+#define R_CRIS_16_GOTPLT       15
+#define R_CRIS_32_GOTPLT       16
+#define R_CRIS_32_GOTREL       17
+#define R_CRIS_32_PLT_GOTREL   18
+#define R_CRIS_32_PLT_PCREL    19
+
+#define R_CRIS_NUM             20
+
+
+/* AMD x86-64 relocations.  */
+#define R_X86_64_NONE          0       /* No reloc */
+#define R_X86_64_64            1       /* Direct 64 bit  */
+#define R_X86_64_PC32          2       /* PC relative 32 bit signed */
+#define R_X86_64_GOT32         3       /* 32 bit GOT entry */
+#define R_X86_64_PLT32         4       /* 32 bit PLT address */
+#define R_X86_64_COPY          5       /* Copy symbol at runtime */
+#define R_X86_64_GLOB_DAT      6       /* Create GOT entry */
+#define R_X86_64_JUMP_SLOT     7       /* Create PLT entry */
+#define R_X86_64_RELATIVE      8       /* Adjust by program base */
+#define R_X86_64_GOTPCREL      9       /* 32 bit signed PC relative
+                                          offset to GOT */
+#define R_X86_64_32            10      /* Direct 32 bit zero extended */
+#define R_X86_64_32S           11      /* Direct 32 bit sign extended */
+#define R_X86_64_16            12      /* Direct 16 bit zero extended */
+#define R_X86_64_PC16          13      /* 16 bit sign extended pc relative */
+#define R_X86_64_8             14      /* Direct 8 bit sign extended  */
+#define R_X86_64_PC8           15      /* 8 bit sign extended pc relative */
+#define R_X86_64_DTPMOD64      16      /* ID of module containing symbol */
+#define R_X86_64_DTPOFF64      17      /* Offset in module's TLS block */
+#define R_X86_64_TPOFF64       18      /* Offset in initial TLS block */
+#define R_X86_64_TLSGD         19      /* 32 bit signed PC relative offset
+                                          to two GOT entries for GD symbol */
+#define R_X86_64_TLSLD         20      /* 32 bit signed PC relative offset
+                                          to two GOT entries for LD symbol */
+#define R_X86_64_DTPOFF32      21      /* Offset in TLS block */
+#define R_X86_64_GOTTPOFF      22      /* 32 bit signed PC relative offset
+                                          to GOT entry for IE symbol */
+#define R_X86_64_TPOFF32       23      /* Offset in initial TLS block */
+#define R_X86_64_PC64          24      /* PC relative 64 bit */
+#define R_X86_64_GOTOFF64      25      /* 64 bit offset to GOT */
+#define R_X86_64_GOTPC32       26      /* 32 bit signed pc relative
+                                          offset to GOT */
+#define R_X86_64_GOT64         27      /* 64-bit GOT entry offset */
+#define R_X86_64_GOTPCREL64    28      /* 64-bit PC relative offset
+                                          to GOT entry */
+#define R_X86_64_GOTPC64       29      /* 64-bit PC relative offset to GOT */
+#define R_X86_64_GOTPLT64      30      /* like GOT64, says PLT entry needed */
+#define R_X86_64_PLTOFF64      31      /* 64-bit GOT relative offset
+                                          to PLT entry */
+#define R_X86_64_SIZE32                32      /* Size of symbol plus 32-bit addend */
+#define R_X86_64_SIZE64                33      /* Size of symbol plus 64-bit addend */
+#define R_X86_64_GOTPC32_TLSDESC 34    /* GOT offset for TLS descriptor.  */
+#define R_X86_64_TLSDESC_CALL   35     /* Marker for call through TLS
+                                          descriptor.  */
+#define R_X86_64_TLSDESC        36     /* TLS descriptor.  */
+#define R_X86_64_IRELATIVE     37      /* Adjust indirectly by program base */
+#define R_X86_64_RELATIVE64    38      /* 64-bit adjust by program base */
+
+#define R_X86_64_NUM           39
+
+
+/* AM33 relocations.  */
+#define R_MN10300_NONE         0       /* No reloc.  */
+#define R_MN10300_32           1       /* Direct 32 bit.  */
+#define R_MN10300_16           2       /* Direct 16 bit.  */
+#define R_MN10300_8            3       /* Direct 8 bit.  */
+#define R_MN10300_PCREL32      4       /* PC-relative 32-bit.  */
+#define R_MN10300_PCREL16      5       /* PC-relative 16-bit signed.  */
+#define R_MN10300_PCREL8       6       /* PC-relative 8-bit signed.  */
+#define R_MN10300_GNU_VTINHERIT        7       /* Ancient C++ vtable garbage... */
+#define R_MN10300_GNU_VTENTRY  8       /* ... collection annotation.  */
+#define R_MN10300_24           9       /* Direct 24 bit.  */
+#define R_MN10300_GOTPC32      10      /* 32-bit PCrel offset to GOT.  */
+#define R_MN10300_GOTPC16      11      /* 16-bit PCrel offset to GOT.  */
+#define R_MN10300_GOTOFF32     12      /* 32-bit offset from GOT.  */
+#define R_MN10300_GOTOFF24     13      /* 24-bit offset from GOT.  */
+#define R_MN10300_GOTOFF16     14      /* 16-bit offset from GOT.  */
+#define R_MN10300_PLT32                15      /* 32-bit PCrel to PLT entry.  */
+#define R_MN10300_PLT16                16      /* 16-bit PCrel to PLT entry.  */
+#define R_MN10300_GOT32                17      /* 32-bit offset to GOT entry.  */
+#define R_MN10300_GOT24                18      /* 24-bit offset to GOT entry.  */
+#define R_MN10300_GOT16                19      /* 16-bit offset to GOT entry.  */
+#define R_MN10300_COPY         20      /* Copy symbol at runtime.  */
+#define R_MN10300_GLOB_DAT     21      /* Create GOT entry.  */
+#define R_MN10300_JMP_SLOT     22      /* Create PLT entry.  */
+#define R_MN10300_RELATIVE     23      /* Adjust by program base.  */
+#define R_MN10300_TLS_GD       24      /* 32-bit offset for global dynamic.  */
+#define R_MN10300_TLS_LD       25      /* 32-bit offset for local dynamic.  */
+#define R_MN10300_TLS_LDO      26      /* Module-relative offset.  */
+#define R_MN10300_TLS_GOTIE    27      /* GOT offset for static TLS block
+                                          offset.  */
+#define R_MN10300_TLS_IE       28      /* GOT address for static TLS block
+                                          offset.  */
+#define R_MN10300_TLS_LE       29      /* Offset relative to static TLS
+                                          block.  */
+#define R_MN10300_TLS_DTPMOD   30      /* ID of module containing symbol.  */
+#define R_MN10300_TLS_DTPOFF   31      /* Offset in module TLS block.  */
+#define R_MN10300_TLS_TPOFF    32      /* Offset in static TLS block.  */
+#define R_MN10300_SYM_DIFF     33      /* Adjustment for next reloc as needed
+                                          by linker relaxation.  */
+#define R_MN10300_ALIGN                34      /* Alignment requirement for linker
+                                          relaxation.  */
+#define R_MN10300_NUM          35
+
+
+/* M32R relocs.  */
+#define R_M32R_NONE            0       /* No reloc. */
+#define R_M32R_16              1       /* Direct 16 bit. */
+#define R_M32R_32              2       /* Direct 32 bit. */
+#define R_M32R_24              3       /* Direct 24 bit. */
+#define R_M32R_10_PCREL                4       /* PC relative 10 bit shifted. */
+#define R_M32R_18_PCREL                5       /* PC relative 18 bit shifted. */
+#define R_M32R_26_PCREL                6       /* PC relative 26 bit shifted. */
+#define R_M32R_HI16_ULO                7       /* High 16 bit with unsigned low. */
+#define R_M32R_HI16_SLO                8       /* High 16 bit with signed low. */
+#define R_M32R_LO16            9       /* Low 16 bit. */
+#define R_M32R_SDA16           10      /* 16 bit offset in SDA. */
+#define R_M32R_GNU_VTINHERIT   11
+#define R_M32R_GNU_VTENTRY     12
+/* M32R relocs use SHT_RELA.  */
+#define R_M32R_16_RELA         33      /* Direct 16 bit. */
+#define R_M32R_32_RELA         34      /* Direct 32 bit. */
+#define R_M32R_24_RELA         35      /* Direct 24 bit. */
+#define R_M32R_10_PCREL_RELA   36      /* PC relative 10 bit shifted. */
+#define R_M32R_18_PCREL_RELA   37      /* PC relative 18 bit shifted. */
+#define R_M32R_26_PCREL_RELA   38      /* PC relative 26 bit shifted. */
+#define R_M32R_HI16_ULO_RELA   39      /* High 16 bit with unsigned low */
+#define R_M32R_HI16_SLO_RELA   40      /* High 16 bit with signed low */
+#define R_M32R_LO16_RELA       41      /* Low 16 bit */
+#define R_M32R_SDA16_RELA      42      /* 16 bit offset in SDA */
+#define R_M32R_RELA_GNU_VTINHERIT      43
+#define R_M32R_RELA_GNU_VTENTRY        44
+#define R_M32R_REL32           45      /* PC relative 32 bit.  */
+
+#define R_M32R_GOT24           48      /* 24 bit GOT entry */
+#define R_M32R_26_PLTREL       49      /* 26 bit PC relative to PLT shifted */
+#define R_M32R_COPY            50      /* Copy symbol at runtime */
+#define R_M32R_GLOB_DAT                51      /* Create GOT entry */
+#define R_M32R_JMP_SLOT                52      /* Create PLT entry */
+#define R_M32R_RELATIVE                53      /* Adjust by program base */
+#define R_M32R_GOTOFF          54      /* 24 bit offset to GOT */
+#define R_M32R_GOTPC24         55      /* 24 bit PC relative offset to GOT */
+#define R_M32R_GOT16_HI_ULO    56      /* High 16 bit GOT entry with unsigned
+                                          low */
+#define R_M32R_GOT16_HI_SLO    57      /* High 16 bit GOT entry with signed
+                                          low */
+#define R_M32R_GOT16_LO                58      /* Low 16 bit GOT entry */
+#define R_M32R_GOTPC_HI_ULO    59      /* High 16 bit PC relative offset to
+                                          GOT with unsigned low */
+#define R_M32R_GOTPC_HI_SLO    60      /* High 16 bit PC relative offset to
+                                          GOT with signed low */
+#define R_M32R_GOTPC_LO                61      /* Low 16 bit PC relative offset to
+                                          GOT */
+#define R_M32R_GOTOFF_HI_ULO   62      /* High 16 bit offset to GOT
+                                          with unsigned low */
+#define R_M32R_GOTOFF_HI_SLO   63      /* High 16 bit offset to GOT
+                                          with signed low */
+#define R_M32R_GOTOFF_LO       64      /* Low 16 bit offset to GOT */
+#define R_M32R_NUM             256     /* Keep this the last entry. */
+
+/* MicroBlaze relocations */
+#define R_MICROBLAZE_NONE              0       /* No reloc. */
+#define R_MICROBLAZE_32                1       /* Direct 32 bit. */
+#define R_MICROBLAZE_32_PCREL          2       /* PC relative 32 bit. */
+#define R_MICROBLAZE_64_PCREL          3       /* PC relative 64 bit. */
+#define R_MICROBLAZE_32_PCREL_LO       4       /* Low 16 bits of PCREL32. */
+#define R_MICROBLAZE_64                5       /* Direct 64 bit. */
+#define R_MICROBLAZE_32_LO             6       /* Low 16 bit. */
+#define R_MICROBLAZE_SRO32             7       /* Read-only small data area. */
+#define R_MICROBLAZE_SRW32             8       /* Read-write small data area. */
+#define R_MICROBLAZE_64_NONE           9       /* No reloc. */
+#define R_MICROBLAZE_32_SYM_OP_SYM     10      /* Symbol Op Symbol relocation. */
+#define R_MICROBLAZE_GNU_VTINHERIT     11      /* GNU C++ vtable hierarchy. */
+#define R_MICROBLAZE_GNU_VTENTRY       12      /* GNU C++ vtable member usage. */
+#define R_MICROBLAZE_GOTPC_64          13      /* PC-relative GOT offset.  */
+#define R_MICROBLAZE_GOT_64            14      /* GOT entry offset.  */
+#define R_MICROBLAZE_PLT_64            15      /* PLT offset (PC-relative).  */
+#define R_MICROBLAZE_REL               16      /* Adjust by program base.  */
+#define R_MICROBLAZE_JUMP_SLOT         17      /* Create PLT entry.  */
+#define R_MICROBLAZE_GLOB_DAT          18      /* Create GOT entry.  */
+#define R_MICROBLAZE_GOTOFF_64         19      /* 64 bit offset to GOT. */
+#define R_MICROBLAZE_GOTOFF_32         20      /* 32 bit offset to GOT. */
+#define R_MICROBLAZE_COPY              21      /* Runtime copy.  */
+#define R_MICROBLAZE_TLS               22      /* TLS Reloc. */
+#define R_MICROBLAZE_TLSGD             23      /* TLS General Dynamic. */
+#define R_MICROBLAZE_TLSLD             24      /* TLS Local Dynamic. */
+#define R_MICROBLAZE_TLSDTPMOD32       25      /* TLS Module ID. */
+#define R_MICROBLAZE_TLSDTPREL32       26      /* TLS Offset Within TLS Block. */
+#define R_MICROBLAZE_TLSDTPREL64       27      /* TLS Offset Within TLS Block. */
+#define R_MICROBLAZE_TLSGOTTPREL32     28      /* TLS Offset From Thread Pointer. */
+#define R_MICROBLAZE_TLSTPREL32        29      /* TLS Offset From Thread Pointer. */
+
+/* TILEPro relocations.  */
+#define R_TILEPRO_NONE         0       /* No reloc */
+#define R_TILEPRO_32           1       /* Direct 32 bit */
+#define R_TILEPRO_16           2       /* Direct 16 bit */
+#define R_TILEPRO_8            3       /* Direct 8 bit */
+#define R_TILEPRO_32_PCREL     4       /* PC relative 32 bit */
+#define R_TILEPRO_16_PCREL     5       /* PC relative 16 bit */
+#define R_TILEPRO_8_PCREL      6       /* PC relative 8 bit */
+#define R_TILEPRO_LO16         7       /* Low 16 bit */
+#define R_TILEPRO_HI16         8       /* High 16 bit */
+#define R_TILEPRO_HA16         9       /* High 16 bit, adjusted */
+#define R_TILEPRO_COPY         10      /* Copy relocation */
+#define R_TILEPRO_GLOB_DAT     11      /* Create GOT entry */
+#define R_TILEPRO_JMP_SLOT     12      /* Create PLT entry */
+#define R_TILEPRO_RELATIVE     13      /* Adjust by program base */
+#define R_TILEPRO_BROFF_X1     14      /* X1 pipe branch offset */
+#define R_TILEPRO_JOFFLONG_X1  15      /* X1 pipe jump offset */
+#define R_TILEPRO_JOFFLONG_X1_PLT 16   /* X1 pipe jump offset to PLT */
+#define R_TILEPRO_IMM8_X0      17      /* X0 pipe 8-bit */
+#define R_TILEPRO_IMM8_Y0      18      /* Y0 pipe 8-bit */
+#define R_TILEPRO_IMM8_X1      19      /* X1 pipe 8-bit */
+#define R_TILEPRO_IMM8_Y1      20      /* Y1 pipe 8-bit */
+#define R_TILEPRO_MT_IMM15_X1  21      /* X1 pipe mtspr */
+#define R_TILEPRO_MF_IMM15_X1  22      /* X1 pipe mfspr */
+#define R_TILEPRO_IMM16_X0     23      /* X0 pipe 16-bit */
+#define R_TILEPRO_IMM16_X1     24      /* X1 pipe 16-bit */
+#define R_TILEPRO_IMM16_X0_LO  25      /* X0 pipe low 16-bit */
+#define R_TILEPRO_IMM16_X1_LO  26      /* X1 pipe low 16-bit */
+#define R_TILEPRO_IMM16_X0_HI  27      /* X0 pipe high 16-bit */
+#define R_TILEPRO_IMM16_X1_HI  28      /* X1 pipe high 16-bit */
+#define R_TILEPRO_IMM16_X0_HA  29      /* X0 pipe high 16-bit, adjusted */
+#define R_TILEPRO_IMM16_X1_HA  30      /* X1 pipe high 16-bit, adjusted */
+#define R_TILEPRO_IMM16_X0_PCREL 31    /* X0 pipe PC relative 16 bit */
+#define R_TILEPRO_IMM16_X1_PCREL 32    /* X1 pipe PC relative 16 bit */
+#define R_TILEPRO_IMM16_X0_LO_PCREL 33 /* X0 pipe PC relative low 16 bit */
+#define R_TILEPRO_IMM16_X1_LO_PCREL 34 /* X1 pipe PC relative low 16 bit */
+#define R_TILEPRO_IMM16_X0_HI_PCREL 35 /* X0 pipe PC relative high 16 bit */
+#define R_TILEPRO_IMM16_X1_HI_PCREL 36 /* X1 pipe PC relative high 16 bit */
+#define R_TILEPRO_IMM16_X0_HA_PCREL 37 /* X0 pipe PC relative ha() 16 bit */
+#define R_TILEPRO_IMM16_X1_HA_PCREL 38 /* X1 pipe PC relative ha() 16 bit */
+#define R_TILEPRO_IMM16_X0_GOT 39      /* X0 pipe 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT 40      /* X1 pipe 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X0_GOT_LO 41   /* X0 pipe low 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT_LO 42   /* X1 pipe low 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X0_GOT_HI 43   /* X0 pipe high 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT_HI 44   /* X1 pipe high 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X0_GOT_HA 45   /* X0 pipe ha() 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT_HA 46   /* X1 pipe ha() 16-bit GOT offset */
+#define R_TILEPRO_MMSTART_X0   47      /* X0 pipe mm "start" */
+#define R_TILEPRO_MMEND_X0     48      /* X0 pipe mm "end" */
+#define R_TILEPRO_MMSTART_X1   49      /* X1 pipe mm "start" */
+#define R_TILEPRO_MMEND_X1     50      /* X1 pipe mm "end" */
+#define R_TILEPRO_SHAMT_X0     51      /* X0 pipe shift amount */
+#define R_TILEPRO_SHAMT_X1     52      /* X1 pipe shift amount */
+#define R_TILEPRO_SHAMT_Y0     53      /* Y0 pipe shift amount */
+#define R_TILEPRO_SHAMT_Y1     54      /* Y1 pipe shift amount */
+#define R_TILEPRO_DEST_IMM8_X1 55      /* X1 pipe destination 8-bit */
+/* Relocs 56-59 are currently not defined.  */
+#define R_TILEPRO_TLS_GD_CALL  60      /* "jal" for TLS GD */
+#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61        /* X0 pipe "addi" for TLS GD */
+#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62        /* X1 pipe "addi" for TLS GD */
+#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63        /* Y0 pipe "addi" for TLS GD */
+#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64        /* Y1 pipe "addi" for TLS GD */
+#define R_TILEPRO_TLS_IE_LOAD  65      /* "lw_tls" for TLS IE */
+#define R_TILEPRO_IMM16_X0_TLS_GD 66   /* X0 pipe 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD 67   /* X1 pipe 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68        /* X0 pipe low 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69        /* X1 pipe low 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70        /* X0 pipe high 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71        /* X1 pipe high 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72        /* X0 pipe ha() 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73        /* X1 pipe ha() 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE 74   /* X0 pipe 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE 75   /* X1 pipe 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76        /* X0 pipe low 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77        /* X1 pipe low 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78        /* X0 pipe high 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79        /* X1 pipe high 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80        /* X0 pipe ha() 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81        /* X1 pipe ha() 16-bit TLS IE offset */
+#define R_TILEPRO_TLS_DTPMOD32 82      /* ID of module containing symbol */
+#define R_TILEPRO_TLS_DTPOFF32 83      /* Offset in TLS block */
+#define R_TILEPRO_TLS_TPOFF32  84      /* Offset in static TLS block */
+#define R_TILEPRO_IMM16_X0_TLS_LE 85   /* X0 pipe 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE 86   /* X1 pipe 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87        /* X0 pipe low 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88        /* X1 pipe low 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89        /* X0 pipe high 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90        /* X1 pipe high 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91        /* X0 pipe ha() 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92        /* X1 pipe ha() 16-bit TLS LE offset */
+
+#define R_TILEPRO_GNU_VTINHERIT        128     /* GNU C++ vtable hierarchy */
+#define R_TILEPRO_GNU_VTENTRY  129     /* GNU C++ vtable member usage */
+
+#define R_TILEPRO_NUM          130
+
+
+/* TILE-Gx relocations.  */
+#define R_TILEGX_NONE          0       /* No reloc */
+#define R_TILEGX_64            1       /* Direct 64 bit */
+#define R_TILEGX_32            2       /* Direct 32 bit */
+#define R_TILEGX_16            3       /* Direct 16 bit */
+#define R_TILEGX_8             4       /* Direct 8 bit */
+#define R_TILEGX_64_PCREL      5       /* PC relative 64 bit */
+#define R_TILEGX_32_PCREL      6       /* PC relative 32 bit */
+#define R_TILEGX_16_PCREL      7       /* PC relative 16 bit */
+#define R_TILEGX_8_PCREL       8       /* PC relative 8 bit */
+#define R_TILEGX_HW0           9       /* hword 0 16-bit */
+#define R_TILEGX_HW1           10      /* hword 1 16-bit */
+#define R_TILEGX_HW2           11      /* hword 2 16-bit */
+#define R_TILEGX_HW3           12      /* hword 3 16-bit */
+#define R_TILEGX_HW0_LAST      13      /* last hword 0 16-bit */
+#define R_TILEGX_HW1_LAST      14      /* last hword 1 16-bit */
+#define R_TILEGX_HW2_LAST      15      /* last hword 2 16-bit */
+#define R_TILEGX_COPY          16      /* Copy relocation */
+#define R_TILEGX_GLOB_DAT      17      /* Create GOT entry */
+#define R_TILEGX_JMP_SLOT      18      /* Create PLT entry */
+#define R_TILEGX_RELATIVE      19      /* Adjust by program base */
+#define R_TILEGX_BROFF_X1      20      /* X1 pipe branch offset */
+#define R_TILEGX_JUMPOFF_X1    21      /* X1 pipe jump offset */
+#define R_TILEGX_JUMPOFF_X1_PLT        22      /* X1 pipe jump offset to PLT */
+#define R_TILEGX_IMM8_X0       23      /* X0 pipe 8-bit */
+#define R_TILEGX_IMM8_Y0       24      /* Y0 pipe 8-bit */
+#define R_TILEGX_IMM8_X1       25      /* X1 pipe 8-bit */
+#define R_TILEGX_IMM8_Y1       26      /* Y1 pipe 8-bit */
+#define R_TILEGX_DEST_IMM8_X1  27      /* X1 pipe destination 8-bit */
+#define R_TILEGX_MT_IMM14_X1   28      /* X1 pipe mtspr */
+#define R_TILEGX_MF_IMM14_X1   29      /* X1 pipe mfspr */
+#define R_TILEGX_MMSTART_X0    30      /* X0 pipe mm "start" */
+#define R_TILEGX_MMEND_X0      31      /* X0 pipe mm "end" */
+#define R_TILEGX_SHAMT_X0      32      /* X0 pipe shift amount */
+#define R_TILEGX_SHAMT_X1      33      /* X1 pipe shift amount */
+#define R_TILEGX_SHAMT_Y0      34      /* Y0 pipe shift amount */
+#define R_TILEGX_SHAMT_Y1      35      /* Y1 pipe shift amount */
+#define R_TILEGX_IMM16_X0_HW0  36      /* X0 pipe hword 0 */
+#define R_TILEGX_IMM16_X1_HW0  37      /* X1 pipe hword 0 */
+#define R_TILEGX_IMM16_X0_HW1  38      /* X0 pipe hword 1 */
+#define R_TILEGX_IMM16_X1_HW1  39      /* X1 pipe hword 1 */
+#define R_TILEGX_IMM16_X0_HW2  40      /* X0 pipe hword 2 */
+#define R_TILEGX_IMM16_X1_HW2  41      /* X1 pipe hword 2 */
+#define R_TILEGX_IMM16_X0_HW3  42      /* X0 pipe hword 3 */
+#define R_TILEGX_IMM16_X1_HW3  43      /* X1 pipe hword 3 */
+#define R_TILEGX_IMM16_X0_HW0_LAST 44  /* X0 pipe last hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_LAST 45  /* X1 pipe last hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_LAST 46  /* X0 pipe last hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_LAST 47  /* X1 pipe last hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_LAST 48  /* X0 pipe last hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_LAST 49  /* X1 pipe last hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_PCREL 50 /* X0 pipe PC relative hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_PCREL 51 /* X1 pipe PC relative hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_PCREL 52 /* X0 pipe PC relative hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_PCREL 53 /* X1 pipe PC relative hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_PCREL 54 /* X0 pipe PC relative hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_PCREL 55 /* X1 pipe PC relative hword 2 */
+#define R_TILEGX_IMM16_X0_HW3_PCREL 56 /* X0 pipe PC relative hword 3 */
+#define R_TILEGX_IMM16_X1_HW3_PCREL 57 /* X1 pipe PC relative hword 3 */
+#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_GOT 64   /* X0 pipe hword 0 GOT offset */
+#define R_TILEGX_IMM16_X1_HW0_GOT 65   /* X1 pipe hword 0 GOT offset */
+#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */
+#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */
+#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */
+#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */
+#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */
+#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */
+#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78        /* X0 pipe hword 0 TLS GD offset */
+#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79        /* X1 pipe hword 0 TLS GD offset */
+#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80        /* X0 pipe hword 0 TLS LE offset */
+#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81        /* X1 pipe hword 0 TLS LE offset */
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */
+/* Relocs 90-91 are currently not defined.  */
+#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92        /* X0 pipe hword 0 TLS IE offset */
+#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93        /* X1 pipe hword 0 TLS IE offset */
+#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */
+/* Relocs 104-105 are currently not defined.  */
+#define R_TILEGX_TLS_DTPMOD64  106     /* 64-bit ID of symbol's module */
+#define R_TILEGX_TLS_DTPOFF64  107     /* 64-bit offset in TLS block */
+#define R_TILEGX_TLS_TPOFF64   108     /* 64-bit offset in static TLS block */
+#define R_TILEGX_TLS_DTPMOD32  109     /* 32-bit ID of symbol's module */
+#define R_TILEGX_TLS_DTPOFF32  110     /* 32-bit offset in TLS block */
+#define R_TILEGX_TLS_TPOFF32   111     /* 32-bit offset in static TLS block */
+#define R_TILEGX_TLS_GD_CALL   112     /* "jal" for TLS GD */
+#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113        /* X0 pipe "addi" for TLS GD */
+#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114        /* X1 pipe "addi" for TLS GD */
+#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115        /* Y0 pipe "addi" for TLS GD */
+#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116        /* Y1 pipe "addi" for TLS GD */
+#define R_TILEGX_TLS_IE_LOAD   117     /* "ld_tls" for TLS IE */
+#define R_TILEGX_IMM8_X0_TLS_ADD 118   /* X0 pipe "addi" for TLS GD/IE */
+#define R_TILEGX_IMM8_X1_TLS_ADD 119   /* X1 pipe "addi" for TLS GD/IE */
+#define R_TILEGX_IMM8_Y0_TLS_ADD 120   /* Y0 pipe "addi" for TLS GD/IE */
+#define R_TILEGX_IMM8_Y1_TLS_ADD 121   /* Y1 pipe "addi" for TLS GD/IE */
+
+#define R_TILEGX_GNU_VTINHERIT 128     /* GNU C++ vtable hierarchy */
+#define R_TILEGX_GNU_VTENTRY   129     /* GNU C++ vtable member usage */
+
+#define R_TILEGX_NUM           130
+
+/* OR1K relocations */
+#define R_OR1K_NONE 0
+#define R_OR1K_32 1
+#define R_OR1K_16 2
+#define R_OR1K_8 3
+#define R_OR1K_LO_16_IN_INSN 4
+#define R_OR1K_HI_16_IN_INSN 5
+#define R_OR1K_INSN_REL_26 6
+#define R_OR1K_GNU_VTENTRY 7
+#define R_OR1K_GNU_VTINHERIT 8
+#define R_OR1K_32_PCREL 9
+#define R_OR1K_16_PCREL 10
+#define R_OR1K_8_PCREL 11
+#define R_OR1K_GOTPC_HI16 12
+#define R_OR1K_GOTPC_LO16 13
+#define R_OR1K_GOT16 14
+#define R_OR1K_PLT26 15
+#define R_OR1K_GOTOFF_HI16 16
+#define R_OR1K_GOTOFF_LO16 17
+#define R_OR1K_COPY 18
+#define R_OR1K_GLOB_DAT 19
+#define R_OR1K_JMP_SLOT 20
+#define R_OR1K_RELATIVE 21
+#define R_OR1K_TLS_GD_HI16 22
+#define R_OR1K_TLS_GD_LO16 23
+#define R_OR1K_TLS_LDM_HI16 24
+#define R_OR1K_TLS_LDM_LO16 25
+#define R_OR1K_TLS_LDO_HI16 26
+#define R_OR1K_TLS_LDO_LO16 27
+#define R_OR1K_TLS_IE_HI16 28
+#define R_OR1K_TLS_IE_LO16 29
+#define R_OR1K_TLS_LE_HI16 30
+#define R_OR1K_TLS_LE_LO16 31
+#define R_OR1K_TLS_TPOFF 32
+#define R_OR1K_TLS_DTPOFF 33
+#define R_OR1K_TLS_DTPMOD 34
+
+#define R_OR1K_NUM 35
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* elf.h */
diff --git a/misoc/software/include/dyld/link.h b/misoc/software/include/dyld/link.h
new file mode 100644 (file)
index 0000000..effa32b
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef __LINK_H
+#define __LINK_H
+
+#include <stddef.h>
+#include <elf.h>
+
+#define ElfW(type) Elf32_##type
+
+struct dl_phdr_info {
+  ElfW(Addr) dlpi_addr;
+  const char *dlpi_name;
+  const ElfW(Phdr) *dlpi_phdr;
+  ElfW(Half) dlpi_phnum;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int dl_iterate_phdr (int (*__callback) (struct dl_phdr_info *,
+                                               size_t, void *),
+                            void *__data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LINK_H */
diff --git a/misoc/software/include/hw/common.h b/misoc/software/include/hw/common.h
new file mode 100644 (file)
index 0000000..e5f9b51
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __HW_COMMON_H
+#define __HW_COMMON_H
+
+#ifdef __ASSEMBLER__
+#define MMPTR(x) x
+#else
+#define MMPTR(x) (*((volatile unsigned int *)(x)))
+#endif
+
+#endif
diff --git a/misoc/software/include/hw/ethmac_mem.h b/misoc/software/include/hw/ethmac_mem.h
new file mode 100644 (file)
index 0000000..03c7b96
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __HW_ETHMAC_MEM_H
+#define __HW_ETHMAC_MEM_H
+
+#include <generated/mem.h>
+
+#define ETHMAC_RX0_BASE        ETHMAC_BASE
+#define ETHMAC_RX1_BASE        (ETHMAC_BASE+0x0800)
+#define ETHMAC_TX0_BASE        (ETHMAC_BASE+0x1000)
+#define ETHMAC_TX1_BASE        (ETHMAC_BASE+0x1800)
+
+#endif
diff --git a/misoc/software/include/hw/flags.h b/misoc/software/include/hw/flags.h
new file mode 100644 (file)
index 0000000..911a1b6
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef __HW_FLAGS_H
+#define __HW_FLAGS_H
+
+#define UART_EV_TX     0x1
+#define UART_EV_RX     0x2
+
+#define DFII_CONTROL_SEL               0x01
+#define DFII_CONTROL_CKE               0x02
+#define DFII_CONTROL_ODT               0x04
+#define DFII_CONTROL_RESET_N   0x08
+
+#define DFII_COMMAND_CS                0x01
+#define DFII_COMMAND_WE                0x02
+#define DFII_COMMAND_CAS       0x04
+#define DFII_COMMAND_RAS       0x08
+#define DFII_COMMAND_WRDATA    0x10
+#define DFII_COMMAND_RDDATA    0x20
+
+#define ETHMAC_EV_SRAM_WRITER  0x1
+#define ETHMAC_EV_SRAM_READER  0x1
+
+#define CLKGEN_STATUS_BUSY             0x1
+#define CLKGEN_STATUS_PROGDONE 0x2
+#define CLKGEN_STATUS_LOCKED   0x4
+
+#define DVISAMPLER_TOO_LATE            0x1
+#define DVISAMPLER_TOO_EARLY   0x2
+
+#define DVISAMPLER_DELAY_MASTER_CAL    0x01
+#define DVISAMPLER_DELAY_MASTER_RST    0x02
+#define DVISAMPLER_DELAY_SLAVE_CAL     0x04
+#define DVISAMPLER_DELAY_SLAVE_RST     0x08
+#define DVISAMPLER_DELAY_INC           0x10
+#define DVISAMPLER_DELAY_DEC           0x20
+
+#define DVISAMPLER_SLOT_EMPTY  0
+#define DVISAMPLER_SLOT_LOADED 1
+#define DVISAMPLER_SLOT_PENDING        2
+
+#endif /* __HW_FLAGS_H */
diff --git a/misoc/software/include/net/microudp.h b/misoc/software/include/net/microudp.h
new file mode 100644 (file)
index 0000000..f148a34
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __MICROUDP_H
+#define __MICROUDP_H
+
+#define IPTOINT(a, b, c, d) ((a << 24)|(b << 16)|(c << 8)|d)
+
+#define MICROUDP_BUFSIZE (5*1532)
+
+typedef void (*udp_callback)(unsigned int src_ip, unsigned short src_port, unsigned short dst_port, void *data, unsigned int length);
+
+void microudp_start(const unsigned char *macaddr, unsigned int ip);
+int microudp_arp_resolve(unsigned int ip);
+void *microudp_get_tx_buffer(void);
+int microudp_send(unsigned short src_port, unsigned short dst_port, unsigned int length);
+void microudp_set_callback(udp_callback callback);
+void microudp_service(void);
+
+void eth_init(void);
+void eth_mode(void);
+
+#endif /* __MICROUDP_H */
diff --git a/misoc/software/include/net/tftp.h b/misoc/software/include/net/tftp.h
new file mode 100644 (file)
index 0000000..7babb2d
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __TFTP_H
+#define __TFTP_H
+
+#include <stdint.h>
+
+int tftp_get(uint32_t ip, const char *filename, void *buffer);
+int tftp_put(uint32_t ip, const char *filename, const void *buffer, int size);
+
+#endif /* __TFTP_H */
+
diff --git a/misoc/software/libbase/Makefile b/misoc/software/libbase/Makefile
new file mode 100644 (file)
index 0000000..c1f2434
--- /dev/null
@@ -0,0 +1,30 @@
+MSCDIR=../..
+include $(MSCDIR)/software/common.mak
+
+OBJECTS=exception.o libc.o errno.o crc16.o crc32.o console.o system.o id.o uart.o time.o qsort.o strtod.o spiflash.o
+
+all: crt0-$(CPU).o libbase.a libbase-nofloat.a
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+libbase.a: $(OBJECTS) vsnprintf.o
+       $(AR) crs libbase.a $(OBJECTS) vsnprintf.o
+
+libbase-nofloat.a: $(OBJECTS) vsnprintf-nofloat.o
+       $(AR) crs libbase-nofloat.a $(OBJECTS) vsnprintf-nofloat.o
+
+vsnprintf-nofloat.o: vsnprintf.c
+       $(call compile-dep,-DNO_FLOAT)
+
+%.o: %.c
+       $(compile-dep)
+
+%.o: %.S
+       $(assemble)
+
+.PHONY: clean
+
+clean:
+       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) crt0-$(CPU).o vsnprintf.o vsnprintf.d vsnprintf-nofloat.o vsnprintf-nofloat.d
+       $(RM) libbase.a libbase-nofloat.a .*~ *~
diff --git a/misoc/software/libbase/console.c b/misoc/software/libbase/console.c
new file mode 100644 (file)
index 0000000..17274e2
--- /dev/null
@@ -0,0 +1,80 @@
+#include <uart.h>
+#include <console.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+FILE *stdin, *stdout, *stderr;
+
+static console_write_hook write_hook;
+static console_read_hook read_hook;
+static console_read_nonblock_hook read_nonblock_hook;
+
+void console_set_write_hook(console_write_hook h)
+{
+       write_hook = h;
+}
+
+void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn)
+{
+       read_hook = r;
+       read_nonblock_hook = rn;
+}
+
+int putchar(int c)
+{
+       uart_write(c);
+       if(write_hook != NULL)
+               write_hook(c);
+       return c;
+}
+
+char readchar(void)
+{
+       while(1) {
+               if(uart_read_nonblock())
+                       return uart_read();
+               if((read_nonblock_hook != NULL) && read_nonblock_hook())
+                       return read_hook();
+       }
+}
+
+int readchar_nonblock(void)
+{
+       return (uart_read_nonblock()
+               || ((read_nonblock_hook != NULL) && read_nonblock_hook()));
+}
+
+int puts(const char *s)
+{
+       while(*s) {
+               putchar(*s);
+               s++;
+       }
+       putchar('\n');
+       return 1;
+}
+
+void putsnonl(const char *s)
+{
+       while(*s) {
+               putchar(*s);
+               s++;
+       }
+}
+
+#define PRINTF_BUFFER_SIZE 256
+
+int printf(const char *fmt, ...)
+{
+       va_list args;
+       int len;
+       char outbuf[PRINTF_BUFFER_SIZE];
+
+       va_start(args, fmt);
+       len = vscnprintf(outbuf, sizeof(outbuf), fmt, args);
+       va_end(args);
+       outbuf[len] = 0;
+       putsnonl(outbuf);
+
+       return len;
+}
diff --git a/misoc/software/libbase/crc16.c b/misoc/software/libbase/crc16.c
new file mode 100644 (file)
index 0000000..a1222e8
--- /dev/null
@@ -0,0 +1,47 @@
+#include <crc.h>
+
+static const unsigned int crc16_table[256] = {
+       0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
+       0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
+       0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
+       0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
+       0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
+       0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
+       0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
+       0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
+       0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
+       0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
+       0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
+       0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
+       0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
+       0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
+       0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
+       0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
+       0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
+       0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
+       0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
+       0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
+       0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
+       0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+       0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
+       0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
+       0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
+       0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
+       0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
+       0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
+       0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
+       0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
+       0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
+       0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
+};
+
+unsigned short crc16(const unsigned char *buffer, int len)
+{
+       unsigned short crc;
+       
+       crc = 0;
+       while(len-- > 0)
+           crc = crc16_table[((crc >> 8) ^ (*buffer++)) & 0xFF] ^ (crc << 8);
+       
+       return crc;
+}
diff --git a/misoc/software/libbase/crc32.c b/misoc/software/libbase/crc32.c
new file mode 100644 (file)
index 0000000..29b9b99
--- /dev/null
@@ -0,0 +1,81 @@
+/* crc32.c -- compute the CRC-32 of a data stream
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include <crc.h>
+
+static const unsigned int crc_table[256] = {
+       0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+       0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+       0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+       0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+       0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+       0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+       0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+       0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+       0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+       0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+       0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+       0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+       0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+       0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+       0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+       0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+       0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+       0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+       0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+       0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+       0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+       0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+       0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+       0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+       0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+       0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+       0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+       0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+       0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+       0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+       0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+       0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+       0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+       0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+       0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+       0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+       0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+       0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+       0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+       0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+       0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+       0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+       0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+       0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+       0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+       0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+       0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+       0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+       0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+       0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+       0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+       0x2d02ef8dL
+};
+
+#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
+#define DO2(buf)  DO1(buf); DO1(buf);
+#define DO4(buf)  DO2(buf); DO2(buf);
+#define DO8(buf)  DO4(buf); DO4(buf);
+
+unsigned int crc32(const unsigned char *buffer, unsigned int len)
+{
+       unsigned int crc;
+       crc = 0;
+       crc = crc ^ 0xffffffffL;
+       while(len >= 8) {
+               DO8(buffer);
+               len -= 8;
+       }
+       if(len) do {
+               DO1(buffer);
+       } while(--len);
+       return crc ^ 0xffffffffL;
+}
diff --git a/misoc/software/libbase/crt0-lm32.S b/misoc/software/libbase/crt0-lm32.S
new file mode 100644 (file)
index 0000000..e0cd715
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * LatticeMico32 C startup code.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Exception handlers - Must be 32 bytes long. */
+.section    .text, "ax", @progbits
+.global     _start
+_start:
+_reset_handler:
+       xor     r0, r0, r0
+       wcsr    IE, r0
+       mvhi    r1, hi(_reset_handler)
+       ori     r1, r1, lo(_reset_handler)
+       wcsr    EBA, r1
+       bi      _crt0
+       nop
+       nop
+
+_breakpoint_handler:
+       bi _breakpoint_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_instruction_bus_error_handler:
+       bi _instruction_bus_error_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_watchpoint_hander:
+       bi _watchpoint_hander
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_data_bus_error_handler:
+       bi _data_bus_error_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_divide_by_zero_handler:
+       bi _divide_by_zero_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_interrupt_handler:
+       sw      (sp+0), ra
+       calli   .save_all
+       calli   isr
+       bi      .restore_all_and_eret
+       nop
+       nop
+       nop
+       nop
+
+_syscall_handler:
+       bi _syscall_handler
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+
+_crt0:
+       /* Setup stack and global pointer */
+       mvhi    sp, hi(_fstack)
+       ori     sp, sp, lo(_fstack)
+
+       /* Clear BSS */
+       mvhi    r1, hi(_fbss)
+       ori     r1, r1, lo(_fbss)
+       mvhi    r3, hi(_ebss)
+       ori     r3, r3, lo(_ebss)
+.clearBSS:
+       be      r1, r3, .callMain
+       sw      (r1+0), r0
+       addi    r1, r1, 4
+       bi      .clearBSS
+
+.callMain:
+       bi      main
+
+.save_all:
+       addi    sp, sp, -56
+       sw      (sp+4), r1
+       sw      (sp+8), r2
+       sw      (sp+12), r3
+       sw      (sp+16), r4
+       sw      (sp+20), r5
+       sw      (sp+24), r6
+       sw      (sp+28), r7
+       sw      (sp+32), r8
+       sw      (sp+36), r9
+       sw      (sp+40), r10
+       sw      (sp+48), ea
+       sw      (sp+52), ba
+       /* ra needs to be moved from initial stack location */
+       lw      r1, (sp+56)
+       sw      (sp+44), r1
+       ret
+
+.restore_all_and_eret:
+       lw      r1, (sp+4)
+       lw      r2, (sp+8)
+       lw      r3, (sp+12)
+       lw      r4, (sp+16)
+       lw      r5, (sp+20)
+       lw      r6, (sp+24)
+       lw      r7, (sp+28)
+       lw      r8, (sp+32)
+       lw      r9, (sp+36)
+       lw      r10, (sp+40)
+       lw      ra, (sp+44)
+       lw      ea, (sp+48)
+       lw      ba, (sp+52)
+       addi    sp, sp, 56
+       eret
diff --git a/misoc/software/libbase/crt0-or1k.S b/misoc/software/libbase/crt0-or1k.S
new file mode 100644 (file)
index 0000000..33807f8
--- /dev/null
@@ -0,0 +1,362 @@
+/*
+ * (C) Copyright 2012, Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <spr-defs.h>
+
+#define EXCEPTION_STACK_SIZE (4*32)
+
+#define HANDLE_EXCEPTION                    ; \
+    l.addi  r1, r1, -EXCEPTION_STACK_SIZE   ; \
+    l.sw    0x1c(r1), r9                    ; \
+    l.jal   _exception_handler              ; \
+     l.nop                                  ; \
+    l.lwz   r9, 0x1c(r1)                    ; \
+    l.addi  r1, r1, EXCEPTION_STACK_SIZE    ; \
+    l.rfe                                   ; \
+     l.nop
+
+
+.section    .text, "ax", @progbits
+.global     _start
+_start:
+_reset_handler:
+    l.movhi r0, 0
+    l.movhi r1, 0
+    l.movhi r2, 0
+    l.movhi r3, 0
+    l.movhi r4, 0
+    l.movhi r5, 0
+    l.movhi r6, 0
+    l.movhi r7, 0
+    l.movhi r8, 0
+    l.movhi r9, 0
+    l.movhi r10, 0
+    l.movhi r11, 0
+    l.movhi r12, 0
+    l.movhi r13, 0
+    l.movhi r14, 0
+    l.movhi r15, 0
+    l.movhi r16, 0
+    l.movhi r17, 0
+    l.movhi r18, 0
+    l.movhi r19, 0
+    l.movhi r20, 0
+    l.movhi r21, 0
+    l.movhi r22, 0
+    l.movhi r23, 0
+    l.movhi r24, 0
+    l.movhi r25, 0
+    l.movhi r26, 0
+    l.movhi r27, 0
+    l.movhi r28, 0
+    l.movhi r29, 0
+    l.movhi r30, 0
+    l.movhi r31, 0
+
+    l.ori   r21, r0, SPR_SR_SM
+    l.mtspr r0, r21, SPR_SR
+    l.movhi r21, hi(_reset_handler)
+    l.ori   r21, r21, lo(_reset_handler)
+    l.mtspr r0, r21, SPR_EVBAR
+    /* enable caches */
+    l.jal   _cache_init
+     l.nop
+    l.j     _crt0
+     l.nop
+
+    /* bus error */
+    .org    0x200
+    HANDLE_EXCEPTION
+
+    /* data page fault */
+    .org    0x300
+    HANDLE_EXCEPTION
+
+    /* instruction page fault */
+    .org    0x400
+    HANDLE_EXCEPTION
+
+    /* tick timer */
+    .org    0x500
+    HANDLE_EXCEPTION
+
+    /* alignment */
+    .org    0x600
+    HANDLE_EXCEPTION
+
+    /* illegal instruction */
+    .org    0x700
+    HANDLE_EXCEPTION
+
+    /* external interrupt */
+    .org    0x800
+    HANDLE_EXCEPTION
+
+    /* D-TLB miss */
+    .org    0x900
+    HANDLE_EXCEPTION
+
+    /* I-TLB miss */
+    .org    0xa00
+    HANDLE_EXCEPTION
+
+    /* range */
+    .org    0xb00
+    HANDLE_EXCEPTION
+
+    /* system call */
+    .org    0xc00
+    HANDLE_EXCEPTION
+
+    /* floating point */
+    .org    0xd00
+    HANDLE_EXCEPTION
+
+    /* trap */
+    .org    0xe00
+    HANDLE_EXCEPTION
+
+    /* reserved */
+    .org    0xf00
+    HANDLE_EXCEPTION
+
+    .org 0x1000
+_crt0:
+    /* Setup stack and global pointer */
+    l.movhi    r1, hi(_fstack)
+    l.ori     r1, r1, lo(_fstack)
+
+    /* Clear BSS */
+    l.movhi    r21, hi(_fbss)
+    l.ori     r21, r21, lo(_fbss)
+    l.movhi    r3, hi(_ebss)
+    l.ori     r3, r3, lo(_ebss)
+.clearBSS:
+    l.sfeq  r21, r3
+    l.bf    .callMain
+     l.nop
+    l.sw      0(r21), r0
+    l.addi    r21, r21, 4
+    l.j      .clearBSS
+     l.nop
+
+.callMain:
+    l.j     main
+     l.nop
+
+_exception_handler:
+    l.sw    0x00(r1), r2
+    l.sw    0x04(r1), r3
+    l.sw    0x08(r1), r4
+    l.sw    0x0c(r1), r5
+    l.sw    0x10(r1), r6
+    l.sw    0x14(r1), r7
+    l.sw    0x18(r1), r8
+    l.sw    0x20(r1), r10
+    l.sw    0x24(r1), r11
+    l.sw    0x28(r1), r12
+    l.sw    0x2c(r1), r13
+    l.sw    0x30(r1), r14
+    l.sw    0x34(r1), r15
+    l.sw    0x38(r1), r16
+    l.sw    0x3c(r1), r17
+    l.sw    0x40(r1), r18
+    l.sw    0x44(r1), r19
+    l.sw    0x48(r1), r20
+    l.sw    0x4c(r1), r21
+    l.sw    0x50(r1), r22
+    l.sw    0x54(r1), r23
+    l.sw    0x58(r1), r24
+    l.sw    0x5c(r1), r25
+    l.sw    0x60(r1), r26
+    l.sw    0x64(r1), r27
+    l.sw    0x68(r1), r28
+    l.sw    0x6c(r1), r29
+    l.sw    0x70(r1), r30
+    l.sw    0x74(r1), r31
+
+    /* Save return address */
+    l.or    r14, r0, r9
+    /* Calculate exception vector from handler address */
+    l.andi  r3, r9, 0xf00
+    l.srli  r3, r3, 8
+    /* Pass saved register state */
+    l.or    r4, r0, r1
+    /* Extract exception PC */
+    l.mfspr r5, r0, SPR_EPCR_BASE
+    /* Extract exception effective address */
+    l.mfspr r6, r0, SPR_EEAR_BASE
+    /* Call exception handler with the link address as argument */
+    l.jal   exception_handler
+     l.nop
+
+    /* Load return address */
+    l.or    r9, r0, r14
+    /* Restore state */
+    l.lwz   r2, 0x00(r1)
+    l.lwz   r3, 0x04(r1)
+    l.lwz   r4, 0x08(r1)
+    l.lwz   r5, 0x0c(r1)
+    l.lwz   r6, 0x10(r1)
+    l.lwz   r7, 0x14(r1)
+    l.lwz   r8, 0x18(r1)
+    l.lwz   r10, 0x20(r1)
+    l.lwz   r11, 0x24(r1)
+    l.lwz   r12, 0x28(r1)
+    l.lwz   r13, 0x2c(r1)
+    l.lwz   r14, 0x30(r1)
+    l.lwz   r15, 0x34(r1)
+    l.lwz   r16, 0x38(r1)
+    l.lwz   r17, 0x3c(r1)
+    l.lwz   r18, 0x40(r1)
+    l.lwz   r19, 0x44(r1)
+    l.lwz   r20, 0x48(r1)
+    l.lwz   r21, 0x4c(r1)
+    l.lwz   r22, 0x50(r1)
+    l.lwz   r23, 0x54(r1)
+    l.lwz   r24, 0x58(r1)
+    l.lwz   r25, 0x5c(r1)
+    l.lwz   r26, 0x60(r1)
+    l.lwz   r27, 0x64(r1)
+    l.lwz   r28, 0x68(r1)
+    l.lwz   r29, 0x6c(r1)
+    l.lwz   r30, 0x70(r1)
+    l.lwz   r31, 0x74(r1)
+    l.jr    r9
+     l.nop
+
+.global _cache_init
+_cache_init:
+    /*
+    This function is to be used ONLY during reset, before main() is called.
+    TODO: Perhaps break into individual enable instruction/data cache
+          sections functions, and provide disable functions, also, all
+          callable from C
+    */
+
+    /* Instruction cache enable */
+    /* Check if IC present and skip enabling otherwise */
+#if 1
+.L6:
+    l.mfspr r3,r0,SPR_UPR
+    l.andi  r7,r3,SPR_UPR_ICP
+    l.sfeq  r7,r0
+    l.bf    .L8
+    l.nop
+
+    /* Disable IC */
+    l.mfspr r6,r0,SPR_SR
+    l.addi  r5,r0,-1
+    l.xori  r5,r5,SPR_SR_ICE
+    l.and   r5,r6,r5
+    l.mtspr r0,r5,SPR_SR
+
+    /* Establish cache block size
+    If BS=0, 16;
+    If BS=1, 32;
+    r14 contain block size
+    */
+    l.mfspr r3,r0,SPR_ICCFGR
+    l.andi  r7,r3,SPR_ICCFGR_CBS
+    l.srli  r8,r7,7
+    l.ori   r4,r0,16
+    l.sll   r14,r4,r8
+
+    /* Establish number of cache sets
+    r10 contains number of cache sets
+    r8 contains log(# of cache sets)
+    */
+    l.andi  r7,r3,SPR_ICCFGR_NCS
+    l.srli  r8,r7,3
+    l.ori   r4,r0,1
+    l.sll   r10,r4,r8
+
+    /* Invalidate IC */
+    l.addi  r6,r0,0
+    l.sll   r5,r14,r8
+
+.L7:    l.mtspr r0,r6,SPR_ICBIR
+    l.sfne  r6,r5
+    l.bf    .L7
+    l.add   r6,r6,r14
+
+    /* Enable IC */
+    l.mfspr r6,r0,SPR_SR
+    l.ori   r6,r6,SPR_SR_ICE
+    l.mtspr r0,r6,SPR_SR
+    l.nop
+    l.nop
+    l.nop
+    l.nop
+    l.nop
+    l.nop
+    l.nop
+    l.nop
+    /* Data cache enable */
+    /* Check if DC present and skip enabling otherwise */
+#endif
+.L8:
+#if 1
+    l.mfspr r3,r0,SPR_UPR
+    l.andi  r7,r3,SPR_UPR_DCP
+    l.sfeq  r7,r0
+    l.bf    .L10
+    l.nop
+    /* Disable DC */
+    l.mfspr r6,r0,SPR_SR
+    l.addi  r5,r0,-1
+    l.xori  r5,r5,SPR_SR_DCE
+    l.and   r5,r6,r5
+    l.mtspr r0,r5,SPR_SR
+    /* Establish cache block size
+       If BS=0, 16;
+       If BS=1, 32;
+       r14 contain block size
+    */
+    l.mfspr r3,r0,SPR_DCCFGR
+    l.andi  r7,r3,SPR_DCCFGR_CBS
+    l.srli  r8,r7,7
+    l.ori   r4,r0,16
+    l.sll   r14,r4,r8
+    /* Establish number of cache sets
+       r10 contains number of cache sets
+       r8 contains log(# of cache sets)
+    */
+    l.andi  r7,r3,SPR_DCCFGR_NCS
+    l.srli  r8,r7,3
+    l.ori   r4,r0,1
+    l.sll   r10,r4,r8
+    /* Invalidate DC */
+    l.addi  r6,r0,0
+    l.sll   r5,r14,r8
+
+.L9:
+    l.mtspr r0,r6,SPR_DCBIR
+    l.sfne  r6,r5
+    l.bf    .L9
+    l.add   r6,r6,r14
+    /* Enable DC */
+    l.mfspr r6,r0,SPR_SR
+    l.ori   r6,r6,SPR_SR_DCE
+    l.mtspr r0,r6,SPR_SR
+#endif
+.L10:
+    /* Return */
+    l.jr    r9
+    l.nop
diff --git a/misoc/software/libbase/errno.c b/misoc/software/libbase/errno.c
new file mode 100644 (file)
index 0000000..4e91f78
--- /dev/null
@@ -0,0 +1,208 @@
+#include <string.h>
+#include <errno.h>
+
+int errno;
+
+/************************************************************************
+ * Based on: lib/string/lib_strerror.c
+ *
+ *   Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ************************************************************************/
+
+struct errno_strmap_s
+{
+  int errnum;
+  char *str;
+};
+
+/* This table maps all error numbers to descriptive strings.
+ * The only assumption that the code makes with regard to this
+ * this table is that it is order by error number.
+ *
+ * The size of this table is quite large.  Its size can be
+ * reduced by eliminating some of the more obscure error
+ * strings.
+ */
+
+struct errno_strmap_s g_errnomap[] =
+{
+  { EPERM,               EPERM_STR           },
+  { ENOENT,              ENOENT_STR          },
+  { ESRCH,               ESRCH_STR           },
+  { EINTR,               EINTR_STR           },
+  { EIO,                 EIO_STR             },
+  { ENXIO,               ENXIO_STR           },
+  { E2BIG,               E2BIG_STR           },
+  { ENOEXEC,             ENOEXEC_STR         },
+  { EBADF,               EBADF_STR           },
+  { ECHILD,              ECHILD_STR          },
+  { EAGAIN,              EAGAIN_STR          },
+  { ENOMEM,              ENOMEM_STR          },
+  { EACCES,              EACCES_STR          },
+  { EFAULT,              EFAULT_STR          },
+  { ENOTBLK,             ENOTBLK_STR         },
+  { EBUSY,               EBUSY_STR           },
+  { EEXIST,              EEXIST_STR          },
+  { EXDEV,               EXDEV_STR           },
+  { ENODEV,              ENODEV_STR          },
+  { ENOTDIR,             ENOTDIR_STR         },
+  { EISDIR,              EISDIR_STR          },
+  { EINVAL,              EINVAL_STR          },
+  { ENFILE,              ENFILE_STR          },
+  { EMFILE,              EMFILE_STR          },
+  { ENOTTY,              ENOTTY_STR          },
+  { ETXTBSY,             ETXTBSY_STR         },
+  { EFBIG,               EFBIG_STR           },
+  { ENOSPC,              ENOSPC_STR          },
+  { ESPIPE,              ESPIPE_STR          },
+  { EROFS,               EROFS_STR           },
+  { EMLINK,              EMLINK_STR          },
+  { EPIPE,               EPIPE_STR           },
+  { EDOM,                EDOM_STR            },
+  { ERANGE,              ERANGE_STR          },
+  { EDEADLK,             EDEADLK_STR         },
+  { ENAMETOOLONG,        ENAMETOOLONG_STR    },
+  { ENOLCK,              ENOLCK_STR          },
+  { ENOSYS,              ENOSYS_STR          },
+  { ENOTEMPTY,           ENOTEMPTY_STR       },
+  { ELOOP,               ELOOP_STR           },
+  { ENOMSG,              ENOMSG_STR          },
+  { EIDRM,               EIDRM_STR           },
+  { ECHRNG,              ECHRNG_STR          },
+  { EL2NSYNC,            EL2NSYNC_STR        },
+  { EL3HLT,              EL3HLT_STR          },
+  { EL3RST,              EL3RST_STR          },
+  { ELNRNG,              ELNRNG_STR          },
+  { EUNATCH,             EUNATCH_STR         },
+  { ENOCSI,              ENOCSI_STR          },
+  { EL2HLT,              EL2HLT_STR          },
+  { EBADE,               EBADE_STR           },
+  { EBADR,               EBADR_STR           },
+  { EXFULL,              EXFULL_STR          },
+  { ENOANO,              ENOANO_STR          },
+  { EBADRQC,             EBADRQC_STR         },
+  { EBADSLT,             EBADSLT_STR         },
+  { EBFONT,              EBFONT_STR          },
+  { ENOSTR,              ENOSTR_STR          },
+  { ENODATA,             ENODATA_STR         },
+  { ETIME,               ETIME_STR           },
+  { ENOSR,               ENOSR_STR           },
+  { ENONET,              ENONET_STR          },
+  { ENOPKG,              ENOPKG_STR          },
+  { EREMOTE,             EREMOTE_STR         },
+  { ENOLINK,             ENOLINK_STR         },
+  { EADV,                EADV_STR            },
+  { ESRMNT,              ESRMNT_STR          },
+  { ECOMM,               ECOMM_STR           },
+  { EPROTO,              EPROTO_STR          },
+  { EMULTIHOP,           EMULTIHOP_STR       },
+  { EDOTDOT,             EDOTDOT_STR         },
+  { EBADMSG,             EBADMSG_STR         },
+  { EOVERFLOW,           EOVERFLOW_STR       },
+  { ENOTUNIQ,            ENOTUNIQ_STR        },
+  { EBADFD,              EBADFD_STR          },
+  { EREMCHG,             EREMCHG_STR         },
+  { ELIBACC,             ELIBACC_STR         },
+  { ELIBBAD,             ELIBBAD_STR         },
+  { ELIBSCN,             ELIBSCN_STR         },
+  { ELIBMAX,             ELIBMAX_STR         },
+  { ELIBEXEC,            ELIBEXEC_STR        },
+  { EILSEQ,              EILSEQ_STR          },
+  { ERESTART,            ERESTART_STR        },
+  { ESTRPIPE,            ESTRPIPE_STR        },
+  { EUSERS,              EUSERS_STR          },
+  { ENOTSOCK,            ENOTSOCK_STR        },
+  { EDESTADDRREQ,        EDESTADDRREQ_STR    },
+  { EMSGSIZE,            EMSGSIZE_STR        },
+  { EPROTOTYPE,          EPROTOTYPE_STR      },
+  { ENOPROTOOPT,         ENOPROTOOPT_STR     },
+  { EPROTONOSUPPORT,     EPROTONOSUPPORT_STR },
+  { ESOCKTNOSUPPORT,     ESOCKTNOSUPPORT_STR },
+  { EOPNOTSUPP,          EOPNOTSUPP_STR      },
+  { EPFNOSUPPORT,        EPFNOSUPPORT_STR    },
+  { EAFNOSUPPORT,        EAFNOSUPPORT_STR    },
+  { EADDRINUSE,          EADDRINUSE_STR      },
+  { EADDRNOTAVAIL,       EADDRNOTAVAIL_STR   },
+  { ENETDOWN,            ENETDOWN_STR        },
+  { ENETUNREACH,         ENETUNREACH_STR     },
+  { ENETRESET,           ENETRESET_STR       },
+  { ECONNABORTED,        ECONNABORTED_STR    },
+  { ECONNRESET,          ECONNRESET_STR      },
+  { ENOBUFS,             ENOBUFS_STR         },
+  { EISCONN,             EISCONN_STR         },
+  { ENOTCONN,            ENOTCONN_STR        },
+  { ESHUTDOWN,           ESHUTDOWN_STR       },
+  { ETOOMANYREFS,        ETOOMANYREFS_STR    },
+  { ETIMEDOUT,           ETIMEDOUT_STR       },
+  { ECONNREFUSED,        ECONNREFUSED_STR    },
+  { EHOSTDOWN,           EHOSTDOWN_STR       },
+  { EHOSTUNREACH,        EHOSTUNREACH_STR    },
+  { EALREADY,            EALREADY_STR        },
+  { EINPROGRESS,         EINPROGRESS_STR     },
+  { ESTALE,              ESTALE_STR          },
+  { EUCLEAN,             EUCLEAN_STR         },
+  { ENOTNAM,             ENOTNAM_STR         },
+  { ENAVAIL,             ENAVAIL_STR         },
+  { EISNAM,              EISNAM_STR          },
+  { EREMOTEIO,           EREMOTEIO_STR       },
+  { EDQUOT,              EDQUOT_STR          },
+  { ENOMEDIUM,           ENOMEDIUM_STR       },
+  { EMEDIUMTYPE,         EMEDIUMTYPE_STR     }
+};
+
+#define NERRNO_STRS (sizeof(g_errnomap) / sizeof(struct errno_strmap_s))
+
+char *strerror(int errnum)
+{
+  int ndxlow = 0;
+  int ndxhi  = NERRNO_STRS - 1;
+  int ndxmid;
+
+  do
+    {
+      ndxmid = (ndxlow + ndxhi) >> 1;
+      if (errnum > g_errnomap[ndxmid].errnum)
+        {
+          ndxlow = ndxmid + 1;
+        }
+      else if (errnum < g_errnomap[ndxmid].errnum)
+        {
+          ndxhi = ndxmid - 1;
+        }
+      else
+        {
+          return g_errnomap[ndxmid].str;
+        }
+    }
+  while (ndxlow <= ndxhi);
+  return "Unknown error";
+}
diff --git a/misoc/software/libbase/exception.c b/misoc/software/libbase/exception.c
new file mode 100644 (file)
index 0000000..542001a
--- /dev/null
@@ -0,0 +1,19 @@
+void isr(void);
+
+#ifdef __or1k__
+
+#define EXTERNAL_IRQ 0x8
+
+void exception_handler(unsigned long vect, unsigned long *regs,
+                       unsigned long pc, unsigned long ea);
+void exception_handler(unsigned long vect, unsigned long *regs,
+                       unsigned long pc, unsigned long ea)
+{
+       if(vect == EXTERNAL_IRQ) {
+               isr();
+       } else {
+               /* Unhandled exception */
+               for(;;);
+       }
+}
+#endif
diff --git a/misoc/software/libbase/id.c b/misoc/software/libbase/id.c
new file mode 100644 (file)
index 0000000..254aa55
--- /dev/null
@@ -0,0 +1,20 @@
+#include <generated/csr.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <id.h>
+
+void get_sysid_formatted(char *sysid)
+{
+       sysid[0] = identifier_sysid_read() >> 8;
+       sysid[1] = identifier_sysid_read();
+       sysid[2] = 0;
+}
+
+void id_print(void)
+{
+       char sysid[3];
+
+       get_sysid_formatted(sysid);
+       printf("Running on MiSoC rev. %08x (sysid:%s) at %dMHz\n", identifier_revision_read(), sysid, identifier_frequency_read()/1000000);
+}
diff --git a/misoc/software/libbase/libc.c b/misoc/software/libbase/libc.c
new file mode 100644 (file)
index 0000000..e45a79d
--- /dev/null
@@ -0,0 +1,734 @@
+/*
+ * MiSoC
+ * Copyright (C) 2007, 2008, 2009, 2010, 2011 Sebastien Bourdeauducq
+ * Copyright (C) Linus Torvalds and Linux kernel developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <limits.h>
+
+/**
+ * strchr - Find the first occurrence of a character in a string
+ * @s: The string to be searched
+ * @c: The character to search for
+ */
+char *strchr(const char *s, int c)
+{
+       for (; *s != (char)c; ++s)
+               if (*s == '\0')
+                       return NULL;
+       return (char *)s;
+}
+
+/**
+ * strpbrk - Find the first occurrence of a set of characters
+ * @cs: The string to be searched
+ * @ct: The characters to search for
+ */
+char *strpbrk(const char *cs, const char *ct)
+{
+       const char *sc1, *sc2;
+
+       for (sc1 = cs; *sc1 != '\0'; ++sc1) {
+               for (sc2 = ct; *sc2 != '\0'; ++sc2) {
+                       if (*sc1 == *sc2)
+                               return (char *)sc1;
+               }
+       }
+       return NULL;
+}
+
+/**
+ * strrchr - Find the last occurrence of a character in a string
+ * @s: The string to be searched
+ * @c: The character to search for
+ */
+char *strrchr(const char *s, int c)
+{
+       const char *p = s + strlen(s);
+       do {
+           if (*p == (char)c)
+               return (char *)p;
+       } while (--p >= s);
+       return NULL;
+}
+
+/**
+ * strnchr - Find a character in a length limited string
+ * @s: The string to be searched
+ * @count: The number of characters to be searched
+ * @c: The character to search for
+ */
+char *strnchr(const char *s, size_t count, int c)
+{
+       for (; count-- && *s != '\0'; ++s)
+               if (*s == (char)c)
+                       return (char *)s;
+       return NULL;
+}
+
+/**
+ * strcpy - Copy a %NUL terminated string
+ * @dest: Where to copy the string to
+ * @src: Where to copy the string from
+ */
+char *strcpy(char *dest, const char *src)
+{
+       char *tmp = dest;
+
+       while ((*dest++ = *src++) != '\0')
+               /* nothing */;
+       return tmp;
+}
+
+/**
+ * strncpy - Copy a length-limited, %NUL-terminated string
+ * @dest: Where to copy the string to
+ * @src: Where to copy the string from
+ * @count: The maximum number of bytes to copy
+ *
+ * The result is not %NUL-terminated if the source exceeds
+ * @count bytes.
+ *
+ * In the case where the length of @src is less than  that  of
+ * count, the remainder of @dest will be padded with %NUL.
+ *
+ */
+char *strncpy(char *dest, const char *src, size_t count)
+{
+       char *tmp = dest;
+       
+       while (count) {
+               if ((*tmp = *src) != 0)
+                       src++;
+               tmp++;
+               count--;
+       }
+       return dest;
+}
+
+/**
+ * strcmp - Compare two strings
+ * @cs: One string
+ * @ct: Another string
+ */
+int strcmp(const char *cs, const char *ct)
+{
+       signed char __res;
+
+       while (1) {
+               if ((__res = *cs - *ct++) != 0 || !*cs++)
+                       break;
+       }
+       return __res;
+}
+
+/**
+ * strncmp - Compare two strings using the first characters only
+ * @cs: One string
+ * @ct: Another string
+ * @count: Number of characters
+ */
+int strncmp(const char *cs, const char *ct, size_t count)
+{
+       signed char __res;
+       size_t n;
+
+       n = 0;
+       __res = 0;
+       while (n < count) {
+               if ((__res = *cs - *ct++) != 0 || !*cs++)
+                       break;
+               n++;
+       }
+       return __res;
+}
+
+/**
+ * strcat - Append one %NUL-terminated string to another
+ * @dest: The string to be appended to
+ * @src: The string to append to it
+ */
+char *strcat(char *dest, const char *src)
+{
+  char *tmp = dest;
+
+  while (*dest)
+    dest++;
+  while ((*dest++ = *src++) != '\0')
+    ;
+  return tmp;
+}
+
+/**
+ * strncat - Append a length-limited, %NUL-terminated string to another
+ * @dest: The string to be appended to
+ * @src: The string to append to it
+ * @count: The maximum numbers of bytes to copy
+ *
+ * Note that in contrast to strncpy(), strncat() ensures the result is
+ * terminated.
+ */
+char *strncat(char *dest, const char *src, size_t count)
+{
+  char *tmp = dest;
+
+  if (count) {
+    while (*dest)
+      dest++;
+    while ((*dest++ = *src++) != 0) {
+      if (--count == 0) {
+        *dest = '\0';
+        break;
+      }
+    }
+  }
+  return tmp;
+}
+
+/**
+ * strlen - Find the length of a string
+ * @s: The string to be sized
+ */
+size_t strlen(const char *s)
+{
+       const char *sc;
+
+       for (sc = s; *sc != '\0'; ++sc)
+               /* nothing */;
+       return sc - s;
+}
+
+/**
+ * strnlen - Find the length of a length-limited string
+ * @s: The string to be sized
+ * @count: The maximum number of bytes to search
+ */
+size_t strnlen(const char *s, size_t count)
+{
+       const char *sc;
+
+       for (sc = s; count-- && *sc != '\0'; ++sc)
+               /* nothing */;
+       return sc - s;
+}
+
+/**
+ * strspn - Calculate the length of the initial substring of @s which only contain letters in @accept
+ * @s: The string to be searched
+ * @accept: The string to search for
+ */
+size_t strspn(const char *s, const char *accept)
+{
+       const char *p;
+       const char *a;
+       size_t count = 0;
+
+       for (p = s; *p != '\0'; ++p) {
+               for (a = accept; *a != '\0'; ++a) {
+                       if (*p == *a)
+                               break;
+               }
+               if (*a == '\0')
+                       return count;
+               ++count;
+       }
+       return count;
+}
+
+/**
+ * memcmp - Compare two areas of memory
+ * @cs: One area of memory
+ * @ct: Another area of memory
+ * @count: The size of the area.
+ */
+int memcmp(const void *cs, const void *ct, size_t count)
+{
+       const unsigned char *su1, *su2;
+       int res = 0;
+
+       for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
+               if ((res = *su1 - *su2) != 0)
+                       break;
+       return res;
+}
+
+/**
+ * memset - Fill a region of memory with the given value
+ * @s: Pointer to the start of the area.
+ * @c: The byte to fill the area with
+ * @count: The size of the area.
+ */
+void *memset(void *s, int c, size_t count)
+{
+       char *xs = s;
+
+       while (count--)
+               *xs++ = c;
+       return s;
+}
+
+/**
+ * memcpy - Copies one area of memory to another
+ * @dest: Destination
+ * @src: Source
+ * @n: The size to copy.
+ */
+void *memcpy(void *to, const void *from, size_t n)
+{
+       void *xto = to;
+       size_t temp;
+
+       if(!n)
+               return xto;
+       if((long)to & 1) {
+               char *cto = to;
+               const char *cfrom = from;
+               *cto++ = *cfrom++;
+               to = cto;
+               from = cfrom;
+               n--;
+       }
+       if((long)from & 1) {
+               char *cto = to;
+               const char *cfrom = from;
+               for (; n; n--)
+                       *cto++ = *cfrom++;
+               return xto;
+       }
+       if(n > 2 && (long)to & 2) {
+               short *sto = to;
+               const short *sfrom = from;
+               *sto++ = *sfrom++;
+               to = sto;
+               from = sfrom;
+               n -= 2;
+       }
+       if((long)from & 2) {
+               short *sto = to;
+               const short *sfrom = from;
+               temp = n >> 1;
+               for (; temp; temp--)
+                       *sto++ = *sfrom++;
+               to = sto;
+               from = sfrom;
+               if(n & 1) {
+                       char *cto = to;
+                       const char *cfrom = from;
+                       *cto = *cfrom;
+               }
+               return xto;
+       }
+       temp = n >> 2;
+       if(temp) {
+               long *lto = to;
+               const long *lfrom = from;
+               for(; temp; temp--)
+                       *lto++ = *lfrom++;
+               to = lto;
+               from = lfrom;
+       }
+       if(n & 2) {
+               short *sto = to;
+               const short *sfrom = from;
+               *sto++ = *sfrom++;
+               to = sto;
+               from = sfrom;
+       }
+       if(n & 1) {
+               char *cto = to;
+               const char *cfrom = from;
+               *cto = *cfrom;
+       }
+       return xto;
+}
+
+/**
+ * memmove - Copies one area of memory to another, overlap possible
+ * @dest: Destination
+ * @src: Source
+ * @n: The size to copy.
+ */
+void *memmove(void *dest, const void *src, size_t count)
+{
+       char *tmp, *s;
+
+       if(dest <= src) {
+               tmp = (char *) dest;
+               s = (char *) src;
+               while(count--)
+                       *tmp++ = *s++;
+       } else {
+               tmp = (char *)dest + count;
+               s = (char *)src + count;
+               while(count--)
+                       *--tmp = *--s;
+       }
+
+       return dest;
+}
+
+/**
+ * strstr - Find the first substring in a %NUL terminated string
+ * @s1: The string to be searched
+ * @s2: The string to search for
+ */
+char *strstr(const char *s1, const char *s2)
+{
+       size_t l1, l2;
+
+       l2 = strlen(s2);
+       if (!l2)
+               return (char *)s1;
+       l1 = strlen(s1);
+       while (l1 >= l2) {
+               l1--;
+               if (!memcmp(s1, s2, l2))
+                       return (char *)s1;
+               s1++;
+       }
+       return NULL;
+}
+
+/**
+ * memchr - Find a character in an area of memory.
+ * @s: The memory area
+ * @c: The byte to search for
+ * @n: The size of the area.
+ *
+ * returns the address of the first occurrence of @c, or %NULL
+ * if @c is not found
+ */
+void *memchr(const void *s, int c, size_t n)
+{
+       const unsigned char *p = s;
+       while (n-- != 0) {
+               if ((unsigned char)c == *p++) {
+                       return (void *)(p - 1);
+               }
+       }
+       return NULL;
+}
+
+/**
+ * strtoul - convert a string to an unsigned long
+ * @nptr: The start of the string
+ * @endptr: A pointer to the end of the parsed string will be placed here
+ * @base: The number base to use
+ */
+unsigned long strtoul(const char *nptr, char **endptr, int base)
+{
+       unsigned long result = 0,value;
+
+       if (!base) {
+               base = 10;
+               if (*nptr == '0') {
+                       base = 8;
+                       nptr++;
+                       if ((toupper(*nptr) == 'X') && isxdigit(nptr[1])) {
+                               nptr++;
+                               base = 16;
+                       }
+               }
+       } else if (base == 16) {
+               if (nptr[0] == '0' && toupper(nptr[1]) == 'X')
+                       nptr += 2;
+       }
+       while (isxdigit(*nptr) &&
+              (value = isdigit(*nptr) ? *nptr-'0' : toupper(*nptr)-'A'+10) < base) {
+               result = result*base + value;
+               nptr++;
+       }
+       if (endptr)
+               *endptr = (char *)nptr;
+       return result;
+}
+
+/**
+ * strtol - convert a string to a signed long
+ * @nptr: The start of the string
+ * @endptr: A pointer to the end of the parsed string will be placed here
+ * @base: The number base to use
+ */
+long strtol(const char *nptr, char **endptr, int base)
+{
+       if(*nptr=='-')
+               return -strtoul(nptr+1,endptr,base);
+       return strtoul(nptr,endptr,base);
+}
+
+int skip_atoi(const char **s)
+{
+       int i=0;
+
+       while (isdigit(**s))
+               i = i*10 + *((*s)++) - '0';
+       return i;
+}
+
+char *number(char *buf, char *end, unsigned long num, int base, int size, int precision, int type)
+{
+       char c,sign,tmp[66];
+       const char *digits;
+       static const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+       static const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+       int i;
+
+       digits = (type & PRINTF_LARGE) ? large_digits : small_digits;
+       if (type & PRINTF_LEFT)
+               type &= ~PRINTF_ZEROPAD;
+       if (base < 2 || base > 36)
+               return NULL;
+       c = (type & PRINTF_ZEROPAD) ? '0' : ' ';
+       sign = 0;
+       if (type & PRINTF_SIGN) {
+               if ((signed long) num < 0) {
+                       sign = '-';
+                       num = - (signed long) num;
+                       size--;
+               } else if (type & PRINTF_PLUS) {
+                       sign = '+';
+                       size--;
+               } else if (type & PRINTF_SPACE) {
+                       sign = ' ';
+                       size--;
+               }
+       }
+       if (type & PRINTF_SPECIAL) {
+               if (base == 16)
+                       size -= 2;
+               else if (base == 8)
+                       size--;
+       }
+       i = 0;
+       if (num == 0)
+               tmp[i++]='0';
+       else while (num != 0) {
+               tmp[i++] = digits[num % base];
+               num = num / base;
+       }
+       if (i > precision)
+               precision = i;
+       size -= precision;
+       if (!(type&(PRINTF_ZEROPAD+PRINTF_LEFT))) {
+               while(size-->0) {
+                       if (buf < end)
+                               *buf = ' ';
+                       ++buf;
+               }
+       }
+       if (sign) {
+               if (buf < end)
+                       *buf = sign;
+               ++buf;
+       }
+       if (type & PRINTF_SPECIAL) {
+               if (base==8) {
+                       if (buf < end)
+                               *buf = '0';
+                       ++buf;
+               } else if (base==16) {
+                       if (buf < end)
+                               *buf = '0';
+                       ++buf;
+                       if (buf < end)
+                               *buf = digits[33];
+                       ++buf;
+               }
+       }
+       if (!(type & PRINTF_LEFT)) {
+               while (size-- > 0) {
+                       if (buf < end)
+                               *buf = c;
+                       ++buf;
+               }
+       }
+       while (i < precision--) {
+               if (buf < end)
+                       *buf = '0';
+               ++buf;
+       }
+       while (i-- > 0) {
+               if (buf < end)
+                       *buf = tmp[i];
+               ++buf;
+       }
+       while (size-- > 0) {
+               if (buf < end)
+                       *buf = ' ';
+               ++buf;
+       }
+       return buf;
+}
+
+/**
+ * vscnprintf - Format a string and place it in a buffer
+ * @buf: The buffer to place the result into
+ * @size: The size of the buffer, including the trailing null space
+ * @fmt: The format string to use
+ * @args: Arguments for the format string
+ *
+ * The return value is the number of characters which have been written into
+ * the @buf not including the trailing '\0'. If @size is <= 0 the function
+ * returns 0.
+ *
+ * Call this function if you are already dealing with a va_list.
+ * You probably want scnprintf() instead.
+ */
+int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
+{
+       int i;
+
+       i=vsnprintf(buf,size,fmt,args);
+       return (i >= size) ? (size - 1) : i;
+}
+
+
+/**
+ * snprintf - Format a string and place it in a buffer
+ * @buf: The buffer to place the result into
+ * @size: The size of the buffer, including the trailing null space
+ * @fmt: The format string to use
+ * @...: Arguments for the format string
+ *
+ * The return value is the number of characters which would be
+ * generated for the given input, excluding the trailing null,
+ * as per ISO C99.  If the return is greater than or equal to
+ * @size, the resulting string is truncated.
+ */
+int snprintf(char * buf, size_t size, const char *fmt, ...)
+{
+       va_list args;
+       int i;
+
+       va_start(args, fmt);
+       i=vsnprintf(buf,size,fmt,args);
+       va_end(args);
+       return i;
+}
+
+/**
+ * scnprintf - Format a string and place it in a buffer
+ * @buf: The buffer to place the result into
+ * @size: The size of the buffer, including the trailing null space
+ * @fmt: The format string to use
+ * @...: Arguments for the format string
+ *
+ * The return value is the number of characters written into @buf not including
+ * the trailing '\0'. If @size is <= 0 the function returns 0.
+ */
+
+int scnprintf(char * buf, size_t size, const char *fmt, ...)
+{
+       va_list args;
+       int i;
+
+       va_start(args, fmt);
+       i = vsnprintf(buf, size, fmt, args);
+       va_end(args);
+       return (i >= size) ? (size - 1) : i;
+}
+
+/**
+ * vsprintf - Format a string and place it in a buffer
+ * @buf: The buffer to place the result into
+ * @fmt: The format string to use
+ * @args: Arguments for the format string
+ *
+ * The function returns the number of characters written
+ * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
+ * buffer overflows.
+ *
+ * Call this function if you are already dealing with a va_list.
+ * You probably want sprintf() instead.
+ */
+int vsprintf(char *buf, const char *fmt, va_list args)
+{
+       return vsnprintf(buf, INT_MAX, fmt, args);
+}
+
+/**
+ * sprintf - Format a string and place it in a buffer
+ * @buf: The buffer to place the result into
+ * @fmt: The format string to use
+ * @...: Arguments for the format string
+ *
+ * The function returns the number of characters written
+ * into @buf. Use snprintf() or scnprintf() in order to avoid
+ * buffer overflows.
+ */
+int sprintf(char * buf, const char *fmt, ...)
+{
+       va_list args;
+       int i;
+
+       va_start(args, fmt);
+       i=vsnprintf(buf, INT_MAX, fmt, args);
+       va_end(args);
+       return i;
+}
+
+/* From linux/lib/ctype.c, Copyright (C) 1991, 1992  Linus Torvalds */
+const unsigned char _ctype[] = {
+_C,_C,_C,_C,_C,_C,_C,_C,                               /* 0-7 */
+_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,                        /* 8-15 */
+_C,_C,_C,_C,_C,_C,_C,_C,                               /* 16-23 */
+_C,_C,_C,_C,_C,_C,_C,_C,                               /* 24-31 */
+_S|_SP,_P,_P,_P,_P,_P,_P,_P,                           /* 32-39 */
+_P,_P,_P,_P,_P,_P,_P,_P,                               /* 40-47 */
+_D,_D,_D,_D,_D,_D,_D,_D,                               /* 48-55 */
+_D,_D,_P,_P,_P,_P,_P,_P,                               /* 56-63 */
+_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,             /* 64-71 */
+_U,_U,_U,_U,_U,_U,_U,_U,                               /* 72-79 */
+_U,_U,_U,_U,_U,_U,_U,_U,                               /* 80-87 */
+_U,_U,_U,_P,_P,_P,_P,_P,                               /* 88-95 */
+_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,             /* 96-103 */
+_L,_L,_L,_L,_L,_L,_L,_L,                               /* 104-111 */
+_L,_L,_L,_L,_L,_L,_L,_L,                               /* 112-119 */
+_L,_L,_L,_P,_P,_P,_P,_C,                               /* 120-127 */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                       /* 128-143 */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                       /* 144-159 */
+_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,   /* 160-175 */
+_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,       /* 176-191 */
+_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,       /* 192-207 */
+_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,       /* 208-223 */
+_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,       /* 224-239 */
+_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L};      /* 240-255 */
+
+/**
+ * rand - Returns a pseudo random number
+ */
+
+static unsigned int randseed;
+unsigned int rand(void)
+{
+       randseed = 129 * randseed + 907633385;
+       return randseed;
+}
+
+void srand(unsigned int seed)
+{
+       randseed = seed;
+}
+
+void abort(void)
+{
+       printf("Aborted.");
+       while(1);
+}
diff --git a/misoc/software/libbase/linker-sdram.ld b/misoc/software/libbase/linker-sdram.ld
new file mode 100644 (file)
index 0000000..b55b50f
--- /dev/null
@@ -0,0 +1,64 @@
+INCLUDE generated/output_format.ld
+ENTRY(_start)
+
+__DYNAMIC = 0;
+
+INCLUDE generated/regions.ld
+
+SECTIONS
+{
+       .text :
+       {
+               _ftext = .;
+               *(.text .stub .text.* .gnu.linkonce.t.*)
+               _etext = .;
+       } > main_ram
+
+       .got :
+       {
+               _GLOBAL_OFFSET_TABLE_ = .;
+               *(.got)
+       } > main_ram
+
+       .got.plt :
+       {
+               *(.got.plt)
+       } > main_ram
+
+       .rodata :
+       {
+               . = ALIGN(4);
+               _frodata = .;
+               *(.rodata .rodata.* .gnu.linkonce.r.*)
+               *(.rodata1)
+               _erodata = .;
+       } > main_ram
+
+       .data :
+       {
+               . = ALIGN(4);
+               _fdata = .;
+               *(.data .data.* .gnu.linkonce.d.*)
+               *(.data1)
+               *(.sdata .sdata.* .gnu.linkonce.s.*)
+               _edata = .;
+       } > main_ram
+
+       .bss :
+       {
+               . = ALIGN(4);
+               _fbss = .;
+               *(.dynsbss)
+               *(.sbss .sbss.* .gnu.linkonce.sb.*)
+               *(.scommon)
+               *(.dynbss)
+               *(.bss .bss.* .gnu.linkonce.b.*)
+               *(COMMON)
+               . = ALIGN(4);
+               _ebss = .;
+               . = ALIGN(8);
+               _heapstart = .;
+       } > main_ram
+}
+
+PROVIDE(_fstack = ORIGIN(main_ram) + LENGTH(main_ram) - 4);
diff --git a/misoc/software/libbase/qsort.c b/misoc/software/libbase/qsort.c
new file mode 100644 (file)
index 0000000..4df3987
--- /dev/null
@@ -0,0 +1,215 @@
+/****************************************************************************
+ * lib/stdlib/lib_qsort.c
+ *
+ *   Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Leveraged from:
+ *
+ *  Copyright (c) 1992, 1993
+ *  The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    This product includes software developed by the University of
+ *    California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#include <stdlib.h>
+
+#define min(a, b)  (a) < (b) ? a : b
+
+#define swapcode(TYPE, parmi, parmj, n) \
+  { \
+    long i = (n) / sizeof (TYPE); \
+    register TYPE *pi = (TYPE *) (parmi); \
+    register TYPE *pj = (TYPE *) (parmj); \
+    do { \
+      register TYPE  t = *pi; \
+      *pi++ = *pj; \
+      *pj++ = t; \
+    } while (--i > 0); \
+  }
+
+#define SWAPINIT(a, size) \
+  swaptype = ((char *)a - (char *)0) % sizeof(long) || \
+  size % sizeof(long) ? 2 : size == sizeof(long)? 0 : 1;
+
+#define swap(a, b) \
+  if (swaptype == 0) \
+    { \
+      long t = *(long *)(a); \
+      *(long *)(a) = *(long *)(b); \
+      *(long *)(b) = t; \
+    } \
+  else \
+    { \
+      swapfunc(a, b, size, swaptype); \
+    }
+
+#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
+
+static inline void swapfunc(char *a, char *b, int n, int swaptype);
+static inline char *med3(char *a, char *b, char *c,
+                         int (*compar)(const void *, const void *));
+
+static inline void swapfunc(char *a, char *b, int n, int swaptype)
+{
+  if(swaptype <= 1)
+    {
+      swapcode(long, a, b, n)
+    }
+  else
+    {
+      swapcode(char, a, b, n)
+    }
+}
+
+static inline char *med3(char *a, char *b, char *c,
+                         int (*compar)(const void *, const void *))
+{
+  return compar(a, b) < 0 ?
+         (compar(b, c) < 0 ? b : (compar(a, c) < 0 ? c : a ))
+              :(compar(b, c) > 0 ? b : (compar(a, c) < 0 ? a : c ));
+}
+
+/****************************************************************************
+ * Name: qsort
+ *
+ * Description:
+ *   Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
+ *
+ ****************************************************************************/
+
+void qsort(void *base, size_t nmemb, size_t size,
+           int(*compar)(const void *, const void *))
+{
+  char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
+  int d, r, swaptype, swap_cnt;
+
+loop:
+  SWAPINIT(base, size);
+  swap_cnt = 0;
+  if (nmemb < 7)
+    {
+      for (pm = (char *) base + size; pm < (char *) base + nmemb * size; pm += size)
+        {
+          for (pl = pm; pl > (char *) base && compar(pl - size, pl) > 0; pl -= size)
+            {
+              swap(pl, pl - size);
+            }
+        }
+      return;
+  }
+
+  pm = (char *) base + (nmemb / 2) * size;
+  if (nmemb > 7)
+    {
+      pl = base;
+      pn = (char *) base + (nmemb - 1) * size;
+      if (nmemb > 40)
+        {
+          d = (nmemb / 8) * size;
+          pl = med3(pl, pl + d, pl + 2 * d, compar);
+          pm = med3(pm - d, pm, pm + d, compar);
+          pn = med3(pn - 2 * d, pn - d, pn, compar);
+        }
+      pm = med3(pl, pm, pn, compar);
+    }
+  swap(base, pm);
+  pa = pb = (char *) base + size;
+
+  pc = pd = (char *) base + (nmemb - 1) * size;
+  for (;;)
+    {
+      while (pb <= pc && (r = compar(pb, base)) <= 0)
+        {
+          if (r == 0)
+            {
+              swap_cnt = 1;
+              swap(pa, pb);
+              pa += size;
+            }
+          pb += size;
+        }
+      while (pb <= pc && (r = compar(pc, base)) >= 0)
+        {
+          if (r == 0)
+            {
+              swap_cnt = 1;
+              swap(pc, pd);
+              pd -= size;
+            }
+          pc -= size;
+        }
+
+      if (pb > pc)
+        {
+          break;
+        }
+
+      swap(pb, pc);
+      swap_cnt = 1;
+      pb += size;
+      pc -= size;
+    }
+
+  if (swap_cnt == 0)
+    {
+      /* Switch to insertion sort */
+
+      for (pm = (char *) base + size; pm < (char *) base + nmemb * size; pm += size)
+        {
+          for (pl = pm; pl > (char *) base && compar(pl - size, pl) > 0; pl -= size)
+            {
+              swap(pl, pl - size);
+            }
+        }
+      return;
+    }
+
+  pn = (char *) base + nmemb * size;
+  r = min(pa - (char *)base, pb - pa);
+  vecswap(base, pb - r, r);
+  r = min(pd - pc, pn - pd - size);
+  vecswap(pb, pn - r, r);
+
+  if ((r = pb - pa) > size)
+    {
+      qsort(base, r / size, size, compar);
+    }
+
+  if ((r = pd - pc) > size)
+    {
+      /* Iterate rather than recurse to save stack space */
+      base = pn - r;
+      nmemb = r / size;
+      goto loop;
+    }
+}
+
diff --git a/misoc/software/libbase/spiflash.c b/misoc/software/libbase/spiflash.c
new file mode 100644 (file)
index 0000000..31d56a1
--- /dev/null
@@ -0,0 +1,141 @@
+#include <generated/csr.h>
+
+#if (defined CSR_SPIFLASH_BASE && defined SPIFLASH_PAGE_SIZE)
+
+#include <spiflash.h>
+
+#define PAGE_PROGRAM_CMD 0x02
+#define WRDI_CMD         0x04
+#define RDSR_CMD         0x05
+#define WREN_CMD         0x06
+#define SE_CMD           0xd8
+
+#define BITBANG_CLK         (1 << 1)
+#define BITBANG_CS_N        (1 << 2)
+#define BITBANG_DQ_INPUT    (1 << 3)
+
+#define SR_WIP              1
+
+static void flash_write_byte(unsigned char b);
+static void flash_write_addr(unsigned int addr);
+static void wait_for_device_ready(void);
+
+#define min(a,b)  (a>b?b:a)
+
+static void flash_write_byte(unsigned char b)
+{
+    int i;
+    spiflash_bitbang_write(0); // ~CS_N ~CLK
+
+    for(i = 0; i < 8; i++, b <<= 1) {
+
+        spiflash_bitbang_write((b & 0x80) >> 7);
+        spiflash_bitbang_write(((b & 0x80) >> 7) | BITBANG_CLK);
+    }
+
+    spiflash_bitbang_write(0); // ~CS_N ~CLK
+
+}
+
+static void flash_write_addr(unsigned int addr)
+{
+    int i;
+    spiflash_bitbang_write(0);
+
+    for(i = 0; i < 24; i++, addr <<= 1) {
+        spiflash_bitbang_write((addr & 0x800000) >> 23);
+        spiflash_bitbang_write(((addr & 0x800000) >> 23) | BITBANG_CLK);
+    }
+
+    spiflash_bitbang_write(0);
+}
+
+static void wait_for_device_ready(void)
+{
+    unsigned char sr;
+    unsigned char i;
+    do {
+        sr = 0;
+        flash_write_byte(RDSR_CMD);
+        spiflash_bitbang_write(BITBANG_DQ_INPUT);
+        for(i = 0; i < 8; i++) {
+            sr <<= 1;
+            spiflash_bitbang_write(BITBANG_CLK | BITBANG_DQ_INPUT);
+            sr |= spiflash_miso_read();
+            spiflash_bitbang_write(0           | BITBANG_DQ_INPUT);
+        }
+        spiflash_bitbang_write(0);
+        spiflash_bitbang_write(BITBANG_CS_N);
+    } while(sr & SR_WIP);
+}
+
+void erase_flash_sector(unsigned int addr)
+{
+    unsigned int sector_addr = addr & ~(SPIFLASH_SECTOR_SIZE - 1);
+
+    spiflash_bitbang_en_write(1);
+
+    wait_for_device_ready();
+
+    flash_write_byte(WREN_CMD);
+    spiflash_bitbang_write(BITBANG_CS_N);
+
+    flash_write_byte(SE_CMD);
+    flash_write_addr(sector_addr);
+    spiflash_bitbang_write(BITBANG_CS_N);
+
+    wait_for_device_ready();
+
+    spiflash_bitbang_en_write(0);
+}
+
+void write_to_flash_page(unsigned int addr, const unsigned char *c, unsigned int len)
+{
+    unsigned int i;
+
+    if(len > SPIFLASH_PAGE_SIZE)
+        len = SPIFLASH_PAGE_SIZE;
+
+    spiflash_bitbang_en_write(1);
+
+    wait_for_device_ready();
+
+    flash_write_byte(WREN_CMD);
+    spiflash_bitbang_write(BITBANG_CS_N);
+    flash_write_byte(PAGE_PROGRAM_CMD);
+    flash_write_addr((unsigned int)addr);
+    for(i = 0; i < len; i++)
+        flash_write_byte(*c++);
+
+    spiflash_bitbang_write(BITBANG_CS_N);
+    spiflash_bitbang_write(0);
+
+    wait_for_device_ready();
+
+    spiflash_bitbang_en_write(0);
+}
+
+#define SPIFLASH_PAGE_MASK (SPIFLASH_PAGE_SIZE - 1)
+
+void write_to_flash(unsigned int addr, const unsigned char *c, unsigned int len)
+{
+   unsigned int written = 0;
+
+   if(addr & SPIFLASH_PAGE_MASK) {
+       written = min(SPIFLASH_PAGE_SIZE - (addr & SPIFLASH_PAGE_MASK), len);
+       write_to_flash_page(addr, c, written);
+       c += written;
+       addr += written;
+       len -= written;
+   }
+
+   while(len > 0) {
+       written = min(len, SPIFLASH_PAGE_SIZE);
+       write_to_flash_page(addr, c, written);
+       c += written;
+       addr += written;
+       len -= written;
+   }
+}
+
+#endif /* CSR_SPIFLASH_BASE && SPIFLASH_PAGE_SIZE */
diff --git a/misoc/software/libbase/strtod.c b/misoc/software/libbase/strtod.c
new file mode 100644 (file)
index 0000000..e79a1ee
--- /dev/null
@@ -0,0 +1,234 @@
+/****************************************************************************
+ * lib/string/lib_strtod.c
+ * Convert string to double
+ *
+ *   Copyright (C) 2002 Michael Ringgaard. All rights reserved.
+ *   Copyright (C) 2006-2007 H. Peter Anvin.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+
+/****************************************************************************
+ * Pre-processor definitions
+ ****************************************************************************/
+
+/* These are predefined with GCC, but could be issues for other compilers. If
+ * not defined, an arbitrary big number is put in for now.  These should be
+ * added to nuttx/compiler for your compiler.
+ */
+
+#if !defined(__DBL_MIN_EXP__) || !defined(__DBL_MAX_EXP__)
+#  ifdef CONFIG_CPP_HAVE_WARNING
+#    warning "Size of exponent is unknown"
+#  endif
+#  undef  __DBL_MIN_EXP__
+#  define __DBL_MIN_EXP__ (-1021)
+#  undef  __DBL_MAX_EXP__
+#  define __DBL_MAX_EXP__ (1024)
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static inline int is_real(double x)
+{
+  const double infinite = 1.0/0.0;
+  return (x < infinite) && (x >= -infinite);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/***************************************************(************************
+ * Name: strtod
+ *
+ * Description:
+ *   Convert a string to a double value
+ *
+ ****************************************************************************/
+
+double strtod(const char *str, char **endptr)
+{
+  double number;
+  int exponent;
+  int negative;
+  char *p = (char *) str;
+  double p10;
+  int n;
+  int num_digits;
+  int num_decimals;
+  const double infinite = 1.0/0.0;
+
+  /* Skip leading whitespace */
+
+  while (isspace(*p))
+    {
+      p++;
+    }
+
+  /* Handle optional sign */
+
+  negative = 0;
+  switch (*p)
+    {
+    case '-':
+      negative = 1; /* Fall through to increment position */
+    case '+':
+      p++;
+    }
+
+  number       = 0.;
+  exponent     = 0;
+  num_digits   = 0;
+  num_decimals = 0;
+
+  /* Process string of digits */
+
+  while (isdigit(*p))
+    {
+      number = number * 10. + (*p - '0');
+      p++;
+      num_digits++;
+    }
+
+  /* Process decimal part */
+
+  if (*p == '.')
+    {
+      p++;
+
+      while (isdigit(*p))
+      {
+        number = number * 10. + (*p - '0');
+        p++;
+        num_digits++;
+        num_decimals++;
+      }
+
+      exponent -= num_decimals;
+    }
+
+  if (num_digits == 0)
+    {
+      errno = ERANGE;
+      return 0.0;
+    }
+
+  /* Correct for sign */
+
+  if (negative)
+    {
+      number = -number;
+    }
+
+  /* Process an exponent string */
+
+  if (*p == 'e' || *p == 'E')
+    {
+      /* Handle optional sign */
+
+      negative = 0;
+      switch(*++p)
+        {
+        case '-':
+          negative = 1;   /* Fall through to increment pos */
+        case '+':
+          p++;
+        }
+
+      /* Process string of digits */
+
+      n = 0;
+      while (isdigit(*p))
+        {
+          n = n * 10 + (*p - '0');
+          p++;
+        }
+
+      if (negative)
+        {
+          exponent -= n;
+        }
+      else
+        {
+          exponent += n;
+        }
+    }
+
+  if (exponent < __DBL_MIN_EXP__ ||
+      exponent > __DBL_MAX_EXP__)
+    {
+      errno = ERANGE;
+      return infinite;
+    }
+
+  /* Scale the result */
+
+  p10 = 10.;
+  n = exponent;
+  if (n < 0) n = -n;
+  while (n)
+    {
+      if (n & 1)
+        {
+          if (exponent < 0)
+            {
+              number /= p10;
+            }
+          else
+            {
+              number *= p10;
+            }
+        }
+      n >>= 1;
+      p10 *= p10;
+    }
+
+  if (!is_real(number))
+    {
+      errno = ERANGE;
+    }
+
+  if (endptr)
+    {
+      *endptr = p;
+    }
+
+  return number;
+}
+
diff --git a/misoc/software/libbase/system.c b/misoc/software/libbase/system.c
new file mode 100644 (file)
index 0000000..c973653
--- /dev/null
@@ -0,0 +1,88 @@
+#include <irq.h>
+#include <uart.h>
+#ifdef __or1k__
+#include <spr-defs.h>
+#endif
+
+#include <system.h>
+#include <generated/mem.h>
+#include <generated/csr.h>
+
+void flush_cpu_icache(void)
+{
+#if defined (__lm32__)
+       asm volatile(
+               "wcsr ICC, r0\n"
+               "nop\n"
+               "nop\n"
+               "nop\n"
+               "nop\n"
+       );
+#elif defined (__or1k__)
+       unsigned long iccfgr;
+       unsigned long cache_set_size;
+       unsigned long cache_ways;
+       unsigned long cache_block_size;
+       unsigned long cache_size;
+       int i;
+
+       iccfgr = mfspr(SPR_ICCFGR);
+       cache_ways = 1 << (iccfgr & SPR_ICCFGR_NCW);
+       cache_set_size = 1 << ((iccfgr & SPR_ICCFGR_NCS) >> 3);
+       cache_block_size = (iccfgr & SPR_ICCFGR_CBS) ? 32 : 16;
+       cache_size = cache_set_size * cache_ways * cache_block_size;
+
+       for (i = 0; i < cache_size; i += cache_block_size)
+               mtspr(SPR_ICBIR, i);
+#else
+#error Unsupported architecture
+#endif
+}
+
+void flush_cpu_dcache(void)
+{
+#if defined (__lm32__)
+       asm volatile(
+               "wcsr DCC, r0\n"
+               "nop\n"
+       );
+#elif defined (__or1k__)
+       unsigned long dccfgr;
+       unsigned long cache_set_size;
+       unsigned long cache_ways;
+       unsigned long cache_block_size;
+       unsigned long cache_size;
+       int i;
+
+       dccfgr = mfspr(SPR_DCCFGR);
+       cache_ways = 1 << (dccfgr & SPR_ICCFGR_NCW);
+       cache_set_size = 1 << ((dccfgr & SPR_DCCFGR_NCS) >> 3);
+       cache_block_size = (dccfgr & SPR_DCCFGR_CBS) ? 32 : 16;
+       cache_size = cache_set_size * cache_ways * cache_block_size;
+
+       for (i = 0; i < cache_size; i += cache_block_size)
+               mtspr(SPR_DCBIR, i);
+#else
+#error Unsupported architecture
+#endif
+}
+
+#ifdef L2_SIZE
+void flush_l2_cache(void)
+{
+       unsigned int i;
+       register unsigned int addr;
+       register unsigned int dummy;
+
+       for(i=0;i<2*L2_SIZE/4;i++) {
+               addr = MAIN_RAM_BASE + i*4;
+#if defined (__lm32__)
+               __asm__ volatile("lw %0, (%1+0)\n":"=r"(dummy):"r"(addr));
+#elif defined (__or1k__)
+               __asm__ volatile("l.lwz %0, 0(%1)\n":"=r"(dummy):"r"(addr));
+#else
+#error Unsupported architecture
+#endif
+       }
+}
+#endif
diff --git a/misoc/software/libbase/time.c b/misoc/software/libbase/time.c
new file mode 100644 (file)
index 0000000..4bf9547
--- /dev/null
@@ -0,0 +1,33 @@
+#include <generated/csr.h>
+#include <time.h>
+
+void time_init(void)
+{
+       int t;
+
+       timer0_en_write(0);
+       t = 2*identifier_frequency_read();
+       timer0_reload_write(t);
+       timer0_load_write(t);
+       timer0_en_write(1);
+}
+
+int elapsed(int *last_event, int period)
+{
+       int t, dt;
+
+       timer0_update_value_write(1);
+       t = timer0_reload_read() - timer0_value_read();
+       if(period < 0) {
+               *last_event = t;
+               return 1;
+       }
+       dt = t - *last_event;
+       if(dt < 0)
+               dt += timer0_reload_read();
+       if((dt > period) || (dt < 0)) {
+               *last_event = t;
+               return 1;
+       } else
+               return 0;
+}
diff --git a/misoc/software/libbase/uart.c b/misoc/software/libbase/uart.c
new file mode 100644 (file)
index 0000000..921459f
--- /dev/null
@@ -0,0 +1,110 @@
+#include <uart.h>
+#include <irq.h>
+#include <generated/csr.h>
+#include <hw/flags.h>
+
+/*
+ * Buffer sizes must be a power of 2 so that modulos can be computed
+ * with logical AND.
+ */
+
+#define UART_RINGBUFFER_SIZE_RX 128
+#define UART_RINGBUFFER_MASK_RX (UART_RINGBUFFER_SIZE_RX-1)
+
+static char rx_buf[UART_RINGBUFFER_SIZE_RX];
+static volatile unsigned int rx_produce;
+static unsigned int rx_consume;
+
+#define UART_RINGBUFFER_SIZE_TX 128
+#define UART_RINGBUFFER_MASK_TX (UART_RINGBUFFER_SIZE_TX-1)
+
+static char tx_buf[UART_RINGBUFFER_SIZE_TX];
+static unsigned int tx_produce;
+static volatile unsigned int tx_consume;
+
+void uart_isr(void)
+{
+       unsigned int stat, rx_produce_next;
+
+       stat = uart_ev_pending_read();
+
+       if(stat & UART_EV_RX) {
+               while(!uart_rxempty_read()) {
+                       rx_produce_next = (rx_produce + 1) & UART_RINGBUFFER_MASK_RX;
+                       if(rx_produce_next != rx_consume) {
+                               rx_buf[rx_produce] = uart_rxtx_read();
+                               rx_produce = rx_produce_next;
+                       }
+                       uart_ev_pending_write(UART_EV_RX);
+               }
+       }
+
+       if(stat & UART_EV_TX) {
+               uart_ev_pending_write(UART_EV_TX);
+               while((tx_consume != tx_produce) && !uart_txfull_read()) {
+                       uart_rxtx_write(tx_buf[tx_consume]);
+                       tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;
+               }
+       }
+}
+
+/* Do not use in interrupt handlers! */
+char uart_read(void)
+{
+       char c;
+
+       if(irq_getie()) {
+               while(rx_consume == rx_produce);
+       } else if (rx_consume == rx_produce) {
+               return 0;
+       }
+
+       c = rx_buf[rx_consume];
+       rx_consume = (rx_consume + 1) & UART_RINGBUFFER_MASK_RX;
+       return c;
+}
+
+int uart_read_nonblock(void)
+{
+       return (rx_consume != rx_produce);
+}
+
+void uart_write(char c)
+{
+       unsigned int oldmask;
+       unsigned int tx_produce_next = (tx_produce + 1) & UART_RINGBUFFER_MASK_TX;
+
+       if(irq_getie()) {
+               while(tx_produce_next == tx_consume);
+       } else if(tx_produce_next == tx_consume) {
+               return;
+       }
+
+       oldmask = irq_getmask();
+       irq_setmask(oldmask & ~(1 << UART_INTERRUPT));
+       if((tx_consume != tx_produce) || uart_txfull_read()) {
+               tx_buf[tx_produce] = c;
+               tx_produce = tx_produce_next;
+       } else {
+               uart_rxtx_write(c);
+       }
+       irq_setmask(oldmask);
+}
+
+void uart_init(void)
+{
+       rx_produce = 0;
+       rx_consume = 0;
+
+       tx_produce = 0;
+       tx_consume = 0;
+
+       uart_ev_pending_write(uart_ev_pending_read());
+       uart_ev_enable_write(UART_EV_TX | UART_EV_RX);
+       irq_setmask(irq_getmask() | (1 << UART_INTERRUPT));
+}
+
+void uart_sync(void)
+{
+       while(tx_consume != tx_produce);
+}
diff --git a/misoc/software/libbase/vsnprintf.c b/misoc/software/libbase/vsnprintf.c
new file mode 100644 (file)
index 0000000..2192974
--- /dev/null
@@ -0,0 +1,328 @@
+/*
+ * MiSoC
+ * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) Linux kernel developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+/**
+ * vsnprintf - Format a string and place it in a buffer
+ * @buf: The buffer to place the result into
+ * @size: The size of the buffer, including the trailing null space
+ * @fmt: The format string to use
+ * @args: Arguments for the format string
+ *
+ * The return value is the number of characters which would
+ * be generated for the given input, excluding the trailing
+ * '\0', as per ISO C99. If you want to have the exact
+ * number of characters written into @buf as return value
+ * (not including the trailing '\0'), use vscnprintf(). If the
+ * return is greater than or equal to @size, the resulting
+ * string is truncated.
+ *
+ * Call this function if you are already dealing with a va_list.
+ * You probably want snprintf() instead.
+ */
+int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
+{
+       int len;
+       unsigned long long num;
+       int i, base;
+       char *str, *end, c;
+       const char *s;
+
+       int flags;              /* flags to number() */
+
+       int field_width;        /* width of output field */
+       int precision;          /* min. # of digits for integers; max
+                                  number of chars for from string */
+       int qualifier;          /* 'h', 'l', or 'L' for integer fields */
+                               /* 'z' support added 23/7/1999 S.H.    */
+                               /* 'z' changed to 'Z' --davidm 1/25/99 */
+                               /* 't' added for ptrdiff_t */
+
+       /* Reject out-of-range values early.  Large positive sizes are
+          used for unknown buffer sizes. */
+       if (unlikely((int) size < 0))
+               return 0;
+
+       str = buf;
+       end = buf + size;
+
+       /* Make sure end is always >= buf */
+       if (end < buf) {
+               end = ((void *)-1);
+               size = end - buf;
+       }
+
+       for (; *fmt ; ++fmt) {
+               if (*fmt != '%') {
+                       if (str < end)
+                               *str = *fmt;
+                       ++str;
+                       continue;
+               }
+
+               /* process flags */
+               flags = 0;
+               repeat:
+                       ++fmt;          /* this also skips first '%' */
+                       switch (*fmt) {
+                               case '-': flags |= PRINTF_LEFT; goto repeat;
+                               case '+': flags |= PRINTF_PLUS; goto repeat;
+                               case ' ': flags |= PRINTF_SPACE; goto repeat;
+                               case '#': flags |= PRINTF_SPECIAL; goto repeat;
+                               case '0': flags |= PRINTF_ZEROPAD; goto repeat;
+                       }
+
+               /* get field width */
+               field_width = -1;
+               if (isdigit(*fmt))
+                       field_width = skip_atoi(&fmt);
+               else if (*fmt == '*') {
+                       ++fmt;
+                       /* it's the next argument */
+                       field_width = va_arg(args, int);
+                       if (field_width < 0) {
+                               field_width = -field_width;
+                               flags |= PRINTF_LEFT;
+                       }
+               }
+
+               /* get the precision */
+               precision = -1;
+               if (*fmt == '.') {
+                       ++fmt;  
+                       if (isdigit(*fmt))
+                               precision = skip_atoi(&fmt);
+                       else if (*fmt == '*') {
+                               ++fmt;
+                               /* it's the next argument */
+                               precision = va_arg(args, int);
+                       }
+                       if (precision < 0)
+                               precision = 0;
+               }
+
+               /* get the conversion qualifier */
+               qualifier = -1;
+               if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
+                   *fmt =='Z' || *fmt == 'z' || *fmt == 't') {
+                       qualifier = *fmt;
+                       ++fmt;
+                       if (qualifier == 'l' && *fmt == 'l') {
+                               qualifier = 'L';
+                               ++fmt;
+                       }
+               }
+
+               /* default base */
+               base = 10;
+
+               switch (*fmt) {
+                       case 'c':
+                               if (!(flags & PRINTF_LEFT)) {
+                                       while (--field_width > 0) {
+                                               if (str < end)
+                                                       *str = ' ';
+                                               ++str;
+                                       }
+                               }
+                               c = (unsigned char) va_arg(args, int);
+                               if (str < end)
+                                       *str = c;
+                               ++str;
+                               while (--field_width > 0) {
+                                       if (str < end)
+                                               *str = ' ';
+                                       ++str;
+                               }
+                               continue;
+
+                       case 's':
+                               s = va_arg(args, char *);
+                               if (s == NULL)
+                                       s = "<NULL>";
+
+                               len = strnlen(s, precision);
+
+                               if (!(flags & PRINTF_LEFT)) {
+                                       while (len < field_width--) {
+                                               if (str < end)
+                                                       *str = ' ';
+                                               ++str;
+                                       }
+                               }
+                               for (i = 0; i < len; ++i) {
+                                       if (str < end)
+                                               *str = *s;
+                                       ++str; ++s;
+                               }
+                               while (len < field_width--) {
+                                       if (str < end)
+                                               *str = ' ';
+                                       ++str;
+                               }
+                               continue;
+
+                       case 'p':
+                               if (field_width == -1) {
+                                       field_width = 2*sizeof(void *);
+                                       flags |= PRINTF_ZEROPAD;
+                               }
+                               str = number(str, end,
+                                               (unsigned long) va_arg(args, void *),
+                                               16, field_width, precision, flags);
+                               continue;
+
+#ifndef NO_FLOAT
+                       case 'g':
+                       case 'f': {
+                               int m;
+                               double f;
+                               int integer;
+                               
+                               f = va_arg(args, double);
+                               if(f < 0.0) {
+                                       *str = '-';
+                                       str++;
+                                       f = -f;
+                               }
+
+                               integer = f;
+                               if(integer > 0) {
+                                       m = 1;
+                                       while(integer > (m*10)) m *= 10;
+                                       while((m >= 1) && (str < end)) {
+                                               int n;
+                                               n = integer/m;
+                                               *str = '0' + n;
+                                               str++;
+                                               f = f - m*n;
+                                               integer = integer - m*n;
+                                               m /= 10;
+                                       }
+                               } else if(str < end) {
+                                       *str = '0';
+                                       str++;
+                               }
+
+                               if(str < end) {
+                                       *str = '.';
+                                       str++;
+                               }
+
+                               for(i=0;i<6;i++) {
+                                       int n;
+
+                                       f = f*10.0;
+                                       n = f;
+                                       f = f - n;
+                                       if(str >= end) break;
+                                       *str = '0' + n;
+                                       str++;
+                               }
+                               
+                               continue;
+                       }
+#endif
+
+                       case 'n':
+                               /* FIXME:
+                                * What does C99 say about the overflow case here? */
+                               if (qualifier == 'l') {
+                                       long * ip = va_arg(args, long *);
+                                       *ip = (str - buf);
+                               } else if (qualifier == 'Z' || qualifier == 'z') {
+                                       size_t * ip = va_arg(args, size_t *);
+                                       *ip = (str - buf);
+                               } else {
+                                       int * ip = va_arg(args, int *);
+                                       *ip = (str - buf);
+                               }
+                               continue;
+
+                       case '%':
+                               if (str < end)
+                                       *str = '%';
+                               ++str;
+                               continue;
+
+                               /* integer number formats - set up the flags and "break" */
+                       case 'o':
+                               base = 8;
+                               break;
+
+                       case 'X':
+                               flags |= PRINTF_LARGE;
+                       case 'x':
+                               base = 16;
+                               break;
+
+                       case 'd':
+                       case 'i':
+                               flags |= PRINTF_SIGN;
+                       case 'u':
+                               break;
+
+                       default:
+                               if (str < end)
+                                       *str = '%';
+                               ++str;
+                               if (*fmt) {
+                                       if (str < end)
+                                               *str = *fmt;
+                                       ++str;
+                               } else {
+                                       --fmt;
+                               }
+                               continue;
+               }
+               if (qualifier == 'L')
+                       num = va_arg(args, long long);
+               else if (qualifier == 'l') {
+                       num = va_arg(args, unsigned long);
+                       if (flags & PRINTF_SIGN)
+                               num = (signed long) num;
+               } else if (qualifier == 'Z' || qualifier == 'z') {
+                       num = va_arg(args, size_t);
+               } else if (qualifier == 't') {
+                       num = va_arg(args, ptrdiff_t);
+               } else if (qualifier == 'h') {
+                       num = (unsigned short) va_arg(args, int);
+                       if (flags & PRINTF_SIGN)
+                               num = (signed short) num;
+               } else {
+                       num = va_arg(args, unsigned int);
+                       if (flags & PRINTF_SIGN)
+                               num = (signed int) num;
+               }
+               str = number(str, end, num, base,
+                               field_width, precision, flags);
+       }
+       if (size > 0) {
+               if (str < end)
+                       *str = '\0';
+               else
+                       end[-1] = '\0';
+       }
+       /* the trailing null byte doesn't count towards the total */
+       return str-buf;
+}
diff --git a/misoc/software/libcompiler-rt/Makefile b/misoc/software/libcompiler-rt/Makefile
new file mode 100644 (file)
index 0000000..917c0ae
--- /dev/null
@@ -0,0 +1,24 @@
+MSCDIR=../..
+include $(MSCDIR)/software/common.mak
+
+CFLAGS+=-D_YUGA_LITTLE_ENDIAN=0 -D_YUGA_BIG_ENDIAN=1 -Wno-missing-prototypes
+
+OBJECTS=divsi3.o modsi3.o comparedf2.o negsf2.o negdf2.o addsf3.o subsf3.o mulsf3.o divsf3.o lshrdi3.o muldi3.o divdi3.o ashldi3.o ashrdi3.o udivmoddi4.o \
+  floatsisf.o floatunsisf.o fixsfsi.o fixdfdi.o fixunssfsi.o adddf3.o subdf3.o muldf3.o divdf3.o floatsidf.o floatunsidf.o floatdidf.o fixdfsi.o fixunsdfsi.o \
+  clzsi2.o ctzsi2.o udivdi3.o umoddi3.o moddi3.o ucmpdi2.o
+
+all: libcompiler-rt.a
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+libcompiler-rt.a: $(OBJECTS)
+       $(AR) crs libcompiler-rt.a $(OBJECTS)
+
+%.o: $(MSCDIR)/software/compiler-rt/lib/builtins/%.c
+       $(compile-dep)
+
+.PHONY: clean
+
+clean:
+       $(RM) $(OBJECTS) $(OBJECTS:.o=.ts) $(OBJECTS:.o=.d) libcompiler-rt.a .*~ *~
diff --git a/misoc/software/libdyld/Makefile b/misoc/software/libdyld/Makefile
new file mode 100644 (file)
index 0000000..27a29db
--- /dev/null
@@ -0,0 +1,19 @@
+MSCDIR=../..
+include $(MSCDIR)/software/common.mak
+
+COMMONFLAGS += -I$(MSCDIR)/software/include/dyld
+
+OBJECTS=dyld.o
+
+all: libdyld.a
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+libdyld.a: $(OBJECTS)
+       $(AR) crs libdyld.a $(OBJECTS)
+
+.PHONY: clean
+
+clean:
+       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) libdyld.a .*~ *~
diff --git a/misoc/software/libdyld/dyld.c b/misoc/software/libdyld/dyld.c
new file mode 100644 (file)
index 0000000..a328e04
--- /dev/null
@@ -0,0 +1,182 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dyld.h>
+
+static int fixup_rela(struct dyld_info *info, const Elf32_Rela *rela,
+                      Elf32_Addr (*resolve_import)(const char *),
+                      const char **error_out)
+{
+    const Elf32_Sym *sym = NULL;
+    if(ELF32_R_SYM(rela->r_info) != 0)
+        sym = &info->symtab[ELF32_R_SYM(rela->r_info)];
+    Elf32_Addr value;
+
+    switch(ELF32_R_TYPE(rela->r_info)) {
+        case R_OR1K_NONE:
+        return 1; // Does nothing.
+
+        case R_OR1K_RELATIVE:
+        value = info->base + rela->r_addend;
+        break;
+
+        case R_OR1K_32:
+        case R_OR1K_GLOB_DAT:
+        case R_OR1K_JMP_SLOT:
+        value = (Elf32_Addr)dyld_lookup(&info->strtab[sym->st_name], info);
+        if(value != 0)
+            break;
+
+        value = resolve_import(&info->strtab[sym->st_name]);
+        if(value == 0) {
+            static char error[256];
+            snprintf(error, sizeof(error),
+                     "ELF object has an unresolved symbol: %s",
+                     &info->strtab[sym->st_name]);
+            *error_out = error;
+            return 0;
+        }
+        break;
+
+        default:
+        *error_out = "ELF object uses an unsupported relocation type";
+        return 0;
+    }
+
+    memcpy((Elf32_Addr*)(info->base + rela->r_offset), &value,
+           sizeof(Elf32_Addr));
+
+    return 1;
+}
+
+int dyld_load(const void *shlib, Elf32_Addr base,
+              Elf32_Addr (*resolve_import)(const char *),
+              struct dyld_info *info, const char **error_out)
+{
+    const Elf32_Ehdr *ehdr = (const Elf32_Ehdr *)shlib;
+
+    const unsigned char expected_ident[EI_NIDENT] = {
+        ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,
+        ELFCLASS32, ELFDATA2MSB, EV_CURRENT,
+        ELFOSABI_NONE, /* ABI version */ 0
+    };
+    if(memcmp(ehdr->e_ident, expected_ident, EI_NIDENT) ||
+       ehdr->e_type != ET_DYN) {
+        *error_out = "ELF object is not a shared library";
+        return 0;
+    }
+
+#ifdef __or1k__
+    if(ehdr->e_machine != EM_OPENRISC) {
+        *error_out = "ELF object does not contain OpenRISC machine code";
+        return 0;
+    }
+#else
+#error Unsupported architecture
+#endif
+
+    const Elf32_Phdr *phdr = (const Elf32_Phdr *)((intptr_t)shlib + ehdr->e_phoff);
+    const Elf32_Dyn *dyn = NULL;
+    for(int i = 0; i < ehdr->e_phnum; i++) {
+        if(phdr[i].p_type == PT_DYNAMIC)
+            dyn = (const Elf32_Dyn *)((intptr_t)shlib + phdr[i].p_offset);
+
+        memcpy((void*)(base + phdr[i].p_vaddr),
+               (const void*)((intptr_t)shlib + phdr[i].p_offset),
+               phdr[i].p_filesz);
+    }
+
+    if(dyn == NULL) {
+        *error_out = "ELF object does not have a PT_DYNAMIC header";
+        return 0;
+    }
+
+    const char *strtab = NULL;
+    const Elf32_Sym *symtab = NULL;
+    const Elf32_Rela *rela = NULL, *pltrel = NULL;
+    const Elf32_Word *hash = NULL;
+    Elf32_Word init = 0;
+    size_t syment = sizeof(Elf32_Sym), relaent = sizeof(Elf32_Rela),
+           relanum = 0, pltrelnum = 0;
+    while(dyn->d_tag != DT_NULL) {
+        switch(dyn->d_tag) {
+            case DT_STRTAB:   strtab    = (const char *)(base + dyn->d_un.d_ptr); break;
+            case DT_SYMTAB:   symtab    = (const Elf32_Sym *)(base + dyn->d_un.d_ptr); break;
+            case DT_SYMENT:   syment    = dyn->d_un.d_val; break;
+            case DT_RELA:     rela      = (const Elf32_Rela *)(base + dyn->d_un.d_ptr); break;
+            case DT_RELAENT:  relaent   = dyn->d_un.d_val; break;
+            case DT_RELASZ:   relanum   = dyn->d_un.d_val / sizeof(Elf32_Rela); break;
+            case DT_JMPREL:   pltrel    = (const Elf32_Rela *)(base + dyn->d_un.d_ptr); break;
+            case DT_PLTRELSZ: pltrelnum = dyn->d_un.d_val / sizeof(Elf32_Rela); break;
+            case DT_HASH:     hash      = (const Elf32_Word *)(base + dyn->d_un.d_ptr); break;
+            case DT_INIT:     init      = dyn->d_un.d_val; break;
+
+            case DT_REL:
+            *error_out = "ELF object uses Rel relocations, which are not supported";
+            return 0;
+        }
+
+        ++dyn;
+    }
+
+    if(symtab == NULL || syment == 0 || strtab == NULL) {
+        *error_out = "ELF object must contain a symbol table";
+        return 0;
+    }
+
+    if(syment != sizeof(Elf32_Sym) || relaent != sizeof(Elf32_Rela)) {
+        *error_out = "ELF object uses an unknown format for symbols and relocations";
+        return 0;
+    }
+
+    info->base         = base;
+    info->init         = (void*)(base + init);
+    info->strtab       = strtab;
+    info->symtab       = symtab;
+    info->hash.nbucket = hash[0];
+    info->hash.nchain  = hash[1];
+    info->hash.bucket  = &hash[2];
+    info->hash.chain   = &hash[2 + info->hash.nbucket];
+
+    for(int i = 0; i < relanum; i++) {
+        if(!fixup_rela(info, &rela[i], resolve_import, error_out))
+            return 0;
+    }
+
+    for(int i = 0; i < pltrelnum; i++) {
+        if(!fixup_rela(info, &pltrel[i], resolve_import, error_out))
+            return 0;
+    }
+
+    return 1;
+}
+
+static unsigned long elf_hash(const unsigned char *name)
+{
+    unsigned long h = 0, g;
+    while(*name) {
+        h = (h << 4) + *name++;
+        if((g = h & 0xf0000000)) {
+            h ^= g >> 24;
+            h &= ~g;
+        }
+    }
+    return h;
+}
+
+void *dyld_lookup(const char *symbol, struct dyld_info *info)
+{
+    unsigned hash = elf_hash((const unsigned char*) symbol);
+    unsigned index = info->hash.bucket[hash % info->hash.nbucket];
+    while(strcmp(&info->strtab[info->symtab[index].st_name], symbol)) {
+        if(index == STN_UNDEF)
+            return NULL;
+        index = info->hash.chain[index];
+    }
+
+    Elf32_Addr value = info->symtab[index].st_value;
+    if(value != 0)
+        return (void*)(info->base + value);
+    else
+        return NULL;
+}
diff --git a/misoc/software/libnet/Makefile b/misoc/software/libnet/Makefile
new file mode 100644 (file)
index 0000000..dc2a283
--- /dev/null
@@ -0,0 +1,23 @@
+MSCDIR=../..
+include $(MSCDIR)/software/common.mak
+
+OBJECTS=microudp.o tftp.o
+
+all: libnet.a
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+libnet.a: $(OBJECTS)
+       $(AR) crs libnet.a $(OBJECTS)
+
+%.o: %.c
+       $(compile-dep)
+
+%.o: %.S
+       $(assemble)
+
+.PHONY: clean
+
+clean:
+       $(RM) $(OBJECTS) $(OBJECTS:.o=.ts) $(OBJECTS:.o=.d) libnet.a .*~ *~
diff --git a/misoc/software/libnet/microudp.c b/misoc/software/libnet/microudp.c
new file mode 100644 (file)
index 0000000..c92e445
--- /dev/null
@@ -0,0 +1,459 @@
+#include <generated/csr.h>
+#ifdef CSR_ETHMAC_BASE
+
+#include <stdio.h>
+#include <system.h>
+#include <crc.h>
+#include <hw/flags.h>
+#include <hw/ethmac_mem.h>
+
+#include <net/microudp.h>
+
+#define ETHERTYPE_ARP 0x0806
+#define ETHERTYPE_IP  0x0800
+
+#ifdef CSR_ETHMAC_PREAMBLE_CRC_ADDR
+#define HW_PREAMBLE_CRC
+#endif
+
+struct ethernet_header {
+#ifndef HW_PREAMBLE_CRC
+       unsigned char preamble[8];
+#endif
+       unsigned char destmac[6];
+       unsigned char srcmac[6];
+       unsigned short ethertype;
+} __attribute__((packed));
+
+static void fill_eth_header(struct ethernet_header *h, const unsigned char *destmac, const unsigned char *srcmac, unsigned short ethertype)
+{
+       int i;
+
+#ifndef HW_PREAMBLE_CRC
+       for(i=0;i<7;i++)
+               h->preamble[i] = 0x55;
+       h->preamble[7] = 0xd5;
+#endif
+       for(i=0;i<6;i++)
+               h->destmac[i] = destmac[i];
+       for(i=0;i<6;i++)
+               h->srcmac[i] = srcmac[i];
+       h->ethertype = ethertype;
+}
+
+#define ARP_HWTYPE_ETHERNET 0x0001
+#define ARP_PROTO_IP        0x0800
+#ifndef HW_PREAMBLE_CRC
+#define ARP_PACKET_LENGTH 68
+#else
+#define ARP_PACKET_LENGTH 60
+#endif
+
+#define ARP_OPCODE_REQUEST  0x0001
+#define ARP_OPCODE_REPLY    0x0002
+
+struct arp_frame {
+       unsigned short hwtype;
+       unsigned short proto;
+       unsigned char hwsize;
+       unsigned char protosize;
+       unsigned short opcode;
+       unsigned char sender_mac[6];
+       unsigned int sender_ip;
+       unsigned char target_mac[6];
+       unsigned int target_ip;
+       unsigned char padding[18];
+} __attribute__((packed));
+
+#define IP_IPV4                        0x45
+#define IP_DONT_FRAGMENT       0x4000
+#define IP_TTL                 64
+#define IP_PROTO_UDP           0x11
+
+struct ip_header {
+       unsigned char version;
+       unsigned char diff_services;
+       unsigned short total_length;
+       unsigned short identification;
+       unsigned short fragment_offset;
+       unsigned char ttl;
+       unsigned char proto;
+       unsigned short checksum;
+       unsigned int src_ip;
+       unsigned int dst_ip;
+} __attribute__((packed));
+
+struct udp_header {
+       unsigned short src_port;
+       unsigned short dst_port;
+       unsigned short length;
+       unsigned short checksum;
+} __attribute__((packed));
+
+struct udp_frame {
+       struct ip_header ip;
+       struct udp_header udp;
+       char payload[];
+} __attribute__((packed));
+
+struct ethernet_frame {
+       struct ethernet_header eth_header;
+       union {
+               struct arp_frame arp;
+               struct udp_frame udp;
+       } contents;
+} __attribute__((packed));
+
+typedef union {
+       struct ethernet_frame frame;
+       unsigned char raw[1532];
+} ethernet_buffer;
+
+
+static unsigned int rxslot;
+static unsigned int rxlen;
+static ethernet_buffer *rxbuffer;
+static ethernet_buffer *rxbuffer0;
+static ethernet_buffer *rxbuffer1;
+static unsigned int txslot;
+static unsigned int txlen;
+static ethernet_buffer *txbuffer;
+static ethernet_buffer *txbuffer0;
+static ethernet_buffer *txbuffer1;
+
+static void send_packet(void)
+{
+#ifndef HW_PREAMBLE_CRC
+       unsigned int crc;
+       crc = crc32(&txbuffer->raw[8], txlen-8);
+       txbuffer->raw[txlen  ] = (crc & 0xff);
+       txbuffer->raw[txlen+1] = (crc & 0xff00) >> 8;
+       txbuffer->raw[txlen+2] = (crc & 0xff0000) >> 16;
+       txbuffer->raw[txlen+3] = (crc & 0xff000000) >> 24;
+       txlen += 4;
+#endif
+       ethmac_sram_reader_slot_write(txslot);
+       ethmac_sram_reader_length_write(txlen);
+       while(!(ethmac_sram_reader_ready_read()));
+       ethmac_sram_reader_start_write(1);
+       txslot = (txslot+1)%2;
+       if (txslot)
+               txbuffer = txbuffer1;
+       else
+               txbuffer = txbuffer0;
+}
+
+static unsigned char my_mac[6];
+static unsigned int my_ip;
+
+/* ARP cache - one entry only */
+static unsigned char cached_mac[6];
+static unsigned int cached_ip;
+
+static void process_arp(void)
+{
+       const struct arp_frame *rx_arp = &rxbuffer->frame.contents.arp;
+       struct arp_frame *tx_arp = &txbuffer->frame.contents.arp;
+
+       if(rxlen < ARP_PACKET_LENGTH) return;
+       if(rx_arp->hwtype != ARP_HWTYPE_ETHERNET) return;
+       if(rx_arp->proto != ARP_PROTO_IP) return;
+       if(rx_arp->hwsize != 6) return;
+       if(rx_arp->protosize != 4) return;
+       if(rx_arp->opcode == ARP_OPCODE_REPLY) {
+               if(rx_arp->sender_ip == cached_ip) {
+                       int i;
+                       for(i=0;i<6;i++)
+                               cached_mac[i] = rx_arp->sender_mac[i];
+               }
+               return;
+       }
+       if(rx_arp->opcode == ARP_OPCODE_REQUEST) {
+               if(rx_arp->target_ip == my_ip) {
+                       int i;
+
+                       fill_eth_header(&txbuffer->frame.eth_header,
+                               rx_arp->sender_mac,
+                               my_mac,
+                               ETHERTYPE_ARP);
+                       txlen = ARP_PACKET_LENGTH;
+                       tx_arp->hwtype = ARP_HWTYPE_ETHERNET;
+                       tx_arp->proto = ARP_PROTO_IP;
+                       tx_arp->hwsize = 6;
+                       tx_arp->protosize = 4;
+                       tx_arp->opcode = ARP_OPCODE_REPLY;
+                       tx_arp->sender_ip = my_ip;
+                       for(i=0;i<6;i++)
+                               tx_arp->sender_mac[i] = my_mac[i];
+                       tx_arp->target_ip = rx_arp->sender_ip;
+                       for(i=0;i<6;i++)
+                               tx_arp->target_mac[i] = rx_arp->sender_mac[i];
+                       send_packet();
+               }
+               return;
+       }
+}
+
+static const unsigned char broadcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
+int microudp_arp_resolve(unsigned int ip)
+{
+       struct arp_frame *arp = &txbuffer->frame.contents.arp;
+       int i;
+       int tries;
+       int timeout;
+
+       if(cached_ip == ip) {
+               for(i=0;i<6;i++)
+                       if(cached_mac[i]) return 1;
+       }
+       cached_ip = ip;
+       for(i=0;i<6;i++)
+               cached_mac[i] = 0;
+
+       for(tries=0;tries<5;tries++) {
+               /* Send an ARP request */
+               fill_eth_header(&txbuffer->frame.eth_header,
+                               broadcast,
+                               my_mac,
+                               ETHERTYPE_ARP);
+               txlen = ARP_PACKET_LENGTH;
+               arp->hwtype = ARP_HWTYPE_ETHERNET;
+               arp->proto = ARP_PROTO_IP;
+               arp->hwsize = 6;
+               arp->protosize = 4;
+               arp->opcode = ARP_OPCODE_REQUEST;
+               arp->sender_ip = my_ip;
+               for(i=0;i<6;i++)
+                       arp->sender_mac[i] = my_mac[i];
+               arp->target_ip = ip;
+               for(i=0;i<6;i++)
+                       arp->target_mac[i] = 0;
+               send_packet();
+
+               /* Do we get a reply ? */
+               for(timeout=0;timeout<2000000;timeout++) {
+                       microudp_service();
+                       for(i=0;i<6;i++)
+                               if(cached_mac[i]) return 1;
+               }
+       }
+
+       return 0;
+}
+
+static unsigned short ip_checksum(unsigned int r, void *buffer, unsigned int length, int complete)
+{
+       unsigned char *ptr;
+       unsigned int i;
+
+       ptr = (unsigned char *)buffer;
+       length >>= 1;
+
+       for(i=0;i<length;i++)
+               r += ((unsigned int)(ptr[2*i]) << 8)|(unsigned int)(ptr[2*i+1]) ;
+
+       /* Add overflows */
+       while(r >> 16)
+               r = (r & 0xffff) + (r >> 16);
+
+       if(complete) {
+               r = ~r;
+               r &= 0xffff;
+               if(r == 0) r = 0xffff;
+       }
+       return r;
+}
+
+void *microudp_get_tx_buffer(void)
+{
+       return txbuffer->frame.contents.udp.payload;
+}
+
+struct pseudo_header {
+       unsigned int src_ip;
+       unsigned int dst_ip;
+       unsigned char zero;
+       unsigned char proto;
+       unsigned short length;
+} __attribute__((packed));
+
+int microudp_send(unsigned short src_port, unsigned short dst_port, unsigned int length)
+{
+       struct pseudo_header h;
+       unsigned int r;
+
+       if((cached_mac[0] == 0) && (cached_mac[1] == 0) && (cached_mac[2] == 0)
+               && (cached_mac[3] == 0) && (cached_mac[4] == 0) && (cached_mac[5] == 0))
+               return 0;
+
+       txlen = length + sizeof(struct ethernet_header) + sizeof(struct udp_frame);
+       if(txlen < ARP_PACKET_LENGTH) txlen = ARP_PACKET_LENGTH;
+
+       fill_eth_header(&txbuffer->frame.eth_header,
+               cached_mac,
+               my_mac,
+               ETHERTYPE_IP);
+
+       txbuffer->frame.contents.udp.ip.version = IP_IPV4;
+       txbuffer->frame.contents.udp.ip.diff_services = 0;
+       txbuffer->frame.contents.udp.ip.total_length = length + sizeof(struct udp_frame);
+       txbuffer->frame.contents.udp.ip.identification = 0;
+       txbuffer->frame.contents.udp.ip.fragment_offset = IP_DONT_FRAGMENT;
+       txbuffer->frame.contents.udp.ip.ttl = IP_TTL;
+       h.proto = txbuffer->frame.contents.udp.ip.proto = IP_PROTO_UDP;
+       txbuffer->frame.contents.udp.ip.checksum = 0;
+       h.src_ip = txbuffer->frame.contents.udp.ip.src_ip = my_ip;
+       h.dst_ip = txbuffer->frame.contents.udp.ip.dst_ip = cached_ip;
+       txbuffer->frame.contents.udp.ip.checksum = ip_checksum(0, &txbuffer->frame.contents.udp.ip,
+               sizeof(struct ip_header), 1);
+
+       txbuffer->frame.contents.udp.udp.src_port = src_port;
+       txbuffer->frame.contents.udp.udp.dst_port = dst_port;
+       h.length = txbuffer->frame.contents.udp.udp.length = length + sizeof(struct udp_header);
+       txbuffer->frame.contents.udp.udp.checksum = 0;
+
+       h.zero = 0;
+       r = ip_checksum(0, &h, sizeof(struct pseudo_header), 0);
+       if(length & 1) {
+               txbuffer->frame.contents.udp.payload[length] = 0;
+               length++;
+       }
+       r = ip_checksum(r, &txbuffer->frame.contents.udp.udp,
+               sizeof(struct udp_header)+length, 1);
+       txbuffer->frame.contents.udp.udp.checksum = r;
+
+       send_packet();
+
+       return 1;
+}
+
+static udp_callback rx_callback;
+
+static void process_ip(void)
+{
+       if(rxlen < (sizeof(struct ethernet_header)+sizeof(struct udp_frame))) return;
+       /* We don't verify UDP and IP checksums and rely on the Ethernet checksum solely */
+       if(rxbuffer->frame.contents.udp.ip.version != IP_IPV4) return;
+       // check disabled for QEMU compatibility
+       //if(rxbuffer->frame.contents.udp.ip.diff_services != 0) return;
+       if(rxbuffer->frame.contents.udp.ip.total_length < sizeof(struct udp_frame)) return;
+       // check disabled for QEMU compatibility
+       //if(rxbuffer->frame.contents.udp.ip.fragment_offset != IP_DONT_FRAGMENT) return;
+       if(rxbuffer->frame.contents.udp.ip.proto != IP_PROTO_UDP) return;
+       if(rxbuffer->frame.contents.udp.ip.dst_ip != my_ip) return;
+       if(rxbuffer->frame.contents.udp.udp.length < sizeof(struct udp_header)) return;
+
+       if(rx_callback)
+               rx_callback(rxbuffer->frame.contents.udp.ip.src_ip, rxbuffer->frame.contents.udp.udp.src_port, rxbuffer->frame.contents.udp.udp.dst_port, rxbuffer->frame.contents.udp.payload, rxbuffer->frame.contents.udp.udp.length-sizeof(struct udp_header));
+}
+
+void microudp_set_callback(udp_callback callback)
+{
+       rx_callback = callback;
+}
+
+static void process_frame(void)
+{
+       flush_cpu_dcache();
+
+#ifndef HW_PREAMBLE_CRC
+       int i;
+       for(i=0;i<7;i++)
+               if(rxbuffer->frame.eth_header.preamble[i] != 0x55) return;
+       if(rxbuffer->frame.eth_header.preamble[7] != 0xd5) return;
+#endif
+
+#ifndef HW_PREAMBLE_CRC
+       unsigned int received_crc;
+       unsigned int computed_crc;
+       received_crc = ((unsigned int)rxbuffer->raw[rxlen-1] << 24)
+               |((unsigned int)rxbuffer->raw[rxlen-2] << 16)
+               |((unsigned int)rxbuffer->raw[rxlen-3] <<  8)
+               |((unsigned int)rxbuffer->raw[rxlen-4]);
+       computed_crc = crc32(&rxbuffer->raw[8], rxlen-12);
+       if(received_crc != computed_crc) return;
+
+       rxlen -= 4; /* strip CRC here to be consistent with TX */
+#endif
+
+       if(rxbuffer->frame.eth_header.ethertype == ETHERTYPE_ARP) process_arp();
+       else if(rxbuffer->frame.eth_header.ethertype == ETHERTYPE_IP) process_ip();
+}
+
+void microudp_start(const unsigned char *macaddr, unsigned int ip)
+{
+       int i;
+       ethmac_sram_reader_ev_pending_write(ETHMAC_EV_SRAM_READER);
+       ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
+
+       rxbuffer0 = (ethernet_buffer *)ETHMAC_RX0_BASE;
+       rxbuffer1 = (ethernet_buffer *)ETHMAC_RX1_BASE;
+       txbuffer0 = (ethernet_buffer *)ETHMAC_TX0_BASE;
+       txbuffer1 = (ethernet_buffer *)ETHMAC_TX1_BASE;
+
+       rxslot = 0;
+       txslot = 0;
+
+       rxbuffer = rxbuffer0;
+       txbuffer = txbuffer0;
+
+       for(i=0;i<6;i++)
+               my_mac[i] = macaddr[i];
+       my_ip = ip;
+
+       cached_ip = 0;
+       for(i=0;i<6;i++)
+               cached_mac[i] = 0;
+
+       rx_callback = (udp_callback)0;
+}
+
+void microudp_service(void)
+{
+       if(ethmac_sram_writer_ev_pending_read() & ETHMAC_EV_SRAM_WRITER) {
+               rxslot = ethmac_sram_writer_slot_read();
+               rxlen = ethmac_sram_writer_length_read();
+               if (rxslot)
+                       rxbuffer = rxbuffer1;
+               else
+                       rxbuffer = rxbuffer0;
+               process_frame();
+               ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
+       }
+}
+
+static void busy_wait(unsigned int ds)
+{
+       timer0_en_write(0);
+       timer0_reload_write(0);
+       timer0_load_write(identifier_frequency_read()/10*ds);
+       timer0_en_write(1);
+       timer0_update_value_write(1);
+       while(timer0_value_read()) timer0_update_value_write(1);
+}
+
+void eth_init(void)
+{
+       ethphy_crg_reset_write(0);
+       busy_wait(2);
+       /* that pesky ethernet PHY needs two resets at times... */
+       ethphy_crg_reset_write(1);
+       busy_wait(2);
+       ethphy_crg_reset_write(0);
+       busy_wait(2);
+}
+
+#ifdef CSR_ETHPHY_MODE_DETECTION_MODE_ADDR
+void eth_mode(void)
+{
+       printf("Ethernet phy mode: ");
+       if (ethphy_mode_detection_mode_read())
+               printf("MII");
+       else
+               printf("GMII");
+       printf("\n");
+}
+#endif
+
+#endif
diff --git a/misoc/software/libnet/tftp.c b/misoc/software/libnet/tftp.c
new file mode 100644 (file)
index 0000000..4579684
--- /dev/null
@@ -0,0 +1,219 @@
+#include <stdint.h>
+#include <string.h>
+
+#include <net/microudp.h>
+#include <net/tftp.h>
+
+#define PORT_OUT       69
+#define PORT_IN                7642
+
+enum {
+       TFTP_RRQ        = 1,    /* Read request */
+       TFTP_WRQ        = 2,    /* Write request */
+       TFTP_DATA       = 3,    /* Data */
+       TFTP_ACK        = 4,    /* Acknowledgment */
+       TFTP_ERROR      = 5,    /* Error */
+};
+
+#define        BLOCK_SIZE      512     /* block size in bytes */
+
+
+static int format_request(uint8_t *buf, uint16_t op, const char *filename)
+{
+       int len = strlen(filename);
+
+       *buf++ = op >> 8; /* Opcode */
+       *buf++ = op;
+       memcpy(buf, filename, len);
+       buf += len;
+       *buf++ = 0x00;
+       *buf++ = 'o';
+       *buf++ = 'c';
+       *buf++ = 't';
+       *buf++ = 'e';
+       *buf++ = 't';
+       *buf++ = 0x00;
+       return 9+strlen(filename);
+}
+
+static int format_ack(uint8_t *buf, uint16_t block)
+{
+       *buf++ = 0x00; /* Opcode: Ack */
+       *buf++ = TFTP_ACK;
+       *buf++ = (block & 0xff00) >> 8;
+       *buf++ = (block & 0x00ff);
+       return 4;
+}
+
+static int format_data(uint8_t *buf, uint16_t block, const void *data, int len)
+{
+       *buf++ = 0x00; /* Opcode: Data*/
+       *buf++ = TFTP_DATA;
+       *buf++ = (block & 0xff00) >> 8;
+       *buf++ = (block & 0x00ff);
+       memcpy(buf, data, len);
+       return len+4;
+}
+
+static uint8_t *packet_data;
+static int total_length;
+static int transfer_finished;
+static uint8_t *dst_buffer;
+static int last_ack; /* signed, so we can use -1 */
+static uint16_t data_port;
+
+static void rx_callback(uint32_t src_ip, uint16_t src_port,
+    uint16_t dst_port, void *_data, unsigned int length)
+{
+       uint8_t *data = _data;
+       uint16_t opcode;
+       uint16_t block;
+       int i;
+       int offset;
+
+       if(length < 4) return;
+       if(dst_port != PORT_IN) return;
+       opcode = data[0] << 8 | data[1];
+       block = data[2] << 8 | data[3];
+       if(opcode == TFTP_ACK) { /* Acknowledgement */
+               data_port = src_port;
+               last_ack = block;
+               return;
+       }
+       if(block < 1) return;
+       if(opcode == TFTP_DATA) { /* Data */
+               length -= 4;
+               offset = (block-1)*BLOCK_SIZE;
+               for(i=0;i<length;i++)
+                       dst_buffer[offset+i] = data[i+4];
+               total_length += length;
+               if(length < BLOCK_SIZE)
+                       transfer_finished = 1;
+
+               packet_data = microudp_get_tx_buffer();
+               length = format_ack(packet_data, block);
+               microudp_send(PORT_IN, src_port, length);
+       }
+       if(opcode == TFTP_ERROR) { /* Error */
+               total_length = -1;
+               transfer_finished = 1;
+       }
+}
+
+int tftp_get(uint32_t ip, const char *filename, void *buffer)
+{
+       int len;
+       int tries;
+       int i;
+       int length_before;
+
+       if(!microudp_arp_resolve(ip))
+               return -1;
+
+       microudp_set_callback(rx_callback);
+
+       dst_buffer = buffer;
+
+       total_length = 0;
+       transfer_finished = 0;
+       tries = 5;
+       while(1) {
+               packet_data = microudp_get_tx_buffer();
+               len = format_request(packet_data, TFTP_RRQ, filename);
+               microudp_send(PORT_IN, PORT_OUT, len);
+               for(i=0;i<2000000;i++) {
+                       microudp_service();
+                       if((total_length > 0) || transfer_finished) break;
+               }
+               if((total_length > 0) || transfer_finished) break;
+               tries--;
+               if(tries == 0) {
+                       microudp_set_callback(NULL);
+                       return -1;
+               }
+       }
+
+       length_before = total_length;
+       while(!transfer_finished) {
+               if(length_before != total_length) {
+                       i = 12000000;
+                       length_before = total_length;
+               }
+               if(i-- == 0) {
+                       microudp_set_callback(NULL);
+                       return -1;
+               }
+               microudp_service();
+       }
+
+       microudp_set_callback(NULL);
+
+       return total_length;
+}
+
+int tftp_put(uint32_t ip, const char *filename, const void *buffer, int size)
+{
+       int len, send;
+       int tries;
+       int i;
+       int block = 0, sent = 0;
+
+       if(!microudp_arp_resolve(ip))
+               return -1;
+
+       microudp_set_callback(rx_callback);
+
+       packet_data = microudp_get_tx_buffer();
+
+       total_length = 0;
+       transfer_finished = 0;
+       tries = 5;
+       while(1) {
+               packet_data = microudp_get_tx_buffer();
+               len = format_request(packet_data, TFTP_WRQ, filename);
+               microudp_send(PORT_IN, PORT_OUT, len);
+               for(i=0;i<2000000;i++) {
+                       last_ack = -1;
+                       microudp_service();
+                       if(last_ack == block)
+                               goto send_data;
+                       if(transfer_finished)
+                               goto fail;
+               }
+               tries--;
+               if(tries == 0)
+                       goto fail;
+       }
+
+send_data:
+       do {
+               block++;
+               send = sent+BLOCK_SIZE > size ? size-sent : BLOCK_SIZE;
+               tries = 5;
+               while(1) {
+                       packet_data = microudp_get_tx_buffer();
+                       len = format_data(packet_data, block, buffer, send);
+                       microudp_send(PORT_IN, data_port, len);
+                       for(i=0;i<12000000;i++) {
+                               microudp_service();
+                               if(transfer_finished)
+                                       goto fail;
+                               if(last_ack == block)
+                                       goto next;
+                       }
+                       if (!--tries)
+                               goto fail;
+               }
+next:
+               sent += send;
+               buffer += send;
+       } while (send == BLOCK_SIZE);
+
+       microudp_set_callback(NULL);
+
+       return sent;
+
+fail:
+       microudp_set_callback(NULL);
+       return -1;
+}
diff --git a/misoc/software/libunwind/Makefile b/misoc/software/libunwind/Makefile
new file mode 100644 (file)
index 0000000..579ad4d
--- /dev/null
@@ -0,0 +1,30 @@
+MSCDIR=../..
+include $(MSCDIR)/software/common.mak
+
+COMMONFLAGS+=-integrated-as \
+       -I. -I$(MSCDIR)/software/include/dyld/ -I$(MSCDIR)/software/unwinder/include/ \
+       -D__ELF__ -D__linux__ -D_LIBUNWIND_NO_HEAP -DNDEBUG
+
+OBJECTS=UnwindRegistersSave.o UnwindRegistersRestore.o UnwindLevel1.o libunwind.o
+
+all: libunwind.a
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+libunwind.a: $(OBJECTS)
+       $(AR) crs libunwind.a $(OBJECTS)
+
+%.o: $(MSCDIR)/software/unwinder/src/%.cpp
+       $(compilexx-dep)
+
+%.o: $(MSCDIR)/software/unwinder/src/%.c
+       $(compile-dep)
+
+%.o: $(MSCDIR)/software/unwinder/src/%.S
+       $(assemble)
+
+.PHONY: clean
+
+clean:
+       $(RM) $(OBJECTS) $(OBJECTS:.o=.ts) $(OBJECTS:.o=.d) libuwind.a .*~ *~
diff --git a/misoc/software/libunwind/__cxxabi_config.h b/misoc/software/libunwind/__cxxabi_config.h
new file mode 100644 (file)
index 0000000..42cd6fe
--- /dev/null
@@ -0,0 +1 @@
+#define LIBCXXABI_ARM_EHABI 0
diff --git a/misoc/software/memtest/Makefile b/misoc/software/memtest/Makefile
new file mode 100644 (file)
index 0000000..ea93a3a
--- /dev/null
@@ -0,0 +1,50 @@
+MSCDIR=../..
+include $(MSCDIR)/software/common.mak
+
+OBJECTS=isr.o main.o
+
+all: memtest.bin
+
+# pull in dependency info for *existing* .o files
+-include $(OBJECTS:.o=.d)
+
+%.bin: %.elf
+       $(OBJCOPY) -O binary $< $@
+       chmod -x $@
+
+memtest.elf: $(OBJECTS) libs
+
+%.elf:
+       $(LD) $(LDFLAGS) \
+               -T $(MSCDIR)/software/libbase/linker-sdram.ld \
+               -N -o $@ \
+               $(MSCDIR)/software/libbase/crt0-$(CPU).o \
+               $(OBJECTS) \
+               -L$(MSCDIR)/software/libbase \
+               -L$(MSCDIR)/software/libcompiler-rt \
+               -lbase -lcompiler-rt
+       chmod -x $@
+
+main.o: main.c
+       $(compile-dep)
+
+%.o: %.c
+       $(compile-dep)
+
+%.o: %.S
+       $(assemble)
+
+libs:
+       $(MAKE) -C $(MSCDIR)/software/libcompiler-rt
+       $(MAKE) -C $(MSCDIR)/software/libbase
+
+load: memtest.bin
+       $(MAKE) -C $(MSCDIR)/tools
+       $(MSCDIR)/tools/flterm --port /dev/ttyUSB0 --kernel memtest.bin
+
+
+clean:
+       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) memtest.elf memtest.bin
+       $(RM) .*~ *~
+
+.PHONY: all main.o clean libs load
diff --git a/misoc/software/memtest/isr.c b/misoc/software/memtest/isr.c
new file mode 100644 (file)
index 0000000..c49d31d
--- /dev/null
@@ -0,0 +1,14 @@
+#include <generated/csr.h>
+#include <irq.h>
+#include <uart.h>
+
+void isr(void);
+void isr(void)
+{
+       unsigned int irqs;
+       
+       irqs = irq_pending() & irq_getmask();
+       
+       if(irqs & (1 << UART_INTERRUPT))
+               uart_isr();
+}
diff --git a/misoc/software/memtest/main.c b/misoc/software/memtest/main.c
new file mode 100644 (file)
index 0000000..c885802
--- /dev/null
@@ -0,0 +1,106 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <irq.h>
+#include <uart.h>
+#include <time.h>
+#include <generated/csr.h>
+#include <generated/mem.h>
+#include <hw/flags.h>
+#include <console.h>
+#include <system.h>
+
+static unsigned int log2(unsigned int v)
+{
+  unsigned int r;
+  r = 0;
+  while(v>>=1) r++;
+  return r;
+}
+
+static void membw_service(void)
+{
+       static int last_event;
+       unsigned long long int nr, nw;
+       unsigned long long int f;
+       unsigned int rdb, wrb;
+       unsigned int dw;
+
+       if(elapsed(&last_event, identifier_frequency_read())) {
+               sdram_controller_bandwidth_update_write(1);
+               nr = sdram_controller_bandwidth_nreads_read();
+               nw = sdram_controller_bandwidth_nwrites_read();
+               f = identifier_frequency_read();
+               dw = sdram_controller_bandwidth_data_width_read();
+               rdb = (nr*f >> (24 - log2(dw)))/1000000ULL;
+               wrb = (nw*f >> (24 - log2(dw)))/1000000ULL;
+               printf("read:%5dMbps  write:%5dMbps  all:%5dMbps\n", rdb, wrb, rdb + wrb);
+       }
+}
+
+//#define DEBUG
+
+static void memtest_service(void)
+{
+       static unsigned int test_buffer[(MAIN_RAM_SIZE/2)/4] __attribute__((aligned(16)));
+       static unsigned char reading;
+       static unsigned int err, total_err;
+#ifdef DEBUG
+       int i;
+#endif
+
+       if(reading) {
+               if(!memtest_w_busy_read()) {
+#ifdef DEBUG
+                       flush_l2_cache();
+                       flush_cpu_dcache();
+                       printf("starting read\n");
+                       for(i=0;i<64;i++) {
+                               printf("%08x", test_buffer[i]);
+                               if((i % 4) == 3)
+                                       printf("\n");
+                       }
+#endif
+                       memtest_r_reset_write(1);
+                       memtest_r_base_write((unsigned int)test_buffer);
+                       memtest_r_length_write(sizeof(test_buffer));
+                       memtest_r_shoot_write(1);
+                       reading = 0;
+               }
+       } else {
+               if(!memtest_r_busy_read()) {
+                       err = memtest_r_error_count_read();
+                       total_err += err;
+                       printf("err=%d\t\ttotal=%d\n", err, total_err);
+                       memtest_w_reset_write(1);
+                       memtest_w_base_write((unsigned int)test_buffer);
+                       memtest_w_length_write(sizeof(test_buffer));
+                       memtest_w_shoot_write(1);
+                       reading = 1;
+               }
+       }
+}
+
+int main(void)
+{
+       irq_setmask(0);
+       irq_setie(1);
+       uart_init();
+
+       puts("Memory testing software built "__DATE__" "__TIME__"\n");
+
+       if((memtest_w_magic_read() != 0x361f) || (memtest_r_magic_read() != 0x361f)) {
+               printf("Memory test cores not detected\n");
+               while(1);
+       }
+
+       time_init();
+
+       flush_l2_cache();
+       while(1) {
+               memtest_service();
+               membw_service();
+       }
+
+       return 0;
+}
diff --git a/misoc/software/unwinder b/misoc/software/unwinder
new file mode 160000 (submodule)
index 0000000..8b11966
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 8b1196692d823a090a9879a695050baa7acc39ee
diff --git a/software/bios/Makefile b/software/bios/Makefile
deleted file mode 100644 (file)
index bd849f0..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-MSCDIR=../..
-include $(MSCDIR)/software/common.mak
-
-OBJECTS=isr.o sdram.o main.o boot-helper-$(CPU).o boot.o dataflow.o
-
-all: bios.bin
-
-# pull in dependency info for *existing* .o files
--include $(OBJECTS:.o=.d)
-
-%.bin: %.elf
-       $(OBJCOPY) -O binary $< $@
-       chmod -x $@
-       $(MSCDIR)/mkmscimg.py $@
-
-bios.elf: linker.ld $(OBJECTS) libs
-
-%.elf:
-       $(LD) $(LDFLAGS) -T $< -N -o $@ \
-               $(MSCDIR)/software/libbase/crt0-$(CPU).o \
-               $(OBJECTS) \
-               -L$(MSCDIR)/software/libnet \
-               -L$(MSCDIR)/software/libbase \
-               -L$(MSCDIR)/software/libcompiler-rt \
-               -lnet -lbase-nofloat -lcompiler-rt
-       chmod -x $@
-
-main.o: main.c
-       $(compile-dep)
-
-%.o: %.c
-       $(compile-dep)
-
-%.o: %.S
-       $(assemble)
-
-libs:
-       $(MAKE) -C $(MSCDIR)/software/libcompiler-rt
-       $(MAKE) -C $(MSCDIR)/software/libbase
-       $(MAKE) -C $(MSCDIR)/software/libnet
-
-clean:
-       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) bios.elf bios.bin .*~ *~
-
-.PHONY: all main.o clean libs
diff --git a/software/bios/boot-helper-lm32.S b/software/bios/boot-helper-lm32.S
deleted file mode 100644 (file)
index bf3765c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-.section    .text, "ax", @progbits
-.global     boot_helper
-boot_helper:
-       call r4
diff --git a/software/bios/boot-helper-or1k.S b/software/bios/boot-helper-or1k.S
deleted file mode 100644 (file)
index 5023602..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-.section    .text, "ax", @progbits
-.global     boot_helper
-boot_helper:
-       l.jr r6
-       l.nop
diff --git a/software/bios/boot.c b/software/bios/boot.c
deleted file mode 100644 (file)
index 54b7789..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-#include <stdio.h>
-#include <console.h>
-#include <uart.h>
-#include <system.h>
-#include <crc.h>
-#include <sfl.h>
-#include <string.h>
-#include <irq.h>
-
-#include <generated/mem.h>
-#include <generated/csr.h>
-
-#include <net/microudp.h>
-#include <net/tftp.h>
-#include "boot.h"
-
-extern void boot_helper(unsigned int r1, unsigned int r2, unsigned int r3, unsigned int addr);
-
-static void __attribute__((noreturn)) boot(unsigned int r1, unsigned int r2, unsigned int r3, unsigned int addr)
-{
-       printf("Executing booted program.\n");
-       uart_sync();
-       irq_setmask(0);
-       irq_setie(0);
-       flush_cpu_icache();
-       boot_helper(r1, r2, r3, addr);
-       while(1);
-}
-
-static int check_ack(void)
-{
-       int recognized;
-       static const char str[SFL_MAGIC_LEN] = SFL_MAGIC_ACK;
-
-       timer0_en_write(0);
-       timer0_reload_write(0);
-       timer0_load_write(identifier_frequency_read()/4);
-       timer0_en_write(1);
-       timer0_update_value_write(1);
-       recognized = 0;
-       while(timer0_value_read()) {
-               if(uart_read_nonblock()) {
-                       char c;
-                       c = uart_read();
-                       if(c == str[recognized]) {
-                               recognized++;
-                               if(recognized == SFL_MAGIC_LEN)
-                                       return 1;
-                       } else {
-                               if(c == str[0])
-                                       recognized = 1;
-                               else
-                                       recognized = 0;
-                       }
-               }
-               timer0_update_value_write(1);
-       }
-       return 0;
-}
-
-#define MAX_FAILED 5
-
-void serialboot(void)
-{
-       struct sfl_frame frame;
-       int failed;
-       unsigned int cmdline_adr, initrdstart_adr, initrdend_adr;
-       static const char str[SFL_MAGIC_LEN+1] = SFL_MAGIC_REQ;
-       const char *c;
-
-       printf("Booting from serial...\n");
-
-       c = str;
-       while(*c) {
-               uart_write(*c);
-               c++;
-       }
-       if(!check_ack()) {
-               printf("Timeout\n");
-               return;
-       }
-
-       failed = 0;
-       cmdline_adr = initrdstart_adr = initrdend_adr = 0;
-       while(1) {
-               int i;
-               int actualcrc;
-               int goodcrc;
-
-               /* Grab one frame */
-               frame.length = uart_read();
-               frame.crc[0] = uart_read();
-               frame.crc[1] = uart_read();
-               frame.cmd = uart_read();
-               for(i=0;i<frame.length;i++)
-                       frame.payload[i] = uart_read();
-
-               /* Check CRC */
-               actualcrc = ((int)frame.crc[0] << 8)|(int)frame.crc[1];
-               goodcrc = crc16(&frame.cmd, frame.length+1);
-               if(actualcrc != goodcrc) {
-                       failed++;
-                       if(failed == MAX_FAILED) {
-                               printf("Too many consecutive errors, aborting");
-                               return;
-                       }
-                       uart_write(SFL_ACK_CRCERROR);
-                       continue;
-               }
-
-               /* CRC OK */
-               switch(frame.cmd) {
-                       case SFL_CMD_ABORT:
-                               failed = 0;
-                               uart_write(SFL_ACK_SUCCESS);
-                               return;
-                       case SFL_CMD_LOAD: {
-                               char *writepointer;
-
-                               failed = 0;
-                               writepointer = (char *)(
-                                        ((unsigned int)frame.payload[0] << 24)
-                                       |((unsigned int)frame.payload[1] << 16)
-                                       |((unsigned int)frame.payload[2] << 8)
-                                       |((unsigned int)frame.payload[3] << 0));
-                               for(i=4;i<frame.length;i++)
-                                       *(writepointer++) = frame.payload[i];
-                               uart_write(SFL_ACK_SUCCESS);
-                               break;
-                       }
-                       case SFL_CMD_JUMP: {
-                               unsigned int addr;
-
-                               failed = 0;
-                               addr =  ((unsigned int)frame.payload[0] << 24)
-                                       |((unsigned int)frame.payload[1] << 16)
-                                       |((unsigned int)frame.payload[2] << 8)
-                                       |((unsigned int)frame.payload[3] << 0);
-                               uart_write(SFL_ACK_SUCCESS);
-                               boot(cmdline_adr, initrdstart_adr, initrdend_adr, addr);
-                               break;
-                       }
-                       case SFL_CMD_CMDLINE:
-                               failed = 0;
-                               cmdline_adr =  ((unsigned int)frame.payload[0] << 24)
-                                             |((unsigned int)frame.payload[1] << 16)
-                                             |((unsigned int)frame.payload[2] << 8)
-                                             |((unsigned int)frame.payload[3] << 0);
-                               uart_write(SFL_ACK_SUCCESS);
-                               break;
-                       case SFL_CMD_INITRDSTART:
-                               failed = 0;
-                               initrdstart_adr =  ((unsigned int)frame.payload[0] << 24)
-                                                 |((unsigned int)frame.payload[1] << 16)
-                                                 |((unsigned int)frame.payload[2] << 8)
-                                                 |((unsigned int)frame.payload[3] << 0);
-                               uart_write(SFL_ACK_SUCCESS);
-                               break;
-                       case SFL_CMD_INITRDEND:
-                               failed = 0;
-                               initrdend_adr =  ((unsigned int)frame.payload[0] << 24)
-                                               |((unsigned int)frame.payload[1] << 16)
-                                               |((unsigned int)frame.payload[2] << 8)
-                                               |((unsigned int)frame.payload[3] << 0);
-                               uart_write(SFL_ACK_SUCCESS);
-                               break;
-                       default:
-                               failed++;
-                               if(failed == MAX_FAILED) {
-                                       printf("Too many consecutive errors, aborting");
-                                       return;
-                               }
-                               uart_write(SFL_ACK_UNKNOWN);
-                               break;
-               }
-       }
-}
-
-#ifdef CSR_ETHMAC_BASE
-
-#define LOCALIP1 192
-#define LOCALIP2 168
-#define LOCALIP3 0
-#define LOCALIP4 42
-#define REMOTEIP1 192
-#define REMOTEIP2 168
-#define REMOTEIP3 0
-#define REMOTEIP4 14
-
-static int tftp_get_v(unsigned int ip, const char *filename, char *buffer)
-{
-       int r;
-
-       r = tftp_get(ip, filename, buffer);
-       if(r > 0)
-               printf("Successfully downloaded %d bytes from %s over TFTP\n", r, filename);
-       else
-               printf("Unable to download %s over TFTP\n", filename);
-       return r;
-}
-
-static const unsigned char macadr[6] = {0x10, 0xe2, 0xd5, 0x00, 0x00, 0x00};
-
-void netboot(void)
-{
-       int size;
-       unsigned int cmdline_adr, initrdstart_adr, initrdend_adr;
-       unsigned int ip;
-
-       printf("Booting from network...\n");
-       printf("Local IP : %d.%d.%d.%d\n", LOCALIP1, LOCALIP2, LOCALIP3, LOCALIP4);
-       printf("Remote IP: %d.%d.%d.%d\n", REMOTEIP1, REMOTEIP2, REMOTEIP3, REMOTEIP4);
-
-       ip = IPTOINT(REMOTEIP1, REMOTEIP2, REMOTEIP3, REMOTEIP4);
-
-       microudp_start(macadr, IPTOINT(LOCALIP1, LOCALIP2, LOCALIP3, LOCALIP4));
-
-       if(tftp_get_v(ip, "boot.bin", (void *)MAIN_RAM_BASE) <= 0) {
-               printf("Network boot failed\n");
-               return;
-       }
-
-       cmdline_adr = MAIN_RAM_BASE+0x1000000;
-       size = tftp_get_v(ip, "cmdline.txt", (void *)cmdline_adr);
-       if(size <= 0) {
-               printf("No command line parameters found\n");
-               cmdline_adr = 0;
-       } else
-               *((char *)(cmdline_adr+size)) = 0x00;
-
-       initrdstart_adr = MAIN_RAM_BASE+0x1002000;
-       size = tftp_get_v(ip, "initrd.bin", (void *)initrdstart_adr);
-       if(size <= 0) {
-               printf("No initial ramdisk found\n");
-               initrdstart_adr = 0;
-               initrdend_adr = 0;
-       } else
-               initrdend_adr = initrdstart_adr + size;
-
-       boot(cmdline_adr, initrdstart_adr, initrdend_adr, MAIN_RAM_BASE);
-}
-
-#endif
-
-#ifdef FLASH_BOOT_ADDRESS
-void flashboot(void)
-{
-       unsigned int *flashbase;
-       unsigned int length;
-       unsigned int crc;
-       unsigned int got_crc;
-
-       printf("Booting from flash...\n");
-       flashbase = (unsigned int *)FLASH_BOOT_ADDRESS;
-       length = *flashbase++;
-       crc = *flashbase++;
-       if((length < 32) || (length > 4*1024*1024)) {
-               printf("Error: Invalid flash boot image length 0x%08x\n", length);
-               return;
-       }
-
-       printf("Loading %d bytes from flash...\n", length);
-       memcpy((void *)MAIN_RAM_BASE, flashbase, length);
-       got_crc = crc32((unsigned char *)MAIN_RAM_BASE, length);
-       if(crc != got_crc) {
-               printf("CRC failed (expected %08x, got %08x)\n", crc, got_crc);
-               return;
-       }
-       boot(0, 0, 0, MAIN_RAM_BASE);
-}
-#endif
-
-#ifdef ROM_BOOT_ADDRESS
-/* When firmware is small enough, it can be interesting to run code from an
-   embedded blockram memory (faster and not impacted by memory controller
-   activity). Define ROM_BOOT_ADDRESS for that and initialize the blockram
-   with the firmware data. */
-void romboot(void)
-{
-       boot(0, 0, 0, ROM_BOOT_ADDRESS);
-}
-#endif
diff --git a/software/bios/boot.h b/software/bios/boot.h
deleted file mode 100644 (file)
index aa9cd88..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __BOOT_H
-#define __BOOT_H
-
-void serialboot(void);
-void netboot(void);
-void flashboot(void);
-void romboot(void);
-
-#endif /* __BOOT_H */
diff --git a/software/bios/dataflow.c b/software/bios/dataflow.c
deleted file mode 100644 (file)
index d9aaa6a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <stdio.h>
-
-#include "dataflow.h"
-
-void print_isd_info(unsigned int baseaddr)
-{
-       volatile unsigned int *regs;
-       int neps;
-       int nbytes;
-       int i, j;
-       int offset;
-       unsigned int ack_count, nack_count, cur_status;
-       
-       regs = (unsigned int *)baseaddr;
-       if((regs[0] != 0x6a) || (regs[1] != 0xb4)) {
-               printf("Incorrect magic number\n");
-               return;
-       }
-       neps = regs[2];
-       nbytes = (regs[3] + 7)/8;
-       
-       regs[4] = 1; // freeze
-       offset = 6; // regs[5] is reset
-       for(i=0;i<neps;i++) {
-               ack_count = 0;
-               for(j=0;j<nbytes;j++) {
-                       ack_count <<= 8;
-                       ack_count |= regs[offset++];
-               }
-               nack_count = 0;
-               for(j=0;j<nbytes;j++) {
-                       nack_count <<= 8;
-                       nack_count |= regs[offset++];
-               }
-               cur_status = regs[offset++];
-               printf("#%d: ACK_CNT:%10u   NAK_CNT:%10u %s %s\n",
-                       i, ack_count, nack_count,
-                       cur_status & 1 ? "stb" : "   ",
-                       cur_status & 2 ? "ack" : "   ");
-       }
-       regs[4] = 0; // unfreeze
-}
diff --git a/software/bios/dataflow.h b/software/bios/dataflow.h
deleted file mode 100644 (file)
index 9659830..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __DATAFLOW_H
-#define __DATAFLOW_H
-
-void print_isd_info(unsigned int baseaddr);
-
-#endif /* __DATAFLOW_H */
-
diff --git a/software/bios/isr.c b/software/bios/isr.c
deleted file mode 100644 (file)
index c49d31d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <generated/csr.h>
-#include <irq.h>
-#include <uart.h>
-
-void isr(void);
-void isr(void)
-{
-       unsigned int irqs;
-       
-       irqs = irq_pending() & irq_getmask();
-       
-       if(irqs & (1 << UART_INTERRUPT))
-               uart_isr();
-}
diff --git a/software/bios/linker.ld b/software/bios/linker.ld
deleted file mode 100644 (file)
index 13b4bca..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-INCLUDE generated/output_format.ld
-ENTRY(_start)
-
-INCLUDE generated/regions.ld
-
-SECTIONS
-{
-       .text :
-       {
-               _ftext = .;
-               *(.text .stub .text.* .gnu.linkonce.t.*)
-               _etext = .;
-       } > rom
-
-       .rodata :
-       {
-               . = ALIGN(4);
-               _frodata = .;
-               *(.rodata .rodata.* .gnu.linkonce.r.*)
-               *(.rodata1)
-
-               /* Make sure the file is aligned on disk as well
-                  as in memory; CRC calculation requires that. */
-               FILL(0);
-               . = ALIGN(4);
-               _erodata = .;
-       } > rom
-
-       .bss :
-       {
-               . = ALIGN(4);
-               _fbss = .;
-               *(.dynsbss)
-               *(.sbss .sbss.* .gnu.linkonce.sb.*)
-               *(.scommon)
-               *(.dynbss)
-               *(.bss .bss.* .gnu.linkonce.b.*)
-               *(COMMON)
-               . = ALIGN(4);
-               _ebss = .;
-               _end = .;
-       } > sram
-
-       /DISCARD/ :
-       {
-               *(.eh_frame)
-               *(.comment)
-               *(.data .data.* .gnu.linkonce.d.*)
-               *(.data1)
-               *(.sdata .sdata.* .gnu.linkonce.s.*)
-       }
-}
-
-PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram) - 4);
diff --git a/software/bios/main.c b/software/bios/main.c
deleted file mode 100644 (file)
index 3893141..0000000
+++ /dev/null
@@ -1,562 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <console.h>
-#include <string.h>
-#include <uart.h>
-#include <system.h>
-#include <id.h>
-#include <irq.h>
-#include <crc.h>
-
-#include <generated/csr.h>
-#include <generated/mem.h>
-#include <net/microudp.h>
-
-#include "sdram.h"
-#include "dataflow.h"
-#include "boot.h"
-
-/* General address space functions */
-
-#define NUMBER_OF_BYTES_ON_A_LINE 16
-static void dump_bytes(unsigned int *ptr, int count, unsigned addr)
-{
-       char *data = (char *)ptr;
-       int line_bytes = 0, i = 0;
-
-       putsnonl("Memory dump:");
-       while(count > 0){
-               line_bytes =
-                       (count > NUMBER_OF_BYTES_ON_A_LINE)?
-                               NUMBER_OF_BYTES_ON_A_LINE : count;
-
-               printf("\n0x%08x  ", addr);
-               for(i=0;i<line_bytes;i++)
-                       printf("%02x ", *(unsigned char *)(data+i));
-
-               for(;i<NUMBER_OF_BYTES_ON_A_LINE;i++)
-                       printf("   ");
-
-               printf(" ");
-
-               for(i=0;i<line_bytes;i++) {
-                       if((*(data+i) < 0x20) || (*(data+i) > 0x7e))
-                               printf(".");
-                       else
-                               printf("%c", *(data+i));
-               }
-
-               for(;i<NUMBER_OF_BYTES_ON_A_LINE;i++)
-                       printf(" ");
-
-               data += (char)line_bytes;
-               count -= line_bytes;
-               addr += line_bytes;
-       }
-       printf("\n");
-}
-
-static void mr(char *startaddr, char *len)
-{
-       char *c;
-       unsigned int *addr;
-       unsigned int length;
-
-       if(*startaddr == 0) {
-               printf("mr <address> [length]\n");
-               return;
-       }
-       addr = (unsigned *)strtoul(startaddr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect address\n");
-               return;
-       }
-       if(*len == 0) {
-               length = 4;
-       } else {
-               length = strtoul(len, &c, 0);
-               if(*c != 0) {
-                       printf("incorrect length\n");
-                       return;
-               }
-       }
-
-       dump_bytes(addr, length, (unsigned)addr);
-}
-
-static void mw(char *addr, char *value, char *count)
-{
-       char *c;
-       unsigned int *addr2;
-       unsigned int value2;
-       unsigned int count2;
-       unsigned int i;
-
-       if((*addr == 0) || (*value == 0)) {
-               printf("mw <address> <value> [count]\n");
-               return;
-       }
-       addr2 = (unsigned int *)strtoul(addr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect address\n");
-               return;
-       }
-       value2 = strtoul(value, &c, 0);
-       if(*c != 0) {
-               printf("incorrect value\n");
-               return;
-       }
-       if(*count == 0) {
-               count2 = 1;
-       } else {
-               count2 = strtoul(count, &c, 0);
-               if(*c != 0) {
-                       printf("incorrect count\n");
-                       return;
-               }
-       }
-       for (i=0;i<count2;i++) *addr2++ = value2;
-}
-
-static void mc(char *dstaddr, char *srcaddr, char *count)
-{
-       char *c;
-       unsigned int *dstaddr2;
-       unsigned int *srcaddr2;
-       unsigned int count2;
-       unsigned int i;
-
-       if((*dstaddr == 0) || (*srcaddr == 0)) {
-               printf("mc <dst> <src> [count]\n");
-               return;
-       }
-       dstaddr2 = (unsigned int *)strtoul(dstaddr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect destination address\n");
-               return;
-       }
-       srcaddr2 = (unsigned int *)strtoul(srcaddr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect source address\n");
-               return;
-       }
-       if(*count == 0) {
-               count2 = 1;
-       } else {
-               count2 = strtoul(count, &c, 0);
-               if(*c != 0) {
-                       printf("incorrect count\n");
-                       return;
-               }
-       }
-       for (i=0;i<count2;i++) *dstaddr2++ = *srcaddr2++;
-}
-
-static void crc(char *startaddr, char *len)
-{
-       char *c;
-       char *addr;
-       unsigned int length;
-
-       if((*startaddr == 0)||(*len == 0)) {
-               printf("crc <address> <length>\n");
-               return;
-       }
-       addr = (char *)strtoul(startaddr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect address\n");
-               return;
-       }
-       length = strtoul(len, &c, 0);
-       if(*c != 0) {
-               printf("incorrect length\n");
-               return;
-       }
-
-       printf("CRC32: %08x\n", crc32((unsigned char *)addr, length));
-}
-
-#ifdef __lm32__
-enum {
-       CSR_IE = 1, CSR_IM, CSR_IP, CSR_ICC, CSR_DCC, CSR_CC, CSR_CFG, CSR_EBA,
-       CSR_DC, CSR_DEBA, CSR_JTX, CSR_JRX, CSR_BP0, CSR_BP1, CSR_BP2, CSR_BP3,
-       CSR_WP0, CSR_WP1, CSR_WP2, CSR_WP3,
-};
-
-/* processor registers */
-static int parse_csr(const char *csr)
-{
-       if(!strcmp(csr, "ie"))   return CSR_IE;
-       if(!strcmp(csr, "im"))   return CSR_IM;
-       if(!strcmp(csr, "ip"))   return CSR_IP;
-       if(!strcmp(csr, "icc"))  return CSR_ICC;
-       if(!strcmp(csr, "dcc"))  return CSR_DCC;
-       if(!strcmp(csr, "cc"))   return CSR_CC;
-       if(!strcmp(csr, "cfg"))  return CSR_CFG;
-       if(!strcmp(csr, "eba"))  return CSR_EBA;
-       if(!strcmp(csr, "dc"))   return CSR_DC;
-       if(!strcmp(csr, "deba")) return CSR_DEBA;
-       if(!strcmp(csr, "jtx"))  return CSR_JTX;
-       if(!strcmp(csr, "jrx"))  return CSR_JRX;
-       if(!strcmp(csr, "bp0"))  return CSR_BP0;
-       if(!strcmp(csr, "bp1"))  return CSR_BP1;
-       if(!strcmp(csr, "bp2"))  return CSR_BP2;
-       if(!strcmp(csr, "bp3"))  return CSR_BP3;
-       if(!strcmp(csr, "wp0"))  return CSR_WP0;
-       if(!strcmp(csr, "wp1"))  return CSR_WP1;
-       if(!strcmp(csr, "wp2"))  return CSR_WP2;
-       if(!strcmp(csr, "wp3"))  return CSR_WP3;
-
-       return 0;
-}
-
-static void rcsr(char *csr)
-{
-       unsigned int csr2;
-       register unsigned int value;
-
-       if(*csr == 0) {
-               printf("rcsr <csr>\n");
-               return;
-       }
-
-       csr2 = parse_csr(csr);
-       if(csr2 == 0) {
-               printf("incorrect csr\n");
-               return;
-       }
-
-       switch(csr2) {
-               case CSR_IE:   asm volatile ("rcsr %0,ie":"=r"(value)); break;
-               case CSR_IM:   asm volatile ("rcsr %0,im":"=r"(value)); break;
-               case CSR_IP:   asm volatile ("rcsr %0,ip":"=r"(value)); break;
-               case CSR_CC:   asm volatile ("rcsr %0,cc":"=r"(value)); break;
-               case CSR_CFG:  asm volatile ("rcsr %0,cfg":"=r"(value)); break;
-               case CSR_EBA:  asm volatile ("rcsr %0,eba":"=r"(value)); break;
-               case CSR_DEBA: asm volatile ("rcsr %0,deba":"=r"(value)); break;
-               case CSR_JTX:  asm volatile ("rcsr %0,jtx":"=r"(value)); break;
-               case CSR_JRX:  asm volatile ("rcsr %0,jrx":"=r"(value)); break;
-               default: printf("csr write only\n"); return;
-       }
-
-       printf("%08x\n", value);
-}
-
-static void wcsr(char *csr, char *value)
-{
-       char *c;
-       unsigned int csr2;
-       register unsigned int value2;
-
-       if((*csr == 0) || (*value == 0)) {
-               printf("wcsr <csr> <address>\n");
-               return;
-       }
-
-       csr2 = parse_csr(csr);
-       if(csr2 == 0) {
-               printf("incorrect csr\n");
-               return;
-       }
-       value2 = strtoul(value, &c, 0);
-       if(*c != 0) {
-               printf("incorrect value\n");
-               return;
-       }
-
-       switch(csr2) {
-               case CSR_IE:   asm volatile ("wcsr ie,%0"::"r"(value2)); break;
-               case CSR_IM:   asm volatile ("wcsr im,%0"::"r"(value2)); break;
-               case CSR_ICC:  asm volatile ("wcsr icc,%0"::"r"(value2)); break;
-               case CSR_DCC:  asm volatile ("wcsr dcc,%0"::"r"(value2)); break;
-               case CSR_EBA:  asm volatile ("wcsr eba,%0"::"r"(value2)); break;
-               case CSR_DC:   asm volatile ("wcsr dcc,%0"::"r"(value2)); break;
-               case CSR_DEBA: asm volatile ("wcsr deba,%0"::"r"(value2)); break;
-               case CSR_JTX:  asm volatile ("wcsr jtx,%0"::"r"(value2)); break;
-               case CSR_JRX:  asm volatile ("wcsr jrx,%0"::"r"(value2)); break;
-               case CSR_BP0:  asm volatile ("wcsr bp0,%0"::"r"(value2)); break;
-               case CSR_BP1:  asm volatile ("wcsr bp1,%0"::"r"(value2)); break;
-               case CSR_BP2:  asm volatile ("wcsr bp2,%0"::"r"(value2)); break;
-               case CSR_BP3:  asm volatile ("wcsr bp3,%0"::"r"(value2)); break;
-               case CSR_WP0:  asm volatile ("wcsr wp0,%0"::"r"(value2)); break;
-               case CSR_WP1:  asm volatile ("wcsr wp1,%0"::"r"(value2)); break;
-               case CSR_WP2:  asm volatile ("wcsr wp2,%0"::"r"(value2)); break;
-               case CSR_WP3:  asm volatile ("wcsr wp3,%0"::"r"(value2)); break;
-               default: printf("csr read only\n"); return;
-       }
-}
-
-#endif /* __lm32__ */
-
-static void dfs(char *baseaddr)
-{
-       char *c;
-       unsigned int addr;
-
-       if(*baseaddr == 0) {
-               printf("dfs <address>\n");
-               return;
-       }
-       addr = strtoul(baseaddr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect address\n");
-               return;
-       }
-       print_isd_info(addr);
-}
-
-/* Init + command line */
-
-static void help(void)
-{
-       puts("MiSoC BIOS");
-       puts("Available commands:");
-       puts("mr         - read address space");
-       puts("mw         - write address space");
-       puts("mc         - copy address space");
-       puts("crc        - compute CRC32 of a part of the address space");
-#ifdef __lm32__
-       puts("rcsr       - read processor CSR");
-       puts("wcsr       - write processor CSR");
-#endif
-#ifdef CSR_ETHMAC_BASE
-       puts("netboot    - boot via TFTP");
-#endif
-       puts("serialboot - boot via SFL");
-#ifdef FLASH_BOOT_ADDRESS
-       puts("flashboot  - boot from flash");
-#endif
-#ifdef ROM_BOOT_ADDRESS
-       puts("romboot    - boot from embedded rom");
-#endif
-       puts("revision   - display revision");
-#ifdef CSR_SDRAM_BASE
-       puts("memtest    - run a memory test");
-#endif
-}
-
-static char *get_token(char **str)
-{
-       char *c, *d;
-
-       c = (char *)strchr(*str, ' ');
-       if(c == NULL) {
-               d = *str;
-               *str = *str+strlen(*str);
-               return d;
-       }
-       *c = 0;
-       d = *str;
-       *str = c+1;
-       return d;
-}
-
-static void do_command(char *c)
-{
-       char *token;
-
-       token = get_token(&c);
-
-       if(strcmp(token, "mr") == 0) mr(get_token(&c), get_token(&c));
-       else if(strcmp(token, "mw") == 0) mw(get_token(&c), get_token(&c), get_token(&c));
-       else if(strcmp(token, "mc") == 0) mc(get_token(&c), get_token(&c), get_token(&c));
-       else if(strcmp(token, "crc") == 0) crc(get_token(&c), get_token(&c));
-
-#ifdef L2_SIZE
-       else if(strcmp(token, "flushl2") == 0) flush_l2_cache();
-#endif
-
-#ifdef FLASH_BOOT_ADDRESS
-       else if(strcmp(token, "flashboot") == 0) flashboot();
-#endif
-#ifdef ROM_BOOT_ADDRESS
-       else if(strcmp(token, "romboot") == 0) romboot();
-#endif
-       else if(strcmp(token, "serialboot") == 0) serialboot();
-#ifdef CSR_ETHMAC_BASE
-       else if(strcmp(token, "netboot") == 0) netboot();
-#endif
-
-       else if(strcmp(token, "revision") == 0) printf("%08x\n", MSC_GIT_ID);
-
-       else if(strcmp(token, "help") == 0) help();
-
-#ifdef __lm32__
-       else if(strcmp(token, "rcsr") == 0) rcsr(get_token(&c));
-       else if(strcmp(token, "wcsr") == 0) wcsr(get_token(&c), get_token(&c));
-#endif
-
-#ifdef CSR_SDRAM_BASE
-       else if(strcmp(token, "sdrrow") == 0) sdrrow(get_token(&c));
-       else if(strcmp(token, "sdrsw") == 0) sdrsw();
-       else if(strcmp(token, "sdrhw") == 0) sdrhw();
-       else if(strcmp(token, "sdrrdbuf") == 0) sdrrdbuf(-1);
-       else if(strcmp(token, "sdrrd") == 0) sdrrd(get_token(&c), get_token(&c));
-       else if(strcmp(token, "sdrrderr") == 0) sdrrderr(get_token(&c));
-       else if(strcmp(token, "sdrwr") == 0) sdrwr(get_token(&c));
-#ifdef CSR_DDRPHY_BASE
-       else if(strcmp(token, "sdrwlon") == 0) sdrwlon();
-       else if(strcmp(token, "sdrwloff") == 0) sdrwloff();
-       else if(strcmp(token, "sdrlevel") == 0) sdrlevel();
-#endif
-       else if(strcmp(token, "memtest") == 0) memtest();
-       else if(strcmp(token, "sdrinit") == 0) sdrinit();
-#endif
-
-       else if(strcmp(token, "dfs") == 0) dfs(get_token(&c));
-
-       else if(strcmp(token, "") != 0)
-               printf("Command not found\n");
-}
-
-extern unsigned int _ftext, _erodata;
-
-static void crcbios(void)
-{
-       unsigned int offset_bios;
-       unsigned int length;
-       unsigned int expected_crc;
-       unsigned int actual_crc;
-
-       /*
-        * _erodata is located right after the end of the flat
-        * binary image. The CRC tool writes the 32-bit CRC here.
-        * We also use the address of _erodata to know the length
-        * of our code.
-        */
-       offset_bios = (unsigned int)&_ftext;
-       expected_crc = _erodata;
-       length = (unsigned int)&_erodata - offset_bios;
-       actual_crc = crc32((unsigned char *)offset_bios, length);
-       if(expected_crc == actual_crc)
-               printf("BIOS CRC passed (%08x)\n", actual_crc);
-       else {
-               printf("BIOS CRC failed (expected %08x, got %08x)\n", expected_crc, actual_crc);
-               printf("The system will continue, but expect problems.\n");
-       }
-}
-
-static void readstr(char *s, int size)
-{
-       char c[2];
-       int ptr;
-
-       c[1] = 0;
-       ptr = 0;
-       while(1) {
-               c[0] = readchar();
-               switch(c[0]) {
-                       case 0x7f:
-                       case 0x08:
-                               if(ptr > 0) {
-                                       ptr--;
-                                       putsnonl("\x08 \x08");
-                               }
-                               break;
-                       case 0x07:
-                               break;
-                       case '\r':
-                       case '\n':
-                               s[ptr] = 0x00;
-                               putsnonl("\n");
-                               return;
-                       default:
-                               putsnonl(c);
-                               s[ptr] = c[0];
-                               ptr++;
-                               break;
-               }
-       }
-}
-
-static int test_user_abort(void)
-{
-       char c;
-
-       printf("Automatic boot in 2 seconds...\n");
-       printf("Q/ESC: abort boot\n");
-       printf("F7:    boot from serial\n");
-#ifdef CSR_ETHMAC_BASE
-       printf("F8:    boot from network\n");
-#endif
-       timer0_en_write(0);
-       timer0_reload_write(0);
-       timer0_load_write(identifier_frequency_read()*2);
-       timer0_en_write(1);
-       timer0_update_value_write(1);
-       while(timer0_value_read()) {
-               if(readchar_nonblock()) {
-                       c = readchar();
-                       if((c == 'Q')||(c == '\e')) {
-                               puts("Aborted");
-                               return 0;
-                       }
-                       if(c == 0x06) {
-                               serialboot();
-                               return 0;
-                       }
-#ifdef CSR_ETHMAC_BASE
-                       if(c == 0x07) {
-                               netboot();
-                               return 0;
-                       }
-#endif
-               }
-               timer0_update_value_write(1);
-       }
-       return 1;
-}
-
-static void boot_sequence(void)
-{
-       if(test_user_abort()) {
-#ifdef FLASH_BOOT_ADDRESS
-               flashboot();
-#endif
-#ifdef ROM_BOOT_ADDRESS
-               romboot();
-#endif
-               serialboot();
-#ifdef CSR_ETHMAC_BASE
-#ifdef CSR_ETHPHY_MODE_DETECTION_MODE_ADDR
-               eth_mode();
-#endif
-               netboot();
-#endif
-               printf("No boot medium found\n");
-       }
-}
-
-int main(int i, char **c)
-{
-       char buffer[64];
-       int sdr_ok;
-
-       irq_setmask(0);
-       irq_setie(1);
-       uart_init();
-       puts("\nMiSoC BIOS   http://m-labs.hk\n"
-       "(c) Copyright 2007-2014 Sebastien Bourdeauducq");
-       printf("Revision %08x built "__DATE__" "__TIME__"\n\n", MSC_GIT_ID);
-       crcbios();
-       id_print();
-#ifdef CSR_ETHMAC_BASE
-       eth_init();
-#endif
-#ifdef CSR_SDRAM_BASE
-       sdr_ok = sdrinit();
-#else
-       sdr_ok = 1;
-#endif
-       if(sdr_ok)
-               boot_sequence();
-       else
-               printf("Memory initialization failed\n");
-
-       while(1) {
-               putsnonl("\e[1mBIOS>\e[0m ");
-               readstr(buffer, 64);
-               do_command(buffer);
-       }
-       return 0;
-}
diff --git a/software/bios/sdram.c b/software/bios/sdram.c
deleted file mode 100644 (file)
index bb917df..0000000
+++ /dev/null
@@ -1,547 +0,0 @@
-#include <generated/csr.h>
-#ifdef CSR_SDRAM_BASE
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <generated/sdram_phy.h>
-#include <generated/mem.h>
-#include <hw/flags.h>
-#include <system.h>
-
-#include "sdram.h"
-
-static void cdelay(int i)
-{
-       while(i > 0) {
-#if defined (__lm32__)
-               __asm__ volatile("nop");
-#elif defined (__or1k__)
-               __asm__ volatile("l.nop");
-#else
-#error Unsupported architecture
-#endif
-               i--;
-       }
-}
-
-void sdrsw(void)
-{
-       sdram_dfii_control_write(DFII_CONTROL_CKE|DFII_CONTROL_ODT|DFII_CONTROL_RESET_N);
-       printf("SDRAM now under software control\n");
-}
-
-void sdrhw(void)
-{
-       sdram_dfii_control_write(DFII_CONTROL_SEL);
-       printf("SDRAM now under hardware control\n");
-}
-
-void sdrrow(char *_row)
-{
-       char *c;
-       unsigned int row;
-
-       if(*_row == 0) {
-               sdram_dfii_pi0_address_write(0x0000);
-               sdram_dfii_pi0_baddress_write(0);
-               command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
-               cdelay(15);
-               printf("Precharged\n");
-       } else {
-               row = strtoul(_row, &c, 0);
-               if(*c != 0) {
-                       printf("incorrect row\n");
-                       return;
-               }
-               sdram_dfii_pi0_address_write(row);
-               sdram_dfii_pi0_baddress_write(0);
-               command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CS);
-               cdelay(15);
-               printf("Activated row %d\n", row);
-       }
-}
-
-void sdrrdbuf(int dq)
-{
-       int i, p;
-       int first_byte, step;
-
-       if(dq < 0) {
-               first_byte = 0;
-               step = 1;
-       } else {
-               first_byte = DFII_PIX_DATA_SIZE/2 - 1 - dq;
-               step = DFII_PIX_DATA_SIZE/2;
-       }
-
-       for(p=0;p<DFII_NPHASES;p++)
-               for(i=first_byte;i<DFII_PIX_DATA_SIZE;i+=step)
-                       printf("%02x", MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i));
-       printf("\n");
-}
-
-void sdrrd(char *startaddr, char *dq)
-{
-       char *c;
-       unsigned int addr;
-       int _dq;
-
-       if(*startaddr == 0) {
-               printf("sdrrd <address>\n");
-               return;
-       }
-       addr = strtoul(startaddr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect address\n");
-               return;
-       }
-       if(*dq == 0)
-               _dq = -1;
-       else {
-               _dq = strtoul(dq, &c, 0);
-               if(*c != 0) {
-                       printf("incorrect DQ\n");
-                       return;
-               }
-       }
-
-       sdram_dfii_pird_address_write(addr);
-       sdram_dfii_pird_baddress_write(0);
-       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
-       cdelay(15);
-       sdrrdbuf(_dq);
-}
-
-void sdrrderr(char *count)
-{
-       int addr;
-       char *c;
-       int _count;
-       int i, j, p;
-       unsigned char prev_data[DFII_NPHASES*DFII_PIX_DATA_SIZE];
-       unsigned char errs[DFII_NPHASES*DFII_PIX_DATA_SIZE];
-
-       if(*count == 0) {
-               printf("sdrrderr <count>\n");
-               return;
-       }
-       _count = strtoul(count, &c, 0);
-       if(*c != 0) {
-               printf("incorrect count\n");
-               return;
-       }
-
-       for(i=0;i<DFII_NPHASES*DFII_PIX_DATA_SIZE;i++)
-                       errs[i] = 0;
-       for(addr=0;addr<16;addr++) {
-               sdram_dfii_pird_address_write(addr*8);
-               sdram_dfii_pird_baddress_write(0);
-               command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
-               cdelay(15);
-               for(p=0;p<DFII_NPHASES;p++)
-                       for(i=0;i<DFII_PIX_DATA_SIZE;i++)
-                               prev_data[p*DFII_PIX_DATA_SIZE+i] = MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i);
-
-               for(j=0;j<_count;j++) {
-                       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
-                       cdelay(15);
-                       for(p=0;p<DFII_NPHASES;p++)
-                               for(i=0;i<DFII_PIX_DATA_SIZE;i++) {
-                                       unsigned char new_data;
-
-                                       new_data = MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i);
-                                       errs[p*DFII_PIX_DATA_SIZE+i] |= prev_data[p*DFII_PIX_DATA_SIZE+i] ^ new_data;
-                                       prev_data[p*DFII_PIX_DATA_SIZE+i] = new_data;
-                               }
-               }
-       }
-
-       for(i=0;i<DFII_NPHASES*DFII_PIX_DATA_SIZE;i++)
-               printf("%02x", errs[i]);
-       printf("\n");
-       for(p=0;p<DFII_NPHASES;p++)
-               for(i=0;i<DFII_PIX_DATA_SIZE;i++)
-                       printf("%2x", DFII_PIX_DATA_SIZE/2 - 1 - (i % (DFII_PIX_DATA_SIZE/2)));
-       printf("\n");
-}
-
-void sdrwr(char *startaddr)
-{
-       char *c;
-       unsigned int addr;
-       int i;
-       int p;
-
-       if(*startaddr == 0) {
-               printf("sdrrd <address>\n");
-               return;
-       }
-       addr = strtoul(startaddr, &c, 0);
-       if(*c != 0) {
-               printf("incorrect address\n");
-               return;
-       }
-
-       for(p=0;p<DFII_NPHASES;p++)
-               for(i=0;i<DFII_PIX_DATA_SIZE;i++)
-                       MMPTR(sdram_dfii_pix_wrdata_addr[p]+4*i) = 0x10*p + i;
-
-       sdram_dfii_piwr_address_write(addr);
-       sdram_dfii_piwr_baddress_write(0);
-       command_pwr(DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS|DFII_COMMAND_WRDATA);
-}
-
-#ifdef CSR_DDRPHY_BASE
-
-void sdrwlon(void)
-{
-       sdram_dfii_pi0_address_write(DDR3_MR1 | (1 << 7));
-       sdram_dfii_pi0_baddress_write(1);
-       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
-       ddrphy_wlevel_en_write(1);
-}
-
-void sdrwloff(void)
-{
-       sdram_dfii_pi0_address_write(DDR3_MR1);
-       sdram_dfii_pi0_baddress_write(1);
-       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
-       ddrphy_wlevel_en_write(0);
-}
-
-#define ERR_DDRPHY_DELAY 32
-
-static int write_level(int *delay, int *high_skew)
-{
-       int i;
-       int dq_address;
-       unsigned char dq;
-       int ok;
-
-       printf("Write leveling: ");
-
-       sdrwlon();
-       cdelay(100);
-       for(i=0;i<DFII_PIX_DATA_SIZE/2;i++) {
-               dq_address = sdram_dfii_pix_rddata_addr[0]+4*(DFII_PIX_DATA_SIZE/2-1-i);
-               ddrphy_dly_sel_write(1 << i);
-               ddrphy_wdly_dq_rst_write(1);
-               ddrphy_wdly_dqs_rst_write(1);
-
-               delay[i] = 0;
-
-               ddrphy_wlevel_strobe_write(1);
-               cdelay(10);
-               dq = MMPTR(dq_address);
-               if(dq != 0) {
-                       /*
-                        * Assume this DQ group has between 1 and 2 bit times of skew.
-                        * Bring DQS into the CK=0 zone before continuing leveling.
-                        */
-                       high_skew[i] = 1;
-                       while(dq != 0) {
-                               delay[i]++;
-                               if(delay[i] >= ERR_DDRPHY_DELAY)
-                                       break;
-                               ddrphy_wdly_dq_inc_write(1);
-                               ddrphy_wdly_dqs_inc_write(1);
-                               ddrphy_wlevel_strobe_write(1);
-                               cdelay(10);
-                               dq = MMPTR(dq_address);
-                        }
-               } else
-                       high_skew[i] = 0;
-
-               while(dq == 0) {
-                       delay[i]++;
-                       if(delay[i] >= ERR_DDRPHY_DELAY)
-                               break;
-                       ddrphy_wdly_dq_inc_write(1);
-                       ddrphy_wdly_dqs_inc_write(1);
-
-                       ddrphy_wlevel_strobe_write(1);
-                       cdelay(10);
-                       dq = MMPTR(dq_address);
-               }
-       }
-       sdrwloff();
-
-       ok = 1;
-       for(i=DFII_PIX_DATA_SIZE/2-1;i>=0;i--) {
-               printf("%2d%c ", delay[i], high_skew[i] ? '*' : ' ');
-               if(delay[i] >= ERR_DDRPHY_DELAY)
-                       ok = 0;
-       }
-
-       if(ok)
-               printf("completed\n");
-       else
-               printf("failed\n");
-
-       return ok;
-}
-
-static void read_bitslip(int *delay, int *high_skew)
-{
-       int bitslip_thr;
-       int i;
-
-       bitslip_thr = 0x7fffffff;
-       for(i=0;i<DFII_PIX_DATA_SIZE/2;i++)
-               if(high_skew[i] && (delay[i] < bitslip_thr))
-                       bitslip_thr = delay[i];
-       if(bitslip_thr == 0x7fffffff)
-               return;
-       bitslip_thr = bitslip_thr/2;
-
-       printf("Read bitslip: ");
-       for(i=DFII_PIX_DATA_SIZE/2-1;i>=0;i--)
-               if(delay[i] > bitslip_thr) {
-                       ddrphy_dly_sel_write(1 << i);
-                       /* 7-series SERDES in DDR mode needs 3 pulses for 1 bitslip */
-                       ddrphy_rdly_dq_bitslip_write(1);
-                       ddrphy_rdly_dq_bitslip_write(1);
-                       ddrphy_rdly_dq_bitslip_write(1);
-                       printf("%d ", i);
-               }
-       printf("\n");
-}
-
-static void read_delays(void)
-{
-       unsigned int prv;
-       unsigned char prs[DFII_NPHASES*DFII_PIX_DATA_SIZE];
-       int p, i, j;
-       int working;
-       int delay, delay_min, delay_max;
-
-       printf("Read delays: ");
-
-       /* Generate pseudo-random sequence */
-       prv = 42;
-       for(i=0;i<DFII_NPHASES*DFII_PIX_DATA_SIZE;i++) {
-               prv = 1664525*prv + 1013904223;
-               prs[i] = prv;
-       }
-
-       /* Activate */
-       sdram_dfii_pi0_address_write(0);
-       sdram_dfii_pi0_baddress_write(0);
-       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CS);
-       cdelay(15);
-
-       /* Write test pattern */
-       for(p=0;p<DFII_NPHASES;p++)
-               for(i=0;i<DFII_PIX_DATA_SIZE;i++)
-                       MMPTR(sdram_dfii_pix_wrdata_addr[p]+4*i) = prs[DFII_PIX_DATA_SIZE*p+i];
-       sdram_dfii_piwr_address_write(0);
-       sdram_dfii_piwr_baddress_write(0);
-       command_pwr(DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS|DFII_COMMAND_WRDATA);
-
-       /* Calibrate each DQ in turn */
-       sdram_dfii_pird_address_write(0);
-       sdram_dfii_pird_baddress_write(0);
-       for(i=0;i<DFII_PIX_DATA_SIZE/2;i++) {
-               ddrphy_dly_sel_write(1 << (DFII_PIX_DATA_SIZE/2-i-1));
-               delay = 0;
-
-               /* Find smallest working delay */
-               ddrphy_rdly_dq_rst_write(1);
-               while(1) {
-                       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
-                       cdelay(15);
-                       working = 1;
-                       for(p=0;p<DFII_NPHASES;p++) {
-                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i) != prs[DFII_PIX_DATA_SIZE*p+i])
-                                       working = 0;
-                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*(i+DFII_PIX_DATA_SIZE/2)) != prs[DFII_PIX_DATA_SIZE*p+i+DFII_PIX_DATA_SIZE/2])
-                                       working = 0;
-                       }
-                       if(working)
-                               break;
-                       delay++;
-                       if(delay >= ERR_DDRPHY_DELAY)
-                               break;
-                       ddrphy_rdly_dq_inc_write(1);
-               }
-               delay_min = delay;
-
-               /* Get a bit further into the working zone */
-               delay++;
-               ddrphy_rdly_dq_inc_write(1);
-
-               /* Find largest working delay */
-               while(1) {
-                       command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA);
-                       cdelay(15);
-                       working = 1;
-                       for(p=0;p<DFII_NPHASES;p++) {
-                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*i) != prs[DFII_PIX_DATA_SIZE*p+i])
-                                       working = 0;
-                               if(MMPTR(sdram_dfii_pix_rddata_addr[p]+4*(i+DFII_PIX_DATA_SIZE/2)) != prs[DFII_PIX_DATA_SIZE*p+i+DFII_PIX_DATA_SIZE/2])
-                                       working = 0;
-                       }
-                       if(!working)
-                               break;
-                       delay++;
-                       if(delay >= ERR_DDRPHY_DELAY)
-                               break;
-                       ddrphy_rdly_dq_inc_write(1);
-               }
-               delay_max = delay;
-
-               printf("%d:%02d-%02d  ", DFII_PIX_DATA_SIZE/2-i-1, delay_min, delay_max);
-
-               /* Set delay to the middle */
-               ddrphy_rdly_dq_rst_write(1);
-               for(j=0;j<(delay_min+delay_max)/2;j++)
-                       ddrphy_rdly_dq_inc_write(1);
-       }
-
-       /* Precharge */
-       sdram_dfii_pi0_address_write(0);
-       sdram_dfii_pi0_baddress_write(0);
-       command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS);
-       cdelay(15);
-
-       printf("completed\n");
-}
-
-int sdrlevel(void)
-{
-       int delay[DFII_PIX_DATA_SIZE/2];
-       int high_skew[DFII_PIX_DATA_SIZE/2];
-
-       if(!write_level(delay, high_skew))
-               return 0;
-       read_bitslip(delay, high_skew);
-       read_delays();
-
-       return 1;
-}
-
-#endif /* CSR_DDRPHY_BASE */
-
-#define TEST_DATA_SIZE (2*1024*1024)
-#define TEST_DATA_RANDOM 1
-
-#define TEST_ADDR_SIZE (32*1024)
-#define TEST_ADDR_RANDOM 0
-
-#define ONEZERO 0xAAAAAAAA
-#define ZEROONE 0x55555555
-
-static unsigned int seed_to_data_32(unsigned int seed, int random)
-{
-       if (random)
-               return 1664525*seed + 1013904223;
-       else
-               return seed + 1;
-}
-
-static unsigned short seed_to_data_16(unsigned short seed, int random)
-{
-       if (random)
-               return 25173*seed + 13849;
-       else
-               return seed + 1;
-}
-
-int memtest_silent(void)
-{
-       volatile unsigned int *array = (unsigned int *)MAIN_RAM_BASE;
-       int i;
-       unsigned int seed_32;
-       unsigned short seed_16;
-       unsigned int error_cnt;
-
-       error_cnt = 0;
-
-       /* test data bus */
-       for(i=0;i<128;i++) {
-               array[i] = ONEZERO;
-       }
-       flush_cpu_dcache();
-       flush_l2_cache();
-       for(i=0;i<128;i++) {
-               if(array[i] != ONEZERO)
-                       error_cnt++;
-       }
-
-       for(i=0;i<128;i++) {
-               array[i] = ZEROONE;
-       }
-       flush_cpu_dcache();
-       flush_l2_cache();
-       for(i=0;i<128;i++) {
-               if(array[i] != ZEROONE)
-                       error_cnt++;
-       }
-
-       /* test counter or random data */
-       seed_32 = 0;
-       for(i=0;i<TEST_DATA_SIZE/4;i++) {
-               seed_32 = seed_to_data_32(seed_32, TEST_DATA_RANDOM);
-               array[i] = seed_32;
-       }
-
-       seed_32 = 0;
-       flush_cpu_dcache();
-       flush_l2_cache();
-       for(i=0;i<TEST_DATA_SIZE/4;i++) {
-               seed_32 = seed_to_data_32(seed_32, TEST_DATA_RANDOM);
-               if(array[i] != seed_32)
-                       error_cnt++;
-       }
-
-       /* test random addressing */
-       seed_16 = 0;
-       for(i=0;i<TEST_ADDR_SIZE/4;i++) {
-               seed_16 = seed_to_data_16(seed_16, TEST_ADDR_RANDOM);
-               array[(unsigned int) seed_16] = i;
-       }
-
-       seed_16 = 0;
-       flush_cpu_dcache();
-       flush_l2_cache();
-       for(i=0;i<TEST_ADDR_SIZE/4;i++) {
-               seed_16 = seed_to_data_16(seed_16, TEST_ADDR_RANDOM);
-               if(array[(unsigned int) seed_16] != i)
-                       error_cnt++;
-       }
-
-       return error_cnt;
-}
-
-int memtest(void)
-{
-       unsigned int e;
-
-       e = memtest_silent();
-       if(e != 0) {
-               printf("Memtest failed: %d/%d words incorrect\n", e, 2*128 + TEST_DATA_SIZE/4 + TEST_ADDR_SIZE/4);
-               return 0;
-       } else {
-               printf("Memtest OK\n");
-               return 1;
-       }
-}
-
-int sdrinit(void)
-{
-       printf("Initializing SDRAM...\n");
-
-       init_sequence();
-#ifdef CSR_DDRPHY_BASE
-       if(!sdrlevel())
-               return 0;
-#endif
-       sdram_dfii_control_write(DFII_CONTROL_SEL);
-       if(!memtest())
-               return 0;
-
-       return 1;
-}
-
-#endif
diff --git a/software/bios/sdram.h b/software/bios/sdram.h
deleted file mode 100644 (file)
index c5d0984..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __SDRAM_H
-#define __SDRAM_H
-
-#include <generated/csr.h>
-
-void sdrsw(void);
-void sdrhw(void);
-void sdrrow(char *_row);
-void sdrrdbuf(int dq);
-void sdrrd(char *startaddr, char *dq);
-void sdrrderr(char *count);
-void sdrwr(char *startaddr);
-
-#ifdef CSR_DDRPHY_BASE
-void sdrwlon(void);
-void sdrwloff(void);
-int sdrlevel(void);
-#endif
-
-int memtest_silent(void);
-int memtest(void);
-int sdrinit(void);
-
-#endif /* __SDRAM_H */
diff --git a/software/common.mak b/software/common.mak
deleted file mode 100644 (file)
index 053ace1..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-include $(MSCDIR)/software/include/generated/cpu.mak
-TARGET_PREFIX=$(TRIPLE)-
-
-RM ?= rm -f
-PYTHON ?= python3
-
-ifeq ($(CLANG),1)
-CC_normal      := clang -target $(TRIPLE) -integrated-as
-CX_normal      := clang++ -target $(TRIPLE) -integrated-as
-else
-CC_normal      := $(TARGET_PREFIX)gcc
-CX_normal      := $(TARGET_PREFIX)g++
-endif
-AR_normal      := $(TARGET_PREFIX)ar
-LD_normal      := $(TARGET_PREFIX)ld
-OBJCOPY_normal := $(TARGET_PREFIX)objcopy
-
-CC_quiet      = @echo " CC      " $@ && $(CC_normal)
-CX_quiet      = @echo " CX      " $@ && $(CX_normal)
-AR_quiet      = @echo " AR      " $@ && $(AR_normal)
-LD_quiet      = @echo " LD      " $@ && $(LD_normal)
-OBJCOPY_quiet = @echo " OBJCOPY " $@ && $(OBJCOPY_normal)
-
-MSC_GIT_ID := $(shell cd $(MSCDIR) && $(PYTHON) -c "from misoc.cores.identifier import get_id; print(hex(get_id()), end='')")
-
-ifeq ($(V),1)
-       CC = $(CC_normal)
-       CX = $(CX_normal)
-       AR = $(AR_normal)
-       LD = $(LD_normal)
-       OBJCOPY = $(OBJCOPY_normal)
-else
-       CC = $(CC_quiet)
-       CX = $(CX_quiet)
-       AR = $(AR_quiet)
-       LD = $(LD_quiet)
-       OBJCOPY = $(OBJCOPY_quiet)
-endif
-
-# Toolchain options
-#
-INCLUDES = -I$(MSCDIR)/software/include/base -I$(MSCDIR)/software/include -I$(MSCDIR)/common
-COMMONFLAGS = -Os $(CPUFLAGS) -fomit-frame-pointer -Wall -fno-builtin -nostdinc -DMSC_GIT_ID=$(MSC_GIT_ID) $(INCLUDES)
-CFLAGS = $(COMMONFLAGS) -fexceptions -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes
-CXXFLAGS = $(COMMONFLAGS) -std=c++11 -I$(MSCDIR)/software/include/basec++ -fexceptions -fno-rtti -ffreestanding
-LDFLAGS = -nostdlib -nodefaultlibs -L$(MSCDIR)/software/include
-
-# compile and generate dependencies, based on
-# http://scottmcpeak.com/autodepend/autodepend.html
-
-define compilexx-dep
-$(CX) -c $(CXXFLAGS) $(1) $< -o $*.o
-@$(CX_normal) -MM $(CXXFLAGS) $(1) $< > $*.d
-@mv -f $*.d $*.d.tmp
-@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
-@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
-       sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
-@rm -f $*.d.tmp
-endef
-
-define compile-dep
-$(CC) -c $(CFLAGS) $(1) $< -o $*.o
-@$(CC_normal) -MM $(CFLAGS) $(1) $< > $*.d
-@mv -f $*.d $*.d.tmp
-@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
-@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
-       sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
-@rm -f $*.d.tmp
-endef
-
-define assemble
-$(CC) -c $(CFLAGS) -o $*.o $<
-endef
diff --git a/software/compiler-rt b/software/compiler-rt
deleted file mode 160000 (submodule)
index a144878..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a1448787a069603414e716adc8a41f866e28a4b4
diff --git a/software/include/base/assert.h b/software/include/base/assert.h
deleted file mode 100644 (file)
index 7b80a28..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __ASSERT_H
-#define __ASSERT_H
-
-#define assert(x)
-
-#endif /* __ASSERT_H */
diff --git a/software/include/base/console.h b/software/include/base/console.h
deleted file mode 100644 (file)
index a1cf599..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __CONSOLE_H
-#define __CONSOLE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef void (*console_write_hook)(char);
-typedef char (*console_read_hook)(void);
-typedef int (*console_read_nonblock_hook)(void);
-
-void console_set_write_hook(console_write_hook h);
-void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn);
-
-char readchar(void);
-int readchar_nonblock(void);
-
-void putsnonl(const char *s);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CONSOLE_H */
diff --git a/software/include/base/crc.h b/software/include/base/crc.h
deleted file mode 100644 (file)
index 88c8d95..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef __CRC_H
-#define __CRC_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-unsigned short crc16(const unsigned char *buffer, int len);
-unsigned int crc32(const unsigned char *buffer, unsigned int len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/software/include/base/ctype.h b/software/include/base/ctype.h
deleted file mode 100644 (file)
index 6936859..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef __CTYPE_H
-#define __CTYPE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * NOTE! This ctype does not handle EOF like the standard C
- * library is required to.
- */
-
-#define _U     0x01    /* upper */
-#define _L     0x02    /* lower */
-#define _D     0x04    /* digit */
-#define _C     0x08    /* cntrl */
-#define _P     0x10    /* punct */
-#define _S     0x20    /* white space (space/lf/tab) */
-#define _X     0x40    /* hex digit */
-#define _SP    0x80    /* hard space (0x20) */
-
-extern const unsigned char _ctype[];
-
-#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
-
-#define isalnum(c)     ((__ismask(c)&(_U|_L|_D)) != 0)
-#define isalpha(c)     ((__ismask(c)&(_U|_L)) != 0)
-#define iscntrl(c)     ((__ismask(c)&(_C)) != 0)
-#define isdigit(c)     ((__ismask(c)&(_D)) != 0)
-#define isgraph(c)     ((__ismask(c)&(_P|_U|_L|_D)) != 0)
-#define islower(c)     ((__ismask(c)&(_L)) != 0)
-#define isprint(c)     ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
-#define ispunct(c)     ((__ismask(c)&(_P)) != 0)
-/* Note: isspace() must return false for %NUL-terminator */
-#define isspace(c)     ((__ismask(c)&(_S)) != 0)
-#define isupper(c)     ((__ismask(c)&(_U)) != 0)
-#define isxdigit(c)    ((__ismask(c)&(_D|_X)) != 0)
-
-#define isascii(c) (((unsigned char)(c))<=0x7f)
-#define toascii(c) (((unsigned char)(c))&0x7f)
-
-static inline unsigned char __tolower(unsigned char c)
-{
-       if (isupper(c))
-               c -= 'A'-'a';
-       return c;
-}
-
-static inline unsigned char __toupper(unsigned char c)
-{
-       if (islower(c))
-               c -= 'a'-'A';
-       return c;
-}
-
-#define tolower(c) __tolower(c)
-#define toupper(c) __toupper(c)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CTYPE_H */
diff --git a/software/include/base/endian.h b/software/include/base/endian.h
deleted file mode 100644 (file)
index 81cf215..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef __ENDIAN_H
-#define __ENDIAN_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define __LITTLE_ENDIAN 0
-#define __BIG_ENDIAN 1
-#define __BYTE_ORDER __BIG_ENDIAN
-
-static inline unsigned int le32toh(unsigned int val)
-{
-       return (val & 0xff) << 24 |
-               (val & 0xff00) << 8 |
-               (val & 0xff0000) >> 8 |
-               (val & 0xff000000) >> 24;
-}
-
-static inline unsigned short le16toh(unsigned short val)
-{
-       return (val & 0xff) << 8 |
-               (val & 0xff00) >> 8;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ENDIAN_H */
diff --git a/software/include/base/errno.h b/software/include/base/errno.h
deleted file mode 100644 (file)
index be05873..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-#ifndef __ERRNO_H
-#define __ERRNO_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int errno;
-
-#define EPERM               1
-#define EPERM_STR           "Operation not permitted"
-#define ENOENT              2
-#define ENOENT_STR          "No such file or directory"
-#define ESRCH               3
-#define ESRCH_STR           "No such process"
-#define EINTR               4
-#define EINTR_STR           "Interrupted system call"
-#define EIO                 5
-#define EIO_STR             "I/O error"
-#define ENXIO               6
-#define ENXIO_STR           "No such device or address"
-#define E2BIG               7
-#define E2BIG_STR           "Arg list too long"
-#define ENOEXEC             8
-#define ENOEXEC_STR         "Exec format error"
-#define EBADF               9
-#define EBADF_STR           "Bad file number"
-#define ECHILD              10
-#define ECHILD_STR          "No child processes"
-#define EAGAIN              11
-#define EWOULDBLOCK         EAGAIN
-#define EAGAIN_STR          "Try again"
-#define ENOMEM              12
-#define ENOMEM_STR          "Out of memory"
-#define EACCES              13
-#define EACCES_STR          "Permission denied"
-#define EFAULT              14
-#define EFAULT_STR          "Bad address"
-#define ENOTBLK             15
-#define ENOTBLK_STR         "Block device required"
-#define EBUSY               16
-#define EBUSY_STR           "Device or resource busy"
-#define EEXIST              17
-#define EEXIST_STR          "File exists"
-#define EXDEV               18
-#define EXDEV_STR           "Cross-device link"
-#define ENODEV              19
-#define ENODEV_STR          "No such device"
-#define ENOTDIR             20
-#define ENOTDIR_STR         "Not a directory"
-#define EISDIR              21
-#define EISDIR_STR          "Is a directory"
-#define EINVAL              22
-#define EINVAL_STR          "Invalid argument"
-#define ENFILE              23
-#define ENFILE_STR          "File table overflow"
-#define EMFILE              24
-#define EMFILE_STR          "Too many open files"
-#define ENOTTY              25
-#define ENOTTY_STR          "Not a typewriter"
-#define ETXTBSY             26
-#define ETXTBSY_STR         "Text file busy"
-#define EFBIG               27
-#define EFBIG_STR           "File too large"
-#define ENOSPC              28
-#define ENOSPC_STR          "No space left on device"
-#define ESPIPE              29
-#define ESPIPE_STR          "Illegal seek"
-#define EROFS               30
-#define EROFS_STR           "Read-only file system"
-#define EMLINK              31
-#define EMLINK_STR          "Too many links"
-#define EPIPE               32
-#define EPIPE_STR           "Broken pipe"
-#define EDOM                33
-#define EDOM_STR            "Math argument out of domain of func"
-#define ERANGE              34
-#define ERANGE_STR          "Math result not representable"
-#define EDEADLK             35
-#define EDEADLOCK           EDEADLK
-#define EDEADLK_STR         "Resource deadlock would occur"
-#define ENAMETOOLONG        36
-#define ENAMETOOLONG_STR    "File name too long"
-#define ENOLCK              37
-#define ENOLCK_STR          "No record locks available"
-#define ENOSYS              38
-#define ENOSYS_STR          "Function not implemented"
-#define ENOTEMPTY           39
-#define ENOTEMPTY_STR       "Directory not empty"
-#define ELOOP               40
-#define ELOOP_STR           "Too many symbolic links encountered"
-#define ENOMSG              42
-#define ENOMSG_STR          "No message of desired type"
-#define EIDRM               43
-#define EIDRM_STR           "Identifier removed"
-#define ECHRNG              44
-#define ECHRNG_STR          "Channel number out of range"
-#define EL2NSYNC            45
-#define EL2NSYNC_STR        "Level 2 not synchronized"
-#define EL3HLT              46
-#define EL3HLT_STR          "Level 3 halted"
-#define EL3RST              47
-#define EL3RST_STR          "Level 3 reset"
-#define ELNRNG              48
-#define ELNRNG_STR          "Link number out of range"
-#define EUNATCH             49
-#define EUNATCH_STR         "Protocol driver not attached"
-#define ENOCSI              50
-#define ENOCSI_STR          "No CSI structure available"
-#define EL2HLT              51
-#define EL2HLT_STR          "Level 2 halted"
-#define EBADE               52
-#define EBADE_STR           "Invalid exchange"
-#define EBADR               53
-#define EBADR_STR           "Invalid request descriptor"
-#define EXFULL              54
-#define EXFULL_STR          "Exchange full"
-#define ENOANO              55
-#define ENOANO_STR          "No anode"
-#define EBADRQC             56
-#define EBADRQC_STR         "Invalid request code"
-#define EBADSLT             57
-#define EBADSLT_STR         "Invalid slot"
-#define EBFONT              59
-#define EBFONT_STR          "Bad font file format"
-#define ENOSTR              60
-#define ENOSTR_STR          "Device not a stream"
-#define ENODATA             61
-#define ENODATA_STR         "No data available"
-#define ETIME               62
-#define ETIME_STR           "Timer expired"
-#define ENOSR               63
-#define ENOSR_STR           "Out of streams resources"
-#define ENONET              64
-#define ENONET_STR          "Machine is not on the network"
-#define ENOPKG              65
-#define ENOPKG_STR          "Package not installed"
-#define EREMOTE             66
-#define EREMOTE_STR         "Object is remote"
-#define ENOLINK             67
-#define ENOLINK_STR         "Link has been severed"
-#define EADV                68
-#define EADV_STR            "Advertise error"
-#define ESRMNT              69
-#define ESRMNT_STR          "Srmount error"
-#define ECOMM               70
-#define ECOMM_STR           "Communication error on send"
-#define EPROTO              71
-#define EPROTO_STR          "Protocol error"
-#define EMULTIHOP           72
-#define EMULTIHOP_STR       "Multihop attempted"
-#define EDOTDOT             73
-#define EDOTDOT_STR         "RFS specific error"
-#define EBADMSG             74
-#define EBADMSG_STR         "Not a data message"
-#define EOVERFLOW           75
-#define EOVERFLOW_STR       "Value too large for defined data type"
-#define ENOTUNIQ            76
-#define ENOTUNIQ_STR        "Name not unique on network"
-#define EBADFD              77
-#define EBADFD_STR          "File descriptor in bad state"
-#define EREMCHG             78
-#define EREMCHG_STR         "Remote address changed"
-#define ELIBACC             79
-#define ELIBACC_STR         "Can not access a needed shared library"
-#define ELIBBAD             80
-#define ELIBBAD_STR         "Accessing a corrupted shared library"
-#define ELIBSCN             81
-#define ELIBSCN_STR         ".lib section in a.out corrupted"
-#define ELIBMAX             82
-#define ELIBMAX_STR         "Attempting to link in too many shared libraries"
-#define ELIBEXEC            83
-#define ELIBEXEC_STR        "Cannot exec a shared library directly"
-#define EILSEQ              84
-#define EILSEQ_STR          "Illegal byte sequence"
-#define ERESTART            85
-#define ERESTART_STR        "Interrupted system call should be restarted"
-#define ESTRPIPE            86
-#define ESTRPIPE_STR        "Streams pipe error"
-#define EUSERS              87
-#define EUSERS_STR          "Too many users"
-#define ENOTSOCK            88
-#define ENOTSOCK_STR        "Socket operation on non-socket"
-#define EDESTADDRREQ        89
-#define EDESTADDRREQ_STR    "Destination address required"
-#define EMSGSIZE            90
-#define EMSGSIZE_STR        "Message too long"
-#define EPROTOTYPE          91
-#define EPROTOTYPE_STR      "Protocol wrong type for socket"
-#define ENOPROTOOPT         92
-#define ENOPROTOOPT_STR     "Protocol not available"
-#define EPROTONOSUPPORT      93
-#define EPROTONOSUPPORT_STR "Protocol not supported"
-#define ESOCKTNOSUPPORT     94
-#define ESOCKTNOSUPPORT_STR "Socket type not supported"
-#define EOPNOTSUPP          95
-#define EOPNOTSUPP_STR      "Operation not supported on transport endpoint"
-#define EPFNOSUPPORT        96
-#define EPFNOSUPPORT_STR    "Protocol family not supported"
-#define EAFNOSUPPORT        97
-#define EAFNOSUPPORT_STR    "Address family not supported by protocol"
-#define EADDRINUSE          98
-#define EADDRINUSE_STR      "Address already in use"
-#define EADDRNOTAVAIL       99
-#define EADDRNOTAVAIL_STR   "Cannot assign requested address"
-#define ENETDOWN            100
-#define ENETDOWN_STR        "Network is down"
-#define ENETUNREACH         101
-#define ENETUNREACH_STR     "Network is unreachable"
-#define ENETRESET           102
-#define ENETRESET_STR       "Network dropped connection because of reset"
-#define ECONNABORTED        103
-#define ECONNABORTED_STR    "Software caused connection abort"
-#define ECONNRESET          104
-#define ECONNRESET_STR      "Connection reset by peer"
-#define ENOBUFS             105
-#define ENOBUFS_STR         "No buffer space available"
-#define EISCONN             106
-#define EISCONN_STR         "Transport endpoint is already connected"
-#define ENOTCONN            107
-#define ENOTCONN_STR        "Transport endpoint is not connected"
-#define ESHUTDOWN           108
-#define ESHUTDOWN_STR       "Cannot send after transport endpoint shutdown"
-#define ETOOMANYREFS        109
-#define ETOOMANYREFS_STR    "Too many references: cannot splice"
-#define ETIMEDOUT           110
-#define ETIMEDOUT_STR       "Connection timed out"
-#define ECONNREFUSED        111
-#define ECONNREFUSED_STR    "Connection refused"
-#define EHOSTDOWN           112
-#define EHOSTDOWN_STR       "Host is down"
-#define EHOSTUNREACH        113
-#define EHOSTUNREACH_STR    "No route to host"
-#define EALREADY            114
-#define EALREADY_STR        "Operation already in progress"
-#define EINPROGRESS         115
-#define EINPROGRESS_STR     "Operation now in progress"
-#define ESTALE              116
-#define ESTALE_STR          "Stale NFS file handle"
-#define EUCLEAN             117
-#define EUCLEAN_STR         "Structure needs cleaning"
-#define ENOTNAM             118
-#define ENOTNAM_STR         "Not a XENIX named type file"
-#define ENAVAIL             119
-#define ENAVAIL_STR         "No XENIX semaphores available"
-#define EISNAM              120
-#define EISNAM_STR          "Is a named type file"
-#define EREMOTEIO           121
-#define EREMOTEIO_STR       "Remote I/O error"
-#define EDQUOT              122
-#define EDQUOT_STR          "Quota exceeded"
-#define ENOMEDIUM           123
-#define ENOMEDIUM_STR       "No medium found"
-#define EMEDIUMTYPE         124
-#define EMEDIUMTYPE_STR     "Wrong medium type"
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ERRNO_H */
diff --git a/software/include/base/float.h b/software/include/base/float.h
deleted file mode 100644 (file)
index 2d0bf67..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef __FLOAT_H
-#define __FLOAT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
-#define FLT_ROUNDS (__builtin_flt_rounds())
-#define FLT_RADIX __FLT_RADIX__
-
-#define FLT_MANT_DIG __FLT_MANT_DIG__
-#define DBL_MANT_DIG __DBL_MANT_DIG__
-#define LDBL_MANT_DIG __LDBL_MANT_DIG__
-
-#define DECIMAL_DIG __DECIMAL_DIG__
-
-#define FLT_DIG __FLT_DIG__
-#define DBL_DIG __DBL_DIG__
-#define LDBL_DIG __LDBL_DIG__
-
-#define FLT_MIN_EXP __FLT_MIN_EXP__
-#define DBL_MIN_EXP __DBL_MIN_EXP__
-#define LDBL_MIN_EXP __LDBL_MIN_EXP__
-
-#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__
-#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__
-#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__
-
-#define FLT_MAX_EXP __FLT_MAX_EXP__
-#define DBL_MAX_EXP __DBL_MAX_EXP__
-#define LDBL_MAX_EXP __LDBL_MAX_EXP__
-
-#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__
-#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__
-#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__
-
-#define FLT_MAX __FLT_MAX__
-#define DBL_MAX __DBL_MAX__
-#define LDBL_MAX __LDBL_MAX__
-
-#define FLT_EPSILON __FLT_EPSILON__
-#define DBL_EPSILON __DBL_EPSILON__
-#define LDBL_EPSILON __LDBL_EPSILON__
-
-#define FLT_MIN __FLT_MIN__
-#define DBL_MIN __DBL_MIN__
-#define LDBL_MIN __LDBL_MIN__
-
-#define FLT_TRUE_MIN __FLT_DENORM_MIN__
-#define DBL_TRUE_MIN __DBL_DENORM_MIN__
-#define LDBL_TRUE_MIN __LDBL_DENORM_MIN__
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __FLOAT_H */
diff --git a/software/include/base/id.h b/software/include/base/id.h
deleted file mode 100644 (file)
index 89b540f..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef __ID_H
-#define __ID_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void get_sysid_formatted(char *sysid);
-void id_print(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ID_H */
diff --git a/software/include/base/inttypes.h b/software/include/base/inttypes.h
deleted file mode 100644 (file)
index 9e4534c..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/* Copyright (C) 1997-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/*
- *      ISO C99: 7.8 Format conversion of integer types <inttypes.h>
- */
-
-#ifndef __INTTYPES_H
-#define __INTTYPES_H
-
-# if __WORDSIZE == 64
-#  define __PRI64_PREFIX        "l"
-#  define __PRIPTR_PREFIX       "l"
-# else
-#  define __PRI64_PREFIX        "ll"
-#  define __PRIPTR_PREFIX
-# endif
-
-/* Macros for printing format specifiers.  */
-
-/* Decimal notation.  */
-# define PRId8          "d"
-# define PRId16         "d"
-# define PRId32         "d"
-# define PRId64         __PRI64_PREFIX "d"
-
-# define PRIdLEAST8     "d"
-# define PRIdLEAST16    "d"
-# define PRIdLEAST32    "d"
-# define PRIdLEAST64    __PRI64_PREFIX "d"
-
-# define PRIdFAST8      "d"
-# define PRIdFAST16     __PRIPTR_PREFIX "d"
-# define PRIdFAST32     __PRIPTR_PREFIX "d"
-# define PRIdFAST64     __PRI64_PREFIX "d"
-
-
-# define PRIi8          "i"
-# define PRIi16         "i"
-# define PRIi32         "i"
-# define PRIi64         __PRI64_PREFIX "i"
-
-# define PRIiLEAST8     "i"
-# define PRIiLEAST16    "i"
-# define PRIiLEAST32    "i"
-# define PRIiLEAST64    __PRI64_PREFIX "i"
-
-# define PRIiFAST8      "i"
-# define PRIiFAST16     __PRIPTR_PREFIX "i"
-# define PRIiFAST32     __PRIPTR_PREFIX "i"
-# define PRIiFAST64     __PRI64_PREFIX "i"
-
-/* Octal notation.  */
-# define PRIo8          "o"
-# define PRIo16         "o"
-# define PRIo32         "o"
-# define PRIo64         __PRI64_PREFIX "o"
-
-# define PRIoLEAST8     "o"
-# define PRIoLEAST16    "o"
-# define PRIoLEAST32    "o"
-# define PRIoLEAST64    __PRI64_PREFIX "o"
-
-# define PRIoFAST8      "o"
-# define PRIoFAST16     __PRIPTR_PREFIX "o"
-# define PRIoFAST32     __PRIPTR_PREFIX "o"
-# define PRIoFAST64     __PRI64_PREFIX "o"
-
-/* Unsigned integers.  */
-# define PRIu8          "u"
-# define PRIu16         "u"
-# define PRIu32         "u"
-# define PRIu64         __PRI64_PREFIX "u"
-
-# define PRIuLEAST8     "u"
-# define PRIuLEAST16    "u"
-# define PRIuLEAST32    "u"
-# define PRIuLEAST64    __PRI64_PREFIX "u"
-
-# define PRIuFAST8      "u"
-# define PRIuFAST16     __PRIPTR_PREFIX "u"
-# define PRIuFAST32     __PRIPTR_PREFIX "u"
-# define PRIuFAST64     __PRI64_PREFIX "u"
-
-/* lowercase hexadecimal notation.  */
-# define PRIx8          "x"
-# define PRIx16         "x"
-# define PRIx32         "x"
-# define PRIx64         __PRI64_PREFIX "x"
-
-# define PRIxLEAST8     "x"
-# define PRIxLEAST16    "x"
-# define PRIxLEAST32    "x"
-# define PRIxLEAST64    __PRI64_PREFIX "x"
-
-# define PRIxFAST8      "x"
-# define PRIxFAST16     __PRIPTR_PREFIX "x"
-# define PRIxFAST32     __PRIPTR_PREFIX "x"
-# define PRIxFAST64     __PRI64_PREFIX "x"
-
-/* UPPERCASE hexadecimal notation.  */
-# define PRIX8          "X"
-# define PRIX16         "X"
-# define PRIX32         "X"
-# define PRIX64         __PRI64_PREFIX "X"
-
-# define PRIXLEAST8     "X"
-# define PRIXLEAST16    "X"
-# define PRIXLEAST32    "X"
-# define PRIXLEAST64    __PRI64_PREFIX "X"
-
-# define PRIXFAST8      "X"
-# define PRIXFAST16     __PRIPTR_PREFIX "X"
-# define PRIXFAST32     __PRIPTR_PREFIX "X"
-# define PRIXFAST64     __PRI64_PREFIX "X"
-
-/* Macros for printing `intmax_t' and `uintmax_t'.  */
-# define PRIdMAX        __PRI64_PREFIX "d"
-# define PRIiMAX        __PRI64_PREFIX "i"
-# define PRIoMAX        __PRI64_PREFIX "o"
-# define PRIuMAX        __PRI64_PREFIX "u"
-# define PRIxMAX        __PRI64_PREFIX "x"
-# define PRIXMAX        __PRI64_PREFIX "X"
-
-
-/* Macros for printing `intptr_t' and `uintptr_t'.  */
-# define PRIdPTR        __PRIPTR_PREFIX "d"
-# define PRIiPTR        __PRIPTR_PREFIX "i"
-# define PRIoPTR        __PRIPTR_PREFIX "o"
-# define PRIuPTR        __PRIPTR_PREFIX "u"
-# define PRIxPTR        __PRIPTR_PREFIX "x"
-# define PRIXPTR        __PRIPTR_PREFIX "X"
-
-/* Macros for scanning format specifiers.  */
-
-/* Signed decimal notation.  */
-# define SCNd8          "hhd"
-# define SCNd16         "hd"
-# define SCNd32         "d"
-# define SCNd64         __PRI64_PREFIX "d"
-
-# define SCNdLEAST8     "hhd"
-# define SCNdLEAST16    "hd"
-# define SCNdLEAST32    "d"
-# define SCNdLEAST64    __PRI64_PREFIX "d"
-
-# define SCNdFAST8      "hhd"
-# define SCNdFAST16     __PRIPTR_PREFIX "d"
-# define SCNdFAST32     __PRIPTR_PREFIX "d"
-# define SCNdFAST64     __PRI64_PREFIX "d"
-
-/* Unsigned decimal notation.  */
-# define SCNu8          "hhu"
-# define SCNu16         "hu"
-# define SCNu32         "u"
-# define SCNu64         __PRI64_PREFIX "u"
-
-# define SCNuLEAST8     "hhu"
-# define SCNuLEAST16    "hu"
-# define SCNuLEAST32    "u"
-# define SCNuLEAST64    __PRI64_PREFIX "u"
-
-# define SCNuFAST8      "hhu"
-# define SCNuFAST16     __PRIPTR_PREFIX "u"
-# define SCNuFAST32     __PRIPTR_PREFIX "u"
-# define SCNuFAST64     __PRI64_PREFIX "u"
-
-/* Octal notation.  */
-# define SCNo8          "hho"
-# define SCNo16         "ho"
-# define SCNo32         "o"
-# define SCNo64         __PRI64_PREFIX "o"
-
-# define SCNoLEAST8     "hho"
-# define SCNoLEAST16    "ho"
-# define SCNoLEAST32    "o"
-# define SCNoLEAST64    __PRI64_PREFIX "o"
-
-# define SCNoFAST8      "hho"
-# define SCNoFAST16     __PRIPTR_PREFIX "o"
-# define SCNoFAST32     __PRIPTR_PREFIX "o"
-# define SCNoFAST64     __PRI64_PREFIX "o"
-
-/* Hexadecimal notation.  */
-# define SCNx8          "hhx"
-# define SCNx16         "hx"
-# define SCNx32         "x"
-# define SCNx64         __PRI64_PREFIX "x"
-
-# define SCNxLEAST8     "hhx"
-# define SCNxLEAST16    "hx"
-# define SCNxLEAST32    "x"
-# define SCNxLEAST64    __PRI64_PREFIX "x"
-
-# define SCNxFAST8      "hhx"
-# define SCNxFAST16     __PRIPTR_PREFIX "x"
-# define SCNxFAST32     __PRIPTR_PREFIX "x"
-# define SCNxFAST64     __PRI64_PREFIX "x"
-
-
-/* Macros for scanning `intmax_t' and `uintmax_t'.  */
-# define SCNdMAX        __PRI64_PREFIX "d"
-# define SCNiMAX        __PRI64_PREFIX "i"
-# define SCNoMAX        __PRI64_PREFIX "o"
-# define SCNuMAX        __PRI64_PREFIX "u"
-# define SCNxMAX        __PRI64_PREFIX "x"
-
-/* Macros for scaning `intptr_t' and `uintptr_t'.  */
-# define SCNdPTR        __PRIPTR_PREFIX "d"
-# define SCNiPTR        __PRIPTR_PREFIX "i"
-# define SCNoPTR        __PRIPTR_PREFIX "o"
-# define SCNuPTR        __PRIPTR_PREFIX "u"
-# define SCNxPTR        __PRIPTR_PREFIX "x"
-
-#endif /* __INTTYPES_H */
diff --git a/software/include/base/irq.h b/software/include/base/irq.h
deleted file mode 100644 (file)
index 54da2f0..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef __IRQ_H
-#define __IRQ_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef __or1k__
-#include <system.h>
-#endif
-
-static inline unsigned int irq_getie(void)
-{
-#if defined (__lm32__)
-       unsigned int ie;
-       __asm__ __volatile__("rcsr %0, IE" : "=r" (ie));
-       return ie;
-#elif defined (__or1k__)
-       return !!(mfspr(SPR_SR) & SPR_SR_IEE);
-#else
-#error Unsupported architecture
-#endif
-}
-
-static inline void irq_setie(unsigned int ie)
-{
-#if defined (__lm32__)
-       __asm__ __volatile__("wcsr IE, %0" : : "r" (ie));
-#elif defined (__or1k__)
-       if (ie & 0x1)
-               mtspr(SPR_SR, mfspr(SPR_SR) | SPR_SR_IEE);
-       else
-               mtspr(SPR_SR, mfspr(SPR_SR) & ~SPR_SR_IEE);
-#else
-#error Unsupported architecture
-#endif
-}
-
-static inline unsigned int irq_getmask(void)
-{
-#if defined (__lm32__)
-       unsigned int mask;
-       __asm__ __volatile__("rcsr %0, IM" : "=r" (mask));
-       return mask;
-#elif defined (__or1k__)
-       return mfspr(SPR_PICMR);
-#else
-#error Unsupported architecture
-#endif
-}
-
-static inline void irq_setmask(unsigned int mask)
-{
-#if defined (__lm32__)
-       __asm__ __volatile__("wcsr IM, %0" : : "r" (mask));
-#elif defined (__or1k__)
-       mtspr(SPR_PICMR, mask);
-#else
-#error Unsupported architecture
-#endif
-}
-
-static inline unsigned int irq_pending(void)
-{
-#if defined (__lm32__)
-       unsigned int pending;
-       __asm__ __volatile__("rcsr %0, IP" : "=r" (pending));
-       return pending;
-#elif defined (__or1k__)
-       return mfspr(SPR_PICSR);
-#else
-#error Unsupported architecture
-#endif
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __IRQ_H */
diff --git a/software/include/base/limits.h b/software/include/base/limits.h
deleted file mode 100644 (file)
index 49ac6ff..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef __LIMITS_H
-#define __LIMITS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ULONG_MAX 0xffffffff
-
-#define UINT_MAX 0xffffffff
-#define INT_MIN 0x80000000
-#define INT_MAX 0x7fffffff
-
-#define USHRT_MAX 0xffff
-#define SHRT_MIN 0x8000
-#define SHRT_MAX 0x7fff
-
-#define UCHAR_MAX 0xff
-
-#define CHAR_BIT 8
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __LIMITS_H */
diff --git a/software/include/base/pthread.h b/software/include/base/pthread.h
deleted file mode 100644 (file)
index b78aa1e..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef __PTHREAD_H
-#define __PTHREAD_H
-
-typedef int pthread_rwlock_t;
-
-#define PTHREAD_RWLOCK_INITIALIZER 0
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inline int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
-  { return 0; }
-inline int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
-  { return 0; }
-inline int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
-  { return 0; }
-inline int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
-  { return 0; }
-int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
-  { return 0; }
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __PTHREAD_H */
diff --git a/software/include/base/spiflash.h b/software/include/base/spiflash.h
deleted file mode 100644 (file)
index a4ff495..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __SPIFLASH_H
-#define __SPIFLASH_H
-
-void write_to_flash_page(unsigned int addr, const unsigned char *c, unsigned int len);
-void erase_flash_sector(unsigned int addr);
-void write_to_flash(unsigned int addr, const unsigned char *c, unsigned int len);
-
-#endif /* __SPIFLASH_H */
diff --git a/software/include/base/spr-defs.h b/software/include/base/spr-defs.h
deleted file mode 100644 (file)
index e073a50..0000000
+++ /dev/null
@@ -1,696 +0,0 @@
-/* spr-defs.h - Special purpose registers definitions file
-       
-   Copyright (C) 2000 Damjan Lampret
-   Copyright (C) 2008, 2010 Embecosm Limited
-   
-   Contributor Damjan Lampret <lampret@opencores.org>
-   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the Free
-   Software Foundation; either version 3 of the License, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful, but WITHOUT
-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-   more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program.  If not, see <http:  www.gnu.org/licenses/>.  */
-
-/* ----------------------------------------------------------------------------
-   This code is commented throughout for use with Doxygen.
-   --------------------------------------------------------------------------*/
-#ifndef SPR_DEFS__H
-#define SPR_DEFS__H
-
-/* Definition of special-purpose registers (SPRs). */
-
-#define MAX_GRPS (32)
-#define MAX_SPRS_PER_GRP_BITS (11)
-#define MAX_SPRS_PER_GRP (1 << MAX_SPRS_PER_GRP_BITS)
-#define MAX_SPRS (0x10000)
-
-/* Base addresses for the groups */
-#define SPRGROUP_SYS   (0<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_DMMU  (1<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_IMMU  (2<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_DC    (3<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_IC    (4<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_MAC   (5<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_D     (6<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_PC    (7<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_PM    (8<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_PIC   (9<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_TT    (10<< MAX_SPRS_PER_GRP_BITS)
-#define SPRGROUP_FP    (11<< MAX_SPRS_PER_GRP_BITS)
-
-/* System control and status group */
-#define SPR_VR         (SPRGROUP_SYS + 0)
-#define SPR_UPR                (SPRGROUP_SYS + 1)
-#define SPR_CPUCFGR    (SPRGROUP_SYS + 2)
-#define SPR_DMMUCFGR   (SPRGROUP_SYS + 3)
-#define SPR_IMMUCFGR   (SPRGROUP_SYS + 4)
-#define SPR_DCCFGR     (SPRGROUP_SYS + 5)
-#define SPR_ICCFGR     (SPRGROUP_SYS + 6)
-#define SPR_DCFGR      (SPRGROUP_SYS + 7)
-#define SPR_PCCFGR     (SPRGROUP_SYS + 8)
-#define SPR_VR2        (SPRGROUP_SYS + 9)
-#define SPR_AVR        (SPRGROUP_SYS + 10)
-#define SPR_EVBAR      (SPRGROUP_SYS + 11)
-#define SPR_AECR       (SPRGROUP_SYS + 12)
-#define SPR_AESR       (SPRGROUP_SYS + 13)
-#define SPR_NPC         (SPRGROUP_SYS + 16)  /* CZ 21/06/01 */
-#define SPR_SR         (SPRGROUP_SYS + 17)  /* CZ 21/06/01 */
-#define SPR_PPC         (SPRGROUP_SYS + 18)  /* CZ 21/06/01 */
-#define SPR_FPCSR       (SPRGROUP_SYS + 20)  /* CZ 21/06/01 */
-#define SPR_ISR_BASE    (SPRGROUP_SYS + 21)
-#define SPR_EPCR_BASE  (SPRGROUP_SYS + 32)  /* CZ 21/06/01 */
-#define SPR_EPCR_LAST  (SPRGROUP_SYS + 47)  /* CZ 21/06/01 */
-#define SPR_EEAR_BASE  (SPRGROUP_SYS + 48)
-#define SPR_EEAR_LAST  (SPRGROUP_SYS + 63)
-#define SPR_ESR_BASE   (SPRGROUP_SYS + 64)
-#define SPR_ESR_LAST   (SPRGROUP_SYS + 79)
-#define SPR_GPR_BASE   (SPRGROUP_SYS + 1024)
-
-/* Data MMU group */
-#define SPR_DMMUCR     (SPRGROUP_DMMU + 0)
-#define SPR_DTLBEIR     (SPRGROUP_DMMU + 2)
-#define SPR_DTLBMR_BASE(WAY)   (SPRGROUP_DMMU + 0x200 + (WAY) * 0x100)
-#define SPR_DTLBMR_LAST(WAY)   (SPRGROUP_DMMU + 0x27f + (WAY) * 0x100)
-#define SPR_DTLBTR_BASE(WAY)   (SPRGROUP_DMMU + 0x280 + (WAY) * 0x100)
-#define SPR_DTLBTR_LAST(WAY)   (SPRGROUP_DMMU + 0x2ff + (WAY) * 0x100)
-
-/* Instruction MMU group */
-#define SPR_IMMUCR     (SPRGROUP_IMMU + 0)
-#define SPR_ITLBEIR     (SPRGROUP_IMMU + 2)
-#define SPR_ITLBMR_BASE(WAY)   (SPRGROUP_IMMU + 0x200 + (WAY) * 0x100)
-#define SPR_ITLBMR_LAST(WAY)   (SPRGROUP_IMMU + 0x27f + (WAY) * 0x100)
-#define SPR_ITLBTR_BASE(WAY)   (SPRGROUP_IMMU + 0x280 + (WAY) * 0x100)
-#define SPR_ITLBTR_LAST(WAY)   (SPRGROUP_IMMU + 0x2ff + (WAY) * 0x100)
-
-/* Data cache group */
-#define SPR_DCCR       (SPRGROUP_DC + 0)
-#define SPR_DCBPR      (SPRGROUP_DC + 1)
-#define SPR_DCBFR      (SPRGROUP_DC + 2)
-#define SPR_DCBIR      (SPRGROUP_DC + 3)
-#define SPR_DCBWR      (SPRGROUP_DC + 4)
-#define SPR_DCBLR      (SPRGROUP_DC + 5)
-#define SPR_DCR_BASE(WAY)      (SPRGROUP_DC + 0x200 + (WAY) * 0x200)
-#define SPR_DCR_LAST(WAY)      (SPRGROUP_DC + 0x3ff + (WAY) * 0x200)
-
-/* Instruction cache group */
-#define SPR_ICCR       (SPRGROUP_IC + 0)
-#define SPR_ICBPR      (SPRGROUP_IC + 1)
-#define SPR_ICBIR      (SPRGROUP_IC + 2)
-#define SPR_ICBLR      (SPRGROUP_IC + 3)
-#define SPR_ICR_BASE(WAY)      (SPRGROUP_IC + 0x200 + (WAY) * 0x200)
-#define SPR_ICR_LAST(WAY)      (SPRGROUP_IC + 0x3ff + (WAY) * 0x200)
-
-/* MAC group */
-#define SPR_MACLO      (SPRGROUP_MAC + 1)
-#define SPR_MACHI      (SPRGROUP_MAC + 2)
-
-/* Debug group */
-#define SPR_DVR(N)     (SPRGROUP_D + (N))
-#define SPR_DCR(N)     (SPRGROUP_D + 8 + (N))
-#define SPR_DMR1       (SPRGROUP_D + 16)
-#define SPR_DMR2       (SPRGROUP_D + 17)
-#define SPR_DWCR0      (SPRGROUP_D + 18)
-#define SPR_DWCR1      (SPRGROUP_D + 19)
-#define SPR_DSR                (SPRGROUP_D + 20)
-#define SPR_DRR                (SPRGROUP_D + 21)
-
-/* Performance counters group */
-#define SPR_PCCR(N)    (SPRGROUP_PC + (N))
-#define SPR_PCMR(N)    (SPRGROUP_PC + 8 + (N))
-
-/* Power management group */
-#define SPR_PMR (SPRGROUP_PM + 0)
-
-/* PIC group */
-#define SPR_PICMR (SPRGROUP_PIC + 0)
-#define SPR_PICPR (SPRGROUP_PIC + 1)
-#define SPR_PICSR (SPRGROUP_PIC + 2)
-
-/* Tick Timer group */
-#define SPR_TTMR (SPRGROUP_TT + 0)
-#define SPR_TTCR (SPRGROUP_TT + 1)
-
-/*
- * Bit definitions for the Version Register
- *
- */
-#define SPR_VR_VER     0xff000000  /* Processor version */
-#define SPR_VR_CFG     0x00ff0000  /* Processor configuration */
-#define SPR_VR_RES     0x0000ff80  /* Reserved */
-#define SPR_VR_UVRP    0x00000040  /* Updated version register present */
-#define SPR_VR_REV     0x0000003f  /* Processor revision */
-
-#define SPR_VR_VER_OFF 24
-#define SPR_VR_CFG_OFF 16
-#define SPR_VR_UVRP_OFF        6
-#define SPR_VR_REV_OFF 0
-
-/*
- * Bit definitions for the Unit Present Register
- *
- */
-#define SPR_UPR_UP        0x00000001  /* UPR present */
-#define SPR_UPR_DCP       0x00000002  /* Data cache present */
-#define SPR_UPR_ICP       0x00000004  /* Instruction cache present */
-#define SPR_UPR_DMP       0x00000008  /* Data MMU present */
-#define SPR_UPR_IMP       0x00000010  /* Instruction MMU present */
-#define SPR_UPR_MP        0x00000020  /* MAC present */
-#define SPR_UPR_DUP       0x00000040  /* Debug unit present */
-#define SPR_UPR_PCUP      0x00000080  /* Performance counters unit present */
-#define SPR_UPR_PMP       0x00000100  /* Power management present */
-#define SPR_UPR_PICP      0x00000200  /* PIC present */
-#define SPR_UPR_TTP       0x00000400  /* Tick timer present */
-#define SPR_UPR_RES       0x00fe0000  /* Reserved */
-#define SPR_UPR_CUP       0xff000000  /* Context units present */
-
-/*
- * JPB: Bit definitions for the CPU configuration register
- *
- */
-#define SPR_CPUCFGR_NSGF   0x0000000f  /* Number of shadow GPR files */
-#define SPR_CPUCFGR_CGF           0x00000010  /* Custom GPR file */
-#define SPR_CPUCFGR_OB32S  0x00000020  /* ORBIS32 supported */
-#define SPR_CPUCFGR_OB64S  0x00000040  /* ORBIS64 supported */
-#define SPR_CPUCFGR_OF32S  0x00000080  /* ORFPX32 supported */
-#define SPR_CPUCFGR_OF64S  0x00000100  /* ORFPX64 supported */
-#define SPR_CPUCFGR_OV64S  0x00000200  /* ORVDX64 supported */
-#define SPR_CPUCFGR_ND     0x00000400  /* No delay-slot */
-#define SPR_CPUCFGR_AVRP   0x00000800  /* Architecture version register present */
-#define SPR_CPUCFGR_EVBARP 0x00001000  /* Exception vector base address register 
-                                         present */
-#define SPR_CPUCFGR_ISRP   0x00002000  /* Implementation-specific registers present */
-#define SPR_CPUCFGR_AECSRP 0x00004000  /* Arithmetic exception control/status 
-                                         registers present */
-#define SPR_CPUCFGR_RES           0xffff8000  /* Reserved */
-
-/*
- * Bit definitions for the Version Register 2
- *
- */
-#define SPR_VR2_CPUID   0xff000000  /* Unique CPU identifier */
-#define SPR_VR2_VER    0x00ffffff  /* Version */
-
-#define SPR_VR2_CPUID_OFF   24
-#define SPR_VR2_VER_OFF     0
-
-#define SPR_VR2_CPUID_OR1KSIM   0x00
-#define SPR_VR2_CPUID_MOR1KX    0x01
-#define SPR_VR2_CPUID_OR1200    0x12
-#define SPR_VR2_CPUID_ALTOR32   0x32
-#define SPR_VR2_CPUID_OR10      0x10
-
-
-/*
- * Bit definitions for the Architecture Version register
- *
- */
-#define SPR_AVR_MAJ     0xff000000  /* Major architecture version number */
-#define SPR_AVR_MIN     0x00ff0000  /* Minor architecture version number */
-#define SPR_AVR_REV     0x0000ff00  /* Architecture revision number */
-#define SPR_AVR_RES    0x000000ff  /* Reserved */
-
-#define SPR_AVR_MAJ_OFF 24
-#define SPR_AVR_MIN_OFF 16
-#define SPR_AVR_REV_OFF 8
-
-/*
- * Bit definitions for the Exception Base Address register
- *
- */
-#define SPR_EVBAR_EVBA  0xffffe000  /* Exception vector base address */
-#define SPR_EVBAR_RES   0x00001fff  /* Reserved */
-
-#define SPR_EVBAR_EVBA_OFF 13
-
-/*
- * Bit definitions for the Arithmetic Exception Control register
- *
- */
-#define SPR_AECR_CYADDE  0x00000001  /* Carry on add/subtract exception */
-#define SPR_AECR_OVADDE  0x00000002  /* Overflow on add/subtract exception */
-#define SPR_AECR_CYMULE  0x00000004  /* Carry on multiply exception */
-#define SPR_AECR_OVMULE  0x00000008  /* Overflow on multiply exception */
-#define SPR_AECR_DBZE    0x00000010  /* Divide by zero exception */
-#define SPR_AECR_CYMACADDE  0x00000020  /* Carry on MAC add/subtract exception */
-#define SPR_AECR_OVMACADDE  0x00000040  /* Overflow on MAC add/subtract exception */
-
-#define SPR_AECR_CYADDE_OFF 0
-#define SPR_AECR_OVADDE_OFF 1
-#define SPR_AECR_CYMULE_OFF 2
-#define SPR_AECR_OVMULE_OFF 3
-#define SPR_AECR_DBZE_OFF   4
-#define SPR_AECR_CYMACADDE_OFF 5
-#define SPR_AECR_OVMACADDE_OFF 6
-
-
-/*
- * Bit definitions for the Arithmetic Exception Status register
- *
- */
-#define SPR_AESR_CYADDE  0x00000001  /* Carry on add/subtract exception */
-#define SPR_AESR_OVADDE  0x00000002  /* Overflow on add/subtract exception */
-#define SPR_AESR_CYMULE  0x00000004  /* Carry on multiply exception */
-#define SPR_AESR_OVMULE  0x00000008  /* Overflow on multiply exception */
-#define SPR_AESR_DBZE    0x00000010  /* Divide by zero exception */
-#define SPR_AESR_CYMACADDE  0x00000020  /* Carry on MAC add/subtract exception */
-#define SPR_AESR_OVMACADDE  0x00000040  /* Overflow on MAC add/subtract exception */
-
-#define SPR_AESR_CYADDE_OFF 0
-#define SPR_AESR_OVADDE_OFF 1
-#define SPR_AESR_CYMULE_OFF 2
-#define SPR_AESR_OVMULE_OFF 3
-#define SPR_AESR_DBZE_OFF   4
-#define SPR_AESR_CYMACADDE_OFF 5
-#define SPR_AESR_OVMACADDE_OFF 6
-
-/*
- * JPB: Bit definitions for the Debug configuration register and other
- * constants.
- *
- */
-
-#define SPR_DCFGR_NDP      0x00000007  /* Number of matchpoints mask */
-#define SPR_DCFGR_NDP1     0x00000000  /* One matchpoint supported */
-#define SPR_DCFGR_NDP2     0x00000001  /* Two matchpoints supported */
-#define SPR_DCFGR_NDP3     0x00000002  /* Three matchpoints supported */
-#define SPR_DCFGR_NDP4     0x00000003  /* Four matchpoints supported */
-#define SPR_DCFGR_NDP5     0x00000004  /* Five matchpoints supported */
-#define SPR_DCFGR_NDP6     0x00000005  /* Six matchpoints supported */
-#define SPR_DCFGR_NDP7     0x00000006  /* Seven matchpoints supported */
-#define SPR_DCFGR_NDP8     0x00000007  /* Eight matchpoints supported */
-#define SPR_DCFGR_WPCI     0x00000008  /* Watchpoint counters implemented */
-
-#define MATCHPOINTS_TO_NDP(n) (1 == n ? SPR_DCFGR_NDP1 : \
-                               2 == n ? SPR_DCFGR_NDP2 : \
-                               3 == n ? SPR_DCFGR_NDP3 : \
-                               4 == n ? SPR_DCFGR_NDP4 : \
-                               5 == n ? SPR_DCFGR_NDP5 : \
-                               6 == n ? SPR_DCFGR_NDP6 : \
-                               7 == n ? SPR_DCFGR_NDP7 : SPR_DCFGR_NDP8)
-#define MAX_MATCHPOINTS  8
-#define MAX_WATCHPOINTS  (MAX_MATCHPOINTS + 2)
-
-/*
- * Bit definitions for the Supervision Register
- *
- */
-#define SPR_SR_SM          0x00000001  /* Supervisor Mode */
-#define SPR_SR_TEE         0x00000002  /* Tick timer Exception Enable */
-#define SPR_SR_IEE         0x00000004  /* Interrupt Exception Enable */
-#define SPR_SR_DCE         0x00000008  /* Data Cache Enable */
-#define SPR_SR_ICE         0x00000010  /* Instruction Cache Enable */
-#define SPR_SR_DME         0x00000020  /* Data MMU Enable */
-#define SPR_SR_IME         0x00000040  /* Instruction MMU Enable */
-#define SPR_SR_LEE         0x00000080  /* Little Endian Enable */
-#define SPR_SR_CE          0x00000100  /* CID Enable */
-#define SPR_SR_F           0x00000200  /* Condition Flag */
-#define SPR_SR_CY          0x00000400  /* Carry flag */
-#define SPR_SR_OV          0x00000800  /* Overflow flag */
-#define SPR_SR_OVE         0x00001000  /* Overflow flag Exception */
-#define SPR_SR_DSX         0x00002000  /* Delay Slot Exception */
-#define SPR_SR_EPH         0x00004000  /* Exception Prefix High */
-#define SPR_SR_FO          0x00008000  /* Fixed one */
-#define SPR_SR_SUMRA       0x00010000  /* Supervisor SPR read access */
-#define SPR_SR_RES         0x0ffe0000  /* Reserved */
-#define SPR_SR_CID         0xf0000000  /* Context ID */
-
-/*
- * Bit definitions for the Data MMU Control Register
- *
- */
-#define SPR_DMMUCR_P2S    0x0000003e  /* Level 2 Page Size */
-#define SPR_DMMUCR_P1S    0x000007c0  /* Level 1 Page Size */
-#define SPR_DMMUCR_VADDR_WIDTH 0x0000f800  /* Virtual ADDR Width */
-#define SPR_DMMUCR_PADDR_WIDTH 0x000f0000  /* Physical ADDR Width */
-
-/*
- * Bit definitions for the Instruction MMU Control Register
- *
- */
-#define SPR_IMMUCR_P2S    0x0000003e  /* Level 2 Page Size */
-#define SPR_IMMUCR_P1S    0x000007c0  /* Level 1 Page Size */
-#define SPR_IMMUCR_VADDR_WIDTH 0x0000f800  /* Virtual ADDR Width */
-#define SPR_IMMUCR_PADDR_WIDTH 0x000f0000  /* Physical ADDR Width */
-
-/*
- * Bit definitions for the Data TLB Match Register
- *
- */
-#define SPR_DTLBMR_V      0x00000001  /* Valid */
-#define SPR_DTLBMR_PL1    0x00000002  /* Page Level 1 (if 0 then PL2) */
-#define SPR_DTLBMR_CID    0x0000003c  /* Context ID */
-#define SPR_DTLBMR_LRU    0x000000c0  /* Least Recently Used */
-#define SPR_DTLBMR_VPN    0xffffe000  /* Virtual Page Number */
-
-/*
- * Bit definitions for the Data TLB Translate Register
- *
- */
-#define SPR_DTLBTR_CC     0x00000001  /* Cache Coherency */
-#define SPR_DTLBTR_CI     0x00000002  /* Cache Inhibit */
-#define SPR_DTLBTR_WBC    0x00000004  /* Write-Back Cache */
-#define SPR_DTLBTR_WOM    0x00000008  /* Weakly-Ordered Memory */
-#define SPR_DTLBTR_A      0x00000010  /* Accessed */
-#define SPR_DTLBTR_D      0x00000020  /* Dirty */
-#define SPR_DTLBTR_URE    0x00000040  /* User Read Enable */
-#define SPR_DTLBTR_UWE    0x00000080  /* User Write Enable */
-#define SPR_DTLBTR_SRE    0x00000100  /* Supervisor Read Enable */
-#define SPR_DTLBTR_SWE    0x00000200  /* Supervisor Write Enable */
-#define SPR_DTLBTR_PPN    0xffffe000  /* Physical Page Number */
-
-#define DTLB_PR_NOLIMIT  ( SPR_DTLBTR_URE  | \
-                          SPR_DTLBTR_UWE  | \
-                          SPR_DTLBTR_SRE  | \
-                          SPR_DTLBTR_SWE  )
-
-/*
- * Bit definitions for the Instruction TLB Match Register
- *
- */
-#define SPR_ITLBMR_V      0x00000001  /* Valid */
-#define SPR_ITLBMR_PL1    0x00000002  /* Page Level 1 (if 0 then PL2) */
-#define SPR_ITLBMR_CID    0x0000003c  /* Context ID */
-#define SPR_ITLBMR_LRU    0x000000c0  /* Least Recently Used */
-#define SPR_ITLBMR_VPN    0xffffe000  /* Virtual Page Number */
-
-/*
- * Bit definitions for the Instruction TLB Translate Register
- *
- */
-#define SPR_ITLBTR_CC     0x00000001  /* Cache Coherency */
-#define SPR_ITLBTR_CI     0x00000002  /* Cache Inhibit */
-#define SPR_ITLBTR_WBC    0x00000004  /* Write-Back Cache */
-#define SPR_ITLBTR_WOM    0x00000008  /* Weakly-Ordered Memory */
-#define SPR_ITLBTR_A      0x00000010  /* Accessed */
-#define SPR_ITLBTR_D      0x00000020  /* Dirty */
-#define SPR_ITLBTR_SXE    0x00000040  /* User Read Enable */
-#define SPR_ITLBTR_UXE    0x00000080  /* User Write Enable */
-#define SPR_ITLBTR_PPN    0xffffe000  /* Physical Page Number */
-
-#define ITLB_PR_NOLIMIT  ( SPR_ITLBTR_SXE  |   \
-                          SPR_ITLBTR_UXE  )
-
-
-/*
- * Bit definitions for Data Cache Control register
- *
- */
-#define SPR_DCCR_EW       0x000000ff  /* Enable ways */
-
-/*
- * Bit definitions for Insn Cache Control register
- *
- */
-#define SPR_ICCR_EW       0x000000ff  /* Enable ways */
-
-/*
- * Bit definitions for Data Cache Configuration Register
- *
- */
-
-#define SPR_DCCFGR_NCW         0x00000007
-#define SPR_DCCFGR_NCS         0x00000078
-#define SPR_DCCFGR_CBS         0x00000080
-#define SPR_DCCFGR_CWS         0x00000100
-#define SPR_DCCFGR_CCRI                0x00000200
-#define SPR_DCCFGR_CBIRI       0x00000400
-#define SPR_DCCFGR_CBPRI       0x00000800
-#define SPR_DCCFGR_CBLRI       0x00001000
-#define SPR_DCCFGR_CBFRI       0x00002000
-#define SPR_DCCFGR_CBWBRI      0x00004000
-
-#define SPR_DCCFGR_NCW_OFF      0
-#define SPR_DCCFGR_NCS_OFF      3
-#define SPR_DCCFGR_CBS_OFF     7
-
-/*
- * Bit definitions for Instruction Cache Configuration Register
- *
- */
-#define SPR_ICCFGR_NCW         0x00000007
-#define SPR_ICCFGR_NCS         0x00000078
-#define SPR_ICCFGR_CBS         0x00000080
-#define SPR_ICCFGR_CCRI                0x00000200
-#define SPR_ICCFGR_CBIRI       0x00000400
-#define SPR_ICCFGR_CBPRI       0x00000800
-#define SPR_ICCFGR_CBLRI       0x00001000
-
-#define SPR_ICCFGR_NCW_OFF      0
-#define SPR_ICCFGR_NCS_OFF      3
-#define SPR_ICCFGR_CBS_OFF     7
-
-/*
- * Bit definitions for Data MMU Configuration Register
- *
- */
-
-#define SPR_DMMUCFGR_NTW       0x00000003
-#define SPR_DMMUCFGR_NTS       0x0000001C
-#define SPR_DMMUCFGR_NAE       0x000000E0
-#define SPR_DMMUCFGR_CRI       0x00000100
-#define SPR_DMMUCFGR_PRI        0x00000200
-#define SPR_DMMUCFGR_TEIRI     0x00000400
-#define SPR_DMMUCFGR_HTR       0x00000800
-
-#define SPR_DMMUCFGR_NTW_OFF   0
-#define SPR_DMMUCFGR_NTS_OFF   2
-
-/*
- * Bit definitions for Instruction MMU Configuration Register
- *
- */
-
-#define SPR_IMMUCFGR_NTW       0x00000003
-#define SPR_IMMUCFGR_NTS       0x0000001C
-#define SPR_IMMUCFGR_NAE       0x000000E0
-#define SPR_IMMUCFGR_CRI       0x00000100
-#define SPR_IMMUCFGR_PRI       0x00000200
-#define SPR_IMMUCFGR_TEIRI     0x00000400
-#define SPR_IMMUCFGR_HTR       0x00000800
-
-#define SPR_IMMUCFGR_NTW_OFF   0
-#define SPR_IMMUCFGR_NTS_OFF   2
-
-/*
- * Bit definitions for Debug Control registers
- *
- */
-#define SPR_DCR_DP     0x00000001  /* DVR/DCR present */
-#define SPR_DCR_CC     0x0000000e  /* Compare condition */
-#define SPR_DCR_SC     0x00000010  /* Signed compare */
-#define SPR_DCR_CT     0x000000e0  /* Compare to */
-
-/* Bit results with SPR_DCR_CC mask */
-#define SPR_DCR_CC_MASKED 0x00000000
-#define SPR_DCR_CC_EQUAL  0x00000002
-#define SPR_DCR_CC_LESS   0x00000004
-#define SPR_DCR_CC_LESSE  0x00000006
-#define SPR_DCR_CC_GREAT  0x00000008
-#define SPR_DCR_CC_GREATE 0x0000000a
-#define SPR_DCR_CC_NEQUAL 0x0000000c
-
-/* Bit results with SPR_DCR_CT mask */
-#define SPR_DCR_CT_DISABLED 0x00000000
-#define SPR_DCR_CT_IFEA     0x00000020
-#define SPR_DCR_CT_LEA      0x00000040
-#define SPR_DCR_CT_SEA      0x00000060
-#define SPR_DCR_CT_LD       0x00000080
-#define SPR_DCR_CT_SD       0x000000a0
-#define SPR_DCR_CT_LSEA     0x000000c0
-#define SPR_DCR_CT_LSD     0x000000e0
-/* SPR_DCR_CT_LSD doesn't seem to be implemented anywhere in or1ksim. 2004-1-30 HP */
-
-/*
- * Bit definitions for Debug Mode 1 register
- *
- */
-#define SPR_DMR1_CW       0x000fffff  /* Chain register pair data */
-#define SPR_DMR1_CW0_AND  0x00000001
-#define SPR_DMR1_CW0_OR   0x00000002
-#define SPR_DMR1_CW0     (SPR_DMR1_CW0_AND | SPR_DMR1_CW0_OR)
-#define SPR_DMR1_CW1_AND  0x00000004
-#define SPR_DMR1_CW1_OR   0x00000008
-#define SPR_DMR1_CW1     (SPR_DMR1_CW1_AND | SPR_DMR1_CW1_OR)
-#define SPR_DMR1_CW2_AND  0x00000010
-#define SPR_DMR1_CW2_OR   0x00000020
-#define SPR_DMR1_CW2     (SPR_DMR1_CW2_AND | SPR_DMR1_CW2_OR)
-#define SPR_DMR1_CW3_AND  0x00000040
-#define SPR_DMR1_CW3_OR   0x00000080
-#define SPR_DMR1_CW3     (SPR_DMR1_CW3_AND | SPR_DMR1_CW3_OR)
-#define SPR_DMR1_CW4_AND  0x00000100
-#define SPR_DMR1_CW4_OR   0x00000200
-#define SPR_DMR1_CW4     (SPR_DMR1_CW4_AND | SPR_DMR1_CW4_OR)
-#define SPR_DMR1_CW5_AND  0x00000400
-#define SPR_DMR1_CW5_OR   0x00000800
-#define SPR_DMR1_CW5     (SPR_DMR1_CW5_AND | SPR_DMR1_CW5_OR)
-#define SPR_DMR1_CW6_AND  0x00001000
-#define SPR_DMR1_CW6_OR   0x00002000
-#define SPR_DMR1_CW6     (SPR_DMR1_CW6_AND | SPR_DMR1_CW6_OR)
-#define SPR_DMR1_CW7_AND  0x00004000
-#define SPR_DMR1_CW7_OR   0x00008000
-#define SPR_DMR1_CW7     (SPR_DMR1_CW7_AND | SPR_DMR1_CW7_OR)
-#define SPR_DMR1_CW8_AND  0x00010000
-#define SPR_DMR1_CW8_OR   0x00020000
-#define SPR_DMR1_CW8     (SPR_DMR1_CW8_AND | SPR_DMR1_CW8_OR)
-#define SPR_DMR1_CW9_AND  0x00040000
-#define SPR_DMR1_CW9_OR   0x00080000
-#define SPR_DMR1_CW9     (SPR_DMR1_CW9_AND | SPR_DMR1_CW9_OR)
-#define SPR_DMR1_RES1      0x00300000  /* Reserved */
-#define SPR_DMR1_ST      0x00400000  /* Single-step trace*/
-#define SPR_DMR1_BT      0x00800000  /* Branch trace */
-#define SPR_DMR1_RES2    0xff000000  /* Reserved */
-
-/*
- * Bit definitions for Debug Mode 2 register. AWTC and WGB corrected by JPB
- *
- */
-#define SPR_DMR2_WCE0     0x00000001  /* Watchpoint counter 0 enable */
-#define SPR_DMR2_WCE1     0x00000002  /* Watchpoint counter 0 enable */
-#define SPR_DMR2_AWTC     0x00000ffc  /* Assign watchpoints to counters */
-#define SPR_DMR2_AWTC_OFF           2  /* Bit offset to AWTC field */
-#define SPR_DMR2_WGB      0x003ff000  /* Watchpoints generating breakpoint */
-#define SPR_DMR2_WGB_OFF           12  /* Bit offset to WGB field */
-#define SPR_DMR2_WBS      0xffc00000  /* JPB: Watchpoint status */
-#define SPR_DMR2_WBS_OFF           22  /* Bit offset to WBS field */
-
-/*
- * Bit definitions for Debug watchpoint counter registers
- *
- */
-#define SPR_DWCR_COUNT     0x0000ffff  /* Count */
-#define SPR_DWCR_MATCH     0xffff0000  /* Match */
-#define SPR_DWCR_MATCH_OFF          16  /* Match bit offset */
-
-/*
- * Bit definitions for Debug stop register
- *
- */
-#define SPR_DSR_RSTE   0x00000001  /* Reset exception */
-#define SPR_DSR_BUSEE  0x00000002  /* Bus error exception */
-#define SPR_DSR_DPFE   0x00000004  /* Data Page Fault exception */
-#define SPR_DSR_IPFE   0x00000008  /* Insn Page Fault exception */
-#define SPR_DSR_TTE    0x00000010  /* Tick Timer exception */
-#define SPR_DSR_AE     0x00000020  /* Alignment exception */
-#define SPR_DSR_IIE    0x00000040  /* Illegal Instruction exception */
-#define SPR_DSR_IE     0x00000080  /* Interrupt exception */
-#define SPR_DSR_DME    0x00000100  /* DTLB miss exception */
-#define SPR_DSR_IME    0x00000200  /* ITLB miss exception */
-#define SPR_DSR_RE     0x00000400  /* Range exception */
-#define SPR_DSR_SCE    0x00000800  /* System call exception */
-#define SPR_DSR_FPE     0x00001000  /* Floating Point Exception */
-#define SPR_DSR_TE     0x00002000  /* Trap exception */
-
-/*
- * Bit definitions for Debug reason register
- *
- */
-#define SPR_DRR_RSTE   0x00000001  /* Reset exception */
-#define SPR_DRR_BUSEE  0x00000002  /* Bus error exception */
-#define SPR_DRR_DPFE   0x00000004  /* Data Page Fault exception */
-#define SPR_DRR_IPFE   0x00000008  /* Insn Page Fault exception */
-#define SPR_DRR_TTE    0x00000010  /* Tick Timer exception */
-#define SPR_DRR_AE     0x00000020  /* Alignment exception */
-#define SPR_DRR_IIE    0x00000040  /* Illegal Instruction exception */
-#define SPR_DRR_IE     0x00000080  /* Interrupt exception */
-#define SPR_DRR_DME    0x00000100  /* DTLB miss exception */
-#define SPR_DRR_IME    0x00000200  /* ITLB miss exception */
-#define SPR_DRR_RE     0x00000400  /* Range exception */
-#define SPR_DRR_SCE    0x00000800  /* System call exception */
-#define SPR_DRR_FPE     0x00001000  /* Floating Point Exception */
-#define SPR_DRR_TE     0x00002000  /* Trap exception */
-
-/*
- * Bit definitions for Performance counters mode registers
- *
- */
-#define SPR_PCMR_CP    0x00000001  /* Counter present */
-#define SPR_PCMR_UMRA  0x00000002  /* User mode read access */
-#define SPR_PCMR_CISM  0x00000004  /* Count in supervisor mode */
-#define SPR_PCMR_CIUM  0x00000008  /* Count in user mode */
-#define SPR_PCMR_LA    0x00000010  /* Load access event */
-#define SPR_PCMR_SA    0x00000020  /* Store access event */
-#define SPR_PCMR_IF    0x00000040  /* Instruction fetch event*/
-#define SPR_PCMR_DCM   0x00000080  /* Data cache miss event */
-#define SPR_PCMR_ICM   0x00000100  /* Insn cache miss event */
-#define SPR_PCMR_IFS   0x00000200  /* Insn fetch stall event */
-#define SPR_PCMR_LSUS  0x00000400  /* LSU stall event */
-#define SPR_PCMR_BS    0x00000800  /* Branch stall event */
-#define SPR_PCMR_DTLBM 0x00001000  /* DTLB miss event */
-#define SPR_PCMR_ITLBM 0x00002000  /* ITLB miss event */
-#define SPR_PCMR_DDS   0x00004000  /* Data dependency stall event */
-#define SPR_PCMR_WPE   0x03ff8000  /* Watchpoint events */
-
-/* 
- * Bit definitions for the Power management register
- *
- */
-#define SPR_PMR_SDF    0x0000000f  /* Slow down factor */
-#define SPR_PMR_DME    0x00000010  /* Doze mode enable */
-#define SPR_PMR_SME    0x00000020  /* Sleep mode enable */
-#define SPR_PMR_DCGE   0x00000040  /* Dynamic clock gating enable */
-#define SPR_PMR_SUME   0x00000080  /* Suspend mode enable */
-
-/*
- * Bit definitions for PICMR
- *
- */
-#define SPR_PICMR_IUM  0xfffffffc  /* Interrupt unmask */
-
-/*
- * Bit definitions for PICPR
- *
- */
-#define SPR_PICPR_IPRIO        0xfffffffc  /* Interrupt priority */
-
-/*
- * Bit definitions for PICSR
- *
- */
-#define SPR_PICSR_IS   0xffffffff  /* Interrupt status */
-
-/*
- * Bit definitions for Tick Timer Control Register
- *
- */
-#define SPR_TTCR_PERIOD        0x0fffffff  /* Time Period */
-#define SPR_TTMR_PERIOD        SPR_TTCR_PERIOD
-#define SPR_TTMR_IP    0x10000000  /* Interrupt Pending */
-#define SPR_TTMR_IE    0x20000000  /* Interrupt Enable */
-#define SPR_TTMR_RT    0x40000000  /* Restart tick */
-#define SPR_TTMR_SR     0x80000000  /* Single run */
-#define SPR_TTMR_CR     0xc0000000  /* Continuous run */
-#define SPR_TTMR_M      0xc0000000  /* Tick mode */
-
-/*
- * Bit definitions for the FP Control Status Register
- *
- */
-#define SPR_FPCSR_FPEE  0x00000001  /* Floating Point Exception Enable */
-#define SPR_FPCSR_RM    0x00000006  /* Rounding Mode */
-#define SPR_FPCSR_OVF   0x00000008  /* Overflow Flag */
-#define SPR_FPCSR_UNF   0x00000010  /* Underflow Flag */
-#define SPR_FPCSR_SNF   0x00000020  /* SNAN Flag */
-#define SPR_FPCSR_QNF   0x00000040  /* QNAN Flag */
-#define SPR_FPCSR_ZF    0x00000080  /* Zero Flag */
-#define SPR_FPCSR_IXF   0x00000100  /* Inexact Flag */
-#define SPR_FPCSR_IVF   0x00000200  /* Invalid Flag */
-#define SPR_FPCSR_INF   0x00000400  /* Infinity Flag */
-#define SPR_FPCSR_DZF   0x00000800  /* Divide By Zero Flag */
-#define SPR_FPCSR_ALLF (SPR_FPCSR_OVF | SPR_FPCSR_UNF | SPR_FPCSR_SNF | \
-                       SPR_FPCSR_QNF | SPR_FPCSR_ZF | SPR_FPCSR_IXF |  \
-                       SPR_FPCSR_IVF | SPR_FPCSR_INF | SPR_FPCSR_DZF)
-
-#define FPCSR_RM_RN (0<<1)
-#define FPCSR_RM_RZ (1<<1)
-#define FPCSR_RM_RIP (2<<1)
-#define FPCSR_RM_RIN (3<<1)
-
-#endif /* SPR_DEFS__H */
diff --git a/software/include/base/stdarg.h b/software/include/base/stdarg.h
deleted file mode 100644 (file)
index 6df5093..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __STDARG_H
-#define __STDARG_H
-
-#include <stdlib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define va_start(v, l) __builtin_va_start((v), l)
-#define va_arg(ap, type) __builtin_va_arg((ap), type)
-#define va_copy(aq, ap) __builtin_va_copy((aq), (ap))
-#define va_end(ap) __builtin_va_end(ap)
-#define va_list __builtin_va_list
-
-int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
-int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
-int vsprintf(char *buf, const char *fmt, va_list args);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STDARG_H */
diff --git a/software/include/base/stdbool.h b/software/include/base/stdbool.h
deleted file mode 100644 (file)
index d58bb58..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __STDBOOL_H
-#define __STDBOOL_H
-
-#define bool _Bool
-#define true 1
-#define false 0
-
-#endif /* __STDBOOL_H */
diff --git a/software/include/base/stddef.h b/software/include/base/stddef.h
deleted file mode 100644 (file)
index d1afa95..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef __STDDEF_H
-#define __STDDEF_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef __cplusplus
-#define NULL 0
-#else
-#define NULL ((void *)0)
-#endif
-
-typedef unsigned long size_t;
-typedef long ptrdiff_t;
-
-#define offsetof(s,m) (size_t)&(((s *)0)->m)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STDDEF_H */
diff --git a/software/include/base/stdint.h b/software/include/base/stdint.h
deleted file mode 100644 (file)
index 90332e3..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef __STDINT_H
-#define __STDINT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef int intptr_t;
-typedef unsigned int uintptr_t;
-
-typedef unsigned long long uint64_t;
-typedef unsigned int uint32_t;
-typedef unsigned short uint16_t;
-typedef unsigned char uint8_t;
-
-typedef long long int64_t;
-typedef int int32_t;
-typedef short int16_t;
-typedef char int8_t;
-
-#define __int_c_join(a, b) a ## b
-#define __int_c(v, suffix) __int_c_join(v, suffix)
-#define __uint_c(v, suffix) __int_c_join(v##U, suffix)
-
-#define INT64_C(v) __int_c(v, LL)
-#define UINT64_C(v) __uint_c(v, LL)
-#define INT32_C(v) v
-#define UINT32_C(v) v##U
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STDINT_H */
diff --git a/software/include/base/stdio.h b/software/include/base/stdio.h
deleted file mode 100644 (file)
index 5e872d6..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef __STDIO_H
-#define __STDIO_H
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int putchar(int c);
-int puts(const char *s);
-
-int snprintf(char *buf, size_t size, const char *fmt, ...);
-int scnprintf(char *buf, size_t size, const char *fmt, ...);
-int sprintf(char *buf, const char *fmt, ...);
-
-int printf(const char *fmt, ...);
-
-/* Not sure this belongs here... */
-typedef long long loff_t;
-typedef long off_t;
-typedef int mode_t;
-typedef int dev_t;
-
-/*
- * Note: this library does not provide FILE operations.
- * User code must implement them.
- */
-
-#ifndef BUFSIZ
-#define BUFSIZ 1024
-#endif
-
-#ifndef EOF
-#define EOF -1
-#endif
-
-#ifndef SEEK_SET
-#define SEEK_SET       0
-#endif
-
-#ifndef SEEK_CUR
-#define SEEK_CUR       1
-#endif
-
-#ifndef SEEK_END
-#define SEEK_END       2
-#endif
-
-typedef int FILE;
-
-extern FILE *stdin;
-extern FILE *stdout;
-extern FILE *stderr;
-
-int fprintf(FILE *stream, const char *format, ...);
-int fflush(FILE *stream);
-
-FILE *fopen(const char *path, const char *mode);
-FILE *freopen(const char *path, const char *mode, FILE *stream);
-char *fgets(char *s, int size, FILE *stream);
-size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
-size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
-int getc(FILE *stream);
-int fputc(int c, FILE *stream);
-int ferror(FILE *stream);
-int feof(FILE *stream);
-int fclose(FILE *fp);
-
-int fseek(FILE *stream, long offset, int whence);
-long ftell(FILE *stream);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STDIO_H */
diff --git a/software/include/base/stdlib.h b/software/include/base/stdlib.h
deleted file mode 100644 (file)
index 4b9bd04..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * MiSoC
- * Copyright (C) 2007, 2008, 2009, 2011 Sebastien Bourdeauducq
- * Copyright (C) Linux kernel developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __STDLIB_H
-#define __STDLIB_H
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define PRINTF_ZEROPAD 1               /* pad with zero */
-#define PRINTF_SIGN    2               /* unsigned/signed long */
-#define PRINTF_PLUS    4               /* show plus */
-#define PRINTF_SPACE   8               /* space if plus */
-#define PRINTF_LEFT    16              /* left justified */
-#define PRINTF_SPECIAL 32              /* 0x */
-#define PRINTF_LARGE   64              /* use 'ABCDEF' instead of 'abcdef' */
-
-#define likely(x) x
-#define unlikely(x) x
-
-static inline int abs(int x)
-{
-       return x > 0 ? x : -x;
-}
-
-static inline long int labs(long int x)
-{
-       return x > 0 ? x : -x;
-}
-
-unsigned long strtoul(const char *nptr, char **endptr, int base);
-long strtol(const char *nptr, char **endptr, int base);
-double strtod(const char *str, char **endptr);
-
-int skip_atoi(const char **s);
-static inline int atoi(const char *nptr) {
-       return strtol(nptr, NULL, 10);
-}
-static inline long atol(const char *nptr) {
-       return (long)atoi(nptr);
-}
-char *number(char *buf, char *end, unsigned long num, int base, int size, int precision, int type);
-
-#define   RAND_MAX        2147483647
-
-unsigned int rand(void);
-void srand(unsigned int seed);
-void abort(void) __attribute__((noreturn));
-
-void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
-
-/*
- * The following functions are not provided by this library.
- */
-
-char *getenv(const char *name);
-
-void *malloc(size_t size);
-void free(void *ptr);
-void *realloc(void *ptr, size_t size);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STDLIB_H */
diff --git a/software/include/base/string.h b/software/include/base/string.h
deleted file mode 100644 (file)
index 4d0716b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * MiSoC
- * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
- * Copyright (C) Linus Torvalds and Linux kernel developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __STRING_H
-#define __STRING_H
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-char *strchr(const char *s, int c);
-char *strpbrk(const char *,const char *);
-char *strrchr(const char *s, int c);
-char *strnchr(const char *s, size_t count, int c);
-char *strcpy(char *dest, const char *src);
-char *strncpy(char *dest, const char *src, size_t count);
-int strcmp(const char *cs, const char *ct);
-int strncmp(const char *cs, const char *ct, size_t count);
-char *strcat(char *dest, const char *src);
-char *strncat(char *dest, const char *src, size_t n);
-size_t strlen(const char *s);
-size_t strnlen(const char *s, size_t count);
-size_t strspn(const char *s, const char *accept);
-int memcmp(const void *cs, const void *ct, size_t count);
-void *memset(void *s, int c, size_t count);
-void *memcpy(void *to, const void *from, size_t n);
-void *memmove(void *dest, const void *src, size_t count);
-char *strstr(const char *s1, const char *s2);
-void *memchr(const void *s, int c, size_t n);
-
-char *strerror(int errnum);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STRING_H */
diff --git a/software/include/base/system.h b/software/include/base/system.h
deleted file mode 100644 (file)
index 014dbf4..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef __SYSTEM_H
-#define __SYSTEM_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void flush_cpu_icache(void);
-void flush_cpu_dcache(void);
-void flush_l2_cache(void);
-
-#ifdef __or1k__
-#include <spr-defs.h>
-static inline unsigned long mfspr(unsigned long add)
-{
-       unsigned long ret;
-
-       __asm__ __volatile__ ("l.mfspr %0,r0,%1" : "=r" (ret) : "K" (add));
-
-       return ret;
-}
-
-static inline void mtspr(unsigned long add, unsigned long val)
-{
-       __asm__ __volatile__ ("l.mtspr r0,%1,%0" : : "K" (add), "r" (val));
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __SYSTEM_H */
diff --git a/software/include/base/time.h b/software/include/base/time.h
deleted file mode 100644 (file)
index 3408390..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef __TIME_H
-#define __TIME_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void time_init(void);
-int elapsed(int *last_event, int period);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __TIME_H */
diff --git a/software/include/base/uart.h b/software/include/base/uart.h
deleted file mode 100644 (file)
index 3d8a4fc..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __UART_H
-#define __UART_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void uart_init(void);
-void uart_isr(void);
-void uart_sync(void);
-
-void uart_write(char c);
-char uart_read(void);
-int uart_read_nonblock(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/software/include/basec++/algorithm b/software/include/basec++/algorithm
deleted file mode 100644 (file)
index cb9b614..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef __CXX_ALGORITHM
-#define __CXX_ALGORITHM
-
-#endif /* __CXX_ALGORITHM */
diff --git a/software/include/basec++/cstddef b/software/include/basec++/cstddef
deleted file mode 100644 (file)
index 5291f1b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef __CXX_CSTDDEF
-#define __CXX_CSTDDEF
-
-#include <stddef.h>
-
-namespace std {
-  using ::size_t;
-  using ::ptrdiff_t;
-}
-
-#endif /* __CXX_CSTDDEF */
diff --git a/software/include/basec++/cstdlib b/software/include/basec++/cstdlib
deleted file mode 100644 (file)
index 6501ea9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __CXX_CSTDLIB
-#define __CXX_CSTDLIB
-
-#include <stdlib.h>
-
-#endif /* __CXX_CSTDLIB */
diff --git a/software/include/basec++/new b/software/include/basec++/new
deleted file mode 100644 (file)
index aa2f1a8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __CXX_NEW
-#define __CXX_NEW
-
-#include <cstddef>
-
-inline void* operator new (std::size_t size, void* ptr) noexcept
-  { return ptr; }
-
-#endif /* __CXX_NEW */
diff --git a/software/include/dyld/dlfcn.h b/software/include/dyld/dlfcn.h
deleted file mode 100644 (file)
index cf679f7..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __DLFCN_H
-#define __DLFCN_H
-
-typedef struct
-{
-  const char *dli_fname;        /* File name of defining object.  */
-  void *dli_fbase;              /* Load address of that object.  */
-  const char *dli_sname;        /* Name of nearest symbol.  */
-  void *dli_saddr;              /* Exact value of nearest symbol.  */
-} Dl_info;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int dl_iterate_phdr (int (*__callback) (struct dl_phdr_info *,
-                                               size_t, void *),
-                            void *__data);
-
-/* Fill in *INFO with the following information about ADDRESS.
-   Returns 0 iff no shared object's segments contain that address.  */
-extern int dladdr (const void *__address, Dl_info *__info);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DLFCN_H */
diff --git a/software/include/dyld/dyld.h b/software/include/dyld/dyld.h
deleted file mode 100644 (file)
index 6bd55be..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef __DYLD_H
-#define __DYLD_H
-
-#include <elf.h>
-
-struct dyld_info {
-    Elf32_Addr base;
-    const void *init;
-    const char *strtab;
-    const Elf32_Sym *symtab;
-    struct {
-        Elf32_Word nbucket;
-        Elf32_Word nchain;
-        const Elf32_Word *bucket;
-        const Elf32_Word *chain;
-    } hash;
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int dyld_load(const void *shlib, Elf32_Addr base,
-              Elf32_Addr (*resolve_import)(const char *),
-              struct dyld_info *info, const char **error_out);
-void *dyld_lookup(const char *symbol, struct dyld_info *info);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DYLD_H */
diff --git a/software/include/dyld/elf.h b/software/include/dyld/elf.h
deleted file mode 100644 (file)
index c84c28a..0000000
+++ /dev/null
@@ -1,3343 +0,0 @@
-/* This file defines standard ELF types, structures, and macros.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _ELF_H
-#define        _ELF_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Standard ELF types.  */
-
-#include <stdint.h>
-
-/* Type for a 16-bit quantity.  */
-typedef uint16_t Elf32_Half;
-typedef uint16_t Elf64_Half;
-
-/* Types for signed and unsigned 32-bit quantities.  */
-typedef uint32_t Elf32_Word;
-typedef        int32_t  Elf32_Sword;
-typedef uint32_t Elf64_Word;
-typedef        int32_t  Elf64_Sword;
-
-/* Types for signed and unsigned 64-bit quantities.  */
-typedef uint64_t Elf32_Xword;
-typedef        int64_t  Elf32_Sxword;
-typedef uint64_t Elf64_Xword;
-typedef        int64_t  Elf64_Sxword;
-
-/* Type of addresses.  */
-typedef uint32_t Elf32_Addr;
-typedef uint64_t Elf64_Addr;
-
-/* Type of file offsets.  */
-typedef uint32_t Elf32_Off;
-typedef uint64_t Elf64_Off;
-
-/* Type for section indices, which are 16-bit quantities.  */
-typedef uint16_t Elf32_Section;
-typedef uint16_t Elf64_Section;
-
-/* Type for version symbol information.  */
-typedef Elf32_Half Elf32_Versym;
-typedef Elf64_Half Elf64_Versym;
-
-
-/* The ELF file header.  This appears at the start of every ELF file.  */
-
-#define EI_NIDENT (16)
-
-typedef struct
-{
-  unsigned char        e_ident[EI_NIDENT];     /* Magic number and other info */
-  Elf32_Half   e_type;                 /* Object file type */
-  Elf32_Half   e_machine;              /* Architecture */
-  Elf32_Word   e_version;              /* Object file version */
-  Elf32_Addr   e_entry;                /* Entry point virtual address */
-  Elf32_Off    e_phoff;                /* Program header table file offset */
-  Elf32_Off    e_shoff;                /* Section header table file offset */
-  Elf32_Word   e_flags;                /* Processor-specific flags */
-  Elf32_Half   e_ehsize;               /* ELF header size in bytes */
-  Elf32_Half   e_phentsize;            /* Program header table entry size */
-  Elf32_Half   e_phnum;                /* Program header table entry count */
-  Elf32_Half   e_shentsize;            /* Section header table entry size */
-  Elf32_Half   e_shnum;                /* Section header table entry count */
-  Elf32_Half   e_shstrndx;             /* Section header string table index */
-} Elf32_Ehdr;
-
-typedef struct
-{
-  unsigned char        e_ident[EI_NIDENT];     /* Magic number and other info */
-  Elf64_Half   e_type;                 /* Object file type */
-  Elf64_Half   e_machine;              /* Architecture */
-  Elf64_Word   e_version;              /* Object file version */
-  Elf64_Addr   e_entry;                /* Entry point virtual address */
-  Elf64_Off    e_phoff;                /* Program header table file offset */
-  Elf64_Off    e_shoff;                /* Section header table file offset */
-  Elf64_Word   e_flags;                /* Processor-specific flags */
-  Elf64_Half   e_ehsize;               /* ELF header size in bytes */
-  Elf64_Half   e_phentsize;            /* Program header table entry size */
-  Elf64_Half   e_phnum;                /* Program header table entry count */
-  Elf64_Half   e_shentsize;            /* Section header table entry size */
-  Elf64_Half   e_shnum;                /* Section header table entry count */
-  Elf64_Half   e_shstrndx;             /* Section header string table index */
-} Elf64_Ehdr;
-
-/* Fields in the e_ident array.  The EI_* macros are indices into the
-   array.  The macros under each EI_* macro are the values the byte
-   may have.  */
-
-#define EI_MAG0                0               /* File identification byte 0 index */
-#define ELFMAG0                0x7f            /* Magic number byte 0 */
-
-#define EI_MAG1                1               /* File identification byte 1 index */
-#define ELFMAG1                'E'             /* Magic number byte 1 */
-
-#define EI_MAG2                2               /* File identification byte 2 index */
-#define ELFMAG2                'L'             /* Magic number byte 2 */
-
-#define EI_MAG3                3               /* File identification byte 3 index */
-#define ELFMAG3                'F'             /* Magic number byte 3 */
-
-/* Conglomeration of the identification bytes, for easy testing as a word.  */
-#define        ELFMAG          "\177ELF"
-#define        SELFMAG         4
-
-#define EI_CLASS       4               /* File class byte index */
-#define ELFCLASSNONE   0               /* Invalid class */
-#define ELFCLASS32     1               /* 32-bit objects */
-#define ELFCLASS64     2               /* 64-bit objects */
-#define ELFCLASSNUM    3
-
-#define EI_DATA                5               /* Data encoding byte index */
-#define ELFDATANONE    0               /* Invalid data encoding */
-#define ELFDATA2LSB    1               /* 2's complement, little endian */
-#define ELFDATA2MSB    2               /* 2's complement, big endian */
-#define ELFDATANUM     3
-
-#define EI_VERSION     6               /* File version byte index */
-                                       /* Value must be EV_CURRENT */
-
-#define EI_OSABI       7               /* OS ABI identification */
-#define ELFOSABI_NONE          0       /* UNIX System V ABI */
-#define ELFOSABI_SYSV          0       /* Alias.  */
-#define ELFOSABI_HPUX          1       /* HP-UX */
-#define ELFOSABI_NETBSD                2       /* NetBSD.  */
-#define ELFOSABI_GNU           3       /* Object uses GNU ELF extensions.  */
-#define ELFOSABI_LINUX         ELFOSABI_GNU /* Compatibility alias.  */
-#define ELFOSABI_SOLARIS       6       /* Sun Solaris.  */
-#define ELFOSABI_AIX           7       /* IBM AIX.  */
-#define ELFOSABI_IRIX          8       /* SGI Irix.  */
-#define ELFOSABI_FREEBSD       9       /* FreeBSD.  */
-#define ELFOSABI_TRU64         10      /* Compaq TRU64 UNIX.  */
-#define ELFOSABI_MODESTO       11      /* Novell Modesto.  */
-#define ELFOSABI_OPENBSD       12      /* OpenBSD.  */
-#define ELFOSABI_ARM_AEABI     64      /* ARM EABI */
-#define ELFOSABI_ARM           97      /* ARM */
-#define ELFOSABI_STANDALONE    255     /* Standalone (embedded) application */
-
-#define EI_ABIVERSION  8               /* ABI version */
-
-#define EI_PAD         9               /* Byte index of padding bytes */
-
-/* Legal values for e_type (object file type).  */
-
-#define ET_NONE                0               /* No file type */
-#define ET_REL         1               /* Relocatable file */
-#define ET_EXEC                2               /* Executable file */
-#define ET_DYN         3               /* Shared object file */
-#define ET_CORE                4               /* Core file */
-#define        ET_NUM          5               /* Number of defined types */
-#define ET_LOOS                0xfe00          /* OS-specific range start */
-#define ET_HIOS                0xfeff          /* OS-specific range end */
-#define ET_LOPROC      0xff00          /* Processor-specific range start */
-#define ET_HIPROC      0xffff          /* Processor-specific range end */
-
-/* Legal values for e_machine (architecture).  */
-
-#define EM_NONE                 0              /* No machine */
-#define EM_M32          1              /* AT&T WE 32100 */
-#define EM_SPARC        2              /* SUN SPARC */
-#define EM_386          3              /* Intel 80386 */
-#define EM_68K          4              /* Motorola m68k family */
-#define EM_88K          5              /* Motorola m88k family */
-#define EM_860          7              /* Intel 80860 */
-#define EM_MIPS                 8              /* MIPS R3000 big-endian */
-#define EM_S370                 9              /* IBM System/370 */
-#define EM_MIPS_RS3_LE 10              /* MIPS R3000 little-endian */
-
-#define EM_PARISC      15              /* HPPA */
-#define EM_VPP500      17              /* Fujitsu VPP500 */
-#define EM_SPARC32PLUS 18              /* Sun's "v8plus" */
-#define EM_960         19              /* Intel 80960 */
-#define EM_PPC         20              /* PowerPC */
-#define EM_PPC64       21              /* PowerPC 64-bit */
-#define EM_S390                22              /* IBM S390 */
-
-#define EM_V800                36              /* NEC V800 series */
-#define EM_FR20                37              /* Fujitsu FR20 */
-#define EM_RH32                38              /* TRW RH-32 */
-#define EM_RCE         39              /* Motorola RCE */
-#define EM_ARM         40              /* ARM */
-#define EM_FAKE_ALPHA  41              /* Digital Alpha */
-#define EM_SH          42              /* Hitachi SH */
-#define EM_SPARCV9     43              /* SPARC v9 64-bit */
-#define EM_TRICORE     44              /* Siemens Tricore */
-#define EM_ARC         45              /* Argonaut RISC Core */
-#define EM_H8_300      46              /* Hitachi H8/300 */
-#define EM_H8_300H     47              /* Hitachi H8/300H */
-#define EM_H8S         48              /* Hitachi H8S */
-#define EM_H8_500      49              /* Hitachi H8/500 */
-#define EM_IA_64       50              /* Intel Merced */
-#define EM_MIPS_X      51              /* Stanford MIPS-X */
-#define EM_COLDFIRE    52              /* Motorola Coldfire */
-#define EM_68HC12      53              /* Motorola M68HC12 */
-#define EM_MMA         54              /* Fujitsu MMA Multimedia Accelerator*/
-#define EM_PCP         55              /* Siemens PCP */
-#define EM_NCPU                56              /* Sony nCPU embeeded RISC */
-#define EM_NDR1                57              /* Denso NDR1 microprocessor */
-#define EM_STARCORE    58              /* Motorola Start*Core processor */
-#define EM_ME16                59              /* Toyota ME16 processor */
-#define EM_ST100       60              /* STMicroelectronic ST100 processor */
-#define EM_TINYJ       61              /* Advanced Logic Corp. Tinyj emb.fam*/
-#define EM_X86_64      62              /* AMD x86-64 architecture */
-#define EM_PDSP                63              /* Sony DSP Processor */
-
-#define EM_FX66                66              /* Siemens FX66 microcontroller */
-#define EM_ST9PLUS     67              /* STMicroelectronics ST9+ 8/16 mc */
-#define EM_ST7         68              /* STmicroelectronics ST7 8 bit mc */
-#define EM_68HC16      69              /* Motorola MC68HC16 microcontroller */
-#define EM_68HC11      70              /* Motorola MC68HC11 microcontroller */
-#define EM_68HC08      71              /* Motorola MC68HC08 microcontroller */
-#define EM_68HC05      72              /* Motorola MC68HC05 microcontroller */
-#define EM_SVX         73              /* Silicon Graphics SVx */
-#define EM_ST19                74              /* STMicroelectronics ST19 8 bit mc */
-#define EM_VAX         75              /* Digital VAX */
-#define EM_CRIS                76              /* Axis Communications 32-bit embedded processor */
-#define EM_JAVELIN     77              /* Infineon Technologies 32-bit embedded processor */
-#define EM_FIREPATH    78              /* Element 14 64-bit DSP Processor */
-#define EM_ZSP         79              /* LSI Logic 16-bit DSP Processor */
-#define EM_MMIX                80              /* Donald Knuth's educational 64-bit processor */
-#define EM_HUANY       81              /* Harvard University machine-independent object files */
-#define EM_PRISM       82              /* SiTera Prism */
-#define EM_AVR         83              /* Atmel AVR 8-bit microcontroller */
-#define EM_FR30                84              /* Fujitsu FR30 */
-#define EM_D10V                85              /* Mitsubishi D10V */
-#define EM_D30V                86              /* Mitsubishi D30V */
-#define EM_V850                87              /* NEC v850 */
-#define EM_M32R                88              /* Mitsubishi M32R */
-#define EM_MN10300     89              /* Matsushita MN10300 */
-#define EM_MN10200     90              /* Matsushita MN10200 */
-#define EM_PJ          91              /* picoJava */
-#define EM_OPENRISC    92              /* OpenRISC 32-bit embedded processor */
-#define EM_ARC_A5      93              /* ARC Cores Tangent-A5 */
-#define EM_XTENSA      94              /* Tensilica Xtensa Architecture */
-#define EM_AARCH64     183             /* ARM AARCH64 */
-#define EM_TILEPRO     188             /* Tilera TILEPro */
-#define EM_MICROBLAZE  189             /* Xilinx MicroBlaze */
-#define EM_TILEGX      191             /* Tilera TILE-Gx */
-#define EM_NUM         192
-
-/* If it is necessary to assign new unofficial EM_* values, please
-   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
-   chances of collision with official or non-GNU unofficial values.  */
-
-#define EM_ALPHA       0x9026
-
-/* Legal values for e_version (version).  */
-
-#define EV_NONE                0               /* Invalid ELF version */
-#define EV_CURRENT     1               /* Current version */
-#define EV_NUM         2
-
-/* Section header.  */
-
-typedef struct
-{
-  Elf32_Word   sh_name;                /* Section name (string tbl index) */
-  Elf32_Word   sh_type;                /* Section type */
-  Elf32_Word   sh_flags;               /* Section flags */
-  Elf32_Addr   sh_addr;                /* Section virtual addr at execution */
-  Elf32_Off    sh_offset;              /* Section file offset */
-  Elf32_Word   sh_size;                /* Section size in bytes */
-  Elf32_Word   sh_link;                /* Link to another section */
-  Elf32_Word   sh_info;                /* Additional section information */
-  Elf32_Word   sh_addralign;           /* Section alignment */
-  Elf32_Word   sh_entsize;             /* Entry size if section holds table */
-} Elf32_Shdr;
-
-typedef struct
-{
-  Elf64_Word   sh_name;                /* Section name (string tbl index) */
-  Elf64_Word   sh_type;                /* Section type */
-  Elf64_Xword  sh_flags;               /* Section flags */
-  Elf64_Addr   sh_addr;                /* Section virtual addr at execution */
-  Elf64_Off    sh_offset;              /* Section file offset */
-  Elf64_Xword  sh_size;                /* Section size in bytes */
-  Elf64_Word   sh_link;                /* Link to another section */
-  Elf64_Word   sh_info;                /* Additional section information */
-  Elf64_Xword  sh_addralign;           /* Section alignment */
-  Elf64_Xword  sh_entsize;             /* Entry size if section holds table */
-} Elf64_Shdr;
-
-/* Special section indices.  */
-
-#define SHN_UNDEF      0               /* Undefined section */
-#define SHN_LORESERVE  0xff00          /* Start of reserved indices */
-#define SHN_LOPROC     0xff00          /* Start of processor-specific */
-#define SHN_BEFORE     0xff00          /* Order section before all others
-                                          (Solaris).  */
-#define SHN_AFTER      0xff01          /* Order section after all others
-                                          (Solaris).  */
-#define SHN_HIPROC     0xff1f          /* End of processor-specific */
-#define SHN_LOOS       0xff20          /* Start of OS-specific */
-#define SHN_HIOS       0xff3f          /* End of OS-specific */
-#define SHN_ABS                0xfff1          /* Associated symbol is absolute */
-#define SHN_COMMON     0xfff2          /* Associated symbol is common */
-#define SHN_XINDEX     0xffff          /* Index is in extra table.  */
-#define SHN_HIRESERVE  0xffff          /* End of reserved indices */
-
-/* Legal values for sh_type (section type).  */
-
-#define SHT_NULL         0             /* Section header table entry unused */
-#define SHT_PROGBITS     1             /* Program data */
-#define SHT_SYMTAB       2             /* Symbol table */
-#define SHT_STRTAB       3             /* String table */
-#define SHT_RELA         4             /* Relocation entries with addends */
-#define SHT_HASH         5             /* Symbol hash table */
-#define SHT_DYNAMIC      6             /* Dynamic linking information */
-#define SHT_NOTE         7             /* Notes */
-#define SHT_NOBITS       8             /* Program space with no data (bss) */
-#define SHT_REL                  9             /* Relocation entries, no addends */
-#define SHT_SHLIB        10            /* Reserved */
-#define SHT_DYNSYM       11            /* Dynamic linker symbol table */
-#define SHT_INIT_ARRAY   14            /* Array of constructors */
-#define SHT_FINI_ARRAY   15            /* Array of destructors */
-#define SHT_PREINIT_ARRAY 16           /* Array of pre-constructors */
-#define SHT_GROUP        17            /* Section group */
-#define SHT_SYMTAB_SHNDX  18           /* Extended section indeces */
-#define        SHT_NUM           19            /* Number of defined types.  */
-#define SHT_LOOS         0x60000000    /* Start OS-specific.  */
-#define SHT_GNU_ATTRIBUTES 0x6ffffff5  /* Object attributes.  */
-#define SHT_GNU_HASH     0x6ffffff6    /* GNU-style hash table.  */
-#define SHT_GNU_LIBLIST          0x6ffffff7    /* Prelink library list */
-#define SHT_CHECKSUM     0x6ffffff8    /* Checksum for DSO content.  */
-#define SHT_LOSUNW       0x6ffffffa    /* Sun-specific low bound.  */
-#define SHT_SUNW_move    0x6ffffffa
-#define SHT_SUNW_COMDAT   0x6ffffffb
-#define SHT_SUNW_syminfo  0x6ffffffc
-#define SHT_GNU_verdef   0x6ffffffd    /* Version definition section.  */
-#define SHT_GNU_verneed          0x6ffffffe    /* Version needs section.  */
-#define SHT_GNU_versym   0x6fffffff    /* Version symbol table.  */
-#define SHT_HISUNW       0x6fffffff    /* Sun-specific high bound.  */
-#define SHT_HIOS         0x6fffffff    /* End OS-specific type */
-#define SHT_LOPROC       0x70000000    /* Start of processor-specific */
-#define SHT_HIPROC       0x7fffffff    /* End of processor-specific */
-#define SHT_LOUSER       0x80000000    /* Start of application-specific */
-#define SHT_HIUSER       0x8fffffff    /* End of application-specific */
-
-/* Legal values for sh_flags (section flags).  */
-
-#define SHF_WRITE           (1 << 0)   /* Writable */
-#define SHF_ALLOC           (1 << 1)   /* Occupies memory during execution */
-#define SHF_EXECINSTR       (1 << 2)   /* Executable */
-#define SHF_MERGE           (1 << 4)   /* Might be merged */
-#define SHF_STRINGS         (1 << 5)   /* Contains nul-terminated strings */
-#define SHF_INFO_LINK       (1 << 6)   /* `sh_info' contains SHT index */
-#define SHF_LINK_ORDER      (1 << 7)   /* Preserve order after combining */
-#define SHF_OS_NONCONFORMING (1 << 8)  /* Non-standard OS specific handling
-                                          required */
-#define SHF_GROUP           (1 << 9)   /* Section is member of a group.  */
-#define SHF_TLS                     (1 << 10)  /* Section hold thread-local data.  */
-#define SHF_MASKOS          0x0ff00000 /* OS-specific.  */
-#define SHF_MASKPROC        0xf0000000 /* Processor-specific */
-#define SHF_ORDERED         (1 << 30)  /* Special ordering requirement
-                                          (Solaris).  */
-#define SHF_EXCLUDE         (1 << 31)  /* Section is excluded unless
-                                          referenced or allocated (Solaris).*/
-
-/* Section group handling.  */
-#define GRP_COMDAT     0x1             /* Mark group as COMDAT.  */
-
-/* Symbol table entry.  */
-
-typedef struct
-{
-  Elf32_Word   st_name;                /* Symbol name (string tbl index) */
-  Elf32_Addr   st_value;               /* Symbol value */
-  Elf32_Word   st_size;                /* Symbol size */
-  unsigned char        st_info;                /* Symbol type and binding */
-  unsigned char        st_other;               /* Symbol visibility */
-  Elf32_Section        st_shndx;               /* Section index */
-} Elf32_Sym;
-
-typedef struct
-{
-  Elf64_Word   st_name;                /* Symbol name (string tbl index) */
-  unsigned char        st_info;                /* Symbol type and binding */
-  unsigned char st_other;              /* Symbol visibility */
-  Elf64_Section        st_shndx;               /* Section index */
-  Elf64_Addr   st_value;               /* Symbol value */
-  Elf64_Xword  st_size;                /* Symbol size */
-} Elf64_Sym;
-
-/* The syminfo section if available contains additional information about
-   every dynamic symbol.  */
-
-typedef struct
-{
-  Elf32_Half si_boundto;               /* Direct bindings, symbol bound to */
-  Elf32_Half si_flags;                 /* Per symbol flags */
-} Elf32_Syminfo;
-
-typedef struct
-{
-  Elf64_Half si_boundto;               /* Direct bindings, symbol bound to */
-  Elf64_Half si_flags;                 /* Per symbol flags */
-} Elf64_Syminfo;
-
-/* Possible values for si_boundto.  */
-#define SYMINFO_BT_SELF                0xffff  /* Symbol bound to self */
-#define SYMINFO_BT_PARENT      0xfffe  /* Symbol bound to parent */
-#define SYMINFO_BT_LOWRESERVE  0xff00  /* Beginning of reserved entries */
-
-/* Possible bitmasks for si_flags.  */
-#define SYMINFO_FLG_DIRECT     0x0001  /* Direct bound symbol */
-#define SYMINFO_FLG_PASSTHRU   0x0002  /* Pass-thru symbol for translator */
-#define SYMINFO_FLG_COPY       0x0004  /* Symbol is a copy-reloc */
-#define SYMINFO_FLG_LAZYLOAD   0x0008  /* Symbol bound to object to be lazy
-                                          loaded */
-/* Syminfo version values.  */
-#define SYMINFO_NONE           0
-#define SYMINFO_CURRENT                1
-#define SYMINFO_NUM            2
-
-
-/* How to extract and insert information held in the st_info field.  */
-
-#define ELF32_ST_BIND(val)             (((unsigned char) (val)) >> 4)
-#define ELF32_ST_TYPE(val)             ((val) & 0xf)
-#define ELF32_ST_INFO(bind, type)      (((bind) << 4) + ((type) & 0xf))
-
-/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */
-#define ELF64_ST_BIND(val)             ELF32_ST_BIND (val)
-#define ELF64_ST_TYPE(val)             ELF32_ST_TYPE (val)
-#define ELF64_ST_INFO(bind, type)      ELF32_ST_INFO ((bind), (type))
-
-/* Legal values for ST_BIND subfield of st_info (symbol binding).  */
-
-#define STB_LOCAL      0               /* Local symbol */
-#define STB_GLOBAL     1               /* Global symbol */
-#define STB_WEAK       2               /* Weak symbol */
-#define        STB_NUM         3               /* Number of defined types.  */
-#define STB_LOOS       10              /* Start of OS-specific */
-#define STB_GNU_UNIQUE 10              /* Unique symbol.  */
-#define STB_HIOS       12              /* End of OS-specific */
-#define STB_LOPROC     13              /* Start of processor-specific */
-#define STB_HIPROC     15              /* End of processor-specific */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_NOTYPE     0               /* Symbol type is unspecified */
-#define STT_OBJECT     1               /* Symbol is a data object */
-#define STT_FUNC       2               /* Symbol is a code object */
-#define STT_SECTION    3               /* Symbol associated with a section */
-#define STT_FILE       4               /* Symbol's name is file name */
-#define STT_COMMON     5               /* Symbol is a common data object */
-#define STT_TLS                6               /* Symbol is thread-local data object*/
-#define        STT_NUM         7               /* Number of defined types.  */
-#define STT_LOOS       10              /* Start of OS-specific */
-#define STT_GNU_IFUNC  10              /* Symbol is indirect code object */
-#define STT_HIOS       12              /* End of OS-specific */
-#define STT_LOPROC     13              /* Start of processor-specific */
-#define STT_HIPROC     15              /* End of processor-specific */
-
-
-/* Symbol table indices are found in the hash buckets and chain table
-   of a symbol hash table section.  This special index value indicates
-   the end of a chain, meaning no further symbols are found in that bucket.  */
-
-#define STN_UNDEF      0               /* End of a chain.  */
-
-
-/* How to extract and insert information held in the st_other field.  */
-
-#define ELF32_ST_VISIBILITY(o) ((o) & 0x03)
-
-/* For ELF64 the definitions are the same.  */
-#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o)
-
-/* Symbol visibility specification encoded in the st_other field.  */
-#define STV_DEFAULT    0               /* Default symbol visibility rules */
-#define STV_INTERNAL   1               /* Processor specific hidden class */
-#define STV_HIDDEN     2               /* Sym unavailable in other modules */
-#define STV_PROTECTED  3               /* Not preemptible, not exported */
-
-
-/* Relocation table entry without addend (in section of type SHT_REL).  */
-
-typedef struct
-{
-  Elf32_Addr   r_offset;               /* Address */
-  Elf32_Word   r_info;                 /* Relocation type and symbol index */
-} Elf32_Rel;
-
-/* I have seen two different definitions of the Elf64_Rel and
-   Elf64_Rela structures, so we'll leave them out until Novell (or
-   whoever) gets their act together.  */
-/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */
-
-typedef struct
-{
-  Elf64_Addr   r_offset;               /* Address */
-  Elf64_Xword  r_info;                 /* Relocation type and symbol index */
-} Elf64_Rel;
-
-/* Relocation table entry with addend (in section of type SHT_RELA).  */
-
-typedef struct
-{
-  Elf32_Addr   r_offset;               /* Address */
-  Elf32_Word   r_info;                 /* Relocation type and symbol index */
-  Elf32_Sword  r_addend;               /* Addend */
-} Elf32_Rela;
-
-typedef struct
-{
-  Elf64_Addr   r_offset;               /* Address */
-  Elf64_Xword  r_info;                 /* Relocation type and symbol index */
-  Elf64_Sxword r_addend;               /* Addend */
-} Elf64_Rela;
-
-/* How to extract and insert information held in the r_info field.  */
-
-#define ELF32_R_SYM(val)               ((val) >> 8)
-#define ELF32_R_TYPE(val)              ((val) & 0xff)
-#define ELF32_R_INFO(sym, type)                (((sym) << 8) + ((type) & 0xff))
-
-#define ELF64_R_SYM(i)                 ((i) >> 32)
-#define ELF64_R_TYPE(i)                        ((i) & 0xffffffff)
-#define ELF64_R_INFO(sym,type)         ((((Elf64_Xword) (sym)) << 32) + (type))
-
-/* Program segment header.  */
-
-typedef struct
-{
-  Elf32_Word   p_type;                 /* Segment type */
-  Elf32_Off    p_offset;               /* Segment file offset */
-  Elf32_Addr   p_vaddr;                /* Segment virtual address */
-  Elf32_Addr   p_paddr;                /* Segment physical address */
-  Elf32_Word   p_filesz;               /* Segment size in file */
-  Elf32_Word   p_memsz;                /* Segment size in memory */
-  Elf32_Word   p_flags;                /* Segment flags */
-  Elf32_Word   p_align;                /* Segment alignment */
-} Elf32_Phdr;
-
-typedef struct
-{
-  Elf64_Word   p_type;                 /* Segment type */
-  Elf64_Word   p_flags;                /* Segment flags */
-  Elf64_Off    p_offset;               /* Segment file offset */
-  Elf64_Addr   p_vaddr;                /* Segment virtual address */
-  Elf64_Addr   p_paddr;                /* Segment physical address */
-  Elf64_Xword  p_filesz;               /* Segment size in file */
-  Elf64_Xword  p_memsz;                /* Segment size in memory */
-  Elf64_Xword  p_align;                /* Segment alignment */
-} Elf64_Phdr;
-
-/* Special value for e_phnum.  This indicates that the real number of
-   program headers is too large to fit into e_phnum.  Instead the real
-   value is in the field sh_info of section 0.  */
-
-#define PN_XNUM                0xffff
-
-/* Legal values for p_type (segment type).  */
-
-#define        PT_NULL         0               /* Program header table entry unused */
-#define PT_LOAD                1               /* Loadable program segment */
-#define PT_DYNAMIC     2               /* Dynamic linking information */
-#define PT_INTERP      3               /* Program interpreter */
-#define PT_NOTE                4               /* Auxiliary information */
-#define PT_SHLIB       5               /* Reserved */
-#define PT_PHDR                6               /* Entry for header table itself */
-#define PT_TLS         7               /* Thread-local storage segment */
-#define        PT_NUM          8               /* Number of defined types */
-#define PT_LOOS                0x60000000      /* Start of OS-specific */
-#define PT_GNU_EH_FRAME        0x6474e550      /* GCC .eh_frame_hdr segment */
-#define PT_GNU_STACK   0x6474e551      /* Indicates stack executability */
-#define PT_GNU_RELRO   0x6474e552      /* Read-only after relocation */
-#define PT_LOSUNW      0x6ffffffa
-#define PT_SUNWBSS     0x6ffffffa      /* Sun Specific segment */
-#define PT_SUNWSTACK   0x6ffffffb      /* Stack segment */
-#define PT_HISUNW      0x6fffffff
-#define PT_HIOS                0x6fffffff      /* End of OS-specific */
-#define PT_LOPROC      0x70000000      /* Start of processor-specific */
-#define PT_HIPROC      0x7fffffff      /* End of processor-specific */
-
-/* Legal values for p_flags (segment flags).  */
-
-#define PF_X           (1 << 0)        /* Segment is executable */
-#define PF_W           (1 << 1)        /* Segment is writable */
-#define PF_R           (1 << 2)        /* Segment is readable */
-#define PF_MASKOS      0x0ff00000      /* OS-specific */
-#define PF_MASKPROC    0xf0000000      /* Processor-specific */
-
-/* Legal values for note segment descriptor types for core files. */
-
-#define NT_PRSTATUS    1               /* Contains copy of prstatus struct */
-#define NT_FPREGSET    2               /* Contains copy of fpregset struct */
-#define NT_PRPSINFO    3               /* Contains copy of prpsinfo struct */
-#define NT_PRXREG      4               /* Contains copy of prxregset struct */
-#define NT_TASKSTRUCT  4               /* Contains copy of task structure */
-#define NT_PLATFORM    5               /* String from sysinfo(SI_PLATFORM) */
-#define NT_AUXV                6               /* Contains copy of auxv array */
-#define NT_GWINDOWS    7               /* Contains copy of gwindows struct */
-#define NT_ASRS                8               /* Contains copy of asrset struct */
-#define NT_PSTATUS     10              /* Contains copy of pstatus struct */
-#define NT_PSINFO      13              /* Contains copy of psinfo struct */
-#define NT_PRCRED      14              /* Contains copy of prcred struct */
-#define NT_UTSNAME     15              /* Contains copy of utsname struct */
-#define NT_LWPSTATUS   16              /* Contains copy of lwpstatus struct */
-#define NT_LWPSINFO    17              /* Contains copy of lwpinfo struct */
-#define NT_PRFPXREG    20              /* Contains copy of fprxregset struct */
-#define NT_SIGINFO     0x53494749      /* Contains copy of siginfo_t,
-                                          size might increase */
-#define NT_FILE                0x46494c45      /* Contains information about mapped
-                                          files */
-#define NT_PRXFPREG    0x46e62b7f      /* Contains copy of user_fxsr_struct */
-#define NT_PPC_VMX     0x100           /* PowerPC Altivec/VMX registers */
-#define NT_PPC_SPE     0x101           /* PowerPC SPE/EVR registers */
-#define NT_PPC_VSX     0x102           /* PowerPC VSX registers */
-#define NT_386_TLS     0x200           /* i386 TLS slots (struct user_desc) */
-#define NT_386_IOPERM  0x201           /* x86 io permission bitmap (1=deny) */
-#define NT_X86_XSTATE  0x202           /* x86 extended state using xsave */
-#define NT_S390_HIGH_GPRS      0x300   /* s390 upper register halves */
-#define NT_S390_TIMER  0x301           /* s390 timer register */
-#define NT_S390_TODCMP 0x302           /* s390 TOD clock comparator register */
-#define NT_S390_TODPREG        0x303           /* s390 TOD programmable register */
-#define NT_S390_CTRS   0x304           /* s390 control registers */
-#define NT_S390_PREFIX 0x305           /* s390 prefix register */
-#define NT_S390_LAST_BREAK     0x306   /* s390 breaking event address */
-#define NT_S390_SYSTEM_CALL    0x307   /* s390 system call restart data */
-#define NT_S390_TDB    0x308           /* s390 transaction diagnostic block */
-#define NT_ARM_VFP     0x400           /* ARM VFP/NEON registers */
-#define NT_ARM_TLS     0x401           /* ARM TLS register */
-#define NT_ARM_HW_BREAK        0x402           /* ARM hardware breakpoint registers */
-#define NT_ARM_HW_WATCH        0x403           /* ARM hardware watchpoint registers */
-
-/* Legal values for the note segment descriptor types for object files.  */
-
-#define NT_VERSION     1               /* Contains a version string.  */
-
-
-/* Dynamic section entry.  */
-
-typedef struct
-{
-  Elf32_Sword  d_tag;                  /* Dynamic entry type */
-  union
-    {
-      Elf32_Word d_val;                        /* Integer value */
-      Elf32_Addr d_ptr;                        /* Address value */
-    } d_un;
-} Elf32_Dyn;
-
-typedef struct
-{
-  Elf64_Sxword d_tag;                  /* Dynamic entry type */
-  union
-    {
-      Elf64_Xword d_val;               /* Integer value */
-      Elf64_Addr d_ptr;                        /* Address value */
-    } d_un;
-} Elf64_Dyn;
-
-/* Legal values for d_tag (dynamic entry type).  */
-
-#define DT_NULL                0               /* Marks end of dynamic section */
-#define DT_NEEDED      1               /* Name of needed library */
-#define DT_PLTRELSZ    2               /* Size in bytes of PLT relocs */
-#define DT_PLTGOT      3               /* Processor defined value */
-#define DT_HASH                4               /* Address of symbol hash table */
-#define DT_STRTAB      5               /* Address of string table */
-#define DT_SYMTAB      6               /* Address of symbol table */
-#define DT_RELA                7               /* Address of Rela relocs */
-#define DT_RELASZ      8               /* Total size of Rela relocs */
-#define DT_RELAENT     9               /* Size of one Rela reloc */
-#define DT_STRSZ       10              /* Size of string table */
-#define DT_SYMENT      11              /* Size of one symbol table entry */
-#define DT_INIT                12              /* Address of init function */
-#define DT_FINI                13              /* Address of termination function */
-#define DT_SONAME      14              /* Name of shared object */
-#define DT_RPATH       15              /* Library search path (deprecated) */
-#define DT_SYMBOLIC    16              /* Start symbol search here */
-#define DT_REL         17              /* Address of Rel relocs */
-#define DT_RELSZ       18              /* Total size of Rel relocs */
-#define DT_RELENT      19              /* Size of one Rel reloc */
-#define DT_PLTREL      20              /* Type of reloc in PLT */
-#define DT_DEBUG       21              /* For debugging; unspecified */
-#define DT_TEXTREL     22              /* Reloc might modify .text */
-#define DT_JMPREL      23              /* Address of PLT relocs */
-#define        DT_BIND_NOW     24              /* Process relocations of object */
-#define        DT_INIT_ARRAY   25              /* Array with addresses of init fct */
-#define        DT_FINI_ARRAY   26              /* Array with addresses of fini fct */
-#define        DT_INIT_ARRAYSZ 27              /* Size in bytes of DT_INIT_ARRAY */
-#define        DT_FINI_ARRAYSZ 28              /* Size in bytes of DT_FINI_ARRAY */
-#define DT_RUNPATH     29              /* Library search path */
-#define DT_FLAGS       30              /* Flags for the object being loaded */
-#define DT_ENCODING    32              /* Start of encoded range */
-#define DT_PREINIT_ARRAY 32            /* Array with addresses of preinit fct*/
-#define DT_PREINIT_ARRAYSZ 33          /* size in bytes of DT_PREINIT_ARRAY */
-#define        DT_NUM          34              /* Number used */
-#define DT_LOOS                0x6000000d      /* Start of OS-specific */
-#define DT_HIOS                0x6ffff000      /* End of OS-specific */
-#define DT_LOPROC      0x70000000      /* Start of processor-specific */
-#define DT_HIPROC      0x7fffffff      /* End of processor-specific */
-#define        DT_PROCNUM      DT_MIPS_NUM     /* Most used by any processor */
-
-/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
-   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
-   approach.  */
-#define DT_VALRNGLO    0x6ffffd00
-#define DT_GNU_PRELINKED 0x6ffffdf5    /* Prelinking timestamp */
-#define DT_GNU_CONFLICTSZ 0x6ffffdf6   /* Size of conflict section */
-#define DT_GNU_LIBLISTSZ 0x6ffffdf7    /* Size of library list */
-#define DT_CHECKSUM    0x6ffffdf8
-#define DT_PLTPADSZ    0x6ffffdf9
-#define DT_MOVEENT     0x6ffffdfa
-#define DT_MOVESZ      0x6ffffdfb
-#define DT_FEATURE_1   0x6ffffdfc      /* Feature selection (DTF_*).  */
-#define DT_POSFLAG_1   0x6ffffdfd      /* Flags for DT_* entries, effecting
-                                          the following DT_* entry.  */
-#define DT_SYMINSZ     0x6ffffdfe      /* Size of syminfo table (in bytes) */
-#define DT_SYMINENT    0x6ffffdff      /* Entry size of syminfo */
-#define DT_VALRNGHI    0x6ffffdff
-#define DT_VALTAGIDX(tag)      (DT_VALRNGHI - (tag))   /* Reverse order! */
-#define DT_VALNUM 12
-
-/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
-   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
-
-   If any adjustment is made to the ELF object after it has been
-   built these entries will need to be adjusted.  */
-#define DT_ADDRRNGLO   0x6ffffe00
-#define DT_GNU_HASH    0x6ffffef5      /* GNU-style hash table.  */
-#define DT_TLSDESC_PLT 0x6ffffef6
-#define DT_TLSDESC_GOT 0x6ffffef7
-#define DT_GNU_CONFLICT        0x6ffffef8      /* Start of conflict section */
-#define DT_GNU_LIBLIST 0x6ffffef9      /* Library list */
-#define DT_CONFIG      0x6ffffefa      /* Configuration information.  */
-#define DT_DEPAUDIT    0x6ffffefb      /* Dependency auditing.  */
-#define DT_AUDIT       0x6ffffefc      /* Object auditing.  */
-#define        DT_PLTPAD       0x6ffffefd      /* PLT padding.  */
-#define        DT_MOVETAB      0x6ffffefe      /* Move table.  */
-#define DT_SYMINFO     0x6ffffeff      /* Syminfo table.  */
-#define DT_ADDRRNGHI   0x6ffffeff
-#define DT_ADDRTAGIDX(tag)     (DT_ADDRRNGHI - (tag))  /* Reverse order! */
-#define DT_ADDRNUM 11
-
-/* The versioning entry types.  The next are defined as part of the
-   GNU extension.  */
-#define DT_VERSYM      0x6ffffff0
-
-#define DT_RELACOUNT   0x6ffffff9
-#define DT_RELCOUNT    0x6ffffffa
-
-/* These were chosen by Sun.  */
-#define DT_FLAGS_1     0x6ffffffb      /* State flags, see DF_1_* below.  */
-#define        DT_VERDEF       0x6ffffffc      /* Address of version definition
-                                          table */
-#define        DT_VERDEFNUM    0x6ffffffd      /* Number of version definitions */
-#define        DT_VERNEED      0x6ffffffe      /* Address of table with needed
-                                          versions */
-#define        DT_VERNEEDNUM   0x6fffffff      /* Number of needed versions */
-#define DT_VERSIONTAGIDX(tag)  (DT_VERNEEDNUM - (tag)) /* Reverse order! */
-#define DT_VERSIONTAGNUM 16
-
-/* Sun added these machine-independent extensions in the "processor-specific"
-   range.  Be compatible.  */
-#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
-#define DT_FILTER       0x7fffffff      /* Shared object to get values from */
-#define DT_EXTRATAGIDX(tag)    ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
-#define DT_EXTRANUM    3
-
-/* Values of `d_un.d_val' in the DT_FLAGS entry.  */
-#define DF_ORIGIN      0x00000001      /* Object may use DF_ORIGIN */
-#define DF_SYMBOLIC    0x00000002      /* Symbol resolutions starts here */
-#define DF_TEXTREL     0x00000004      /* Object contains text relocations */
-#define DF_BIND_NOW    0x00000008      /* No lazy binding for this object */
-#define DF_STATIC_TLS  0x00000010      /* Module uses the static TLS model */
-
-/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
-   entry in the dynamic section.  */
-#define DF_1_NOW       0x00000001      /* Set RTLD_NOW for this object.  */
-#define DF_1_GLOBAL    0x00000002      /* Set RTLD_GLOBAL for this object.  */
-#define DF_1_GROUP     0x00000004      /* Set RTLD_GROUP for this object.  */
-#define DF_1_NODELETE  0x00000008      /* Set RTLD_NODELETE for this object.*/
-#define DF_1_LOADFLTR  0x00000010      /* Trigger filtee loading at runtime.*/
-#define DF_1_INITFIRST 0x00000020      /* Set RTLD_INITFIRST for this object*/
-#define DF_1_NOOPEN    0x00000040      /* Set RTLD_NOOPEN for this object.  */
-#define DF_1_ORIGIN    0x00000080      /* $ORIGIN must be handled.  */
-#define DF_1_DIRECT    0x00000100      /* Direct binding enabled.  */
-#define DF_1_TRANS     0x00000200
-#define DF_1_INTERPOSE 0x00000400      /* Object is used to interpose.  */
-#define DF_1_NODEFLIB  0x00000800      /* Ignore default lib search path.  */
-#define DF_1_NODUMP    0x00001000      /* Object can't be dldump'ed.  */
-#define DF_1_CONFALT   0x00002000      /* Configuration alternative created.*/
-#define DF_1_ENDFILTEE 0x00004000      /* Filtee terminates filters search. */
-#define        DF_1_DISPRELDNE 0x00008000      /* Disp reloc applied at build time. */
-#define        DF_1_DISPRELPND 0x00010000      /* Disp reloc applied at run-time.  */
-#define        DF_1_NODIRECT   0x00020000      /* Object has no-direct binding. */
-#define        DF_1_IGNMULDEF  0x00040000
-#define        DF_1_NOKSYMS    0x00080000
-#define        DF_1_NOHDR      0x00100000
-#define        DF_1_EDITED     0x00200000      /* Object is modified after built.  */
-#define        DF_1_NORELOC    0x00400000
-#define        DF_1_SYMINTPOSE 0x00800000      /* Object has individual interposers.  */
-#define        DF_1_GLOBAUDIT  0x01000000      /* Global auditing required.  */
-#define        DF_1_SINGLETON  0x02000000      /* Singleton symbols are used.  */
-
-/* Flags for the feature selection in DT_FEATURE_1.  */
-#define DTF_1_PARINIT  0x00000001
-#define DTF_1_CONFEXP  0x00000002
-
-/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */
-#define DF_P1_LAZYLOAD 0x00000001      /* Lazyload following object.  */
-#define DF_P1_GROUPPERM        0x00000002      /* Symbols from next object are not
-                                          generally available.  */
-
-/* Version definition sections.  */
-
-typedef struct
-{
-  Elf32_Half   vd_version;             /* Version revision */
-  Elf32_Half   vd_flags;               /* Version information */
-  Elf32_Half   vd_ndx;                 /* Version Index */
-  Elf32_Half   vd_cnt;                 /* Number of associated aux entries */
-  Elf32_Word   vd_hash;                /* Version name hash value */
-  Elf32_Word   vd_aux;                 /* Offset in bytes to verdaux array */
-  Elf32_Word   vd_next;                /* Offset in bytes to next verdef
-                                          entry */
-} Elf32_Verdef;
-
-typedef struct
-{
-  Elf64_Half   vd_version;             /* Version revision */
-  Elf64_Half   vd_flags;               /* Version information */
-  Elf64_Half   vd_ndx;                 /* Version Index */
-  Elf64_Half   vd_cnt;                 /* Number of associated aux entries */
-  Elf64_Word   vd_hash;                /* Version name hash value */
-  Elf64_Word   vd_aux;                 /* Offset in bytes to verdaux array */
-  Elf64_Word   vd_next;                /* Offset in bytes to next verdef
-                                          entry */
-} Elf64_Verdef;
-
-
-/* Legal values for vd_version (version revision).  */
-#define VER_DEF_NONE   0               /* No version */
-#define VER_DEF_CURRENT        1               /* Current version */
-#define VER_DEF_NUM    2               /* Given version number */
-
-/* Legal values for vd_flags (version information flags).  */
-#define VER_FLG_BASE   0x1             /* Version definition of file itself */
-#define VER_FLG_WEAK   0x2             /* Weak version identifier */
-
-/* Versym symbol index values.  */
-#define        VER_NDX_LOCAL           0       /* Symbol is local.  */
-#define        VER_NDX_GLOBAL          1       /* Symbol is global.  */
-#define        VER_NDX_LORESERVE       0xff00  /* Beginning of reserved entries.  */
-#define        VER_NDX_ELIMINATE       0xff01  /* Symbol is to be eliminated.  */
-
-/* Auxialiary version information.  */
-
-typedef struct
-{
-  Elf32_Word   vda_name;               /* Version or dependency names */
-  Elf32_Word   vda_next;               /* Offset in bytes to next verdaux
-                                          entry */
-} Elf32_Verdaux;
-
-typedef struct
-{
-  Elf64_Word   vda_name;               /* Version or dependency names */
-  Elf64_Word   vda_next;               /* Offset in bytes to next verdaux
-                                          entry */
-} Elf64_Verdaux;
-
-
-/* Version dependency section.  */
-
-typedef struct
-{
-  Elf32_Half   vn_version;             /* Version of structure */
-  Elf32_Half   vn_cnt;                 /* Number of associated aux entries */
-  Elf32_Word   vn_file;                /* Offset of filename for this
-                                          dependency */
-  Elf32_Word   vn_aux;                 /* Offset in bytes to vernaux array */
-  Elf32_Word   vn_next;                /* Offset in bytes to next verneed
-                                          entry */
-} Elf32_Verneed;
-
-typedef struct
-{
-  Elf64_Half   vn_version;             /* Version of structure */
-  Elf64_Half   vn_cnt;                 /* Number of associated aux entries */
-  Elf64_Word   vn_file;                /* Offset of filename for this
-                                          dependency */
-  Elf64_Word   vn_aux;                 /* Offset in bytes to vernaux array */
-  Elf64_Word   vn_next;                /* Offset in bytes to next verneed
-                                          entry */
-} Elf64_Verneed;
-
-
-/* Legal values for vn_version (version revision).  */
-#define VER_NEED_NONE   0              /* No version */
-#define VER_NEED_CURRENT 1             /* Current version */
-#define VER_NEED_NUM    2              /* Given version number */
-
-/* Auxiliary needed version information.  */
-
-typedef struct
-{
-  Elf32_Word   vna_hash;               /* Hash value of dependency name */
-  Elf32_Half   vna_flags;              /* Dependency specific information */
-  Elf32_Half   vna_other;              /* Unused */
-  Elf32_Word   vna_name;               /* Dependency name string offset */
-  Elf32_Word   vna_next;               /* Offset in bytes to next vernaux
-                                          entry */
-} Elf32_Vernaux;
-
-typedef struct
-{
-  Elf64_Word   vna_hash;               /* Hash value of dependency name */
-  Elf64_Half   vna_flags;              /* Dependency specific information */
-  Elf64_Half   vna_other;              /* Unused */
-  Elf64_Word   vna_name;               /* Dependency name string offset */
-  Elf64_Word   vna_next;               /* Offset in bytes to next vernaux
-                                          entry */
-} Elf64_Vernaux;
-
-
-/* Legal values for vna_flags.  */
-#define VER_FLG_WEAK   0x2             /* Weak version identifier */
-
-
-/* Auxiliary vector.  */
-
-/* This vector is normally only used by the program interpreter.  The
-   usual definition in an ABI supplement uses the name auxv_t.  The
-   vector is not usually defined in a standard <elf.h> file, but it
-   can't hurt.  We rename it to avoid conflicts.  The sizes of these
-   types are an arrangement between the exec server and the program
-   interpreter, so we don't fully specify them here.  */
-
-typedef struct
-{
-  uint32_t a_type;             /* Entry type */
-  union
-    {
-      uint32_t a_val;          /* Integer value */
-      /* We use to have pointer elements added here.  We cannot do that,
-        though, since it does not work when using 32-bit definitions
-        on 64-bit platforms and vice versa.  */
-    } a_un;
-} Elf32_auxv_t;
-
-typedef struct
-{
-  uint64_t a_type;             /* Entry type */
-  union
-    {
-      uint64_t a_val;          /* Integer value */
-      /* We use to have pointer elements added here.  We cannot do that,
-        though, since it does not work when using 32-bit definitions
-        on 64-bit platforms and vice versa.  */
-    } a_un;
-} Elf64_auxv_t;
-
-/* Note section contents.  Each entry in the note section begins with
-   a header of a fixed form.  */
-
-typedef struct
-{
-  Elf32_Word n_namesz;                 /* Length of the note's name.  */
-  Elf32_Word n_descsz;                 /* Length of the note's descriptor.  */
-  Elf32_Word n_type;                   /* Type of the note.  */
-} Elf32_Nhdr;
-
-typedef struct
-{
-  Elf64_Word n_namesz;                 /* Length of the note's name.  */
-  Elf64_Word n_descsz;                 /* Length of the note's descriptor.  */
-  Elf64_Word n_type;                   /* Type of the note.  */
-} Elf64_Nhdr;
-
-/* Known names of notes.  */
-
-/* Solaris entries in the note section have this name.  */
-#define ELF_NOTE_SOLARIS       "SUNW Solaris"
-
-/* Note entries for GNU systems have this name.  */
-#define ELF_NOTE_GNU           "GNU"
-
-
-/* Defined types of notes for Solaris.  */
-
-/* Value of descriptor (one word) is desired pagesize for the binary.  */
-#define ELF_NOTE_PAGESIZE_HINT 1
-
-
-/* Defined note types for GNU systems.  */
-
-/* ABI information.  The descriptor consists of words:
-   word 0: OS descriptor
-   word 1: major version of the ABI
-   word 2: minor version of the ABI
-   word 3: subminor version of the ABI
-*/
-#define NT_GNU_ABI_TAG 1
-#define ELF_NOTE_ABI   NT_GNU_ABI_TAG /* Old name.  */
-
-/* Known OSes.  These values can appear in word 0 of an
-   NT_GNU_ABI_TAG note section entry.  */
-#define ELF_NOTE_OS_LINUX      0
-#define ELF_NOTE_OS_GNU                1
-#define ELF_NOTE_OS_SOLARIS2   2
-#define ELF_NOTE_OS_FREEBSD    3
-
-/* Synthetic hwcap information.  The descriptor begins with two words:
-   word 0: number of entries
-   word 1: bitmask of enabled entries
-   Then follow variable-length entries, one byte followed by a
-   '\0'-terminated hwcap name string.  The byte gives the bit
-   number to test if enabled, (1U << bit) & bitmask.  */
-#define NT_GNU_HWCAP   2
-
-/* Build ID bits as generated by ld --build-id.
-   The descriptor consists of any nonzero number of bytes.  */
-#define NT_GNU_BUILD_ID        3
-
-/* Version note generated by GNU gold containing a version string.  */
-#define NT_GNU_GOLD_VERSION    4
-
-
-/* Move records.  */
-typedef struct
-{
-  Elf32_Xword m_value;         /* Symbol value.  */
-  Elf32_Word m_info;           /* Size and index.  */
-  Elf32_Word m_poffset;                /* Symbol offset.  */
-  Elf32_Half m_repeat;         /* Repeat count.  */
-  Elf32_Half m_stride;         /* Stride info.  */
-} Elf32_Move;
-
-typedef struct
-{
-  Elf64_Xword m_value;         /* Symbol value.  */
-  Elf64_Xword m_info;          /* Size and index.  */
-  Elf64_Xword m_poffset;       /* Symbol offset.  */
-  Elf64_Half m_repeat;         /* Repeat count.  */
-  Elf64_Half m_stride;         /* Stride info.  */
-} Elf64_Move;
-
-/* Macro to construct move records.  */
-#define ELF32_M_SYM(info)      ((info) >> 8)
-#define ELF32_M_SIZE(info)     ((unsigned char) (info))
-#define ELF32_M_INFO(sym, size)        (((sym) << 8) + (unsigned char) (size))
-
-#define ELF64_M_SYM(info)      ELF32_M_SYM (info)
-#define ELF64_M_SIZE(info)     ELF32_M_SIZE (info)
-#define ELF64_M_INFO(sym, size)        ELF32_M_INFO (sym, size)
-
-
-/* Motorola 68k specific definitions.  */
-
-/* Values for Elf32_Ehdr.e_flags.  */
-#define EF_CPU32       0x00810000
-
-/* m68k relocs.  */
-
-#define R_68K_NONE     0               /* No reloc */
-#define R_68K_32       1               /* Direct 32 bit  */
-#define R_68K_16       2               /* Direct 16 bit  */
-#define R_68K_8                3               /* Direct 8 bit  */
-#define R_68K_PC32     4               /* PC relative 32 bit */
-#define R_68K_PC16     5               /* PC relative 16 bit */
-#define R_68K_PC8      6               /* PC relative 8 bit */
-#define R_68K_GOT32    7               /* 32 bit PC relative GOT entry */
-#define R_68K_GOT16    8               /* 16 bit PC relative GOT entry */
-#define R_68K_GOT8     9               /* 8 bit PC relative GOT entry */
-#define R_68K_GOT32O   10              /* 32 bit GOT offset */
-#define R_68K_GOT16O   11              /* 16 bit GOT offset */
-#define R_68K_GOT8O    12              /* 8 bit GOT offset */
-#define R_68K_PLT32    13              /* 32 bit PC relative PLT address */
-#define R_68K_PLT16    14              /* 16 bit PC relative PLT address */
-#define R_68K_PLT8     15              /* 8 bit PC relative PLT address */
-#define R_68K_PLT32O   16              /* 32 bit PLT offset */
-#define R_68K_PLT16O   17              /* 16 bit PLT offset */
-#define R_68K_PLT8O    18              /* 8 bit PLT offset */
-#define R_68K_COPY     19              /* Copy symbol at runtime */
-#define R_68K_GLOB_DAT 20              /* Create GOT entry */
-#define R_68K_JMP_SLOT 21              /* Create PLT entry */
-#define R_68K_RELATIVE 22              /* Adjust by program base */
-#define R_68K_TLS_GD32      25          /* 32 bit GOT offset for GD */
-#define R_68K_TLS_GD16      26          /* 16 bit GOT offset for GD */
-#define R_68K_TLS_GD8       27          /* 8 bit GOT offset for GD */
-#define R_68K_TLS_LDM32     28          /* 32 bit GOT offset for LDM */
-#define R_68K_TLS_LDM16     29          /* 16 bit GOT offset for LDM */
-#define R_68K_TLS_LDM8      30          /* 8 bit GOT offset for LDM */
-#define R_68K_TLS_LDO32     31          /* 32 bit module-relative offset */
-#define R_68K_TLS_LDO16     32          /* 16 bit module-relative offset */
-#define R_68K_TLS_LDO8      33          /* 8 bit module-relative offset */
-#define R_68K_TLS_IE32      34          /* 32 bit GOT offset for IE */
-#define R_68K_TLS_IE16      35          /* 16 bit GOT offset for IE */
-#define R_68K_TLS_IE8       36          /* 8 bit GOT offset for IE */
-#define R_68K_TLS_LE32      37          /* 32 bit offset relative to
-                                          static TLS block */
-#define R_68K_TLS_LE16      38          /* 16 bit offset relative to
-                                          static TLS block */
-#define R_68K_TLS_LE8       39          /* 8 bit offset relative to
-                                          static TLS block */
-#define R_68K_TLS_DTPMOD32  40          /* 32 bit module number */
-#define R_68K_TLS_DTPREL32  41          /* 32 bit module-relative offset */
-#define R_68K_TLS_TPREL32   42          /* 32 bit TP-relative offset */
-/* Keep this the last entry.  */
-#define R_68K_NUM      43
-
-/* Intel 80386 specific definitions.  */
-
-/* i386 relocs.  */
-
-#define R_386_NONE        0            /* No reloc */
-#define R_386_32          1            /* Direct 32 bit  */
-#define R_386_PC32        2            /* PC relative 32 bit */
-#define R_386_GOT32       3            /* 32 bit GOT entry */
-#define R_386_PLT32       4            /* 32 bit PLT address */
-#define R_386_COPY        5            /* Copy symbol at runtime */
-#define R_386_GLOB_DAT    6            /* Create GOT entry */
-#define R_386_JMP_SLOT    7            /* Create PLT entry */
-#define R_386_RELATIVE    8            /* Adjust by program base */
-#define R_386_GOTOFF      9            /* 32 bit offset to GOT */
-#define R_386_GOTPC       10           /* 32 bit PC relative offset to GOT */
-#define R_386_32PLT       11
-#define R_386_TLS_TPOFF           14           /* Offset in static TLS block */
-#define R_386_TLS_IE      15           /* Address of GOT entry for static TLS
-                                          block offset */
-#define R_386_TLS_GOTIE           16           /* GOT entry for static TLS block
-                                          offset */
-#define R_386_TLS_LE      17           /* Offset relative to static TLS
-                                          block */
-#define R_386_TLS_GD      18           /* Direct 32 bit for GNU version of
-                                          general dynamic thread local data */
-#define R_386_TLS_LDM     19           /* Direct 32 bit for GNU version of
-                                          local dynamic thread local data
-                                          in LE code */
-#define R_386_16          20
-#define R_386_PC16        21
-#define R_386_8                   22
-#define R_386_PC8         23
-#define R_386_TLS_GD_32           24           /* Direct 32 bit for general dynamic
-                                          thread local data */
-#define R_386_TLS_GD_PUSH  25          /* Tag for pushl in GD TLS code */
-#define R_386_TLS_GD_CALL  26          /* Relocation for call to
-                                          __tls_get_addr() */
-#define R_386_TLS_GD_POP   27          /* Tag for popl in GD TLS code */
-#define R_386_TLS_LDM_32   28          /* Direct 32 bit for local dynamic
-                                          thread local data in LE code */
-#define R_386_TLS_LDM_PUSH 29          /* Tag for pushl in LDM TLS code */
-#define R_386_TLS_LDM_CALL 30          /* Relocation for call to
-                                          __tls_get_addr() in LDM code */
-#define R_386_TLS_LDM_POP  31          /* Tag for popl in LDM TLS code */
-#define R_386_TLS_LDO_32   32          /* Offset relative to TLS block */
-#define R_386_TLS_IE_32           33           /* GOT entry for negated static TLS
-                                          block offset */
-#define R_386_TLS_LE_32           34           /* Negated offset relative to static
-                                          TLS block */
-#define R_386_TLS_DTPMOD32 35          /* ID of module containing symbol */
-#define R_386_TLS_DTPOFF32 36          /* Offset in TLS block */
-#define R_386_TLS_TPOFF32  37          /* Negated offset in static TLS block */
-#define R_386_SIZE32      38           /* 32-bit symbol size */
-#define R_386_TLS_GOTDESC  39          /* GOT offset for TLS descriptor.  */
-#define R_386_TLS_DESC_CALL 40         /* Marker of call through TLS
-                                          descriptor for
-                                          relaxation.  */
-#define R_386_TLS_DESC     41          /* TLS descriptor containing
-                                          pointer to code and to
-                                          argument, returning the TLS
-                                          offset for the symbol.  */
-#define R_386_IRELATIVE           42           /* Adjust indirectly by program base */
-/* Keep this the last entry.  */
-#define R_386_NUM         43
-
-/* SUN SPARC specific definitions.  */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_SPARC_REGISTER     13      /* Global register reserved to app. */
-
-/* Values for Elf64_Ehdr.e_flags.  */
-
-#define EF_SPARCV9_MM          3
-#define EF_SPARCV9_TSO         0
-#define EF_SPARCV9_PSO         1
-#define EF_SPARCV9_RMO         2
-#define EF_SPARC_LEDATA                0x800000 /* little endian data */
-#define EF_SPARC_EXT_MASK      0xFFFF00
-#define EF_SPARC_32PLUS                0x000100 /* generic V8+ features */
-#define EF_SPARC_SUN_US1       0x000200 /* Sun UltraSPARC1 extensions */
-#define EF_SPARC_HAL_R1                0x000400 /* HAL R1 extensions */
-#define EF_SPARC_SUN_US3       0x000800 /* Sun UltraSPARCIII extensions */
-
-/* SPARC relocs.  */
-
-#define R_SPARC_NONE           0       /* No reloc */
-#define R_SPARC_8              1       /* Direct 8 bit */
-#define R_SPARC_16             2       /* Direct 16 bit */
-#define R_SPARC_32             3       /* Direct 32 bit */
-#define R_SPARC_DISP8          4       /* PC relative 8 bit */
-#define R_SPARC_DISP16         5       /* PC relative 16 bit */
-#define R_SPARC_DISP32         6       /* PC relative 32 bit */
-#define R_SPARC_WDISP30                7       /* PC relative 30 bit shifted */
-#define R_SPARC_WDISP22                8       /* PC relative 22 bit shifted */
-#define R_SPARC_HI22           9       /* High 22 bit */
-#define R_SPARC_22             10      /* Direct 22 bit */
-#define R_SPARC_13             11      /* Direct 13 bit */
-#define R_SPARC_LO10           12      /* Truncated 10 bit */
-#define R_SPARC_GOT10          13      /* Truncated 10 bit GOT entry */
-#define R_SPARC_GOT13          14      /* 13 bit GOT entry */
-#define R_SPARC_GOT22          15      /* 22 bit GOT entry shifted */
-#define R_SPARC_PC10           16      /* PC relative 10 bit truncated */
-#define R_SPARC_PC22           17      /* PC relative 22 bit shifted */
-#define R_SPARC_WPLT30         18      /* 30 bit PC relative PLT address */
-#define R_SPARC_COPY           19      /* Copy symbol at runtime */
-#define R_SPARC_GLOB_DAT       20      /* Create GOT entry */
-#define R_SPARC_JMP_SLOT       21      /* Create PLT entry */
-#define R_SPARC_RELATIVE       22      /* Adjust by program base */
-#define R_SPARC_UA32           23      /* Direct 32 bit unaligned */
-
-/* Additional Sparc64 relocs.  */
-
-#define R_SPARC_PLT32          24      /* Direct 32 bit ref to PLT entry */
-#define R_SPARC_HIPLT22                25      /* High 22 bit PLT entry */
-#define R_SPARC_LOPLT10                26      /* Truncated 10 bit PLT entry */
-#define R_SPARC_PCPLT32                27      /* PC rel 32 bit ref to PLT entry */
-#define R_SPARC_PCPLT22                28      /* PC rel high 22 bit PLT entry */
-#define R_SPARC_PCPLT10                29      /* PC rel trunc 10 bit PLT entry */
-#define R_SPARC_10             30      /* Direct 10 bit */
-#define R_SPARC_11             31      /* Direct 11 bit */
-#define R_SPARC_64             32      /* Direct 64 bit */
-#define R_SPARC_OLO10          33      /* 10bit with secondary 13bit addend */
-#define R_SPARC_HH22           34      /* Top 22 bits of direct 64 bit */
-#define R_SPARC_HM10           35      /* High middle 10 bits of ... */
-#define R_SPARC_LM22           36      /* Low middle 22 bits of ... */
-#define R_SPARC_PC_HH22                37      /* Top 22 bits of pc rel 64 bit */
-#define R_SPARC_PC_HM10                38      /* High middle 10 bit of ... */
-#define R_SPARC_PC_LM22                39      /* Low miggle 22 bits of ... */
-#define R_SPARC_WDISP16                40      /* PC relative 16 bit shifted */
-#define R_SPARC_WDISP19                41      /* PC relative 19 bit shifted */
-#define R_SPARC_GLOB_JMP       42      /* was part of v9 ABI but was removed */
-#define R_SPARC_7              43      /* Direct 7 bit */
-#define R_SPARC_5              44      /* Direct 5 bit */
-#define R_SPARC_6              45      /* Direct 6 bit */
-#define R_SPARC_DISP64         46      /* PC relative 64 bit */
-#define R_SPARC_PLT64          47      /* Direct 64 bit ref to PLT entry */
-#define R_SPARC_HIX22          48      /* High 22 bit complemented */
-#define R_SPARC_LOX10          49      /* Truncated 11 bit complemented */
-#define R_SPARC_H44            50      /* Direct high 12 of 44 bit */
-#define R_SPARC_M44            51      /* Direct mid 22 of 44 bit */
-#define R_SPARC_L44            52      /* Direct low 10 of 44 bit */
-#define R_SPARC_REGISTER       53      /* Global register usage */
-#define R_SPARC_UA64           54      /* Direct 64 bit unaligned */
-#define R_SPARC_UA16           55      /* Direct 16 bit unaligned */
-#define R_SPARC_TLS_GD_HI22    56
-#define R_SPARC_TLS_GD_LO10    57
-#define R_SPARC_TLS_GD_ADD     58
-#define R_SPARC_TLS_GD_CALL    59
-#define R_SPARC_TLS_LDM_HI22   60
-#define R_SPARC_TLS_LDM_LO10   61
-#define R_SPARC_TLS_LDM_ADD    62
-#define R_SPARC_TLS_LDM_CALL   63
-#define R_SPARC_TLS_LDO_HIX22  64
-#define R_SPARC_TLS_LDO_LOX10  65
-#define R_SPARC_TLS_LDO_ADD    66
-#define R_SPARC_TLS_IE_HI22    67
-#define R_SPARC_TLS_IE_LO10    68
-#define R_SPARC_TLS_IE_LD      69
-#define R_SPARC_TLS_IE_LDX     70
-#define R_SPARC_TLS_IE_ADD     71
-#define R_SPARC_TLS_LE_HIX22   72
-#define R_SPARC_TLS_LE_LOX10   73
-#define R_SPARC_TLS_DTPMOD32   74
-#define R_SPARC_TLS_DTPMOD64   75
-#define R_SPARC_TLS_DTPOFF32   76
-#define R_SPARC_TLS_DTPOFF64   77
-#define R_SPARC_TLS_TPOFF32    78
-#define R_SPARC_TLS_TPOFF64    79
-#define R_SPARC_GOTDATA_HIX22  80
-#define R_SPARC_GOTDATA_LOX10  81
-#define R_SPARC_GOTDATA_OP_HIX22       82
-#define R_SPARC_GOTDATA_OP_LOX10       83
-#define R_SPARC_GOTDATA_OP     84
-#define R_SPARC_H34            85
-#define R_SPARC_SIZE32         86
-#define R_SPARC_SIZE64         87
-#define R_SPARC_WDISP10                88
-#define R_SPARC_JMP_IREL       248
-#define R_SPARC_IRELATIVE      249
-#define R_SPARC_GNU_VTINHERIT  250
-#define R_SPARC_GNU_VTENTRY    251
-#define R_SPARC_REV32          252
-/* Keep this the last entry.  */
-#define R_SPARC_NUM            253
-
-/* For Sparc64, legal values for d_tag of Elf64_Dyn.  */
-
-#define DT_SPARC_REGISTER      0x70000001
-#define DT_SPARC_NUM           2
-
-/* MIPS R3000 specific definitions.  */
-
-/* Legal values for e_flags field of Elf32_Ehdr.  */
-
-#define EF_MIPS_NOREORDER      1     /* A .noreorder directive was used.  */
-#define EF_MIPS_PIC            2     /* Contains PIC code.  */
-#define EF_MIPS_CPIC           4     /* Uses PIC calling sequence.  */
-#define EF_MIPS_XGOT           8
-#define EF_MIPS_64BIT_WHIRL    16
-#define EF_MIPS_ABI2           32
-#define EF_MIPS_ABI_ON32       64
-#define EF_MIPS_NAN2008        1024  /* Uses IEEE 754-2008 NaN encoding.  */
-#define EF_MIPS_ARCH           0xf0000000 /* MIPS architecture level.  */
-
-/* Legal values for MIPS architecture level.  */
-
-#define EF_MIPS_ARCH_1         0x00000000 /* -mips1 code.  */
-#define EF_MIPS_ARCH_2         0x10000000 /* -mips2 code.  */
-#define EF_MIPS_ARCH_3         0x20000000 /* -mips3 code.  */
-#define EF_MIPS_ARCH_4         0x30000000 /* -mips4 code.  */
-#define EF_MIPS_ARCH_5         0x40000000 /* -mips5 code.  */
-#define EF_MIPS_ARCH_32                0x50000000 /* MIPS32 code.  */
-#define EF_MIPS_ARCH_64                0x60000000 /* MIPS64 code.  */
-#define EF_MIPS_ARCH_32R2      0x70000000 /* MIPS32r2 code.  */
-#define EF_MIPS_ARCH_64R2      0x80000000 /* MIPS64r2 code.  */
-
-/* The following are unofficial names and should not be used.  */
-
-#define E_MIPS_ARCH_1          EF_MIPS_ARCH_1
-#define E_MIPS_ARCH_2          EF_MIPS_ARCH_2
-#define E_MIPS_ARCH_3          EF_MIPS_ARCH_3
-#define E_MIPS_ARCH_4          EF_MIPS_ARCH_4
-#define E_MIPS_ARCH_5          EF_MIPS_ARCH_5
-#define E_MIPS_ARCH_32         EF_MIPS_ARCH_32
-#define E_MIPS_ARCH_64         EF_MIPS_ARCH_64
-
-/* Special section indices.  */
-
-#define SHN_MIPS_ACOMMON       0xff00  /* Allocated common symbols.  */
-#define SHN_MIPS_TEXT          0xff01  /* Allocated test symbols.  */
-#define SHN_MIPS_DATA          0xff02  /* Allocated data symbols.  */
-#define SHN_MIPS_SCOMMON       0xff03  /* Small common symbols.  */
-#define SHN_MIPS_SUNDEFINED    0xff04  /* Small undefined symbols.  */
-
-/* Legal values for sh_type field of Elf32_Shdr.  */
-
-#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link.  */
-#define SHT_MIPS_MSYM          0x70000001
-#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols.  */
-#define SHT_MIPS_GPTAB         0x70000003 /* Global data area sizes.  */
-#define SHT_MIPS_UCODE         0x70000004 /* Reserved for SGI/MIPS compilers */
-#define SHT_MIPS_DEBUG         0x70000005 /* MIPS ECOFF debugging info.  */
-#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information.  */
-#define SHT_MIPS_PACKAGE       0x70000007
-#define SHT_MIPS_PACKSYM       0x70000008
-#define SHT_MIPS_RELD          0x70000009
-#define SHT_MIPS_IFACE         0x7000000b
-#define SHT_MIPS_CONTENT       0x7000000c
-#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */
-#define SHT_MIPS_SHDR          0x70000010
-#define SHT_MIPS_FDESC         0x70000011
-#define SHT_MIPS_EXTSYM                0x70000012
-#define SHT_MIPS_DENSE         0x70000013
-#define SHT_MIPS_PDESC         0x70000014
-#define SHT_MIPS_LOCSYM                0x70000015
-#define SHT_MIPS_AUXSYM                0x70000016
-#define SHT_MIPS_OPTSYM                0x70000017
-#define SHT_MIPS_LOCSTR                0x70000018
-#define SHT_MIPS_LINE          0x70000019
-#define SHT_MIPS_RFDESC                0x7000001a
-#define SHT_MIPS_DELTASYM      0x7000001b
-#define SHT_MIPS_DELTAINST     0x7000001c
-#define SHT_MIPS_DELTACLASS    0x7000001d
-#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */
-#define SHT_MIPS_DELTADECL     0x7000001f
-#define SHT_MIPS_SYMBOL_LIB    0x70000020
-#define SHT_MIPS_EVENTS                0x70000021 /* Event section.  */
-#define SHT_MIPS_TRANSLATE     0x70000022
-#define SHT_MIPS_PIXIE         0x70000023
-#define SHT_MIPS_XLATE         0x70000024
-#define SHT_MIPS_XLATE_DEBUG   0x70000025
-#define SHT_MIPS_WHIRL         0x70000026
-#define SHT_MIPS_EH_REGION     0x70000027
-#define SHT_MIPS_XLATE_OLD     0x70000028
-#define SHT_MIPS_PDR_EXCEPTION 0x70000029
-
-/* Legal values for sh_flags field of Elf32_Shdr.  */
-
-#define SHF_MIPS_GPREL         0x10000000 /* Must be in global data area.  */
-#define SHF_MIPS_MERGE         0x20000000
-#define SHF_MIPS_ADDR          0x40000000
-#define SHF_MIPS_STRINGS       0x80000000
-#define SHF_MIPS_NOSTRIP       0x08000000
-#define SHF_MIPS_LOCAL         0x04000000
-#define SHF_MIPS_NAMES         0x02000000
-#define SHF_MIPS_NODUPE                0x01000000
-
-
-/* Symbol tables.  */
-
-/* MIPS specific values for `st_other'.  */
-#define STO_MIPS_DEFAULT               0x0
-#define STO_MIPS_INTERNAL              0x1
-#define STO_MIPS_HIDDEN                        0x2
-#define STO_MIPS_PROTECTED             0x3
-#define STO_MIPS_PLT                   0x8
-#define STO_MIPS_SC_ALIGN_UNUSED       0xff
-
-/* MIPS specific values for `st_info'.  */
-#define STB_MIPS_SPLIT_COMMON          13
-
-/* Entries found in sections of type SHT_MIPS_GPTAB.  */
-
-typedef union
-{
-  struct
-    {
-      Elf32_Word gt_current_g_value;   /* -G value used for compilation.  */
-      Elf32_Word gt_unused;            /* Not used.  */
-    } gt_header;                       /* First entry in section.  */
-  struct
-    {
-      Elf32_Word gt_g_value;           /* If this value were used for -G.  */
-      Elf32_Word gt_bytes;             /* This many bytes would be used.  */
-    } gt_entry;                                /* Subsequent entries in section.  */
-} Elf32_gptab;
-
-/* Entry found in sections of type SHT_MIPS_REGINFO.  */
-
-typedef struct
-{
-  Elf32_Word ri_gprmask;               /* General registers used.  */
-  Elf32_Word ri_cprmask[4];            /* Coprocessor registers used.  */
-  Elf32_Sword ri_gp_value;             /* $gp register value.  */
-} Elf32_RegInfo;
-
-/* Entries found in sections of type SHT_MIPS_OPTIONS.  */
-
-typedef struct
-{
-  unsigned char kind;          /* Determines interpretation of the
-                                  variable part of descriptor.  */
-  unsigned char size;          /* Size of descriptor, including header.  */
-  Elf32_Section section;       /* Section header index of section affected,
-                                  0 for global options.  */
-  Elf32_Word info;             /* Kind-specific information.  */
-} Elf_Options;
-
-/* Values for `kind' field in Elf_Options.  */
-
-#define ODK_NULL       0       /* Undefined.  */
-#define ODK_REGINFO    1       /* Register usage information.  */
-#define ODK_EXCEPTIONS 2       /* Exception processing options.  */
-#define ODK_PAD                3       /* Section padding options.  */
-#define ODK_HWPATCH    4       /* Hardware workarounds performed */
-#define ODK_FILL       5       /* record the fill value used by the linker. */
-#define ODK_TAGS       6       /* reserve space for desktop tools to write. */
-#define ODK_HWAND      7       /* HW workarounds.  'AND' bits when merging. */
-#define ODK_HWOR       8       /* HW workarounds.  'OR' bits when merging.  */
-
-/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */
-
-#define OEX_FPU_MIN    0x1f    /* FPE's which MUST be enabled.  */
-#define OEX_FPU_MAX    0x1f00  /* FPE's which MAY be enabled.  */
-#define OEX_PAGE0      0x10000 /* page zero must be mapped.  */
-#define OEX_SMM                0x20000 /* Force sequential memory mode?  */
-#define OEX_FPDBUG     0x40000 /* Force floating point debug mode?  */
-#define OEX_PRECISEFP  OEX_FPDBUG
-#define OEX_DISMISS    0x80000 /* Dismiss invalid address faults?  */
-
-#define OEX_FPU_INVAL  0x10
-#define OEX_FPU_DIV0   0x08
-#define OEX_FPU_OFLO   0x04
-#define OEX_FPU_UFLO   0x02
-#define OEX_FPU_INEX   0x01
-
-/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */
-
-#define OHW_R4KEOP     0x1     /* R4000 end-of-page patch.  */
-#define OHW_R8KPFETCH  0x2     /* may need R8000 prefetch patch.  */
-#define OHW_R5KEOP     0x4     /* R5000 end-of-page patch.  */
-#define OHW_R5KCVTL    0x8     /* R5000 cvt.[ds].l bug.  clean=1.  */
-
-#define OPAD_PREFIX    0x1
-#define OPAD_POSTFIX   0x2
-#define OPAD_SYMBOL    0x4
-
-/* Entry found in `.options' section.  */
-
-typedef struct
-{
-  Elf32_Word hwp_flags1;       /* Extra flags.  */
-  Elf32_Word hwp_flags2;       /* Extra flags.  */
-} Elf_Options_Hw;
-
-/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */
-
-#define OHWA0_R4KEOP_CHECKED   0x00000001
-#define OHWA1_R4KEOP_CLEAN     0x00000002
-
-/* MIPS relocs.  */
-
-#define R_MIPS_NONE            0       /* No reloc */
-#define R_MIPS_16              1       /* Direct 16 bit */
-#define R_MIPS_32              2       /* Direct 32 bit */
-#define R_MIPS_REL32           3       /* PC relative 32 bit */
-#define R_MIPS_26              4       /* Direct 26 bit shifted */
-#define R_MIPS_HI16            5       /* High 16 bit */
-#define R_MIPS_LO16            6       /* Low 16 bit */
-#define R_MIPS_GPREL16         7       /* GP relative 16 bit */
-#define R_MIPS_LITERAL         8       /* 16 bit literal entry */
-#define R_MIPS_GOT16           9       /* 16 bit GOT entry */
-#define R_MIPS_PC16            10      /* PC relative 16 bit */
-#define R_MIPS_CALL16          11      /* 16 bit GOT entry for function */
-#define R_MIPS_GPREL32         12      /* GP relative 32 bit */
-
-#define R_MIPS_SHIFT5          16
-#define R_MIPS_SHIFT6          17
-#define R_MIPS_64              18
-#define R_MIPS_GOT_DISP                19
-#define R_MIPS_GOT_PAGE                20
-#define R_MIPS_GOT_OFST                21
-#define R_MIPS_GOT_HI16                22
-#define R_MIPS_GOT_LO16                23
-#define R_MIPS_SUB             24
-#define R_MIPS_INSERT_A                25
-#define R_MIPS_INSERT_B                26
-#define R_MIPS_DELETE          27
-#define R_MIPS_HIGHER          28
-#define R_MIPS_HIGHEST         29
-#define R_MIPS_CALL_HI16       30
-#define R_MIPS_CALL_LO16       31
-#define R_MIPS_SCN_DISP                32
-#define R_MIPS_REL16           33
-#define R_MIPS_ADD_IMMEDIATE   34
-#define R_MIPS_PJUMP           35
-#define R_MIPS_RELGOT          36
-#define R_MIPS_JALR            37
-#define R_MIPS_TLS_DTPMOD32    38      /* Module number 32 bit */
-#define R_MIPS_TLS_DTPREL32    39      /* Module-relative offset 32 bit */
-#define R_MIPS_TLS_DTPMOD64    40      /* Module number 64 bit */
-#define R_MIPS_TLS_DTPREL64    41      /* Module-relative offset 64 bit */
-#define R_MIPS_TLS_GD          42      /* 16 bit GOT offset for GD */
-#define R_MIPS_TLS_LDM         43      /* 16 bit GOT offset for LDM */
-#define R_MIPS_TLS_DTPREL_HI16 44      /* Module-relative offset, high 16 bits */
-#define R_MIPS_TLS_DTPREL_LO16 45      /* Module-relative offset, low 16 bits */
-#define R_MIPS_TLS_GOTTPREL    46      /* 16 bit GOT offset for IE */
-#define R_MIPS_TLS_TPREL32     47      /* TP-relative offset, 32 bit */
-#define R_MIPS_TLS_TPREL64     48      /* TP-relative offset, 64 bit */
-#define R_MIPS_TLS_TPREL_HI16  49      /* TP-relative offset, high 16 bits */
-#define R_MIPS_TLS_TPREL_LO16  50      /* TP-relative offset, low 16 bits */
-#define R_MIPS_GLOB_DAT                51
-#define R_MIPS_COPY            126
-#define R_MIPS_JUMP_SLOT        127
-/* Keep this the last entry.  */
-#define R_MIPS_NUM             128
-
-/* Legal values for p_type field of Elf32_Phdr.  */
-
-#define PT_MIPS_REGINFO        0x70000000      /* Register usage information */
-#define PT_MIPS_RTPROC  0x70000001     /* Runtime procedure table. */
-#define PT_MIPS_OPTIONS 0x70000002
-
-/* Special program header types.  */
-
-#define PF_MIPS_LOCAL  0x10000000
-
-/* Legal values for d_tag field of Elf32_Dyn.  */
-
-#define DT_MIPS_RLD_VERSION  0x70000001        /* Runtime linker interface version */
-#define DT_MIPS_TIME_STAMP   0x70000002        /* Timestamp */
-#define DT_MIPS_ICHECKSUM    0x70000003        /* Checksum */
-#define DT_MIPS_IVERSION     0x70000004        /* Version string (string tbl index) */
-#define DT_MIPS_FLAGS       0x70000005 /* Flags */
-#define DT_MIPS_BASE_ADDRESS 0x70000006        /* Base address */
-#define DT_MIPS_MSYM        0x70000007
-#define DT_MIPS_CONFLICT     0x70000008        /* Address of CONFLICT section */
-#define DT_MIPS_LIBLIST             0x70000009 /* Address of LIBLIST section */
-#define DT_MIPS_LOCAL_GOTNO  0x7000000a        /* Number of local GOT entries */
-#define DT_MIPS_CONFLICTNO   0x7000000b        /* Number of CONFLICT entries */
-#define DT_MIPS_LIBLISTNO    0x70000010        /* Number of LIBLIST entries */
-#define DT_MIPS_SYMTABNO     0x70000011        /* Number of DYNSYM entries */
-#define DT_MIPS_UNREFEXTNO   0x70000012        /* First external DYNSYM */
-#define DT_MIPS_GOTSYM      0x70000013 /* First GOT entry in DYNSYM */
-#define DT_MIPS_HIPAGENO     0x70000014        /* Number of GOT page table entries */
-#define DT_MIPS_RLD_MAP             0x70000016 /* Address of run time loader map.  */
-#define DT_MIPS_DELTA_CLASS  0x70000017        /* Delta C++ class definition.  */
-#define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in
-                                               DT_MIPS_DELTA_CLASS.  */
-#define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */
-#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
-                                               DT_MIPS_DELTA_INSTANCE.  */
-#define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */
-#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
-                                            DT_MIPS_DELTA_RELOC.  */
-#define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta
-                                          relocations refer to.  */
-#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
-                                          DT_MIPS_DELTA_SYM.  */
-#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
-                                            class declaration.  */
-#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
-                                               DT_MIPS_DELTA_CLASSSYM.  */
-#define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */
-#define DT_MIPS_PIXIE_INIT   0x70000023
-#define DT_MIPS_SYMBOL_LIB   0x70000024
-#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
-#define DT_MIPS_LOCAL_GOTIDX 0x70000026
-#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
-#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
-#define DT_MIPS_OPTIONS             0x70000029 /* Address of .options.  */
-#define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */
-#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
-#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
-#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
-                                                   function stored in GOT.  */
-#define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added
-                                          by rld on dlopen() calls.  */
-#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
-#define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */
-#define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */
-/* The address of .got.plt in an executable using the new non-PIC ABI.  */
-#define DT_MIPS_PLTGOT      0x70000032
-/* The base of the PLT in an executable using the new non-PIC ABI if that
-   PLT is writable.  For a non-writable PLT, this is omitted or has a zero
-   value.  */
-#define DT_MIPS_RWPLT        0x70000034
-#define DT_MIPS_NUM         0x35
-
-/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */
-
-#define RHF_NONE                  0            /* No flags */
-#define RHF_QUICKSTART            (1 << 0)     /* Use quickstart */
-#define RHF_NOTPOT                (1 << 1)     /* Hash size not power of 2 */
-#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)    /* Ignore LD_LIBRARY_PATH */
-#define RHF_NO_MOVE               (1 << 3)
-#define RHF_SGI_ONLY              (1 << 4)
-#define RHF_GUARANTEE_INIT        (1 << 5)
-#define RHF_DELTA_C_PLUS_PLUS     (1 << 6)
-#define RHF_GUARANTEE_START_INIT   (1 << 7)
-#define RHF_PIXIE                 (1 << 8)
-#define RHF_DEFAULT_DELAY_LOAD    (1 << 9)
-#define RHF_REQUICKSTART          (1 << 10)
-#define RHF_REQUICKSTARTED        (1 << 11)
-#define RHF_CORD                  (1 << 12)
-#define RHF_NO_UNRES_UNDEF        (1 << 13)
-#define RHF_RLD_ORDER_SAFE        (1 << 14)
-
-/* Entries found in sections of type SHT_MIPS_LIBLIST.  */
-
-typedef struct
-{
-  Elf32_Word l_name;           /* Name (string table index) */
-  Elf32_Word l_time_stamp;     /* Timestamp */
-  Elf32_Word l_checksum;       /* Checksum */
-  Elf32_Word l_version;                /* Interface version */
-  Elf32_Word l_flags;          /* Flags */
-} Elf32_Lib;
-
-typedef struct
-{
-  Elf64_Word l_name;           /* Name (string table index) */
-  Elf64_Word l_time_stamp;     /* Timestamp */
-  Elf64_Word l_checksum;       /* Checksum */
-  Elf64_Word l_version;                /* Interface version */
-  Elf64_Word l_flags;          /* Flags */
-} Elf64_Lib;
-
-
-/* Legal values for l_flags.  */
-
-#define LL_NONE                  0
-#define LL_EXACT_MATCH   (1 << 0)      /* Require exact match */
-#define LL_IGNORE_INT_VER (1 << 1)     /* Ignore interface version */
-#define LL_REQUIRE_MINOR  (1 << 2)
-#define LL_EXPORTS       (1 << 3)
-#define LL_DELAY_LOAD    (1 << 4)
-#define LL_DELTA         (1 << 5)
-
-/* Entries found in sections of type SHT_MIPS_CONFLICT.  */
-
-typedef Elf32_Addr Elf32_Conflict;
-
-
-/* HPPA specific definitions.  */
-
-/* Legal values for e_flags field of Elf32_Ehdr.  */
-
-#define EF_PARISC_TRAPNIL      0x00010000 /* Trap nil pointer dereference.  */
-#define EF_PARISC_EXT          0x00020000 /* Program uses arch. extensions. */
-#define EF_PARISC_LSB          0x00040000 /* Program expects little endian. */
-#define EF_PARISC_WIDE         0x00080000 /* Program expects wide mode.  */
-#define EF_PARISC_NO_KABP      0x00100000 /* No kernel assisted branch
-                                             prediction.  */
-#define EF_PARISC_LAZYSWAP     0x00400000 /* Allow lazy swapping.  */
-#define EF_PARISC_ARCH         0x0000ffff /* Architecture version.  */
-
-/* Defined values for `e_flags & EF_PARISC_ARCH' are:  */
-
-#define EFA_PARISC_1_0             0x020b /* PA-RISC 1.0 big-endian.  */
-#define EFA_PARISC_1_1             0x0210 /* PA-RISC 1.1 big-endian.  */
-#define EFA_PARISC_2_0             0x0214 /* PA-RISC 2.0 big-endian.  */
-
-/* Additional section indeces.  */
-
-#define SHN_PARISC_ANSI_COMMON 0xff00     /* Section for tenatively declared
-                                             symbols in ANSI C.  */
-#define SHN_PARISC_HUGE_COMMON 0xff01     /* Common blocks in huge model.  */
-
-/* Legal values for sh_type field of Elf32_Shdr.  */
-
-#define SHT_PARISC_EXT         0x70000000 /* Contains product specific ext. */
-#define SHT_PARISC_UNWIND      0x70000001 /* Unwind information.  */
-#define SHT_PARISC_DOC         0x70000002 /* Debug info for optimized code. */
-
-/* Legal values for sh_flags field of Elf32_Shdr.  */
-
-#define SHF_PARISC_SHORT       0x20000000 /* Section with short addressing. */
-#define SHF_PARISC_HUGE                0x40000000 /* Section far from gp.  */
-#define SHF_PARISC_SBP         0x80000000 /* Static branch prediction code. */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_PARISC_MILLICODE   13      /* Millicode function entry point.  */
-
-#define STT_HP_OPAQUE          (STT_LOOS + 0x1)
-#define STT_HP_STUB            (STT_LOOS + 0x2)
-
-/* HPPA relocs.  */
-
-#define R_PARISC_NONE          0       /* No reloc.  */
-#define R_PARISC_DIR32         1       /* Direct 32-bit reference.  */
-#define R_PARISC_DIR21L                2       /* Left 21 bits of eff. address.  */
-#define R_PARISC_DIR17R                3       /* Right 17 bits of eff. address.  */
-#define R_PARISC_DIR17F                4       /* 17 bits of eff. address.  */
-#define R_PARISC_DIR14R                6       /* Right 14 bits of eff. address.  */
-#define R_PARISC_PCREL32       9       /* 32-bit rel. address.  */
-#define R_PARISC_PCREL21L      10      /* Left 21 bits of rel. address.  */
-#define R_PARISC_PCREL17R      11      /* Right 17 bits of rel. address.  */
-#define R_PARISC_PCREL17F      12      /* 17 bits of rel. address.  */
-#define R_PARISC_PCREL14R      14      /* Right 14 bits of rel. address.  */
-#define R_PARISC_DPREL21L      18      /* Left 21 bits of rel. address.  */
-#define R_PARISC_DPREL14R      22      /* Right 14 bits of rel. address.  */
-#define R_PARISC_GPREL21L      26      /* GP-relative, left 21 bits.  */
-#define R_PARISC_GPREL14R      30      /* GP-relative, right 14 bits.  */
-#define R_PARISC_LTOFF21L      34      /* LT-relative, left 21 bits.  */
-#define R_PARISC_LTOFF14R      38      /* LT-relative, right 14 bits.  */
-#define R_PARISC_SECREL32      41      /* 32 bits section rel. address.  */
-#define R_PARISC_SEGBASE       48      /* No relocation, set segment base.  */
-#define R_PARISC_SEGREL32      49      /* 32 bits segment rel. address.  */
-#define R_PARISC_PLTOFF21L     50      /* PLT rel. address, left 21 bits.  */
-#define R_PARISC_PLTOFF14R     54      /* PLT rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF_FPTR32  57      /* 32 bits LT-rel. function pointer. */
-#define R_PARISC_LTOFF_FPTR21L 58      /* LT-rel. fct ptr, left 21 bits. */
-#define R_PARISC_LTOFF_FPTR14R 62      /* LT-rel. fct ptr, right 14 bits. */
-#define R_PARISC_FPTR64                64      /* 64 bits function address.  */
-#define R_PARISC_PLABEL32      65      /* 32 bits function address.  */
-#define R_PARISC_PLABEL21L     66      /* Left 21 bits of fdesc address.  */
-#define R_PARISC_PLABEL14R     70      /* Right 14 bits of fdesc address.  */
-#define R_PARISC_PCREL64       72      /* 64 bits PC-rel. address.  */
-#define R_PARISC_PCREL22F      74      /* 22 bits PC-rel. address.  */
-#define R_PARISC_PCREL14WR     75      /* PC-rel. address, right 14 bits.  */
-#define R_PARISC_PCREL14DR     76      /* PC rel. address, right 14 bits.  */
-#define R_PARISC_PCREL16F      77      /* 16 bits PC-rel. address.  */
-#define R_PARISC_PCREL16WF     78      /* 16 bits PC-rel. address.  */
-#define R_PARISC_PCREL16DF     79      /* 16 bits PC-rel. address.  */
-#define R_PARISC_DIR64         80      /* 64 bits of eff. address.  */
-#define R_PARISC_DIR14WR       83      /* 14 bits of eff. address.  */
-#define R_PARISC_DIR14DR       84      /* 14 bits of eff. address.  */
-#define R_PARISC_DIR16F                85      /* 16 bits of eff. address.  */
-#define R_PARISC_DIR16WF       86      /* 16 bits of eff. address.  */
-#define R_PARISC_DIR16DF       87      /* 16 bits of eff. address.  */
-#define R_PARISC_GPREL64       88      /* 64 bits of GP-rel. address.  */
-#define R_PARISC_GPREL14WR     91      /* GP-rel. address, right 14 bits.  */
-#define R_PARISC_GPREL14DR     92      /* GP-rel. address, right 14 bits.  */
-#define R_PARISC_GPREL16F      93      /* 16 bits GP-rel. address.  */
-#define R_PARISC_GPREL16WF     94      /* 16 bits GP-rel. address.  */
-#define R_PARISC_GPREL16DF     95      /* 16 bits GP-rel. address.  */
-#define R_PARISC_LTOFF64       96      /* 64 bits LT-rel. address.  */
-#define R_PARISC_LTOFF14WR     99      /* LT-rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF14DR     100     /* LT-rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF16F      101     /* 16 bits LT-rel. address.  */
-#define R_PARISC_LTOFF16WF     102     /* 16 bits LT-rel. address.  */
-#define R_PARISC_LTOFF16DF     103     /* 16 bits LT-rel. address.  */
-#define R_PARISC_SECREL64      104     /* 64 bits section rel. address.  */
-#define R_PARISC_SEGREL64      112     /* 64 bits segment rel. address.  */
-#define R_PARISC_PLTOFF14WR    115     /* PLT-rel. address, right 14 bits.  */
-#define R_PARISC_PLTOFF14DR    116     /* PLT-rel. address, right 14 bits.  */
-#define R_PARISC_PLTOFF16F     117     /* 16 bits LT-rel. address.  */
-#define R_PARISC_PLTOFF16WF    118     /* 16 bits PLT-rel. address.  */
-#define R_PARISC_PLTOFF16DF    119     /* 16 bits PLT-rel. address.  */
-#define R_PARISC_LTOFF_FPTR64  120     /* 64 bits LT-rel. function ptr.  */
-#define R_PARISC_LTOFF_FPTR14WR        123     /* LT-rel. fct. ptr., right 14 bits. */
-#define R_PARISC_LTOFF_FPTR14DR        124     /* LT-rel. fct. ptr., right 14 bits. */
-#define R_PARISC_LTOFF_FPTR16F 125     /* 16 bits LT-rel. function ptr.  */
-#define R_PARISC_LTOFF_FPTR16WF        126     /* 16 bits LT-rel. function ptr.  */
-#define R_PARISC_LTOFF_FPTR16DF        127     /* 16 bits LT-rel. function ptr.  */
-#define R_PARISC_LORESERVE     128
-#define R_PARISC_COPY          128     /* Copy relocation.  */
-#define R_PARISC_IPLT          129     /* Dynamic reloc, imported PLT */
-#define R_PARISC_EPLT          130     /* Dynamic reloc, exported PLT */
-#define R_PARISC_TPREL32       153     /* 32 bits TP-rel. address.  */
-#define R_PARISC_TPREL21L      154     /* TP-rel. address, left 21 bits.  */
-#define R_PARISC_TPREL14R      158     /* TP-rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF_TP21L   162     /* LT-TP-rel. address, left 21 bits. */
-#define R_PARISC_LTOFF_TP14R   166     /* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP14F   167     /* 14 bits LT-TP-rel. address.  */
-#define R_PARISC_TPREL64       216     /* 64 bits TP-rel. address.  */
-#define R_PARISC_TPREL14WR     219     /* TP-rel. address, right 14 bits.  */
-#define R_PARISC_TPREL14DR     220     /* TP-rel. address, right 14 bits.  */
-#define R_PARISC_TPREL16F      221     /* 16 bits TP-rel. address.  */
-#define R_PARISC_TPREL16WF     222     /* 16 bits TP-rel. address.  */
-#define R_PARISC_TPREL16DF     223     /* 16 bits TP-rel. address.  */
-#define R_PARISC_LTOFF_TP64    224     /* 64 bits LT-TP-rel. address.  */
-#define R_PARISC_LTOFF_TP14WR  227     /* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP14DR  228     /* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP16F   229     /* 16 bits LT-TP-rel. address.  */
-#define R_PARISC_LTOFF_TP16WF  230     /* 16 bits LT-TP-rel. address.  */
-#define R_PARISC_LTOFF_TP16DF  231     /* 16 bits LT-TP-rel. address.  */
-#define R_PARISC_GNU_VTENTRY   232
-#define R_PARISC_GNU_VTINHERIT 233
-#define R_PARISC_TLS_GD21L     234     /* GD 21-bit left.  */
-#define R_PARISC_TLS_GD14R     235     /* GD 14-bit right.  */
-#define R_PARISC_TLS_GDCALL    236     /* GD call to __t_g_a.  */
-#define R_PARISC_TLS_LDM21L    237     /* LD module 21-bit left.  */
-#define R_PARISC_TLS_LDM14R    238     /* LD module 14-bit right.  */
-#define R_PARISC_TLS_LDMCALL   239     /* LD module call to __t_g_a.  */
-#define R_PARISC_TLS_LDO21L    240     /* LD offset 21-bit left.  */
-#define R_PARISC_TLS_LDO14R    241     /* LD offset 14-bit right.  */
-#define R_PARISC_TLS_DTPMOD32  242     /* DTP module 32-bit.  */
-#define R_PARISC_TLS_DTPMOD64  243     /* DTP module 64-bit.  */
-#define R_PARISC_TLS_DTPOFF32  244     /* DTP offset 32-bit.  */
-#define R_PARISC_TLS_DTPOFF64  245     /* DTP offset 32-bit.  */
-#define R_PARISC_TLS_LE21L     R_PARISC_TPREL21L
-#define R_PARISC_TLS_LE14R     R_PARISC_TPREL14R
-#define R_PARISC_TLS_IE21L     R_PARISC_LTOFF_TP21L
-#define R_PARISC_TLS_IE14R     R_PARISC_LTOFF_TP14R
-#define R_PARISC_TLS_TPREL32   R_PARISC_TPREL32
-#define R_PARISC_TLS_TPREL64   R_PARISC_TPREL64
-#define R_PARISC_HIRESERVE     255
-
-/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.  */
-
-#define PT_HP_TLS              (PT_LOOS + 0x0)
-#define PT_HP_CORE_NONE                (PT_LOOS + 0x1)
-#define PT_HP_CORE_VERSION     (PT_LOOS + 0x2)
-#define PT_HP_CORE_KERNEL      (PT_LOOS + 0x3)
-#define PT_HP_CORE_COMM                (PT_LOOS + 0x4)
-#define PT_HP_CORE_PROC                (PT_LOOS + 0x5)
-#define PT_HP_CORE_LOADABLE    (PT_LOOS + 0x6)
-#define PT_HP_CORE_STACK       (PT_LOOS + 0x7)
-#define PT_HP_CORE_SHM         (PT_LOOS + 0x8)
-#define PT_HP_CORE_MMF         (PT_LOOS + 0x9)
-#define PT_HP_PARALLEL         (PT_LOOS + 0x10)
-#define PT_HP_FASTBIND         (PT_LOOS + 0x11)
-#define PT_HP_OPT_ANNOT                (PT_LOOS + 0x12)
-#define PT_HP_HSL_ANNOT                (PT_LOOS + 0x13)
-#define PT_HP_STACK            (PT_LOOS + 0x14)
-
-#define PT_PARISC_ARCHEXT      0x70000000
-#define PT_PARISC_UNWIND       0x70000001
-
-/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.  */
-
-#define PF_PARISC_SBP          0x08000000
-
-#define PF_HP_PAGE_SIZE                0x00100000
-#define PF_HP_FAR_SHARED       0x00200000
-#define PF_HP_NEAR_SHARED      0x00400000
-#define PF_HP_CODE             0x01000000
-#define PF_HP_MODIFY           0x02000000
-#define PF_HP_LAZYSWAP         0x04000000
-#define PF_HP_SBP              0x08000000
-
-
-/* Alpha specific definitions.  */
-
-/* Legal values for e_flags field of Elf64_Ehdr.  */
-
-#define EF_ALPHA_32BIT         1       /* All addresses must be < 2GB.  */
-#define EF_ALPHA_CANRELAX      2       /* Relocations for relaxing exist.  */
-
-/* Legal values for sh_type field of Elf64_Shdr.  */
-
-/* These two are primerily concerned with ECOFF debugging info.  */
-#define SHT_ALPHA_DEBUG                0x70000001
-#define SHT_ALPHA_REGINFO      0x70000002
-
-/* Legal values for sh_flags field of Elf64_Shdr.  */
-
-#define SHF_ALPHA_GPREL                0x10000000
-
-/* Legal values for st_other field of Elf64_Sym.  */
-#define STO_ALPHA_NOPV         0x80    /* No PV required.  */
-#define STO_ALPHA_STD_GPLOAD   0x88    /* PV only used for initial ldgp.  */
-
-/* Alpha relocs.  */
-
-#define R_ALPHA_NONE           0       /* No reloc */
-#define R_ALPHA_REFLONG                1       /* Direct 32 bit */
-#define R_ALPHA_REFQUAD                2       /* Direct 64 bit */
-#define R_ALPHA_GPREL32                3       /* GP relative 32 bit */
-#define R_ALPHA_LITERAL                4       /* GP relative 16 bit w/optimization */
-#define R_ALPHA_LITUSE         5       /* Optimization hint for LITERAL */
-#define R_ALPHA_GPDISP         6       /* Add displacement to GP */
-#define R_ALPHA_BRADDR         7       /* PC+4 relative 23 bit shifted */
-#define R_ALPHA_HINT           8       /* PC+4 relative 16 bit shifted */
-#define R_ALPHA_SREL16         9       /* PC relative 16 bit */
-#define R_ALPHA_SREL32         10      /* PC relative 32 bit */
-#define R_ALPHA_SREL64         11      /* PC relative 64 bit */
-#define R_ALPHA_GPRELHIGH      17      /* GP relative 32 bit, high 16 bits */
-#define R_ALPHA_GPRELLOW       18      /* GP relative 32 bit, low 16 bits */
-#define R_ALPHA_GPREL16                19      /* GP relative 16 bit */
-#define R_ALPHA_COPY           24      /* Copy symbol at runtime */
-#define R_ALPHA_GLOB_DAT       25      /* Create GOT entry */
-#define R_ALPHA_JMP_SLOT       26      /* Create PLT entry */
-#define R_ALPHA_RELATIVE       27      /* Adjust by program base */
-#define R_ALPHA_TLS_GD_HI      28
-#define R_ALPHA_TLSGD          29
-#define R_ALPHA_TLS_LDM                30
-#define R_ALPHA_DTPMOD64       31
-#define R_ALPHA_GOTDTPREL      32
-#define R_ALPHA_DTPREL64       33
-#define R_ALPHA_DTPRELHI       34
-#define R_ALPHA_DTPRELLO       35
-#define R_ALPHA_DTPREL16       36
-#define R_ALPHA_GOTTPREL       37
-#define R_ALPHA_TPREL64                38
-#define R_ALPHA_TPRELHI                39
-#define R_ALPHA_TPRELLO                40
-#define R_ALPHA_TPREL16                41
-/* Keep this the last entry.  */
-#define R_ALPHA_NUM            46
-
-/* Magic values of the LITUSE relocation addend.  */
-#define LITUSE_ALPHA_ADDR      0
-#define LITUSE_ALPHA_BASE      1
-#define LITUSE_ALPHA_BYTOFF    2
-#define LITUSE_ALPHA_JSR       3
-#define LITUSE_ALPHA_TLS_GD    4
-#define LITUSE_ALPHA_TLS_LDM   5
-
-/* Legal values for d_tag of Elf64_Dyn.  */
-#define DT_ALPHA_PLTRO         (DT_LOPROC + 0)
-#define DT_ALPHA_NUM           1
-
-/* PowerPC specific declarations */
-
-/* Values for Elf32/64_Ehdr.e_flags.  */
-#define EF_PPC_EMB             0x80000000      /* PowerPC embedded flag */
-
-/* Cygnus local bits below */
-#define EF_PPC_RELOCATABLE     0x00010000      /* PowerPC -mrelocatable flag*/
-#define EF_PPC_RELOCATABLE_LIB 0x00008000      /* PowerPC -mrelocatable-lib
-                                                  flag */
-
-/* PowerPC relocations defined by the ABIs */
-#define R_PPC_NONE             0
-#define R_PPC_ADDR32           1       /* 32bit absolute address */
-#define R_PPC_ADDR24           2       /* 26bit address, 2 bits ignored.  */
-#define R_PPC_ADDR16           3       /* 16bit absolute address */
-#define R_PPC_ADDR16_LO                4       /* lower 16bit of absolute address */
-#define R_PPC_ADDR16_HI                5       /* high 16bit of absolute address */
-#define R_PPC_ADDR16_HA                6       /* adjusted high 16bit */
-#define R_PPC_ADDR14           7       /* 16bit address, 2 bits ignored */
-#define R_PPC_ADDR14_BRTAKEN   8
-#define R_PPC_ADDR14_BRNTAKEN  9
-#define R_PPC_REL24            10      /* PC relative 26 bit */
-#define R_PPC_REL14            11      /* PC relative 16 bit */
-#define R_PPC_REL14_BRTAKEN    12
-#define R_PPC_REL14_BRNTAKEN   13
-#define R_PPC_GOT16            14
-#define R_PPC_GOT16_LO         15
-#define R_PPC_GOT16_HI         16
-#define R_PPC_GOT16_HA         17
-#define R_PPC_PLTREL24         18
-#define R_PPC_COPY             19
-#define R_PPC_GLOB_DAT         20
-#define R_PPC_JMP_SLOT         21
-#define R_PPC_RELATIVE         22
-#define R_PPC_LOCAL24PC                23
-#define R_PPC_UADDR32          24
-#define R_PPC_UADDR16          25
-#define R_PPC_REL32            26
-#define R_PPC_PLT32            27
-#define R_PPC_PLTREL32         28
-#define R_PPC_PLT16_LO         29
-#define R_PPC_PLT16_HI         30
-#define R_PPC_PLT16_HA         31
-#define R_PPC_SDAREL16         32
-#define R_PPC_SECTOFF          33
-#define R_PPC_SECTOFF_LO       34
-#define R_PPC_SECTOFF_HI       35
-#define R_PPC_SECTOFF_HA       36
-
-/* PowerPC relocations defined for the TLS access ABI.  */
-#define R_PPC_TLS              67 /* none      (sym+add)@tls */
-#define R_PPC_DTPMOD32         68 /* word32    (sym+add)@dtpmod */
-#define R_PPC_TPREL16          69 /* half16*   (sym+add)@tprel */
-#define R_PPC_TPREL16_LO       70 /* half16    (sym+add)@tprel@l */
-#define R_PPC_TPREL16_HI       71 /* half16    (sym+add)@tprel@h */
-#define R_PPC_TPREL16_HA       72 /* half16    (sym+add)@tprel@ha */
-#define R_PPC_TPREL32          73 /* word32    (sym+add)@tprel */
-#define R_PPC_DTPREL16         74 /* half16*   (sym+add)@dtprel */
-#define R_PPC_DTPREL16_LO      75 /* half16    (sym+add)@dtprel@l */
-#define R_PPC_DTPREL16_HI      76 /* half16    (sym+add)@dtprel@h */
-#define R_PPC_DTPREL16_HA      77 /* half16    (sym+add)@dtprel@ha */
-#define R_PPC_DTPREL32         78 /* word32    (sym+add)@dtprel */
-#define R_PPC_GOT_TLSGD16      79 /* half16*   (sym+add)@got@tlsgd */
-#define R_PPC_GOT_TLSGD16_LO   80 /* half16    (sym+add)@got@tlsgd@l */
-#define R_PPC_GOT_TLSGD16_HI   81 /* half16    (sym+add)@got@tlsgd@h */
-#define R_PPC_GOT_TLSGD16_HA   82 /* half16    (sym+add)@got@tlsgd@ha */
-#define R_PPC_GOT_TLSLD16      83 /* half16*   (sym+add)@got@tlsld */
-#define R_PPC_GOT_TLSLD16_LO   84 /* half16    (sym+add)@got@tlsld@l */
-#define R_PPC_GOT_TLSLD16_HI   85 /* half16    (sym+add)@got@tlsld@h */
-#define R_PPC_GOT_TLSLD16_HA   86 /* half16    (sym+add)@got@tlsld@ha */
-#define R_PPC_GOT_TPREL16      87 /* half16*   (sym+add)@got@tprel */
-#define R_PPC_GOT_TPREL16_LO   88 /* half16    (sym+add)@got@tprel@l */
-#define R_PPC_GOT_TPREL16_HI   89 /* half16    (sym+add)@got@tprel@h */
-#define R_PPC_GOT_TPREL16_HA   90 /* half16    (sym+add)@got@tprel@ha */
-#define R_PPC_GOT_DTPREL16     91 /* half16*   (sym+add)@got@dtprel */
-#define R_PPC_GOT_DTPREL16_LO  92 /* half16*   (sym+add)@got@dtprel@l */
-#define R_PPC_GOT_DTPREL16_HI  93 /* half16*   (sym+add)@got@dtprel@h */
-#define R_PPC_GOT_DTPREL16_HA  94 /* half16*   (sym+add)@got@dtprel@ha */
-
-/* The remaining relocs are from the Embedded ELF ABI, and are not
-   in the SVR4 ELF ABI.  */
-#define R_PPC_EMB_NADDR32      101
-#define R_PPC_EMB_NADDR16      102
-#define R_PPC_EMB_NADDR16_LO   103
-#define R_PPC_EMB_NADDR16_HI   104
-#define R_PPC_EMB_NADDR16_HA   105
-#define R_PPC_EMB_SDAI16       106
-#define R_PPC_EMB_SDA2I16      107
-#define R_PPC_EMB_SDA2REL      108
-#define R_PPC_EMB_SDA21                109     /* 16 bit offset in SDA */
-#define R_PPC_EMB_MRKREF       110
-#define R_PPC_EMB_RELSEC16     111
-#define R_PPC_EMB_RELST_LO     112
-#define R_PPC_EMB_RELST_HI     113
-#define R_PPC_EMB_RELST_HA     114
-#define R_PPC_EMB_BIT_FLD      115
-#define R_PPC_EMB_RELSDA       116     /* 16 bit relative offset in SDA */
-
-/* Diab tool relocations.  */
-#define R_PPC_DIAB_SDA21_LO    180     /* like EMB_SDA21, but lower 16 bit */
-#define R_PPC_DIAB_SDA21_HI    181     /* like EMB_SDA21, but high 16 bit */
-#define R_PPC_DIAB_SDA21_HA    182     /* like EMB_SDA21, adjusted high 16 */
-#define R_PPC_DIAB_RELSDA_LO   183     /* like EMB_RELSDA, but lower 16 bit */
-#define R_PPC_DIAB_RELSDA_HI   184     /* like EMB_RELSDA, but high 16 bit */
-#define R_PPC_DIAB_RELSDA_HA   185     /* like EMB_RELSDA, adjusted high 16 */
-
-/* GNU extension to support local ifunc.  */
-#define R_PPC_IRELATIVE                248
-
-/* GNU relocs used in PIC code sequences.  */
-#define R_PPC_REL16            249     /* half16   (sym+add-.) */
-#define R_PPC_REL16_LO         250     /* half16   (sym+add-.)@l */
-#define R_PPC_REL16_HI         251     /* half16   (sym+add-.)@h */
-#define R_PPC_REL16_HA         252     /* half16   (sym+add-.)@ha */
-
-/* This is a phony reloc to handle any old fashioned TOC16 references
-   that may still be in object files.  */
-#define R_PPC_TOC16            255
-
-/* PowerPC specific values for the Dyn d_tag field.  */
-#define DT_PPC_GOT             (DT_LOPROC + 0)
-#define DT_PPC_NUM             1
-
-/* PowerPC64 relocations defined by the ABIs */
-#define R_PPC64_NONE           R_PPC_NONE
-#define R_PPC64_ADDR32         R_PPC_ADDR32 /* 32bit absolute address */
-#define R_PPC64_ADDR24         R_PPC_ADDR24 /* 26bit address, word aligned */
-#define R_PPC64_ADDR16         R_PPC_ADDR16 /* 16bit absolute address */
-#define R_PPC64_ADDR16_LO      R_PPC_ADDR16_LO /* lower 16bits of address */
-#define R_PPC64_ADDR16_HI      R_PPC_ADDR16_HI /* high 16bits of address. */
-#define R_PPC64_ADDR16_HA      R_PPC_ADDR16_HA /* adjusted high 16bits.  */
-#define R_PPC64_ADDR14         R_PPC_ADDR14 /* 16bit address, word aligned */
-#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN
-#define R_PPC64_ADDR14_BRNTAKEN        R_PPC_ADDR14_BRNTAKEN
-#define R_PPC64_REL24          R_PPC_REL24 /* PC-rel. 26 bit, word aligned */
-#define R_PPC64_REL14          R_PPC_REL14 /* PC relative 16 bit */
-#define R_PPC64_REL14_BRTAKEN  R_PPC_REL14_BRTAKEN
-#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN
-#define R_PPC64_GOT16          R_PPC_GOT16
-#define R_PPC64_GOT16_LO       R_PPC_GOT16_LO
-#define R_PPC64_GOT16_HI       R_PPC_GOT16_HI
-#define R_PPC64_GOT16_HA       R_PPC_GOT16_HA
-
-#define R_PPC64_COPY           R_PPC_COPY
-#define R_PPC64_GLOB_DAT       R_PPC_GLOB_DAT
-#define R_PPC64_JMP_SLOT       R_PPC_JMP_SLOT
-#define R_PPC64_RELATIVE       R_PPC_RELATIVE
-
-#define R_PPC64_UADDR32                R_PPC_UADDR32
-#define R_PPC64_UADDR16                R_PPC_UADDR16
-#define R_PPC64_REL32          R_PPC_REL32
-#define R_PPC64_PLT32          R_PPC_PLT32
-#define R_PPC64_PLTREL32       R_PPC_PLTREL32
-#define R_PPC64_PLT16_LO       R_PPC_PLT16_LO
-#define R_PPC64_PLT16_HI       R_PPC_PLT16_HI
-#define R_PPC64_PLT16_HA       R_PPC_PLT16_HA
-
-#define R_PPC64_SECTOFF                R_PPC_SECTOFF
-#define R_PPC64_SECTOFF_LO     R_PPC_SECTOFF_LO
-#define R_PPC64_SECTOFF_HI     R_PPC_SECTOFF_HI
-#define R_PPC64_SECTOFF_HA     R_PPC_SECTOFF_HA
-#define R_PPC64_ADDR30         37 /* word30 (S + A - P) >> 2 */
-#define R_PPC64_ADDR64         38 /* doubleword64 S + A */
-#define R_PPC64_ADDR16_HIGHER  39 /* half16 #higher(S + A) */
-#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */
-#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */
-#define R_PPC64_ADDR16_HIGHESTA        42 /* half16 #highesta(S + A) */
-#define R_PPC64_UADDR64                43 /* doubleword64 S + A */
-#define R_PPC64_REL64          44 /* doubleword64 S + A - P */
-#define R_PPC64_PLT64          45 /* doubleword64 L + A */
-#define R_PPC64_PLTREL64       46 /* doubleword64 L + A - P */
-#define R_PPC64_TOC16          47 /* half16* S + A - .TOC */
-#define R_PPC64_TOC16_LO       48 /* half16 #lo(S + A - .TOC.) */
-#define R_PPC64_TOC16_HI       49 /* half16 #hi(S + A - .TOC.) */
-#define R_PPC64_TOC16_HA       50 /* half16 #ha(S + A - .TOC.) */
-#define R_PPC64_TOC            51 /* doubleword64 .TOC */
-#define R_PPC64_PLTGOT16       52 /* half16* M + A */
-#define R_PPC64_PLTGOT16_LO    53 /* half16 #lo(M + A) */
-#define R_PPC64_PLTGOT16_HI    54 /* half16 #hi(M + A) */
-#define R_PPC64_PLTGOT16_HA    55 /* half16 #ha(M + A) */
-
-#define R_PPC64_ADDR16_DS      56 /* half16ds* (S + A) >> 2 */
-#define R_PPC64_ADDR16_LO_DS   57 /* half16ds  #lo(S + A) >> 2 */
-#define R_PPC64_GOT16_DS       58 /* half16ds* (G + A) >> 2 */
-#define R_PPC64_GOT16_LO_DS    59 /* half16ds  #lo(G + A) >> 2 */
-#define R_PPC64_PLT16_LO_DS    60 /* half16ds  #lo(L + A) >> 2 */
-#define R_PPC64_SECTOFF_DS     61 /* half16ds* (R + A) >> 2 */
-#define R_PPC64_SECTOFF_LO_DS  62 /* half16ds  #lo(R + A) >> 2 */
-#define R_PPC64_TOC16_DS       63 /* half16ds* (S + A - .TOC.) >> 2 */
-#define R_PPC64_TOC16_LO_DS    64 /* half16ds  #lo(S + A - .TOC.) >> 2 */
-#define R_PPC64_PLTGOT16_DS    65 /* half16ds* (M + A) >> 2 */
-#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds  #lo(M + A) >> 2 */
-
-/* PowerPC64 relocations defined for the TLS access ABI.  */
-#define R_PPC64_TLS            67 /* none      (sym+add)@tls */
-#define R_PPC64_DTPMOD64       68 /* doubleword64 (sym+add)@dtpmod */
-#define R_PPC64_TPREL16                69 /* half16*   (sym+add)@tprel */
-#define R_PPC64_TPREL16_LO     70 /* half16    (sym+add)@tprel@l */
-#define R_PPC64_TPREL16_HI     71 /* half16    (sym+add)@tprel@h */
-#define R_PPC64_TPREL16_HA     72 /* half16    (sym+add)@tprel@ha */
-#define R_PPC64_TPREL64                73 /* doubleword64 (sym+add)@tprel */
-#define R_PPC64_DTPREL16       74 /* half16*   (sym+add)@dtprel */
-#define R_PPC64_DTPREL16_LO    75 /* half16    (sym+add)@dtprel@l */
-#define R_PPC64_DTPREL16_HI    76 /* half16    (sym+add)@dtprel@h */
-#define R_PPC64_DTPREL16_HA    77 /* half16    (sym+add)@dtprel@ha */
-#define R_PPC64_DTPREL64       78 /* doubleword64 (sym+add)@dtprel */
-#define R_PPC64_GOT_TLSGD16    79 /* half16*   (sym+add)@got@tlsgd */
-#define R_PPC64_GOT_TLSGD16_LO 80 /* half16    (sym+add)@got@tlsgd@l */
-#define R_PPC64_GOT_TLSGD16_HI 81 /* half16    (sym+add)@got@tlsgd@h */
-#define R_PPC64_GOT_TLSGD16_HA 82 /* half16    (sym+add)@got@tlsgd@ha */
-#define R_PPC64_GOT_TLSLD16    83 /* half16*   (sym+add)@got@tlsld */
-#define R_PPC64_GOT_TLSLD16_LO 84 /* half16    (sym+add)@got@tlsld@l */
-#define R_PPC64_GOT_TLSLD16_HI 85 /* half16    (sym+add)@got@tlsld@h */
-#define R_PPC64_GOT_TLSLD16_HA 86 /* half16    (sym+add)@got@tlsld@ha */
-#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */
-#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */
-#define R_PPC64_GOT_TPREL16_HI 89 /* half16    (sym+add)@got@tprel@h */
-#define R_PPC64_GOT_TPREL16_HA 90 /* half16    (sym+add)@got@tprel@ha */
-#define R_PPC64_GOT_DTPREL16_DS        91 /* half16ds* (sym+add)@got@dtprel */
-#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */
-#define R_PPC64_GOT_DTPREL16_HI        93 /* half16    (sym+add)@got@dtprel@h */
-#define R_PPC64_GOT_DTPREL16_HA        94 /* half16    (sym+add)@got@dtprel@ha */
-#define R_PPC64_TPREL16_DS     95 /* half16ds* (sym+add)@tprel */
-#define R_PPC64_TPREL16_LO_DS  96 /* half16ds  (sym+add)@tprel@l */
-#define R_PPC64_TPREL16_HIGHER 97 /* half16    (sym+add)@tprel@higher */
-#define R_PPC64_TPREL16_HIGHERA        98 /* half16    (sym+add)@tprel@highera */
-#define R_PPC64_TPREL16_HIGHEST        99 /* half16    (sym+add)@tprel@highest */
-#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */
-#define R_PPC64_DTPREL16_DS    101 /* half16ds* (sym+add)@dtprel */
-#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */
-#define R_PPC64_DTPREL16_HIGHER        103 /* half16   (sym+add)@dtprel@higher */
-#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */
-#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */
-#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16        (sym+add)@dtprel@highesta */
-#define R_PPC64_TLSGD          107 /* none     (sym+add)@tlsgd */
-#define R_PPC64_TLSLD          108 /* none     (sym+add)@tlsld */
-#define R_PPC64_TOCSAVE                109 /* none */
-
-/* Added when HA and HI relocs were changed to report overflows.  */
-#define R_PPC64_ADDR16_HIGH    110
-#define R_PPC64_ADDR16_HIGHA   111
-#define R_PPC64_TPREL16_HIGH   112
-#define R_PPC64_TPREL16_HIGHA  113
-#define R_PPC64_DTPREL16_HIGH  114
-#define R_PPC64_DTPREL16_HIGHA 115
-
-/* GNU extension to support local ifunc.  */
-#define R_PPC64_JMP_IREL       247
-#define R_PPC64_IRELATIVE      248
-#define R_PPC64_REL16          249     /* half16   (sym+add-.) */
-#define R_PPC64_REL16_LO       250     /* half16   (sym+add-.)@l */
-#define R_PPC64_REL16_HI       251     /* half16   (sym+add-.)@h */
-#define R_PPC64_REL16_HA       252     /* half16   (sym+add-.)@ha */
-
-/* e_flags bits specifying ABI.
-   1 for original function descriptor using ABI,
-   2 for revised ABI without function descriptors,
-   0 for unspecified or not using any features affected by the differences.  */
-#define EF_PPC64_ABI   3
-
-/* PowerPC64 specific values for the Dyn d_tag field.  */
-#define DT_PPC64_GLINK  (DT_LOPROC + 0)
-#define DT_PPC64_OPD   (DT_LOPROC + 1)
-#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
-#define DT_PPC64_OPT   (DT_LOPROC + 3)
-#define DT_PPC64_NUM    3
-
-/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry.  */
-#define PPC64_OPT_TLS          1
-#define PPC64_OPT_MULTI_TOC    2
-
-/* PowerPC64 specific values for the Elf64_Sym st_other field.  */
-#define STO_PPC64_LOCAL_BIT    5
-#define STO_PPC64_LOCAL_MASK   (7 << STO_PPC64_LOCAL_BIT)
-#define PPC64_LOCAL_ENTRY_OFFSET(other)                                \
- (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2)
-
-
-/* ARM specific declarations */
-
-/* Processor specific flags for the ELF header e_flags field.  */
-#define EF_ARM_RELEXEC         0x01
-#define EF_ARM_HASENTRY                0x02
-#define EF_ARM_INTERWORK       0x04
-#define EF_ARM_APCS_26         0x08
-#define EF_ARM_APCS_FLOAT      0x10
-#define EF_ARM_PIC             0x20
-#define EF_ARM_ALIGN8          0x40 /* 8-bit structure alignment is in use */
-#define EF_ARM_NEW_ABI         0x80
-#define EF_ARM_OLD_ABI         0x100
-#define EF_ARM_SOFT_FLOAT      0x200
-#define EF_ARM_VFP_FLOAT       0x400
-#define EF_ARM_MAVERICK_FLOAT  0x800
-
-#define EF_ARM_ABI_FLOAT_SOFT  0x200   /* NB conflicts with EF_ARM_SOFT_FLOAT */
-#define EF_ARM_ABI_FLOAT_HARD  0x400   /* NB conflicts with EF_ARM_VFP_FLOAT */
-
-
-/* Other constants defined in the ARM ELF spec. version B-01.  */
-/* NB. These conflict with values defined above.  */
-#define EF_ARM_SYMSARESORTED   0x04
-#define EF_ARM_DYNSYMSUSESEGIDX        0x08
-#define EF_ARM_MAPSYMSFIRST    0x10
-#define EF_ARM_EABIMASK                0XFF000000
-
-/* Constants defined in AAELF.  */
-#define EF_ARM_BE8         0x00800000
-#define EF_ARM_LE8         0x00400000
-
-#define EF_ARM_EABI_VERSION(flags)     ((flags) & EF_ARM_EABIMASK)
-#define EF_ARM_EABI_UNKNOWN    0x00000000
-#define EF_ARM_EABI_VER1       0x01000000
-#define EF_ARM_EABI_VER2       0x02000000
-#define EF_ARM_EABI_VER3       0x03000000
-#define EF_ARM_EABI_VER4       0x04000000
-#define EF_ARM_EABI_VER5       0x05000000
-
-/* Additional symbol types for Thumb.  */
-#define STT_ARM_TFUNC          STT_LOPROC /* A Thumb function.  */
-#define STT_ARM_16BIT          STT_HIPROC /* A Thumb label.  */
-
-/* ARM-specific values for sh_flags */
-#define SHF_ARM_ENTRYSECT      0x10000000 /* Section contains an entry point */
-#define SHF_ARM_COMDEF         0x80000000 /* Section may be multiply defined
-                                             in the input to a link step.  */
-
-/* ARM-specific program header flags */
-#define PF_ARM_SB              0x10000000 /* Segment contains the location
-                                             addressed by the static base. */
-#define PF_ARM_PI              0x20000000 /* Position-independent segment.  */
-#define PF_ARM_ABS             0x40000000 /* Absolute segment.  */
-
-/* Processor specific values for the Phdr p_type field.  */
-#define PT_ARM_EXIDX           (PT_LOPROC + 1) /* ARM unwind segment.  */
-
-/* Processor specific values for the Shdr sh_type field.  */
-#define SHT_ARM_EXIDX          (SHT_LOPROC + 1) /* ARM unwind section.  */
-#define SHT_ARM_PREEMPTMAP     (SHT_LOPROC + 2) /* Preemption details.  */
-#define SHT_ARM_ATTRIBUTES     (SHT_LOPROC + 3) /* ARM attributes section.  */
-
-
-/* AArch64 relocs.  */
-
-#define R_AARCH64_NONE            0    /* No relocation.  */
-#define R_AARCH64_ABS64         257    /* Direct 64 bit. */
-#define R_AARCH64_ABS32         258    /* Direct 32 bit.  */
-#define R_AARCH64_ABS16                259     /* Direct 16-bit.  */
-#define R_AARCH64_PREL64       260     /* PC-relative 64-bit.  */
-#define R_AARCH64_PREL32       261     /* PC-relative 32-bit.  */
-#define R_AARCH64_PREL16       262     /* PC-relative 16-bit.  */
-#define R_AARCH64_MOVW_UABS_G0 263     /* Dir. MOVZ imm. from bits 15:0.  */
-#define R_AARCH64_MOVW_UABS_G0_NC 264  /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_UABS_G1 265     /* Dir. MOVZ imm. from bits 31:16.  */
-#define R_AARCH64_MOVW_UABS_G1_NC 266  /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_UABS_G2 267     /* Dir. MOVZ imm. from bits 47:32.  */
-#define R_AARCH64_MOVW_UABS_G2_NC 268  /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_UABS_G3 269     /* Dir. MOV{K,Z} imm. from 63:48.  */
-#define R_AARCH64_MOVW_SABS_G0 270     /* Dir. MOV{N,Z} imm. from 15:0.  */
-#define R_AARCH64_MOVW_SABS_G1 271     /* Dir. MOV{N,Z} imm. from 31:16.  */
-#define R_AARCH64_MOVW_SABS_G2 272     /* Dir. MOV{N,Z} imm. from 47:32.  */
-#define R_AARCH64_LD_PREL_LO19 273     /* PC-rel. LD imm. from bits 20:2.  */
-#define R_AARCH64_ADR_PREL_LO21        274     /* PC-rel. ADR imm. from bits 20:0.  */
-#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12.  */
-#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check.  */
-#define R_AARCH64_ADD_ABS_LO12_NC 277  /* Dir. ADD imm. from bits 11:0.  */
-#define R_AARCH64_LDST8_ABS_LO12_NC 278        /* Likewise for LD/ST; no check. */
-#define R_AARCH64_TSTBR14      279     /* PC-rel. TBZ/TBNZ imm. from 15:2.  */
-#define R_AARCH64_CONDBR19     280     /* PC-rel. cond. br. imm. from 20:2. */
-#define R_AARCH64_JUMP26       282     /* PC-rel. B imm. from bits 27:2.  */
-#define R_AARCH64_CALL26       283     /* Likewise for CALL.  */
-#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1.  */
-#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2.  */
-#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3.  */
-#define R_AARCH64_MOVW_PREL_G0 287     /* PC-rel. MOV{N,Z} imm. from 15:0.  */
-#define R_AARCH64_MOVW_PREL_G0_NC 288  /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_PREL_G1 289     /* PC-rel. MOV{N,Z} imm. from 31:16. */
-#define R_AARCH64_MOVW_PREL_G1_NC 290  /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_PREL_G2 291     /* PC-rel. MOV{N,Z} imm. from 47:32. */
-#define R_AARCH64_MOVW_PREL_G2_NC 292  /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_PREL_G3 293     /* PC-rel. MOV{N,Z} imm. from 63:48. */
-#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4.  */
-#define R_AARCH64_MOVW_GOTOFF_G0 300   /* GOT-rel. off. MOV{N,Z} imm. 15:0. */
-#define R_AARCH64_MOVW_GOTOFF_G0_NC 301        /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_GOTOFF_G1 302   /* GOT-rel. o. MOV{N,Z} imm. 31:16.  */
-#define R_AARCH64_MOVW_GOTOFF_G1_NC 303        /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_GOTOFF_G2 304   /* GOT-rel. o. MOV{N,Z} imm. 47:32.  */
-#define R_AARCH64_MOVW_GOTOFF_G2_NC 305        /* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_GOTOFF_G3 306   /* GOT-rel. o. MOV{N,Z} imm. 63:48.  */
-#define R_AARCH64_GOTREL64     307     /* GOT-relative 64-bit.  */
-#define R_AARCH64_GOTREL32     308     /* GOT-relative 32-bit.  */
-#define R_AARCH64_GOT_LD_PREL19        309     /* PC-rel. GOT off. load imm. 20:2.  */
-#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3.  */
-#define R_AARCH64_ADR_GOT_PAGE 311     /* P-page-rel. GOT off. ADRP 32:12.  */
-#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3.  */
-#define R_AARCH64_LD64_GOTPAGE_LO15 313        /* GOT-page-rel. GOT off. LD/ST 14:3 */
-#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0.  */
-#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12.  */
-#define R_AARCH64_TLSGD_ADD_LO12_NC 514        /* direct ADD imm. from 11:0.  */
-#define R_AARCH64_TLSGD_MOVW_G1        515     /* GOT-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0.  */
-#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model.  */
-#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model.  */
-#define R_AARCH64_TLSLD_ADD_LO12_NC 519        /* Like 514; local dynamic model.  */
-#define R_AARCH64_TLSLD_MOVW_G1        520     /* Like 515; local dynamic model.  */
-#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model.  */
-#define R_AARCH64_TLSLD_LD_PREL19 522  /* TLS PC-rel. load imm. 20:2.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */
-#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0.  */
-#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check.  */
-#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0.  */
-#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1.  */
-#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2.  */
-#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3.  */
-#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check.  */
-#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0.  */
-#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12.  */
-#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3.  */
-#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12.  */
-#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0.  */
-#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check.  */
-#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0.  */
-#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */
-#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1.  */
-#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check.  */
-#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2.  */
-#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check.  */
-#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3.  */
-#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check.  */
-#define R_AARCH64_TLSDESC_LD_PREL19 560        /* PC-rel. load immediate 20:2.  */
-#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0.  */
-#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12.  */
-#define R_AARCH64_TLSDESC_LD64_LO12 563        /* Direct LD off. from 11:3.  */
-#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0.  */
-#define R_AARCH64_TLSDESC_OFF_G1 565   /* GOT-rel. MOV{N,Z} imm. 31:16.  */
-#define R_AARCH64_TLSDESC_OFF_G0_NC 566        /* GOT-rel. MOVK imm. 15:0; no ck.  */
-#define R_AARCH64_TLSDESC_LDR  567     /* Relax LDR.  */
-#define R_AARCH64_TLSDESC_ADD  568     /* Relax ADD.  */
-#define R_AARCH64_TLSDESC_CALL 569     /* Relax BLR.  */
-#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4.  */
-#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */
-#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check.  */
-#define R_AARCH64_COPY         1024    /* Copy symbol at runtime.  */
-#define R_AARCH64_GLOB_DAT     1025    /* Create GOT entry.  */
-#define R_AARCH64_JUMP_SLOT    1026    /* Create PLT entry.  */
-#define R_AARCH64_RELATIVE     1027    /* Adjust by program base.  */
-#define R_AARCH64_TLS_DTPMOD64 1028    /* Module number, 64 bit.  */
-#define R_AARCH64_TLS_DTPREL64 1029    /* Module-relative offset, 64 bit.  */
-#define R_AARCH64_TLS_TPREL64  1030    /* TP-relative offset, 64 bit.  */
-#define R_AARCH64_TLSDESC      1031    /* TLS Descriptor.  */
-#define R_AARCH64_IRELATIVE    1032    /* STT_GNU_IFUNC relocation.  */
-
-/* ARM relocs.  */
-
-#define R_ARM_NONE             0       /* No reloc */
-#define R_ARM_PC24             1       /* Deprecated PC relative 26
-                                          bit branch.  */
-#define R_ARM_ABS32            2       /* Direct 32 bit  */
-#define R_ARM_REL32            3       /* PC relative 32 bit */
-#define R_ARM_PC13             4
-#define R_ARM_ABS16            5       /* Direct 16 bit */
-#define R_ARM_ABS12            6       /* Direct 12 bit */
-#define R_ARM_THM_ABS5         7       /* Direct & 0x7C (LDR, STR).  */
-#define R_ARM_ABS8             8       /* Direct 8 bit */
-#define R_ARM_SBREL32          9
-#define R_ARM_THM_PC22         10      /* PC relative 24 bit (Thumb32 BL).  */
-#define R_ARM_THM_PC8          11      /* PC relative & 0x3FC
-                                          (Thumb16 LDR, ADD, ADR).  */
-#define R_ARM_AMP_VCALL9       12
-#define R_ARM_SWI24            13      /* Obsolete static relocation.  */
-#define R_ARM_TLS_DESC         13      /* Dynamic relocation.  */
-#define R_ARM_THM_SWI8         14      /* Reserved.  */
-#define R_ARM_XPC25            15      /* Reserved.  */
-#define R_ARM_THM_XPC22                16      /* Reserved.  */
-#define R_ARM_TLS_DTPMOD32     17      /* ID of module containing symbol */
-#define R_ARM_TLS_DTPOFF32     18      /* Offset in TLS block */
-#define R_ARM_TLS_TPOFF32      19      /* Offset in static TLS block */
-#define R_ARM_COPY             20      /* Copy symbol at runtime */
-#define R_ARM_GLOB_DAT         21      /* Create GOT entry */
-#define R_ARM_JUMP_SLOT                22      /* Create PLT entry */
-#define R_ARM_RELATIVE         23      /* Adjust by program base */
-#define R_ARM_GOTOFF           24      /* 32 bit offset to GOT */
-#define R_ARM_GOTPC            25      /* 32 bit PC relative offset to GOT */
-#define R_ARM_GOT32            26      /* 32 bit GOT entry */
-#define R_ARM_PLT32            27      /* Deprecated, 32 bit PLT address.  */
-#define R_ARM_CALL             28      /* PC relative 24 bit (BL, BLX).  */
-#define R_ARM_JUMP24           29      /* PC relative 24 bit
-                                          (B, BL<cond>).  */
-#define R_ARM_THM_JUMP24       30      /* PC relative 24 bit (Thumb32 B.W).  */
-#define R_ARM_BASE_ABS         31      /* Adjust by program base.  */
-#define R_ARM_ALU_PCREL_7_0    32      /* Obsolete.  */
-#define R_ARM_ALU_PCREL_15_8   33      /* Obsolete.  */
-#define R_ARM_ALU_PCREL_23_15  34      /* Obsolete.  */
-#define R_ARM_LDR_SBREL_11_0   35      /* Deprecated, prog. base relative.  */
-#define R_ARM_ALU_SBREL_19_12  36      /* Deprecated, prog. base relative.  */
-#define R_ARM_ALU_SBREL_27_20  37      /* Deprecated, prog. base relative.  */
-#define R_ARM_TARGET1          38
-#define R_ARM_SBREL31          39      /* Program base relative.  */
-#define R_ARM_V4BX             40
-#define R_ARM_TARGET2          41
-#define R_ARM_PREL31           42      /* 32 bit PC relative.  */
-#define R_ARM_MOVW_ABS_NC      43      /* Direct 16-bit (MOVW).  */
-#define R_ARM_MOVT_ABS         44      /* Direct high 16-bit (MOVT).  */
-#define R_ARM_MOVW_PREL_NC     45      /* PC relative 16-bit (MOVW).  */
-#define R_ARM_MOVT_PREL                46      /* PC relative (MOVT).  */
-#define R_ARM_THM_MOVW_ABS_NC  47      /* Direct 16 bit (Thumb32 MOVW).  */
-#define R_ARM_THM_MOVT_ABS     48      /* Direct high 16 bit
-                                          (Thumb32 MOVT).  */
-#define R_ARM_THM_MOVW_PREL_NC 49      /* PC relative 16 bit
-                                          (Thumb32 MOVW).  */
-#define R_ARM_THM_MOVT_PREL    50      /* PC relative high 16 bit
-                                          (Thumb32 MOVT).  */
-#define R_ARM_THM_JUMP19       51      /* PC relative 20 bit
-                                          (Thumb32 B<cond>.W).  */
-#define R_ARM_THM_JUMP6                52      /* PC relative X & 0x7E
-                                          (Thumb16 CBZ, CBNZ).  */
-#define R_ARM_THM_ALU_PREL_11_0        53      /* PC relative 12 bit
-                                          (Thumb32 ADR.W).  */
-#define R_ARM_THM_PC12         54      /* PC relative 12 bit
-                                          (Thumb32 LDR{D,SB,H,SH}).  */
-#define R_ARM_ABS32_NOI                55      /* Direct 32-bit.  */
-#define R_ARM_REL32_NOI                56      /* PC relative 32-bit.  */
-#define R_ARM_ALU_PC_G0_NC     57      /* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G0                58      /* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G1_NC     59      /* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G1                60      /* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G2                61      /* PC relative (ADD, SUB).  */
-#define R_ARM_LDR_PC_G1                62      /* PC relative (LDR,STR,LDRB,STRB).  */
-#define R_ARM_LDR_PC_G2                63      /* PC relative (LDR,STR,LDRB,STRB).  */
-#define R_ARM_LDRS_PC_G0       64      /* PC relative (STR{D,H},
-                                          LDR{D,SB,H,SH}).  */
-#define R_ARM_LDRS_PC_G1       65      /* PC relative (STR{D,H},
-                                          LDR{D,SB,H,SH}).  */
-#define R_ARM_LDRS_PC_G2       66      /* PC relative (STR{D,H},
-                                          LDR{D,SB,H,SH}).  */
-#define R_ARM_LDC_PC_G0                67      /* PC relative (LDC, STC).  */
-#define R_ARM_LDC_PC_G1                68      /* PC relative (LDC, STC).  */
-#define R_ARM_LDC_PC_G2                69      /* PC relative (LDC, STC).  */
-#define R_ARM_ALU_SB_G0_NC     70      /* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G0                71      /* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G1_NC     72      /* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G1                73      /* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G2                74      /* Program base relative (ADD,SUB).  */
-#define R_ARM_LDR_SB_G0                75      /* Program base relative (LDR,
-                                          STR, LDRB, STRB).  */
-#define R_ARM_LDR_SB_G1                76      /* Program base relative
-                                          (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDR_SB_G2                77      /* Program base relative
-                                          (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDRS_SB_G0       78      /* Program base relative
-                                          (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDRS_SB_G1       79      /* Program base relative
-                                          (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDRS_SB_G2       80      /* Program base relative
-                                          (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDC_SB_G0                81      /* Program base relative (LDC,STC).  */
-#define R_ARM_LDC_SB_G1                82      /* Program base relative (LDC,STC).  */
-#define R_ARM_LDC_SB_G2                83      /* Program base relative (LDC,STC).  */
-#define R_ARM_MOVW_BREL_NC     84      /* Program base relative 16
-                                          bit (MOVW).  */
-#define R_ARM_MOVT_BREL                85      /* Program base relative high
-                                          16 bit (MOVT).  */
-#define R_ARM_MOVW_BREL                86      /* Program base relative 16
-                                          bit (MOVW).  */
-#define R_ARM_THM_MOVW_BREL_NC 87      /* Program base relative 16
-                                          bit (Thumb32 MOVW).  */
-#define R_ARM_THM_MOVT_BREL    88      /* Program base relative high
-                                          16 bit (Thumb32 MOVT).  */
-#define R_ARM_THM_MOVW_BREL    89      /* Program base relative 16
-                                          bit (Thumb32 MOVW).  */
-#define R_ARM_TLS_GOTDESC      90
-#define R_ARM_TLS_CALL         91
-#define R_ARM_TLS_DESCSEQ      92      /* TLS relaxation.  */
-#define R_ARM_THM_TLS_CALL     93
-#define R_ARM_PLT32_ABS                94
-#define R_ARM_GOT_ABS          95      /* GOT entry.  */
-#define R_ARM_GOT_PREL         96      /* PC relative GOT entry.  */
-#define R_ARM_GOT_BREL12       97      /* GOT entry relative to GOT
-                                          origin (LDR).  */
-#define R_ARM_GOTOFF12         98      /* 12 bit, GOT entry relative
-                                          to GOT origin (LDR, STR).  */
-#define R_ARM_GOTRELAX         99
-#define R_ARM_GNU_VTENTRY      100
-#define R_ARM_GNU_VTINHERIT    101
-#define R_ARM_THM_PC11         102     /* PC relative & 0xFFE (Thumb16 B).  */
-#define R_ARM_THM_PC9          103     /* PC relative & 0x1FE
-                                          (Thumb16 B/B<cond>).  */
-#define R_ARM_TLS_GD32         104     /* PC-rel 32 bit for global dynamic
-                                          thread local data */
-#define R_ARM_TLS_LDM32                105     /* PC-rel 32 bit for local dynamic
-                                          thread local data */
-#define R_ARM_TLS_LDO32                106     /* 32 bit offset relative to TLS
-                                          block */
-#define R_ARM_TLS_IE32         107     /* PC-rel 32 bit for GOT entry of
-                                          static TLS block offset */
-#define R_ARM_TLS_LE32         108     /* 32 bit offset relative to static
-                                          TLS block */
-#define R_ARM_TLS_LDO12                109     /* 12 bit relative to TLS
-                                          block (LDR, STR).  */
-#define R_ARM_TLS_LE12         110     /* 12 bit relative to static
-                                          TLS block (LDR, STR).  */
-#define R_ARM_TLS_IE12GP       111     /* 12 bit GOT entry relative
-                                          to GOT origin (LDR).  */
-#define R_ARM_ME_TOO           128     /* Obsolete.  */
-#define R_ARM_THM_TLS_DESCSEQ  129
-#define R_ARM_THM_TLS_DESCSEQ16        129
-#define R_ARM_THM_TLS_DESCSEQ32        130
-#define R_ARM_THM_GOT_BREL12   131     /* GOT entry relative to GOT
-                                          origin, 12 bit (Thumb32 LDR).  */
-#define R_ARM_IRELATIVE                160
-#define R_ARM_RXPC25           249
-#define R_ARM_RSBREL32         250
-#define R_ARM_THM_RPC22                251
-#define R_ARM_RREL32           252
-#define R_ARM_RABS22           253
-#define R_ARM_RPC24            254
-#define R_ARM_RBASE            255
-/* Keep this the last entry.  */
-#define R_ARM_NUM              256
-
-/* IA-64 specific declarations.  */
-
-/* Processor specific flags for the Ehdr e_flags field.  */
-#define EF_IA_64_MASKOS                0x0000000f      /* os-specific flags */
-#define EF_IA_64_ABI64         0x00000010      /* 64-bit ABI */
-#define EF_IA_64_ARCH          0xff000000      /* arch. version mask */
-
-/* Processor specific values for the Phdr p_type field.  */
-#define PT_IA_64_ARCHEXT       (PT_LOPROC + 0) /* arch extension bits */
-#define PT_IA_64_UNWIND                (PT_LOPROC + 1) /* ia64 unwind bits */
-#define PT_IA_64_HP_OPT_ANOT   (PT_LOOS + 0x12)
-#define PT_IA_64_HP_HSL_ANOT   (PT_LOOS + 0x13)
-#define PT_IA_64_HP_STACK      (PT_LOOS + 0x14)
-
-/* Processor specific flags for the Phdr p_flags field.  */
-#define PF_IA_64_NORECOV       0x80000000      /* spec insns w/o recovery */
-
-/* Processor specific values for the Shdr sh_type field.  */
-#define SHT_IA_64_EXT          (SHT_LOPROC + 0) /* extension bits */
-#define SHT_IA_64_UNWIND       (SHT_LOPROC + 1) /* unwind bits */
-
-/* Processor specific flags for the Shdr sh_flags field.  */
-#define SHF_IA_64_SHORT                0x10000000      /* section near gp */
-#define SHF_IA_64_NORECOV      0x20000000      /* spec insns w/o recovery */
-
-/* Processor specific values for the Dyn d_tag field.  */
-#define DT_IA_64_PLT_RESERVE   (DT_LOPROC + 0)
-#define DT_IA_64_NUM           1
-
-/* IA-64 relocations.  */
-#define R_IA64_NONE            0x00    /* none */
-#define R_IA64_IMM14           0x21    /* symbol + addend, add imm14 */
-#define R_IA64_IMM22           0x22    /* symbol + addend, add imm22 */
-#define R_IA64_IMM64           0x23    /* symbol + addend, mov imm64 */
-#define R_IA64_DIR32MSB                0x24    /* symbol + addend, data4 MSB */
-#define R_IA64_DIR32LSB                0x25    /* symbol + addend, data4 LSB */
-#define R_IA64_DIR64MSB                0x26    /* symbol + addend, data8 MSB */
-#define R_IA64_DIR64LSB                0x27    /* symbol + addend, data8 LSB */
-#define R_IA64_GPREL22         0x2a    /* @gprel(sym + add), add imm22 */
-#define R_IA64_GPREL64I                0x2b    /* @gprel(sym + add), mov imm64 */
-#define R_IA64_GPREL32MSB      0x2c    /* @gprel(sym + add), data4 MSB */
-#define R_IA64_GPREL32LSB      0x2d    /* @gprel(sym + add), data4 LSB */
-#define R_IA64_GPREL64MSB      0x2e    /* @gprel(sym + add), data8 MSB */
-#define R_IA64_GPREL64LSB      0x2f    /* @gprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF22         0x32    /* @ltoff(sym + add), add imm22 */
-#define R_IA64_LTOFF64I                0x33    /* @ltoff(sym + add), mov imm64 */
-#define R_IA64_PLTOFF22                0x3a    /* @pltoff(sym + add), add imm22 */
-#define R_IA64_PLTOFF64I       0x3b    /* @pltoff(sym + add), mov imm64 */
-#define R_IA64_PLTOFF64MSB     0x3e    /* @pltoff(sym + add), data8 MSB */
-#define R_IA64_PLTOFF64LSB     0x3f    /* @pltoff(sym + add), data8 LSB */
-#define R_IA64_FPTR64I         0x43    /* @fptr(sym + add), mov imm64 */
-#define R_IA64_FPTR32MSB       0x44    /* @fptr(sym + add), data4 MSB */
-#define R_IA64_FPTR32LSB       0x45    /* @fptr(sym + add), data4 LSB */
-#define R_IA64_FPTR64MSB       0x46    /* @fptr(sym + add), data8 MSB */
-#define R_IA64_FPTR64LSB       0x47    /* @fptr(sym + add), data8 LSB */
-#define R_IA64_PCREL60B                0x48    /* @pcrel(sym + add), brl */
-#define R_IA64_PCREL21B                0x49    /* @pcrel(sym + add), ptb, call */
-#define R_IA64_PCREL21M                0x4a    /* @pcrel(sym + add), chk.s */
-#define R_IA64_PCREL21F                0x4b    /* @pcrel(sym + add), fchkf */
-#define R_IA64_PCREL32MSB      0x4c    /* @pcrel(sym + add), data4 MSB */
-#define R_IA64_PCREL32LSB      0x4d    /* @pcrel(sym + add), data4 LSB */
-#define R_IA64_PCREL64MSB      0x4e    /* @pcrel(sym + add), data8 MSB */
-#define R_IA64_PCREL64LSB      0x4f    /* @pcrel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_FPTR22    0x52    /* @ltoff(@fptr(s+a)), imm22 */
-#define R_IA64_LTOFF_FPTR64I   0x53    /* @ltoff(@fptr(s+a)), imm64 */
-#define R_IA64_LTOFF_FPTR32MSB 0x54    /* @ltoff(@fptr(s+a)), data4 MSB */
-#define R_IA64_LTOFF_FPTR32LSB 0x55    /* @ltoff(@fptr(s+a)), data4 LSB */
-#define R_IA64_LTOFF_FPTR64MSB 0x56    /* @ltoff(@fptr(s+a)), data8 MSB */
-#define R_IA64_LTOFF_FPTR64LSB 0x57    /* @ltoff(@fptr(s+a)), data8 LSB */
-#define R_IA64_SEGREL32MSB     0x5c    /* @segrel(sym + add), data4 MSB */
-#define R_IA64_SEGREL32LSB     0x5d    /* @segrel(sym + add), data4 LSB */
-#define R_IA64_SEGREL64MSB     0x5e    /* @segrel(sym + add), data8 MSB */
-#define R_IA64_SEGREL64LSB     0x5f    /* @segrel(sym + add), data8 LSB */
-#define R_IA64_SECREL32MSB     0x64    /* @secrel(sym + add), data4 MSB */
-#define R_IA64_SECREL32LSB     0x65    /* @secrel(sym + add), data4 LSB */
-#define R_IA64_SECREL64MSB     0x66    /* @secrel(sym + add), data8 MSB */
-#define R_IA64_SECREL64LSB     0x67    /* @secrel(sym + add), data8 LSB */
-#define R_IA64_REL32MSB                0x6c    /* data 4 + REL */
-#define R_IA64_REL32LSB                0x6d    /* data 4 + REL */
-#define R_IA64_REL64MSB                0x6e    /* data 8 + REL */
-#define R_IA64_REL64LSB                0x6f    /* data 8 + REL */
-#define R_IA64_LTV32MSB                0x74    /* symbol + addend, data4 MSB */
-#define R_IA64_LTV32LSB                0x75    /* symbol + addend, data4 LSB */
-#define R_IA64_LTV64MSB                0x76    /* symbol + addend, data8 MSB */
-#define R_IA64_LTV64LSB                0x77    /* symbol + addend, data8 LSB */
-#define R_IA64_PCREL21BI       0x79    /* @pcrel(sym + add), 21bit inst */
-#define R_IA64_PCREL22         0x7a    /* @pcrel(sym + add), 22bit inst */
-#define R_IA64_PCREL64I                0x7b    /* @pcrel(sym + add), 64bit inst */
-#define R_IA64_IPLTMSB         0x80    /* dynamic reloc, imported PLT, MSB */
-#define R_IA64_IPLTLSB         0x81    /* dynamic reloc, imported PLT, LSB */
-#define R_IA64_COPY            0x84    /* copy relocation */
-#define R_IA64_SUB             0x85    /* Addend and symbol difference */
-#define R_IA64_LTOFF22X                0x86    /* LTOFF22, relaxable.  */
-#define R_IA64_LDXMOV          0x87    /* Use of LTOFF22X.  */
-#define R_IA64_TPREL14         0x91    /* @tprel(sym + add), imm14 */
-#define R_IA64_TPREL22         0x92    /* @tprel(sym + add), imm22 */
-#define R_IA64_TPREL64I                0x93    /* @tprel(sym + add), imm64 */
-#define R_IA64_TPREL64MSB      0x96    /* @tprel(sym + add), data8 MSB */
-#define R_IA64_TPREL64LSB      0x97    /* @tprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_TPREL22   0x9a    /* @ltoff(@tprel(s+a)), imm2 */
-#define R_IA64_DTPMOD64MSB     0xa6    /* @dtpmod(sym + add), data8 MSB */
-#define R_IA64_DTPMOD64LSB     0xa7    /* @dtpmod(sym + add), data8 LSB */
-#define R_IA64_LTOFF_DTPMOD22  0xaa    /* @ltoff(@dtpmod(sym + add)), imm22 */
-#define R_IA64_DTPREL14                0xb1    /* @dtprel(sym + add), imm14 */
-#define R_IA64_DTPREL22                0xb2    /* @dtprel(sym + add), imm22 */
-#define R_IA64_DTPREL64I       0xb3    /* @dtprel(sym + add), imm64 */
-#define R_IA64_DTPREL32MSB     0xb4    /* @dtprel(sym + add), data4 MSB */
-#define R_IA64_DTPREL32LSB     0xb5    /* @dtprel(sym + add), data4 LSB */
-#define R_IA64_DTPREL64MSB     0xb6    /* @dtprel(sym + add), data8 MSB */
-#define R_IA64_DTPREL64LSB     0xb7    /* @dtprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_DTPREL22  0xba    /* @ltoff(@dtprel(s+a)), imm22 */
-
-/* SH specific declarations */
-
-/* Processor specific flags for the ELF header e_flags field.  */
-#define EF_SH_MACH_MASK                0x1f
-#define EF_SH_UNKNOWN          0x0
-#define EF_SH1                 0x1
-#define EF_SH2                 0x2
-#define EF_SH3                 0x3
-#define EF_SH_DSP              0x4
-#define EF_SH3_DSP             0x5
-#define EF_SH4AL_DSP           0x6
-#define EF_SH3E                        0x8
-#define EF_SH4                 0x9
-#define EF_SH2E                        0xb
-#define EF_SH4A                        0xc
-#define EF_SH2A                        0xd
-#define EF_SH4_NOFPU           0x10
-#define EF_SH4A_NOFPU          0x11
-#define EF_SH4_NOMMU_NOFPU     0x12
-#define EF_SH2A_NOFPU          0x13
-#define EF_SH3_NOMMU           0x14
-#define EF_SH2A_SH4_NOFPU      0x15
-#define EF_SH2A_SH3_NOFPU      0x16
-#define EF_SH2A_SH4            0x17
-#define EF_SH2A_SH3E           0x18
-
-/* SH relocs.  */
-#define        R_SH_NONE               0
-#define        R_SH_DIR32              1
-#define        R_SH_REL32              2
-#define        R_SH_DIR8WPN            3
-#define        R_SH_IND12W             4
-#define        R_SH_DIR8WPL            5
-#define        R_SH_DIR8WPZ            6
-#define        R_SH_DIR8BP             7
-#define        R_SH_DIR8W              8
-#define        R_SH_DIR8L              9
-#define        R_SH_SWITCH16           25
-#define        R_SH_SWITCH32           26
-#define        R_SH_USES               27
-#define        R_SH_COUNT              28
-#define        R_SH_ALIGN              29
-#define        R_SH_CODE               30
-#define        R_SH_DATA               31
-#define        R_SH_LABEL              32
-#define        R_SH_SWITCH8            33
-#define        R_SH_GNU_VTINHERIT      34
-#define        R_SH_GNU_VTENTRY        35
-#define        R_SH_TLS_GD_32          144
-#define        R_SH_TLS_LD_32          145
-#define        R_SH_TLS_LDO_32         146
-#define        R_SH_TLS_IE_32          147
-#define        R_SH_TLS_LE_32          148
-#define        R_SH_TLS_DTPMOD32       149
-#define        R_SH_TLS_DTPOFF32       150
-#define        R_SH_TLS_TPOFF32        151
-#define        R_SH_GOT32              160
-#define        R_SH_PLT32              161
-#define        R_SH_COPY               162
-#define        R_SH_GLOB_DAT           163
-#define        R_SH_JMP_SLOT           164
-#define        R_SH_RELATIVE           165
-#define        R_SH_GOTOFF             166
-#define        R_SH_GOTPC              167
-/* Keep this the last entry.  */
-#define        R_SH_NUM                256
-
-/* S/390 specific definitions.  */
-
-/* Valid values for the e_flags field.  */
-
-#define EF_S390_HIGH_GPRS    0x00000001  /* High GPRs kernel facility needed.  */
-
-/* Additional s390 relocs */
-
-#define R_390_NONE             0       /* No reloc.  */
-#define R_390_8                        1       /* Direct 8 bit.  */
-#define R_390_12               2       /* Direct 12 bit.  */
-#define R_390_16               3       /* Direct 16 bit.  */
-#define R_390_32               4       /* Direct 32 bit.  */
-#define R_390_PC32             5       /* PC relative 32 bit.  */
-#define R_390_GOT12            6       /* 12 bit GOT offset.  */
-#define R_390_GOT32            7       /* 32 bit GOT offset.  */
-#define R_390_PLT32            8       /* 32 bit PC relative PLT address.  */
-#define R_390_COPY             9       /* Copy symbol at runtime.  */
-#define R_390_GLOB_DAT         10      /* Create GOT entry.  */
-#define R_390_JMP_SLOT         11      /* Create PLT entry.  */
-#define R_390_RELATIVE         12      /* Adjust by program base.  */
-#define R_390_GOTOFF32         13      /* 32 bit offset to GOT.         */
-#define R_390_GOTPC            14      /* 32 bit PC relative offset to GOT.  */
-#define R_390_GOT16            15      /* 16 bit GOT offset.  */
-#define R_390_PC16             16      /* PC relative 16 bit.  */
-#define R_390_PC16DBL          17      /* PC relative 16 bit shifted by 1.  */
-#define R_390_PLT16DBL         18      /* 16 bit PC rel. PLT shifted by 1.  */
-#define R_390_PC32DBL          19      /* PC relative 32 bit shifted by 1.  */
-#define R_390_PLT32DBL         20      /* 32 bit PC rel. PLT shifted by 1.  */
-#define R_390_GOTPCDBL         21      /* 32 bit PC rel. GOT shifted by 1.  */
-#define R_390_64               22      /* Direct 64 bit.  */
-#define R_390_PC64             23      /* PC relative 64 bit.  */
-#define R_390_GOT64            24      /* 64 bit GOT offset.  */
-#define R_390_PLT64            25      /* 64 bit PC relative PLT address.  */
-#define R_390_GOTENT           26      /* 32 bit PC rel. to GOT entry >> 1. */
-#define R_390_GOTOFF16         27      /* 16 bit offset to GOT. */
-#define R_390_GOTOFF64         28      /* 64 bit offset to GOT. */
-#define R_390_GOTPLT12         29      /* 12 bit offset to jump slot.  */
-#define R_390_GOTPLT16         30      /* 16 bit offset to jump slot.  */
-#define R_390_GOTPLT32         31      /* 32 bit offset to jump slot.  */
-#define R_390_GOTPLT64         32      /* 64 bit offset to jump slot.  */
-#define R_390_GOTPLTENT                33      /* 32 bit rel. offset to jump slot.  */
-#define R_390_PLTOFF16         34      /* 16 bit offset from GOT to PLT. */
-#define R_390_PLTOFF32         35      /* 32 bit offset from GOT to PLT. */
-#define R_390_PLTOFF64         36      /* 16 bit offset from GOT to PLT. */
-#define R_390_TLS_LOAD         37      /* Tag for load insn in TLS code.  */
-#define R_390_TLS_GDCALL       38      /* Tag for function call in general
-                                          dynamic TLS code. */
-#define R_390_TLS_LDCALL       39      /* Tag for function call in local
-                                          dynamic TLS code. */
-#define R_390_TLS_GD32         40      /* Direct 32 bit for general dynamic
-                                          thread local data.  */
-#define R_390_TLS_GD64         41      /* Direct 64 bit for general dynamic
-                                         thread local data.  */
-#define R_390_TLS_GOTIE12      42      /* 12 bit GOT offset for static TLS
-                                          block offset.  */
-#define R_390_TLS_GOTIE32      43      /* 32 bit GOT offset for static TLS
-                                          block offset.  */
-#define R_390_TLS_GOTIE64      44      /* 64 bit GOT offset for static TLS
-                                          block offset. */
-#define R_390_TLS_LDM32                45      /* Direct 32 bit for local dynamic
-                                          thread local data in LE code.  */
-#define R_390_TLS_LDM64                46      /* Direct 64 bit for local dynamic
-                                          thread local data in LE code.  */
-#define R_390_TLS_IE32         47      /* 32 bit address of GOT entry for
-                                          negated static TLS block offset.  */
-#define R_390_TLS_IE64         48      /* 64 bit address of GOT entry for
-                                          negated static TLS block offset.  */
-#define R_390_TLS_IEENT                49      /* 32 bit rel. offset to GOT entry for
-                                          negated static TLS block offset.  */
-#define R_390_TLS_LE32         50      /* 32 bit negated offset relative to
-                                          static TLS block.  */
-#define R_390_TLS_LE64         51      /* 64 bit negated offset relative to
-                                          static TLS block.  */
-#define R_390_TLS_LDO32                52      /* 32 bit offset relative to TLS
-                                          block.  */
-#define R_390_TLS_LDO64                53      /* 64 bit offset relative to TLS
-                                          block.  */
-#define R_390_TLS_DTPMOD       54      /* ID of module containing symbol.  */
-#define R_390_TLS_DTPOFF       55      /* Offset in TLS block.  */
-#define R_390_TLS_TPOFF                56      /* Negated offset in static TLS
-                                          block.  */
-#define R_390_20               57      /* Direct 20 bit.  */
-#define R_390_GOT20            58      /* 20 bit GOT offset.  */
-#define R_390_GOTPLT20         59      /* 20 bit offset to jump slot.  */
-#define R_390_TLS_GOTIE20      60      /* 20 bit GOT offset for static TLS
-                                          block offset.  */
-#define R_390_IRELATIVE         61      /* STT_GNU_IFUNC relocation.  */
-/* Keep this the last entry.  */
-#define R_390_NUM              62
-
-
-/* CRIS relocations.  */
-#define R_CRIS_NONE            0
-#define R_CRIS_8               1
-#define R_CRIS_16              2
-#define R_CRIS_32              3
-#define R_CRIS_8_PCREL         4
-#define R_CRIS_16_PCREL                5
-#define R_CRIS_32_PCREL                6
-#define R_CRIS_GNU_VTINHERIT   7
-#define R_CRIS_GNU_VTENTRY     8
-#define R_CRIS_COPY            9
-#define R_CRIS_GLOB_DAT                10
-#define R_CRIS_JUMP_SLOT       11
-#define R_CRIS_RELATIVE                12
-#define R_CRIS_16_GOT          13
-#define R_CRIS_32_GOT          14
-#define R_CRIS_16_GOTPLT       15
-#define R_CRIS_32_GOTPLT       16
-#define R_CRIS_32_GOTREL       17
-#define R_CRIS_32_PLT_GOTREL   18
-#define R_CRIS_32_PLT_PCREL    19
-
-#define R_CRIS_NUM             20
-
-
-/* AMD x86-64 relocations.  */
-#define R_X86_64_NONE          0       /* No reloc */
-#define R_X86_64_64            1       /* Direct 64 bit  */
-#define R_X86_64_PC32          2       /* PC relative 32 bit signed */
-#define R_X86_64_GOT32         3       /* 32 bit GOT entry */
-#define R_X86_64_PLT32         4       /* 32 bit PLT address */
-#define R_X86_64_COPY          5       /* Copy symbol at runtime */
-#define R_X86_64_GLOB_DAT      6       /* Create GOT entry */
-#define R_X86_64_JUMP_SLOT     7       /* Create PLT entry */
-#define R_X86_64_RELATIVE      8       /* Adjust by program base */
-#define R_X86_64_GOTPCREL      9       /* 32 bit signed PC relative
-                                          offset to GOT */
-#define R_X86_64_32            10      /* Direct 32 bit zero extended */
-#define R_X86_64_32S           11      /* Direct 32 bit sign extended */
-#define R_X86_64_16            12      /* Direct 16 bit zero extended */
-#define R_X86_64_PC16          13      /* 16 bit sign extended pc relative */
-#define R_X86_64_8             14      /* Direct 8 bit sign extended  */
-#define R_X86_64_PC8           15      /* 8 bit sign extended pc relative */
-#define R_X86_64_DTPMOD64      16      /* ID of module containing symbol */
-#define R_X86_64_DTPOFF64      17      /* Offset in module's TLS block */
-#define R_X86_64_TPOFF64       18      /* Offset in initial TLS block */
-#define R_X86_64_TLSGD         19      /* 32 bit signed PC relative offset
-                                          to two GOT entries for GD symbol */
-#define R_X86_64_TLSLD         20      /* 32 bit signed PC relative offset
-                                          to two GOT entries for LD symbol */
-#define R_X86_64_DTPOFF32      21      /* Offset in TLS block */
-#define R_X86_64_GOTTPOFF      22      /* 32 bit signed PC relative offset
-                                          to GOT entry for IE symbol */
-#define R_X86_64_TPOFF32       23      /* Offset in initial TLS block */
-#define R_X86_64_PC64          24      /* PC relative 64 bit */
-#define R_X86_64_GOTOFF64      25      /* 64 bit offset to GOT */
-#define R_X86_64_GOTPC32       26      /* 32 bit signed pc relative
-                                          offset to GOT */
-#define R_X86_64_GOT64         27      /* 64-bit GOT entry offset */
-#define R_X86_64_GOTPCREL64    28      /* 64-bit PC relative offset
-                                          to GOT entry */
-#define R_X86_64_GOTPC64       29      /* 64-bit PC relative offset to GOT */
-#define R_X86_64_GOTPLT64      30      /* like GOT64, says PLT entry needed */
-#define R_X86_64_PLTOFF64      31      /* 64-bit GOT relative offset
-                                          to PLT entry */
-#define R_X86_64_SIZE32                32      /* Size of symbol plus 32-bit addend */
-#define R_X86_64_SIZE64                33      /* Size of symbol plus 64-bit addend */
-#define R_X86_64_GOTPC32_TLSDESC 34    /* GOT offset for TLS descriptor.  */
-#define R_X86_64_TLSDESC_CALL   35     /* Marker for call through TLS
-                                          descriptor.  */
-#define R_X86_64_TLSDESC        36     /* TLS descriptor.  */
-#define R_X86_64_IRELATIVE     37      /* Adjust indirectly by program base */
-#define R_X86_64_RELATIVE64    38      /* 64-bit adjust by program base */
-
-#define R_X86_64_NUM           39
-
-
-/* AM33 relocations.  */
-#define R_MN10300_NONE         0       /* No reloc.  */
-#define R_MN10300_32           1       /* Direct 32 bit.  */
-#define R_MN10300_16           2       /* Direct 16 bit.  */
-#define R_MN10300_8            3       /* Direct 8 bit.  */
-#define R_MN10300_PCREL32      4       /* PC-relative 32-bit.  */
-#define R_MN10300_PCREL16      5       /* PC-relative 16-bit signed.  */
-#define R_MN10300_PCREL8       6       /* PC-relative 8-bit signed.  */
-#define R_MN10300_GNU_VTINHERIT        7       /* Ancient C++ vtable garbage... */
-#define R_MN10300_GNU_VTENTRY  8       /* ... collection annotation.  */
-#define R_MN10300_24           9       /* Direct 24 bit.  */
-#define R_MN10300_GOTPC32      10      /* 32-bit PCrel offset to GOT.  */
-#define R_MN10300_GOTPC16      11      /* 16-bit PCrel offset to GOT.  */
-#define R_MN10300_GOTOFF32     12      /* 32-bit offset from GOT.  */
-#define R_MN10300_GOTOFF24     13      /* 24-bit offset from GOT.  */
-#define R_MN10300_GOTOFF16     14      /* 16-bit offset from GOT.  */
-#define R_MN10300_PLT32                15      /* 32-bit PCrel to PLT entry.  */
-#define R_MN10300_PLT16                16      /* 16-bit PCrel to PLT entry.  */
-#define R_MN10300_GOT32                17      /* 32-bit offset to GOT entry.  */
-#define R_MN10300_GOT24                18      /* 24-bit offset to GOT entry.  */
-#define R_MN10300_GOT16                19      /* 16-bit offset to GOT entry.  */
-#define R_MN10300_COPY         20      /* Copy symbol at runtime.  */
-#define R_MN10300_GLOB_DAT     21      /* Create GOT entry.  */
-#define R_MN10300_JMP_SLOT     22      /* Create PLT entry.  */
-#define R_MN10300_RELATIVE     23      /* Adjust by program base.  */
-#define R_MN10300_TLS_GD       24      /* 32-bit offset for global dynamic.  */
-#define R_MN10300_TLS_LD       25      /* 32-bit offset for local dynamic.  */
-#define R_MN10300_TLS_LDO      26      /* Module-relative offset.  */
-#define R_MN10300_TLS_GOTIE    27      /* GOT offset for static TLS block
-                                          offset.  */
-#define R_MN10300_TLS_IE       28      /* GOT address for static TLS block
-                                          offset.  */
-#define R_MN10300_TLS_LE       29      /* Offset relative to static TLS
-                                          block.  */
-#define R_MN10300_TLS_DTPMOD   30      /* ID of module containing symbol.  */
-#define R_MN10300_TLS_DTPOFF   31      /* Offset in module TLS block.  */
-#define R_MN10300_TLS_TPOFF    32      /* Offset in static TLS block.  */
-#define R_MN10300_SYM_DIFF     33      /* Adjustment for next reloc as needed
-                                          by linker relaxation.  */
-#define R_MN10300_ALIGN                34      /* Alignment requirement for linker
-                                          relaxation.  */
-#define R_MN10300_NUM          35
-
-
-/* M32R relocs.  */
-#define R_M32R_NONE            0       /* No reloc. */
-#define R_M32R_16              1       /* Direct 16 bit. */
-#define R_M32R_32              2       /* Direct 32 bit. */
-#define R_M32R_24              3       /* Direct 24 bit. */
-#define R_M32R_10_PCREL                4       /* PC relative 10 bit shifted. */
-#define R_M32R_18_PCREL                5       /* PC relative 18 bit shifted. */
-#define R_M32R_26_PCREL                6       /* PC relative 26 bit shifted. */
-#define R_M32R_HI16_ULO                7       /* High 16 bit with unsigned low. */
-#define R_M32R_HI16_SLO                8       /* High 16 bit with signed low. */
-#define R_M32R_LO16            9       /* Low 16 bit. */
-#define R_M32R_SDA16           10      /* 16 bit offset in SDA. */
-#define R_M32R_GNU_VTINHERIT   11
-#define R_M32R_GNU_VTENTRY     12
-/* M32R relocs use SHT_RELA.  */
-#define R_M32R_16_RELA         33      /* Direct 16 bit. */
-#define R_M32R_32_RELA         34      /* Direct 32 bit. */
-#define R_M32R_24_RELA         35      /* Direct 24 bit. */
-#define R_M32R_10_PCREL_RELA   36      /* PC relative 10 bit shifted. */
-#define R_M32R_18_PCREL_RELA   37      /* PC relative 18 bit shifted. */
-#define R_M32R_26_PCREL_RELA   38      /* PC relative 26 bit shifted. */
-#define R_M32R_HI16_ULO_RELA   39      /* High 16 bit with unsigned low */
-#define R_M32R_HI16_SLO_RELA   40      /* High 16 bit with signed low */
-#define R_M32R_LO16_RELA       41      /* Low 16 bit */
-#define R_M32R_SDA16_RELA      42      /* 16 bit offset in SDA */
-#define R_M32R_RELA_GNU_VTINHERIT      43
-#define R_M32R_RELA_GNU_VTENTRY        44
-#define R_M32R_REL32           45      /* PC relative 32 bit.  */
-
-#define R_M32R_GOT24           48      /* 24 bit GOT entry */
-#define R_M32R_26_PLTREL       49      /* 26 bit PC relative to PLT shifted */
-#define R_M32R_COPY            50      /* Copy symbol at runtime */
-#define R_M32R_GLOB_DAT                51      /* Create GOT entry */
-#define R_M32R_JMP_SLOT                52      /* Create PLT entry */
-#define R_M32R_RELATIVE                53      /* Adjust by program base */
-#define R_M32R_GOTOFF          54      /* 24 bit offset to GOT */
-#define R_M32R_GOTPC24         55      /* 24 bit PC relative offset to GOT */
-#define R_M32R_GOT16_HI_ULO    56      /* High 16 bit GOT entry with unsigned
-                                          low */
-#define R_M32R_GOT16_HI_SLO    57      /* High 16 bit GOT entry with signed
-                                          low */
-#define R_M32R_GOT16_LO                58      /* Low 16 bit GOT entry */
-#define R_M32R_GOTPC_HI_ULO    59      /* High 16 bit PC relative offset to
-                                          GOT with unsigned low */
-#define R_M32R_GOTPC_HI_SLO    60      /* High 16 bit PC relative offset to
-                                          GOT with signed low */
-#define R_M32R_GOTPC_LO                61      /* Low 16 bit PC relative offset to
-                                          GOT */
-#define R_M32R_GOTOFF_HI_ULO   62      /* High 16 bit offset to GOT
-                                          with unsigned low */
-#define R_M32R_GOTOFF_HI_SLO   63      /* High 16 bit offset to GOT
-                                          with signed low */
-#define R_M32R_GOTOFF_LO       64      /* Low 16 bit offset to GOT */
-#define R_M32R_NUM             256     /* Keep this the last entry. */
-
-/* MicroBlaze relocations */
-#define R_MICROBLAZE_NONE              0       /* No reloc. */
-#define R_MICROBLAZE_32                1       /* Direct 32 bit. */
-#define R_MICROBLAZE_32_PCREL          2       /* PC relative 32 bit. */
-#define R_MICROBLAZE_64_PCREL          3       /* PC relative 64 bit. */
-#define R_MICROBLAZE_32_PCREL_LO       4       /* Low 16 bits of PCREL32. */
-#define R_MICROBLAZE_64                5       /* Direct 64 bit. */
-#define R_MICROBLAZE_32_LO             6       /* Low 16 bit. */
-#define R_MICROBLAZE_SRO32             7       /* Read-only small data area. */
-#define R_MICROBLAZE_SRW32             8       /* Read-write small data area. */
-#define R_MICROBLAZE_64_NONE           9       /* No reloc. */
-#define R_MICROBLAZE_32_SYM_OP_SYM     10      /* Symbol Op Symbol relocation. */
-#define R_MICROBLAZE_GNU_VTINHERIT     11      /* GNU C++ vtable hierarchy. */
-#define R_MICROBLAZE_GNU_VTENTRY       12      /* GNU C++ vtable member usage. */
-#define R_MICROBLAZE_GOTPC_64          13      /* PC-relative GOT offset.  */
-#define R_MICROBLAZE_GOT_64            14      /* GOT entry offset.  */
-#define R_MICROBLAZE_PLT_64            15      /* PLT offset (PC-relative).  */
-#define R_MICROBLAZE_REL               16      /* Adjust by program base.  */
-#define R_MICROBLAZE_JUMP_SLOT         17      /* Create PLT entry.  */
-#define R_MICROBLAZE_GLOB_DAT          18      /* Create GOT entry.  */
-#define R_MICROBLAZE_GOTOFF_64         19      /* 64 bit offset to GOT. */
-#define R_MICROBLAZE_GOTOFF_32         20      /* 32 bit offset to GOT. */
-#define R_MICROBLAZE_COPY              21      /* Runtime copy.  */
-#define R_MICROBLAZE_TLS               22      /* TLS Reloc. */
-#define R_MICROBLAZE_TLSGD             23      /* TLS General Dynamic. */
-#define R_MICROBLAZE_TLSLD             24      /* TLS Local Dynamic. */
-#define R_MICROBLAZE_TLSDTPMOD32       25      /* TLS Module ID. */
-#define R_MICROBLAZE_TLSDTPREL32       26      /* TLS Offset Within TLS Block. */
-#define R_MICROBLAZE_TLSDTPREL64       27      /* TLS Offset Within TLS Block. */
-#define R_MICROBLAZE_TLSGOTTPREL32     28      /* TLS Offset From Thread Pointer. */
-#define R_MICROBLAZE_TLSTPREL32        29      /* TLS Offset From Thread Pointer. */
-
-/* TILEPro relocations.  */
-#define R_TILEPRO_NONE         0       /* No reloc */
-#define R_TILEPRO_32           1       /* Direct 32 bit */
-#define R_TILEPRO_16           2       /* Direct 16 bit */
-#define R_TILEPRO_8            3       /* Direct 8 bit */
-#define R_TILEPRO_32_PCREL     4       /* PC relative 32 bit */
-#define R_TILEPRO_16_PCREL     5       /* PC relative 16 bit */
-#define R_TILEPRO_8_PCREL      6       /* PC relative 8 bit */
-#define R_TILEPRO_LO16         7       /* Low 16 bit */
-#define R_TILEPRO_HI16         8       /* High 16 bit */
-#define R_TILEPRO_HA16         9       /* High 16 bit, adjusted */
-#define R_TILEPRO_COPY         10      /* Copy relocation */
-#define R_TILEPRO_GLOB_DAT     11      /* Create GOT entry */
-#define R_TILEPRO_JMP_SLOT     12      /* Create PLT entry */
-#define R_TILEPRO_RELATIVE     13      /* Adjust by program base */
-#define R_TILEPRO_BROFF_X1     14      /* X1 pipe branch offset */
-#define R_TILEPRO_JOFFLONG_X1  15      /* X1 pipe jump offset */
-#define R_TILEPRO_JOFFLONG_X1_PLT 16   /* X1 pipe jump offset to PLT */
-#define R_TILEPRO_IMM8_X0      17      /* X0 pipe 8-bit */
-#define R_TILEPRO_IMM8_Y0      18      /* Y0 pipe 8-bit */
-#define R_TILEPRO_IMM8_X1      19      /* X1 pipe 8-bit */
-#define R_TILEPRO_IMM8_Y1      20      /* Y1 pipe 8-bit */
-#define R_TILEPRO_MT_IMM15_X1  21      /* X1 pipe mtspr */
-#define R_TILEPRO_MF_IMM15_X1  22      /* X1 pipe mfspr */
-#define R_TILEPRO_IMM16_X0     23      /* X0 pipe 16-bit */
-#define R_TILEPRO_IMM16_X1     24      /* X1 pipe 16-bit */
-#define R_TILEPRO_IMM16_X0_LO  25      /* X0 pipe low 16-bit */
-#define R_TILEPRO_IMM16_X1_LO  26      /* X1 pipe low 16-bit */
-#define R_TILEPRO_IMM16_X0_HI  27      /* X0 pipe high 16-bit */
-#define R_TILEPRO_IMM16_X1_HI  28      /* X1 pipe high 16-bit */
-#define R_TILEPRO_IMM16_X0_HA  29      /* X0 pipe high 16-bit, adjusted */
-#define R_TILEPRO_IMM16_X1_HA  30      /* X1 pipe high 16-bit, adjusted */
-#define R_TILEPRO_IMM16_X0_PCREL 31    /* X0 pipe PC relative 16 bit */
-#define R_TILEPRO_IMM16_X1_PCREL 32    /* X1 pipe PC relative 16 bit */
-#define R_TILEPRO_IMM16_X0_LO_PCREL 33 /* X0 pipe PC relative low 16 bit */
-#define R_TILEPRO_IMM16_X1_LO_PCREL 34 /* X1 pipe PC relative low 16 bit */
-#define R_TILEPRO_IMM16_X0_HI_PCREL 35 /* X0 pipe PC relative high 16 bit */
-#define R_TILEPRO_IMM16_X1_HI_PCREL 36 /* X1 pipe PC relative high 16 bit */
-#define R_TILEPRO_IMM16_X0_HA_PCREL 37 /* X0 pipe PC relative ha() 16 bit */
-#define R_TILEPRO_IMM16_X1_HA_PCREL 38 /* X1 pipe PC relative ha() 16 bit */
-#define R_TILEPRO_IMM16_X0_GOT 39      /* X0 pipe 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT 40      /* X1 pipe 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X0_GOT_LO 41   /* X0 pipe low 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT_LO 42   /* X1 pipe low 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X0_GOT_HI 43   /* X0 pipe high 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT_HI 44   /* X1 pipe high 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X0_GOT_HA 45   /* X0 pipe ha() 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT_HA 46   /* X1 pipe ha() 16-bit GOT offset */
-#define R_TILEPRO_MMSTART_X0   47      /* X0 pipe mm "start" */
-#define R_TILEPRO_MMEND_X0     48      /* X0 pipe mm "end" */
-#define R_TILEPRO_MMSTART_X1   49      /* X1 pipe mm "start" */
-#define R_TILEPRO_MMEND_X1     50      /* X1 pipe mm "end" */
-#define R_TILEPRO_SHAMT_X0     51      /* X0 pipe shift amount */
-#define R_TILEPRO_SHAMT_X1     52      /* X1 pipe shift amount */
-#define R_TILEPRO_SHAMT_Y0     53      /* Y0 pipe shift amount */
-#define R_TILEPRO_SHAMT_Y1     54      /* Y1 pipe shift amount */
-#define R_TILEPRO_DEST_IMM8_X1 55      /* X1 pipe destination 8-bit */
-/* Relocs 56-59 are currently not defined.  */
-#define R_TILEPRO_TLS_GD_CALL  60      /* "jal" for TLS GD */
-#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61        /* X0 pipe "addi" for TLS GD */
-#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62        /* X1 pipe "addi" for TLS GD */
-#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63        /* Y0 pipe "addi" for TLS GD */
-#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64        /* Y1 pipe "addi" for TLS GD */
-#define R_TILEPRO_TLS_IE_LOAD  65      /* "lw_tls" for TLS IE */
-#define R_TILEPRO_IMM16_X0_TLS_GD 66   /* X0 pipe 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD 67   /* X1 pipe 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68        /* X0 pipe low 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69        /* X1 pipe low 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70        /* X0 pipe high 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71        /* X1 pipe high 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72        /* X0 pipe ha() 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73        /* X1 pipe ha() 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE 74   /* X0 pipe 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE 75   /* X1 pipe 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76        /* X0 pipe low 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77        /* X1 pipe low 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78        /* X0 pipe high 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79        /* X1 pipe high 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80        /* X0 pipe ha() 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81        /* X1 pipe ha() 16-bit TLS IE offset */
-#define R_TILEPRO_TLS_DTPMOD32 82      /* ID of module containing symbol */
-#define R_TILEPRO_TLS_DTPOFF32 83      /* Offset in TLS block */
-#define R_TILEPRO_TLS_TPOFF32  84      /* Offset in static TLS block */
-#define R_TILEPRO_IMM16_X0_TLS_LE 85   /* X0 pipe 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE 86   /* X1 pipe 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87        /* X0 pipe low 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88        /* X1 pipe low 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89        /* X0 pipe high 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90        /* X1 pipe high 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91        /* X0 pipe ha() 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92        /* X1 pipe ha() 16-bit TLS LE offset */
-
-#define R_TILEPRO_GNU_VTINHERIT        128     /* GNU C++ vtable hierarchy */
-#define R_TILEPRO_GNU_VTENTRY  129     /* GNU C++ vtable member usage */
-
-#define R_TILEPRO_NUM          130
-
-
-/* TILE-Gx relocations.  */
-#define R_TILEGX_NONE          0       /* No reloc */
-#define R_TILEGX_64            1       /* Direct 64 bit */
-#define R_TILEGX_32            2       /* Direct 32 bit */
-#define R_TILEGX_16            3       /* Direct 16 bit */
-#define R_TILEGX_8             4       /* Direct 8 bit */
-#define R_TILEGX_64_PCREL      5       /* PC relative 64 bit */
-#define R_TILEGX_32_PCREL      6       /* PC relative 32 bit */
-#define R_TILEGX_16_PCREL      7       /* PC relative 16 bit */
-#define R_TILEGX_8_PCREL       8       /* PC relative 8 bit */
-#define R_TILEGX_HW0           9       /* hword 0 16-bit */
-#define R_TILEGX_HW1           10      /* hword 1 16-bit */
-#define R_TILEGX_HW2           11      /* hword 2 16-bit */
-#define R_TILEGX_HW3           12      /* hword 3 16-bit */
-#define R_TILEGX_HW0_LAST      13      /* last hword 0 16-bit */
-#define R_TILEGX_HW1_LAST      14      /* last hword 1 16-bit */
-#define R_TILEGX_HW2_LAST      15      /* last hword 2 16-bit */
-#define R_TILEGX_COPY          16      /* Copy relocation */
-#define R_TILEGX_GLOB_DAT      17      /* Create GOT entry */
-#define R_TILEGX_JMP_SLOT      18      /* Create PLT entry */
-#define R_TILEGX_RELATIVE      19      /* Adjust by program base */
-#define R_TILEGX_BROFF_X1      20      /* X1 pipe branch offset */
-#define R_TILEGX_JUMPOFF_X1    21      /* X1 pipe jump offset */
-#define R_TILEGX_JUMPOFF_X1_PLT        22      /* X1 pipe jump offset to PLT */
-#define R_TILEGX_IMM8_X0       23      /* X0 pipe 8-bit */
-#define R_TILEGX_IMM8_Y0       24      /* Y0 pipe 8-bit */
-#define R_TILEGX_IMM8_X1       25      /* X1 pipe 8-bit */
-#define R_TILEGX_IMM8_Y1       26      /* Y1 pipe 8-bit */
-#define R_TILEGX_DEST_IMM8_X1  27      /* X1 pipe destination 8-bit */
-#define R_TILEGX_MT_IMM14_X1   28      /* X1 pipe mtspr */
-#define R_TILEGX_MF_IMM14_X1   29      /* X1 pipe mfspr */
-#define R_TILEGX_MMSTART_X0    30      /* X0 pipe mm "start" */
-#define R_TILEGX_MMEND_X0      31      /* X0 pipe mm "end" */
-#define R_TILEGX_SHAMT_X0      32      /* X0 pipe shift amount */
-#define R_TILEGX_SHAMT_X1      33      /* X1 pipe shift amount */
-#define R_TILEGX_SHAMT_Y0      34      /* Y0 pipe shift amount */
-#define R_TILEGX_SHAMT_Y1      35      /* Y1 pipe shift amount */
-#define R_TILEGX_IMM16_X0_HW0  36      /* X0 pipe hword 0 */
-#define R_TILEGX_IMM16_X1_HW0  37      /* X1 pipe hword 0 */
-#define R_TILEGX_IMM16_X0_HW1  38      /* X0 pipe hword 1 */
-#define R_TILEGX_IMM16_X1_HW1  39      /* X1 pipe hword 1 */
-#define R_TILEGX_IMM16_X0_HW2  40      /* X0 pipe hword 2 */
-#define R_TILEGX_IMM16_X1_HW2  41      /* X1 pipe hword 2 */
-#define R_TILEGX_IMM16_X0_HW3  42      /* X0 pipe hword 3 */
-#define R_TILEGX_IMM16_X1_HW3  43      /* X1 pipe hword 3 */
-#define R_TILEGX_IMM16_X0_HW0_LAST 44  /* X0 pipe last hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_LAST 45  /* X1 pipe last hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_LAST 46  /* X0 pipe last hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_LAST 47  /* X1 pipe last hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_LAST 48  /* X0 pipe last hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_LAST 49  /* X1 pipe last hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_PCREL 50 /* X0 pipe PC relative hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_PCREL 51 /* X1 pipe PC relative hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_PCREL 52 /* X0 pipe PC relative hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_PCREL 53 /* X1 pipe PC relative hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_PCREL 54 /* X0 pipe PC relative hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_PCREL 55 /* X1 pipe PC relative hword 2 */
-#define R_TILEGX_IMM16_X0_HW3_PCREL 56 /* X0 pipe PC relative hword 3 */
-#define R_TILEGX_IMM16_X1_HW3_PCREL 57 /* X1 pipe PC relative hword 3 */
-#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_GOT 64   /* X0 pipe hword 0 GOT offset */
-#define R_TILEGX_IMM16_X1_HW0_GOT 65   /* X1 pipe hword 0 GOT offset */
-#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */
-#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */
-#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */
-#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */
-#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */
-#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */
-#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78        /* X0 pipe hword 0 TLS GD offset */
-#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79        /* X1 pipe hword 0 TLS GD offset */
-#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80        /* X0 pipe hword 0 TLS LE offset */
-#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81        /* X1 pipe hword 0 TLS LE offset */
-#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */
-#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */
-#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */
-#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */
-#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */
-#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */
-#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */
-#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */
-/* Relocs 90-91 are currently not defined.  */
-#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92        /* X0 pipe hword 0 TLS IE offset */
-#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93        /* X1 pipe hword 0 TLS IE offset */
-#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */
-#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */
-#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */
-#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */
-/* Relocs 104-105 are currently not defined.  */
-#define R_TILEGX_TLS_DTPMOD64  106     /* 64-bit ID of symbol's module */
-#define R_TILEGX_TLS_DTPOFF64  107     /* 64-bit offset in TLS block */
-#define R_TILEGX_TLS_TPOFF64   108     /* 64-bit offset in static TLS block */
-#define R_TILEGX_TLS_DTPMOD32  109     /* 32-bit ID of symbol's module */
-#define R_TILEGX_TLS_DTPOFF32  110     /* 32-bit offset in TLS block */
-#define R_TILEGX_TLS_TPOFF32   111     /* 32-bit offset in static TLS block */
-#define R_TILEGX_TLS_GD_CALL   112     /* "jal" for TLS GD */
-#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113        /* X0 pipe "addi" for TLS GD */
-#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114        /* X1 pipe "addi" for TLS GD */
-#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115        /* Y0 pipe "addi" for TLS GD */
-#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116        /* Y1 pipe "addi" for TLS GD */
-#define R_TILEGX_TLS_IE_LOAD   117     /* "ld_tls" for TLS IE */
-#define R_TILEGX_IMM8_X0_TLS_ADD 118   /* X0 pipe "addi" for TLS GD/IE */
-#define R_TILEGX_IMM8_X1_TLS_ADD 119   /* X1 pipe "addi" for TLS GD/IE */
-#define R_TILEGX_IMM8_Y0_TLS_ADD 120   /* Y0 pipe "addi" for TLS GD/IE */
-#define R_TILEGX_IMM8_Y1_TLS_ADD 121   /* Y1 pipe "addi" for TLS GD/IE */
-
-#define R_TILEGX_GNU_VTINHERIT 128     /* GNU C++ vtable hierarchy */
-#define R_TILEGX_GNU_VTENTRY   129     /* GNU C++ vtable member usage */
-
-#define R_TILEGX_NUM           130
-
-/* OR1K relocations */
-#define R_OR1K_NONE 0
-#define R_OR1K_32 1
-#define R_OR1K_16 2
-#define R_OR1K_8 3
-#define R_OR1K_LO_16_IN_INSN 4
-#define R_OR1K_HI_16_IN_INSN 5
-#define R_OR1K_INSN_REL_26 6
-#define R_OR1K_GNU_VTENTRY 7
-#define R_OR1K_GNU_VTINHERIT 8
-#define R_OR1K_32_PCREL 9
-#define R_OR1K_16_PCREL 10
-#define R_OR1K_8_PCREL 11
-#define R_OR1K_GOTPC_HI16 12
-#define R_OR1K_GOTPC_LO16 13
-#define R_OR1K_GOT16 14
-#define R_OR1K_PLT26 15
-#define R_OR1K_GOTOFF_HI16 16
-#define R_OR1K_GOTOFF_LO16 17
-#define R_OR1K_COPY 18
-#define R_OR1K_GLOB_DAT 19
-#define R_OR1K_JMP_SLOT 20
-#define R_OR1K_RELATIVE 21
-#define R_OR1K_TLS_GD_HI16 22
-#define R_OR1K_TLS_GD_LO16 23
-#define R_OR1K_TLS_LDM_HI16 24
-#define R_OR1K_TLS_LDM_LO16 25
-#define R_OR1K_TLS_LDO_HI16 26
-#define R_OR1K_TLS_LDO_LO16 27
-#define R_OR1K_TLS_IE_HI16 28
-#define R_OR1K_TLS_IE_LO16 29
-#define R_OR1K_TLS_LE_HI16 30
-#define R_OR1K_TLS_LE_LO16 31
-#define R_OR1K_TLS_TPOFF 32
-#define R_OR1K_TLS_DTPOFF 33
-#define R_OR1K_TLS_DTPMOD 34
-
-#define R_OR1K_NUM 35
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* elf.h */
diff --git a/software/include/dyld/link.h b/software/include/dyld/link.h
deleted file mode 100644 (file)
index effa32b..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __LINK_H
-#define __LINK_H
-
-#include <stddef.h>
-#include <elf.h>
-
-#define ElfW(type) Elf32_##type
-
-struct dl_phdr_info {
-  ElfW(Addr) dlpi_addr;
-  const char *dlpi_name;
-  const ElfW(Phdr) *dlpi_phdr;
-  ElfW(Half) dlpi_phnum;
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int dl_iterate_phdr (int (*__callback) (struct dl_phdr_info *,
-                                               size_t, void *),
-                            void *__data);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __LINK_H */
diff --git a/software/include/generated/.keep_me b/software/include/generated/.keep_me
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/software/include/hw/common.h b/software/include/hw/common.h
deleted file mode 100644 (file)
index e5f9b51..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __HW_COMMON_H
-#define __HW_COMMON_H
-
-#ifdef __ASSEMBLER__
-#define MMPTR(x) x
-#else
-#define MMPTR(x) (*((volatile unsigned int *)(x)))
-#endif
-
-#endif
diff --git a/software/include/hw/ethmac_mem.h b/software/include/hw/ethmac_mem.h
deleted file mode 100644 (file)
index 03c7b96..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef __HW_ETHMAC_MEM_H
-#define __HW_ETHMAC_MEM_H
-
-#include <generated/mem.h>
-
-#define ETHMAC_RX0_BASE        ETHMAC_BASE
-#define ETHMAC_RX1_BASE        (ETHMAC_BASE+0x0800)
-#define ETHMAC_TX0_BASE        (ETHMAC_BASE+0x1000)
-#define ETHMAC_TX1_BASE        (ETHMAC_BASE+0x1800)
-
-#endif
diff --git a/software/include/hw/flags.h b/software/include/hw/flags.h
deleted file mode 100644 (file)
index 911a1b6..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef __HW_FLAGS_H
-#define __HW_FLAGS_H
-
-#define UART_EV_TX     0x1
-#define UART_EV_RX     0x2
-
-#define DFII_CONTROL_SEL               0x01
-#define DFII_CONTROL_CKE               0x02
-#define DFII_CONTROL_ODT               0x04
-#define DFII_CONTROL_RESET_N   0x08
-
-#define DFII_COMMAND_CS                0x01
-#define DFII_COMMAND_WE                0x02
-#define DFII_COMMAND_CAS       0x04
-#define DFII_COMMAND_RAS       0x08
-#define DFII_COMMAND_WRDATA    0x10
-#define DFII_COMMAND_RDDATA    0x20
-
-#define ETHMAC_EV_SRAM_WRITER  0x1
-#define ETHMAC_EV_SRAM_READER  0x1
-
-#define CLKGEN_STATUS_BUSY             0x1
-#define CLKGEN_STATUS_PROGDONE 0x2
-#define CLKGEN_STATUS_LOCKED   0x4
-
-#define DVISAMPLER_TOO_LATE            0x1
-#define DVISAMPLER_TOO_EARLY   0x2
-
-#define DVISAMPLER_DELAY_MASTER_CAL    0x01
-#define DVISAMPLER_DELAY_MASTER_RST    0x02
-#define DVISAMPLER_DELAY_SLAVE_CAL     0x04
-#define DVISAMPLER_DELAY_SLAVE_RST     0x08
-#define DVISAMPLER_DELAY_INC           0x10
-#define DVISAMPLER_DELAY_DEC           0x20
-
-#define DVISAMPLER_SLOT_EMPTY  0
-#define DVISAMPLER_SLOT_LOADED 1
-#define DVISAMPLER_SLOT_PENDING        2
-
-#endif /* __HW_FLAGS_H */
diff --git a/software/include/net/microudp.h b/software/include/net/microudp.h
deleted file mode 100644 (file)
index f148a34..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __MICROUDP_H
-#define __MICROUDP_H
-
-#define IPTOINT(a, b, c, d) ((a << 24)|(b << 16)|(c << 8)|d)
-
-#define MICROUDP_BUFSIZE (5*1532)
-
-typedef void (*udp_callback)(unsigned int src_ip, unsigned short src_port, unsigned short dst_port, void *data, unsigned int length);
-
-void microudp_start(const unsigned char *macaddr, unsigned int ip);
-int microudp_arp_resolve(unsigned int ip);
-void *microudp_get_tx_buffer(void);
-int microudp_send(unsigned short src_port, unsigned short dst_port, unsigned int length);
-void microudp_set_callback(udp_callback callback);
-void microudp_service(void);
-
-void eth_init(void);
-void eth_mode(void);
-
-#endif /* __MICROUDP_H */
diff --git a/software/include/net/tftp.h b/software/include/net/tftp.h
deleted file mode 100644 (file)
index 7babb2d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __TFTP_H
-#define __TFTP_H
-
-#include <stdint.h>
-
-int tftp_get(uint32_t ip, const char *filename, void *buffer);
-int tftp_put(uint32_t ip, const char *filename, const void *buffer, int size);
-
-#endif /* __TFTP_H */
-
diff --git a/software/libbase/Makefile b/software/libbase/Makefile
deleted file mode 100644 (file)
index c1f2434..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-MSCDIR=../..
-include $(MSCDIR)/software/common.mak
-
-OBJECTS=exception.o libc.o errno.o crc16.o crc32.o console.o system.o id.o uart.o time.o qsort.o strtod.o spiflash.o
-
-all: crt0-$(CPU).o libbase.a libbase-nofloat.a
-
-# pull in dependency info for *existing* .o files
--include $(OBJECTS:.o=.d)
-
-libbase.a: $(OBJECTS) vsnprintf.o
-       $(AR) crs libbase.a $(OBJECTS) vsnprintf.o
-
-libbase-nofloat.a: $(OBJECTS) vsnprintf-nofloat.o
-       $(AR) crs libbase-nofloat.a $(OBJECTS) vsnprintf-nofloat.o
-
-vsnprintf-nofloat.o: vsnprintf.c
-       $(call compile-dep,-DNO_FLOAT)
-
-%.o: %.c
-       $(compile-dep)
-
-%.o: %.S
-       $(assemble)
-
-.PHONY: clean
-
-clean:
-       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) crt0-$(CPU).o vsnprintf.o vsnprintf.d vsnprintf-nofloat.o vsnprintf-nofloat.d
-       $(RM) libbase.a libbase-nofloat.a .*~ *~
diff --git a/software/libbase/console.c b/software/libbase/console.c
deleted file mode 100644 (file)
index 17274e2..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#include <uart.h>
-#include <console.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-FILE *stdin, *stdout, *stderr;
-
-static console_write_hook write_hook;
-static console_read_hook read_hook;
-static console_read_nonblock_hook read_nonblock_hook;
-
-void console_set_write_hook(console_write_hook h)
-{
-       write_hook = h;
-}
-
-void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn)
-{
-       read_hook = r;
-       read_nonblock_hook = rn;
-}
-
-int putchar(int c)
-{
-       uart_write(c);
-       if(write_hook != NULL)
-               write_hook(c);
-       return c;
-}
-
-char readchar(void)
-{
-       while(1) {
-               if(uart_read_nonblock())
-                       return uart_read();
-               if((read_nonblock_hook != NULL) && read_nonblock_hook())
-                       return read_hook();
-       }
-}
-
-int readchar_nonblock(void)
-{
-       return (uart_read_nonblock()
-               || ((read_nonblock_hook != NULL) && read_nonblock_hook()));
-}
-
-int puts(const char *s)
-{
-       while(*s) {
-               putchar(*s);
-               s++;
-       }
-       putchar('\n');
-       return 1;
-}
-
-void putsnonl(const char *s)
-{
-       while(*s) {
-               putchar(*s);
-               s++;
-       }
-}
-
-#define PRINTF_BUFFER_SIZE 256
-
-int printf(const char *fmt, ...)
-{
-       va_list args;
-       int len;
-       char outbuf[PRINTF_BUFFER_SIZE];
-
-       va_start(args, fmt);
-       len = vscnprintf(outbuf, sizeof(outbuf), fmt, args);
-       va_end(args);
-       outbuf[len] = 0;
-       putsnonl(outbuf);
-
-       return len;
-}
diff --git a/software/libbase/crc16.c b/software/libbase/crc16.c
deleted file mode 100644 (file)
index a1222e8..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#include <crc.h>
-
-static const unsigned int crc16_table[256] = {
-       0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
-       0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
-       0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
-       0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
-       0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
-       0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
-       0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
-       0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
-       0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
-       0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
-       0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
-       0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
-       0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
-       0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
-       0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
-       0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
-       0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
-       0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
-       0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
-       0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
-       0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
-       0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
-       0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
-       0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
-       0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
-       0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
-       0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
-       0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
-       0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
-       0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
-       0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
-       0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
-};
-
-unsigned short crc16(const unsigned char *buffer, int len)
-{
-       unsigned short crc;
-       
-       crc = 0;
-       while(len-- > 0)
-           crc = crc16_table[((crc >> 8) ^ (*buffer++)) & 0xFF] ^ (crc << 8);
-       
-       return crc;
-}
diff --git a/software/libbase/crc32.c b/software/libbase/crc32.c
deleted file mode 100644 (file)
index 29b9b99..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-1998 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include <crc.h>
-
-static const unsigned int crc_table[256] = {
-       0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
-       0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
-       0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
-       0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
-       0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
-       0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
-       0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
-       0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
-       0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
-       0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
-       0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
-       0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
-       0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
-       0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
-       0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
-       0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
-       0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
-       0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
-       0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
-       0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
-       0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
-       0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
-       0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
-       0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
-       0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
-       0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
-       0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
-       0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
-       0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
-       0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
-       0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
-       0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
-       0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
-       0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
-       0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
-       0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
-       0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
-       0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
-       0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
-       0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
-       0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
-       0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
-       0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
-       0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
-       0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
-       0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
-       0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
-       0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
-       0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
-       0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
-       0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
-       0x2d02ef8dL
-};
-
-#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
-#define DO2(buf)  DO1(buf); DO1(buf);
-#define DO4(buf)  DO2(buf); DO2(buf);
-#define DO8(buf)  DO4(buf); DO4(buf);
-
-unsigned int crc32(const unsigned char *buffer, unsigned int len)
-{
-       unsigned int crc;
-       crc = 0;
-       crc = crc ^ 0xffffffffL;
-       while(len >= 8) {
-               DO8(buffer);
-               len -= 8;
-       }
-       if(len) do {
-               DO1(buffer);
-       } while(--len);
-       return crc ^ 0xffffffffL;
-}
diff --git a/software/libbase/crt0-lm32.S b/software/libbase/crt0-lm32.S
deleted file mode 100644 (file)
index e0cd715..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * LatticeMico32 C startup code.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* Exception handlers - Must be 32 bytes long. */
-.section    .text, "ax", @progbits
-.global     _start
-_start:
-_reset_handler:
-       xor     r0, r0, r0
-       wcsr    IE, r0
-       mvhi    r1, hi(_reset_handler)
-       ori     r1, r1, lo(_reset_handler)
-       wcsr    EBA, r1
-       bi      _crt0
-       nop
-       nop
-
-_breakpoint_handler:
-       bi _breakpoint_handler
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-
-_instruction_bus_error_handler:
-       bi _instruction_bus_error_handler
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-
-_watchpoint_hander:
-       bi _watchpoint_hander
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-
-_data_bus_error_handler:
-       bi _data_bus_error_handler
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-
-_divide_by_zero_handler:
-       bi _divide_by_zero_handler
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-
-_interrupt_handler:
-       sw      (sp+0), ra
-       calli   .save_all
-       calli   isr
-       bi      .restore_all_and_eret
-       nop
-       nop
-       nop
-       nop
-
-_syscall_handler:
-       bi _syscall_handler
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-
-_crt0:
-       /* Setup stack and global pointer */
-       mvhi    sp, hi(_fstack)
-       ori     sp, sp, lo(_fstack)
-
-       /* Clear BSS */
-       mvhi    r1, hi(_fbss)
-       ori     r1, r1, lo(_fbss)
-       mvhi    r3, hi(_ebss)
-       ori     r3, r3, lo(_ebss)
-.clearBSS:
-       be      r1, r3, .callMain
-       sw      (r1+0), r0
-       addi    r1, r1, 4
-       bi      .clearBSS
-
-.callMain:
-       bi      main
-
-.save_all:
-       addi    sp, sp, -56
-       sw      (sp+4), r1
-       sw      (sp+8), r2
-       sw      (sp+12), r3
-       sw      (sp+16), r4
-       sw      (sp+20), r5
-       sw      (sp+24), r6
-       sw      (sp+28), r7
-       sw      (sp+32), r8
-       sw      (sp+36), r9
-       sw      (sp+40), r10
-       sw      (sp+48), ea
-       sw      (sp+52), ba
-       /* ra needs to be moved from initial stack location */
-       lw      r1, (sp+56)
-       sw      (sp+44), r1
-       ret
-
-.restore_all_and_eret:
-       lw      r1, (sp+4)
-       lw      r2, (sp+8)
-       lw      r3, (sp+12)
-       lw      r4, (sp+16)
-       lw      r5, (sp+20)
-       lw      r6, (sp+24)
-       lw      r7, (sp+28)
-       lw      r8, (sp+32)
-       lw      r9, (sp+36)
-       lw      r10, (sp+40)
-       lw      ra, (sp+44)
-       lw      ea, (sp+48)
-       lw      ba, (sp+52)
-       addi    sp, sp, 56
-       eret
diff --git a/software/libbase/crt0-or1k.S b/software/libbase/crt0-or1k.S
deleted file mode 100644 (file)
index 33807f8..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * (C) Copyright 2012, Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <spr-defs.h>
-
-#define EXCEPTION_STACK_SIZE (4*32)
-
-#define HANDLE_EXCEPTION                    ; \
-    l.addi  r1, r1, -EXCEPTION_STACK_SIZE   ; \
-    l.sw    0x1c(r1), r9                    ; \
-    l.jal   _exception_handler              ; \
-     l.nop                                  ; \
-    l.lwz   r9, 0x1c(r1)                    ; \
-    l.addi  r1, r1, EXCEPTION_STACK_SIZE    ; \
-    l.rfe                                   ; \
-     l.nop
-
-
-.section    .text, "ax", @progbits
-.global     _start
-_start:
-_reset_handler:
-    l.movhi r0, 0
-    l.movhi r1, 0
-    l.movhi r2, 0
-    l.movhi r3, 0
-    l.movhi r4, 0
-    l.movhi r5, 0
-    l.movhi r6, 0
-    l.movhi r7, 0
-    l.movhi r8, 0
-    l.movhi r9, 0
-    l.movhi r10, 0
-    l.movhi r11, 0
-    l.movhi r12, 0
-    l.movhi r13, 0
-    l.movhi r14, 0
-    l.movhi r15, 0
-    l.movhi r16, 0
-    l.movhi r17, 0
-    l.movhi r18, 0
-    l.movhi r19, 0
-    l.movhi r20, 0
-    l.movhi r21, 0
-    l.movhi r22, 0
-    l.movhi r23, 0
-    l.movhi r24, 0
-    l.movhi r25, 0
-    l.movhi r26, 0
-    l.movhi r27, 0
-    l.movhi r28, 0
-    l.movhi r29, 0
-    l.movhi r30, 0
-    l.movhi r31, 0
-
-    l.ori   r21, r0, SPR_SR_SM
-    l.mtspr r0, r21, SPR_SR
-    l.movhi r21, hi(_reset_handler)
-    l.ori   r21, r21, lo(_reset_handler)
-    l.mtspr r0, r21, SPR_EVBAR
-    /* enable caches */
-    l.jal   _cache_init
-     l.nop
-    l.j     _crt0
-     l.nop
-
-    /* bus error */
-    .org    0x200
-    HANDLE_EXCEPTION
-
-    /* data page fault */
-    .org    0x300
-    HANDLE_EXCEPTION
-
-    /* instruction page fault */
-    .org    0x400
-    HANDLE_EXCEPTION
-
-    /* tick timer */
-    .org    0x500
-    HANDLE_EXCEPTION
-
-    /* alignment */
-    .org    0x600
-    HANDLE_EXCEPTION
-
-    /* illegal instruction */
-    .org    0x700
-    HANDLE_EXCEPTION
-
-    /* external interrupt */
-    .org    0x800
-    HANDLE_EXCEPTION
-
-    /* D-TLB miss */
-    .org    0x900
-    HANDLE_EXCEPTION
-
-    /* I-TLB miss */
-    .org    0xa00
-    HANDLE_EXCEPTION
-
-    /* range */
-    .org    0xb00
-    HANDLE_EXCEPTION
-
-    /* system call */
-    .org    0xc00
-    HANDLE_EXCEPTION
-
-    /* floating point */
-    .org    0xd00
-    HANDLE_EXCEPTION
-
-    /* trap */
-    .org    0xe00
-    HANDLE_EXCEPTION
-
-    /* reserved */
-    .org    0xf00
-    HANDLE_EXCEPTION
-
-    .org 0x1000
-_crt0:
-    /* Setup stack and global pointer */
-    l.movhi    r1, hi(_fstack)
-    l.ori     r1, r1, lo(_fstack)
-
-    /* Clear BSS */
-    l.movhi    r21, hi(_fbss)
-    l.ori     r21, r21, lo(_fbss)
-    l.movhi    r3, hi(_ebss)
-    l.ori     r3, r3, lo(_ebss)
-.clearBSS:
-    l.sfeq  r21, r3
-    l.bf    .callMain
-     l.nop
-    l.sw      0(r21), r0
-    l.addi    r21, r21, 4
-    l.j      .clearBSS
-     l.nop
-
-.callMain:
-    l.j     main
-     l.nop
-
-_exception_handler:
-    l.sw    0x00(r1), r2
-    l.sw    0x04(r1), r3
-    l.sw    0x08(r1), r4
-    l.sw    0x0c(r1), r5
-    l.sw    0x10(r1), r6
-    l.sw    0x14(r1), r7
-    l.sw    0x18(r1), r8
-    l.sw    0x20(r1), r10
-    l.sw    0x24(r1), r11
-    l.sw    0x28(r1), r12
-    l.sw    0x2c(r1), r13
-    l.sw    0x30(r1), r14
-    l.sw    0x34(r1), r15
-    l.sw    0x38(r1), r16
-    l.sw    0x3c(r1), r17
-    l.sw    0x40(r1), r18
-    l.sw    0x44(r1), r19
-    l.sw    0x48(r1), r20
-    l.sw    0x4c(r1), r21
-    l.sw    0x50(r1), r22
-    l.sw    0x54(r1), r23
-    l.sw    0x58(r1), r24
-    l.sw    0x5c(r1), r25
-    l.sw    0x60(r1), r26
-    l.sw    0x64(r1), r27
-    l.sw    0x68(r1), r28
-    l.sw    0x6c(r1), r29
-    l.sw    0x70(r1), r30
-    l.sw    0x74(r1), r31
-
-    /* Save return address */
-    l.or    r14, r0, r9
-    /* Calculate exception vector from handler address */
-    l.andi  r3, r9, 0xf00
-    l.srli  r3, r3, 8
-    /* Pass saved register state */
-    l.or    r4, r0, r1
-    /* Extract exception PC */
-    l.mfspr r5, r0, SPR_EPCR_BASE
-    /* Extract exception effective address */
-    l.mfspr r6, r0, SPR_EEAR_BASE
-    /* Call exception handler with the link address as argument */
-    l.jal   exception_handler
-     l.nop
-
-    /* Load return address */
-    l.or    r9, r0, r14
-    /* Restore state */
-    l.lwz   r2, 0x00(r1)
-    l.lwz   r3, 0x04(r1)
-    l.lwz   r4, 0x08(r1)
-    l.lwz   r5, 0x0c(r1)
-    l.lwz   r6, 0x10(r1)
-    l.lwz   r7, 0x14(r1)
-    l.lwz   r8, 0x18(r1)
-    l.lwz   r10, 0x20(r1)
-    l.lwz   r11, 0x24(r1)
-    l.lwz   r12, 0x28(r1)
-    l.lwz   r13, 0x2c(r1)
-    l.lwz   r14, 0x30(r1)
-    l.lwz   r15, 0x34(r1)
-    l.lwz   r16, 0x38(r1)
-    l.lwz   r17, 0x3c(r1)
-    l.lwz   r18, 0x40(r1)
-    l.lwz   r19, 0x44(r1)
-    l.lwz   r20, 0x48(r1)
-    l.lwz   r21, 0x4c(r1)
-    l.lwz   r22, 0x50(r1)
-    l.lwz   r23, 0x54(r1)
-    l.lwz   r24, 0x58(r1)
-    l.lwz   r25, 0x5c(r1)
-    l.lwz   r26, 0x60(r1)
-    l.lwz   r27, 0x64(r1)
-    l.lwz   r28, 0x68(r1)
-    l.lwz   r29, 0x6c(r1)
-    l.lwz   r30, 0x70(r1)
-    l.lwz   r31, 0x74(r1)
-    l.jr    r9
-     l.nop
-
-.global _cache_init
-_cache_init:
-    /*
-    This function is to be used ONLY during reset, before main() is called.
-    TODO: Perhaps break into individual enable instruction/data cache
-          sections functions, and provide disable functions, also, all
-          callable from C
-    */
-
-    /* Instruction cache enable */
-    /* Check if IC present and skip enabling otherwise */
-#if 1
-.L6:
-    l.mfspr r3,r0,SPR_UPR
-    l.andi  r7,r3,SPR_UPR_ICP
-    l.sfeq  r7,r0
-    l.bf    .L8
-    l.nop
-
-    /* Disable IC */
-    l.mfspr r6,r0,SPR_SR
-    l.addi  r5,r0,-1
-    l.xori  r5,r5,SPR_SR_ICE
-    l.and   r5,r6,r5
-    l.mtspr r0,r5,SPR_SR
-
-    /* Establish cache block size
-    If BS=0, 16;
-    If BS=1, 32;
-    r14 contain block size
-    */
-    l.mfspr r3,r0,SPR_ICCFGR
-    l.andi  r7,r3,SPR_ICCFGR_CBS
-    l.srli  r8,r7,7
-    l.ori   r4,r0,16
-    l.sll   r14,r4,r8
-
-    /* Establish number of cache sets
-    r10 contains number of cache sets
-    r8 contains log(# of cache sets)
-    */
-    l.andi  r7,r3,SPR_ICCFGR_NCS
-    l.srli  r8,r7,3
-    l.ori   r4,r0,1
-    l.sll   r10,r4,r8
-
-    /* Invalidate IC */
-    l.addi  r6,r0,0
-    l.sll   r5,r14,r8
-
-.L7:    l.mtspr r0,r6,SPR_ICBIR
-    l.sfne  r6,r5
-    l.bf    .L7
-    l.add   r6,r6,r14
-
-    /* Enable IC */
-    l.mfspr r6,r0,SPR_SR
-    l.ori   r6,r6,SPR_SR_ICE
-    l.mtspr r0,r6,SPR_SR
-    l.nop
-    l.nop
-    l.nop
-    l.nop
-    l.nop
-    l.nop
-    l.nop
-    l.nop
-    /* Data cache enable */
-    /* Check if DC present and skip enabling otherwise */
-#endif
-.L8:
-#if 1
-    l.mfspr r3,r0,SPR_UPR
-    l.andi  r7,r3,SPR_UPR_DCP
-    l.sfeq  r7,r0
-    l.bf    .L10
-    l.nop
-    /* Disable DC */
-    l.mfspr r6,r0,SPR_SR
-    l.addi  r5,r0,-1
-    l.xori  r5,r5,SPR_SR_DCE
-    l.and   r5,r6,r5
-    l.mtspr r0,r5,SPR_SR
-    /* Establish cache block size
-       If BS=0, 16;
-       If BS=1, 32;
-       r14 contain block size
-    */
-    l.mfspr r3,r0,SPR_DCCFGR
-    l.andi  r7,r3,SPR_DCCFGR_CBS
-    l.srli  r8,r7,7
-    l.ori   r4,r0,16
-    l.sll   r14,r4,r8
-    /* Establish number of cache sets
-       r10 contains number of cache sets
-       r8 contains log(# of cache sets)
-    */
-    l.andi  r7,r3,SPR_DCCFGR_NCS
-    l.srli  r8,r7,3
-    l.ori   r4,r0,1
-    l.sll   r10,r4,r8
-    /* Invalidate DC */
-    l.addi  r6,r0,0
-    l.sll   r5,r14,r8
-
-.L9:
-    l.mtspr r0,r6,SPR_DCBIR
-    l.sfne  r6,r5
-    l.bf    .L9
-    l.add   r6,r6,r14
-    /* Enable DC */
-    l.mfspr r6,r0,SPR_SR
-    l.ori   r6,r6,SPR_SR_DCE
-    l.mtspr r0,r6,SPR_SR
-#endif
-.L10:
-    /* Return */
-    l.jr    r9
-    l.nop
diff --git a/software/libbase/errno.c b/software/libbase/errno.c
deleted file mode 100644 (file)
index 4e91f78..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-#include <string.h>
-#include <errno.h>
-
-int errno;
-
-/************************************************************************
- * Based on: lib/string/lib_strerror.c
- *
- *   Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
- *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- * 3. Neither the name NuttX nor the names of its contributors may be
- *    used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ************************************************************************/
-
-struct errno_strmap_s
-{
-  int errnum;
-  char *str;
-};
-
-/* This table maps all error numbers to descriptive strings.
- * The only assumption that the code makes with regard to this
- * this table is that it is order by error number.
- *
- * The size of this table is quite large.  Its size can be
- * reduced by eliminating some of the more obscure error
- * strings.
- */
-
-struct errno_strmap_s g_errnomap[] =
-{
-  { EPERM,               EPERM_STR           },
-  { ENOENT,              ENOENT_STR          },
-  { ESRCH,               ESRCH_STR           },
-  { EINTR,               EINTR_STR           },
-  { EIO,                 EIO_STR             },
-  { ENXIO,               ENXIO_STR           },
-  { E2BIG,               E2BIG_STR           },
-  { ENOEXEC,             ENOEXEC_STR         },
-  { EBADF,               EBADF_STR           },
-  { ECHILD,              ECHILD_STR          },
-  { EAGAIN,              EAGAIN_STR          },
-  { ENOMEM,              ENOMEM_STR          },
-  { EACCES,              EACCES_STR          },
-  { EFAULT,              EFAULT_STR          },
-  { ENOTBLK,             ENOTBLK_STR         },
-  { EBUSY,               EBUSY_STR           },
-  { EEXIST,              EEXIST_STR          },
-  { EXDEV,               EXDEV_STR           },
-  { ENODEV,              ENODEV_STR          },
-  { ENOTDIR,             ENOTDIR_STR         },
-  { EISDIR,              EISDIR_STR          },
-  { EINVAL,              EINVAL_STR          },
-  { ENFILE,              ENFILE_STR          },
-  { EMFILE,              EMFILE_STR          },
-  { ENOTTY,              ENOTTY_STR          },
-  { ETXTBSY,             ETXTBSY_STR         },
-  { EFBIG,               EFBIG_STR           },
-  { ENOSPC,              ENOSPC_STR          },
-  { ESPIPE,              ESPIPE_STR          },
-  { EROFS,               EROFS_STR           },
-  { EMLINK,              EMLINK_STR          },
-  { EPIPE,               EPIPE_STR           },
-  { EDOM,                EDOM_STR            },
-  { ERANGE,              ERANGE_STR          },
-  { EDEADLK,             EDEADLK_STR         },
-  { ENAMETOOLONG,        ENAMETOOLONG_STR    },
-  { ENOLCK,              ENOLCK_STR          },
-  { ENOSYS,              ENOSYS_STR          },
-  { ENOTEMPTY,           ENOTEMPTY_STR       },
-  { ELOOP,               ELOOP_STR           },
-  { ENOMSG,              ENOMSG_STR          },
-  { EIDRM,               EIDRM_STR           },
-  { ECHRNG,              ECHRNG_STR          },
-  { EL2NSYNC,            EL2NSYNC_STR        },
-  { EL3HLT,              EL3HLT_STR          },
-  { EL3RST,              EL3RST_STR          },
-  { ELNRNG,              ELNRNG_STR          },
-  { EUNATCH,             EUNATCH_STR         },
-  { ENOCSI,              ENOCSI_STR          },
-  { EL2HLT,              EL2HLT_STR          },
-  { EBADE,               EBADE_STR           },
-  { EBADR,               EBADR_STR           },
-  { EXFULL,              EXFULL_STR          },
-  { ENOANO,              ENOANO_STR          },
-  { EBADRQC,             EBADRQC_STR         },
-  { EBADSLT,             EBADSLT_STR         },
-  { EBFONT,              EBFONT_STR          },
-  { ENOSTR,              ENOSTR_STR          },
-  { ENODATA,             ENODATA_STR         },
-  { ETIME,               ETIME_STR           },
-  { ENOSR,               ENOSR_STR           },
-  { ENONET,              ENONET_STR          },
-  { ENOPKG,              ENOPKG_STR          },
-  { EREMOTE,             EREMOTE_STR         },
-  { ENOLINK,             ENOLINK_STR         },
-  { EADV,                EADV_STR            },
-  { ESRMNT,              ESRMNT_STR          },
-  { ECOMM,               ECOMM_STR           },
-  { EPROTO,              EPROTO_STR          },
-  { EMULTIHOP,           EMULTIHOP_STR       },
-  { EDOTDOT,             EDOTDOT_STR         },
-  { EBADMSG,             EBADMSG_STR         },
-  { EOVERFLOW,           EOVERFLOW_STR       },
-  { ENOTUNIQ,            ENOTUNIQ_STR        },
-  { EBADFD,              EBADFD_STR          },
-  { EREMCHG,             EREMCHG_STR         },
-  { ELIBACC,             ELIBACC_STR         },
-  { ELIBBAD,             ELIBBAD_STR         },
-  { ELIBSCN,             ELIBSCN_STR         },
-  { ELIBMAX,             ELIBMAX_STR         },
-  { ELIBEXEC,            ELIBEXEC_STR        },
-  { EILSEQ,              EILSEQ_STR          },
-  { ERESTART,            ERESTART_STR        },
-  { ESTRPIPE,            ESTRPIPE_STR        },
-  { EUSERS,              EUSERS_STR          },
-  { ENOTSOCK,            ENOTSOCK_STR        },
-  { EDESTADDRREQ,        EDESTADDRREQ_STR    },
-  { EMSGSIZE,            EMSGSIZE_STR        },
-  { EPROTOTYPE,          EPROTOTYPE_STR      },
-  { ENOPROTOOPT,         ENOPROTOOPT_STR     },
-  { EPROTONOSUPPORT,     EPROTONOSUPPORT_STR },
-  { ESOCKTNOSUPPORT,     ESOCKTNOSUPPORT_STR },
-  { EOPNOTSUPP,          EOPNOTSUPP_STR      },
-  { EPFNOSUPPORT,        EPFNOSUPPORT_STR    },
-  { EAFNOSUPPORT,        EAFNOSUPPORT_STR    },
-  { EADDRINUSE,          EADDRINUSE_STR      },
-  { EADDRNOTAVAIL,       EADDRNOTAVAIL_STR   },
-  { ENETDOWN,            ENETDOWN_STR        },
-  { ENETUNREACH,         ENETUNREACH_STR     },
-  { ENETRESET,           ENETRESET_STR       },
-  { ECONNABORTED,        ECONNABORTED_STR    },
-  { ECONNRESET,          ECONNRESET_STR      },
-  { ENOBUFS,             ENOBUFS_STR         },
-  { EISCONN,             EISCONN_STR         },
-  { ENOTCONN,            ENOTCONN_STR        },
-  { ESHUTDOWN,           ESHUTDOWN_STR       },
-  { ETOOMANYREFS,        ETOOMANYREFS_STR    },
-  { ETIMEDOUT,           ETIMEDOUT_STR       },
-  { ECONNREFUSED,        ECONNREFUSED_STR    },
-  { EHOSTDOWN,           EHOSTDOWN_STR       },
-  { EHOSTUNREACH,        EHOSTUNREACH_STR    },
-  { EALREADY,            EALREADY_STR        },
-  { EINPROGRESS,         EINPROGRESS_STR     },
-  { ESTALE,              ESTALE_STR          },
-  { EUCLEAN,             EUCLEAN_STR         },
-  { ENOTNAM,             ENOTNAM_STR         },
-  { ENAVAIL,             ENAVAIL_STR         },
-  { EISNAM,              EISNAM_STR          },
-  { EREMOTEIO,           EREMOTEIO_STR       },
-  { EDQUOT,              EDQUOT_STR          },
-  { ENOMEDIUM,           ENOMEDIUM_STR       },
-  { EMEDIUMTYPE,         EMEDIUMTYPE_STR     }
-};
-
-#define NERRNO_STRS (sizeof(g_errnomap) / sizeof(struct errno_strmap_s))
-
-char *strerror(int errnum)
-{
-  int ndxlow = 0;
-  int ndxhi  = NERRNO_STRS - 1;
-  int ndxmid;
-
-  do
-    {
-      ndxmid = (ndxlow + ndxhi) >> 1;
-      if (errnum > g_errnomap[ndxmid].errnum)
-        {
-          ndxlow = ndxmid + 1;
-        }
-      else if (errnum < g_errnomap[ndxmid].errnum)
-        {
-          ndxhi = ndxmid - 1;
-        }
-      else
-        {
-          return g_errnomap[ndxmid].str;
-        }
-    }
-  while (ndxlow <= ndxhi);
-  return "Unknown error";
-}
diff --git a/software/libbase/exception.c b/software/libbase/exception.c
deleted file mode 100644 (file)
index 542001a..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-void isr(void);
-
-#ifdef __or1k__
-
-#define EXTERNAL_IRQ 0x8
-
-void exception_handler(unsigned long vect, unsigned long *regs,
-                       unsigned long pc, unsigned long ea);
-void exception_handler(unsigned long vect, unsigned long *regs,
-                       unsigned long pc, unsigned long ea)
-{
-       if(vect == EXTERNAL_IRQ) {
-               isr();
-       } else {
-               /* Unhandled exception */
-               for(;;);
-       }
-}
-#endif
diff --git a/software/libbase/id.c b/software/libbase/id.c
deleted file mode 100644 (file)
index 254aa55..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <generated/csr.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <id.h>
-
-void get_sysid_formatted(char *sysid)
-{
-       sysid[0] = identifier_sysid_read() >> 8;
-       sysid[1] = identifier_sysid_read();
-       sysid[2] = 0;
-}
-
-void id_print(void)
-{
-       char sysid[3];
-
-       get_sysid_formatted(sysid);
-       printf("Running on MiSoC rev. %08x (sysid:%s) at %dMHz\n", identifier_revision_read(), sysid, identifier_frequency_read()/1000000);
-}
diff --git a/software/libbase/libc.c b/software/libbase/libc.c
deleted file mode 100644 (file)
index e45a79d..0000000
+++ /dev/null
@@ -1,734 +0,0 @@
-/*
- * MiSoC
- * Copyright (C) 2007, 2008, 2009, 2010, 2011 Sebastien Bourdeauducq
- * Copyright (C) Linus Torvalds and Linux kernel developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <limits.h>
-
-/**
- * strchr - Find the first occurrence of a character in a string
- * @s: The string to be searched
- * @c: The character to search for
- */
-char *strchr(const char *s, int c)
-{
-       for (; *s != (char)c; ++s)
-               if (*s == '\0')
-                       return NULL;
-       return (char *)s;
-}
-
-/**
- * strpbrk - Find the first occurrence of a set of characters
- * @cs: The string to be searched
- * @ct: The characters to search for
- */
-char *strpbrk(const char *cs, const char *ct)
-{
-       const char *sc1, *sc2;
-
-       for (sc1 = cs; *sc1 != '\0'; ++sc1) {
-               for (sc2 = ct; *sc2 != '\0'; ++sc2) {
-                       if (*sc1 == *sc2)
-                               return (char *)sc1;
-               }
-       }
-       return NULL;
-}
-
-/**
- * strrchr - Find the last occurrence of a character in a string
- * @s: The string to be searched
- * @c: The character to search for
- */
-char *strrchr(const char *s, int c)
-{
-       const char *p = s + strlen(s);
-       do {
-           if (*p == (char)c)
-               return (char *)p;
-       } while (--p >= s);
-       return NULL;
-}
-
-/**
- * strnchr - Find a character in a length limited string
- * @s: The string to be searched
- * @count: The number of characters to be searched
- * @c: The character to search for
- */
-char *strnchr(const char *s, size_t count, int c)
-{
-       for (; count-- && *s != '\0'; ++s)
-               if (*s == (char)c)
-                       return (char *)s;
-       return NULL;
-}
-
-/**
- * strcpy - Copy a %NUL terminated string
- * @dest: Where to copy the string to
- * @src: Where to copy the string from
- */
-char *strcpy(char *dest, const char *src)
-{
-       char *tmp = dest;
-
-       while ((*dest++ = *src++) != '\0')
-               /* nothing */;
-       return tmp;
-}
-
-/**
- * strncpy - Copy a length-limited, %NUL-terminated string
- * @dest: Where to copy the string to
- * @src: Where to copy the string from
- * @count: The maximum number of bytes to copy
- *
- * The result is not %NUL-terminated if the source exceeds
- * @count bytes.
- *
- * In the case where the length of @src is less than  that  of
- * count, the remainder of @dest will be padded with %NUL.
- *
- */
-char *strncpy(char *dest, const char *src, size_t count)
-{
-       char *tmp = dest;
-       
-       while (count) {
-               if ((*tmp = *src) != 0)
-                       src++;
-               tmp++;
-               count--;
-       }
-       return dest;
-}
-
-/**
- * strcmp - Compare two strings
- * @cs: One string
- * @ct: Another string
- */
-int strcmp(const char *cs, const char *ct)
-{
-       signed char __res;
-
-       while (1) {
-               if ((__res = *cs - *ct++) != 0 || !*cs++)
-                       break;
-       }
-       return __res;
-}
-
-/**
- * strncmp - Compare two strings using the first characters only
- * @cs: One string
- * @ct: Another string
- * @count: Number of characters
- */
-int strncmp(const char *cs, const char *ct, size_t count)
-{
-       signed char __res;
-       size_t n;
-
-       n = 0;
-       __res = 0;
-       while (n < count) {
-               if ((__res = *cs - *ct++) != 0 || !*cs++)
-                       break;
-               n++;
-       }
-       return __res;
-}
-
-/**
- * strcat - Append one %NUL-terminated string to another
- * @dest: The string to be appended to
- * @src: The string to append to it
- */
-char *strcat(char *dest, const char *src)
-{
-  char *tmp = dest;
-
-  while (*dest)
-    dest++;
-  while ((*dest++ = *src++) != '\0')
-    ;
-  return tmp;
-}
-
-/**
- * strncat - Append a length-limited, %NUL-terminated string to another
- * @dest: The string to be appended to
- * @src: The string to append to it
- * @count: The maximum numbers of bytes to copy
- *
- * Note that in contrast to strncpy(), strncat() ensures the result is
- * terminated.
- */
-char *strncat(char *dest, const char *src, size_t count)
-{
-  char *tmp = dest;
-
-  if (count) {
-    while (*dest)
-      dest++;
-    while ((*dest++ = *src++) != 0) {
-      if (--count == 0) {
-        *dest = '\0';
-        break;
-      }
-    }
-  }
-  return tmp;
-}
-
-/**
- * strlen - Find the length of a string
- * @s: The string to be sized
- */
-size_t strlen(const char *s)
-{
-       const char *sc;
-
-       for (sc = s; *sc != '\0'; ++sc)
-               /* nothing */;
-       return sc - s;
-}
-
-/**
- * strnlen - Find the length of a length-limited string
- * @s: The string to be sized
- * @count: The maximum number of bytes to search
- */
-size_t strnlen(const char *s, size_t count)
-{
-       const char *sc;
-
-       for (sc = s; count-- && *sc != '\0'; ++sc)
-               /* nothing */;
-       return sc - s;
-}
-
-/**
- * strspn - Calculate the length of the initial substring of @s which only contain letters in @accept
- * @s: The string to be searched
- * @accept: The string to search for
- */
-size_t strspn(const char *s, const char *accept)
-{
-       const char *p;
-       const char *a;
-       size_t count = 0;
-
-       for (p = s; *p != '\0'; ++p) {
-               for (a = accept; *a != '\0'; ++a) {
-                       if (*p == *a)
-                               break;
-               }
-               if (*a == '\0')
-                       return count;
-               ++count;
-       }
-       return count;
-}
-
-/**
- * memcmp - Compare two areas of memory
- * @cs: One area of memory
- * @ct: Another area of memory
- * @count: The size of the area.
- */
-int memcmp(const void *cs, const void *ct, size_t count)
-{
-       const unsigned char *su1, *su2;
-       int res = 0;
-
-       for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
-               if ((res = *su1 - *su2) != 0)
-                       break;
-       return res;
-}
-
-/**
- * memset - Fill a region of memory with the given value
- * @s: Pointer to the start of the area.
- * @c: The byte to fill the area with
- * @count: The size of the area.
- */
-void *memset(void *s, int c, size_t count)
-{
-       char *xs = s;
-
-       while (count--)
-               *xs++ = c;
-       return s;
-}
-
-/**
- * memcpy - Copies one area of memory to another
- * @dest: Destination
- * @src: Source
- * @n: The size to copy.
- */
-void *memcpy(void *to, const void *from, size_t n)
-{
-       void *xto = to;
-       size_t temp;
-
-       if(!n)
-               return xto;
-       if((long)to & 1) {
-               char *cto = to;
-               const char *cfrom = from;
-               *cto++ = *cfrom++;
-               to = cto;
-               from = cfrom;
-               n--;
-       }
-       if((long)from & 1) {
-               char *cto = to;
-               const char *cfrom = from;
-               for (; n; n--)
-                       *cto++ = *cfrom++;
-               return xto;
-       }
-       if(n > 2 && (long)to & 2) {
-               short *sto = to;
-               const short *sfrom = from;
-               *sto++ = *sfrom++;
-               to = sto;
-               from = sfrom;
-               n -= 2;
-       }
-       if((long)from & 2) {
-               short *sto = to;
-               const short *sfrom = from;
-               temp = n >> 1;
-               for (; temp; temp--)
-                       *sto++ = *sfrom++;
-               to = sto;
-               from = sfrom;
-               if(n & 1) {
-                       char *cto = to;
-                       const char *cfrom = from;
-                       *cto = *cfrom;
-               }
-               return xto;
-       }
-       temp = n >> 2;
-       if(temp) {
-               long *lto = to;
-               const long *lfrom = from;
-               for(; temp; temp--)
-                       *lto++ = *lfrom++;
-               to = lto;
-               from = lfrom;
-       }
-       if(n & 2) {
-               short *sto = to;
-               const short *sfrom = from;
-               *sto++ = *sfrom++;
-               to = sto;
-               from = sfrom;
-       }
-       if(n & 1) {
-               char *cto = to;
-               const char *cfrom = from;
-               *cto = *cfrom;
-       }
-       return xto;
-}
-
-/**
- * memmove - Copies one area of memory to another, overlap possible
- * @dest: Destination
- * @src: Source
- * @n: The size to copy.
- */
-void *memmove(void *dest, const void *src, size_t count)
-{
-       char *tmp, *s;
-
-       if(dest <= src) {
-               tmp = (char *) dest;
-               s = (char *) src;
-               while(count--)
-                       *tmp++ = *s++;
-       } else {
-               tmp = (char *)dest + count;
-               s = (char *)src + count;
-               while(count--)
-                       *--tmp = *--s;
-       }
-
-       return dest;
-}
-
-/**
- * strstr - Find the first substring in a %NUL terminated string
- * @s1: The string to be searched
- * @s2: The string to search for
- */
-char *strstr(const char *s1, const char *s2)
-{
-       size_t l1, l2;
-
-       l2 = strlen(s2);
-       if (!l2)
-               return (char *)s1;
-       l1 = strlen(s1);
-       while (l1 >= l2) {
-               l1--;
-               if (!memcmp(s1, s2, l2))
-                       return (char *)s1;
-               s1++;
-       }
-       return NULL;
-}
-
-/**
- * memchr - Find a character in an area of memory.
- * @s: The memory area
- * @c: The byte to search for
- * @n: The size of the area.
- *
- * returns the address of the first occurrence of @c, or %NULL
- * if @c is not found
- */
-void *memchr(const void *s, int c, size_t n)
-{
-       const unsigned char *p = s;
-       while (n-- != 0) {
-               if ((unsigned char)c == *p++) {
-                       return (void *)(p - 1);
-               }
-       }
-       return NULL;
-}
-
-/**
- * strtoul - convert a string to an unsigned long
- * @nptr: The start of the string
- * @endptr: A pointer to the end of the parsed string will be placed here
- * @base: The number base to use
- */
-unsigned long strtoul(const char *nptr, char **endptr, int base)
-{
-       unsigned long result = 0,value;
-
-       if (!base) {
-               base = 10;
-               if (*nptr == '0') {
-                       base = 8;
-                       nptr++;
-                       if ((toupper(*nptr) == 'X') && isxdigit(nptr[1])) {
-                               nptr++;
-                               base = 16;
-                       }
-               }
-       } else if (base == 16) {
-               if (nptr[0] == '0' && toupper(nptr[1]) == 'X')
-                       nptr += 2;
-       }
-       while (isxdigit(*nptr) &&
-              (value = isdigit(*nptr) ? *nptr-'0' : toupper(*nptr)-'A'+10) < base) {
-               result = result*base + value;
-               nptr++;
-       }
-       if (endptr)
-               *endptr = (char *)nptr;
-       return result;
-}
-
-/**
- * strtol - convert a string to a signed long
- * @nptr: The start of the string
- * @endptr: A pointer to the end of the parsed string will be placed here
- * @base: The number base to use
- */
-long strtol(const char *nptr, char **endptr, int base)
-{
-       if(*nptr=='-')
-               return -strtoul(nptr+1,endptr,base);
-       return strtoul(nptr,endptr,base);
-}
-
-int skip_atoi(const char **s)
-{
-       int i=0;
-
-       while (isdigit(**s))
-               i = i*10 + *((*s)++) - '0';
-       return i;
-}
-
-char *number(char *buf, char *end, unsigned long num, int base, int size, int precision, int type)
-{
-       char c,sign,tmp[66];
-       const char *digits;
-       static const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
-       static const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-       int i;
-
-       digits = (type & PRINTF_LARGE) ? large_digits : small_digits;
-       if (type & PRINTF_LEFT)
-               type &= ~PRINTF_ZEROPAD;
-       if (base < 2 || base > 36)
-               return NULL;
-       c = (type & PRINTF_ZEROPAD) ? '0' : ' ';
-       sign = 0;
-       if (type & PRINTF_SIGN) {
-               if ((signed long) num < 0) {
-                       sign = '-';
-                       num = - (signed long) num;
-                       size--;
-               } else if (type & PRINTF_PLUS) {
-                       sign = '+';
-                       size--;
-               } else if (type & PRINTF_SPACE) {
-                       sign = ' ';
-                       size--;
-               }
-       }
-       if (type & PRINTF_SPECIAL) {
-               if (base == 16)
-                       size -= 2;
-               else if (base == 8)
-                       size--;
-       }
-       i = 0;
-       if (num == 0)
-               tmp[i++]='0';
-       else while (num != 0) {
-               tmp[i++] = digits[num % base];
-               num = num / base;
-       }
-       if (i > precision)
-               precision = i;
-       size -= precision;
-       if (!(type&(PRINTF_ZEROPAD+PRINTF_LEFT))) {
-               while(size-->0) {
-                       if (buf < end)
-                               *buf = ' ';
-                       ++buf;
-               }
-       }
-       if (sign) {
-               if (buf < end)
-                       *buf = sign;
-               ++buf;
-       }
-       if (type & PRINTF_SPECIAL) {
-               if (base==8) {
-                       if (buf < end)
-                               *buf = '0';
-                       ++buf;
-               } else if (base==16) {
-                       if (buf < end)
-                               *buf = '0';
-                       ++buf;
-                       if (buf < end)
-                               *buf = digits[33];
-                       ++buf;
-               }
-       }
-       if (!(type & PRINTF_LEFT)) {
-               while (size-- > 0) {
-                       if (buf < end)
-                               *buf = c;
-                       ++buf;
-               }
-       }
-       while (i < precision--) {
-               if (buf < end)
-                       *buf = '0';
-               ++buf;
-       }
-       while (i-- > 0) {
-               if (buf < end)
-                       *buf = tmp[i];
-               ++buf;
-       }
-       while (size-- > 0) {
-               if (buf < end)
-                       *buf = ' ';
-               ++buf;
-       }
-       return buf;
-}
-
-/**
- * vscnprintf - Format a string and place it in a buffer
- * @buf: The buffer to place the result into
- * @size: The size of the buffer, including the trailing null space
- * @fmt: The format string to use
- * @args: Arguments for the format string
- *
- * The return value is the number of characters which have been written into
- * the @buf not including the trailing '\0'. If @size is <= 0 the function
- * returns 0.
- *
- * Call this function if you are already dealing with a va_list.
- * You probably want scnprintf() instead.
- */
-int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
-{
-       int i;
-
-       i=vsnprintf(buf,size,fmt,args);
-       return (i >= size) ? (size - 1) : i;
-}
-
-
-/**
- * snprintf - Format a string and place it in a buffer
- * @buf: The buffer to place the result into
- * @size: The size of the buffer, including the trailing null space
- * @fmt: The format string to use
- * @...: Arguments for the format string
- *
- * The return value is the number of characters which would be
- * generated for the given input, excluding the trailing null,
- * as per ISO C99.  If the return is greater than or equal to
- * @size, the resulting string is truncated.
- */
-int snprintf(char * buf, size_t size, const char *fmt, ...)
-{
-       va_list args;
-       int i;
-
-       va_start(args, fmt);
-       i=vsnprintf(buf,size,fmt,args);
-       va_end(args);
-       return i;
-}
-
-/**
- * scnprintf - Format a string and place it in a buffer
- * @buf: The buffer to place the result into
- * @size: The size of the buffer, including the trailing null space
- * @fmt: The format string to use
- * @...: Arguments for the format string
- *
- * The return value is the number of characters written into @buf not including
- * the trailing '\0'. If @size is <= 0 the function returns 0.
- */
-
-int scnprintf(char * buf, size_t size, const char *fmt, ...)
-{
-       va_list args;
-       int i;
-
-       va_start(args, fmt);
-       i = vsnprintf(buf, size, fmt, args);
-       va_end(args);
-       return (i >= size) ? (size - 1) : i;
-}
-
-/**
- * vsprintf - Format a string and place it in a buffer
- * @buf: The buffer to place the result into
- * @fmt: The format string to use
- * @args: Arguments for the format string
- *
- * The function returns the number of characters written
- * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
- * buffer overflows.
- *
- * Call this function if you are already dealing with a va_list.
- * You probably want sprintf() instead.
- */
-int vsprintf(char *buf, const char *fmt, va_list args)
-{
-       return vsnprintf(buf, INT_MAX, fmt, args);
-}
-
-/**
- * sprintf - Format a string and place it in a buffer
- * @buf: The buffer to place the result into
- * @fmt: The format string to use
- * @...: Arguments for the format string
- *
- * The function returns the number of characters written
- * into @buf. Use snprintf() or scnprintf() in order to avoid
- * buffer overflows.
- */
-int sprintf(char * buf, const char *fmt, ...)
-{
-       va_list args;
-       int i;
-
-       va_start(args, fmt);
-       i=vsnprintf(buf, INT_MAX, fmt, args);
-       va_end(args);
-       return i;
-}
-
-/* From linux/lib/ctype.c, Copyright (C) 1991, 1992  Linus Torvalds */
-const unsigned char _ctype[] = {
-_C,_C,_C,_C,_C,_C,_C,_C,                               /* 0-7 */
-_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,                        /* 8-15 */
-_C,_C,_C,_C,_C,_C,_C,_C,                               /* 16-23 */
-_C,_C,_C,_C,_C,_C,_C,_C,                               /* 24-31 */
-_S|_SP,_P,_P,_P,_P,_P,_P,_P,                           /* 32-39 */
-_P,_P,_P,_P,_P,_P,_P,_P,                               /* 40-47 */
-_D,_D,_D,_D,_D,_D,_D,_D,                               /* 48-55 */
-_D,_D,_P,_P,_P,_P,_P,_P,                               /* 56-63 */
-_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,             /* 64-71 */
-_U,_U,_U,_U,_U,_U,_U,_U,                               /* 72-79 */
-_U,_U,_U,_U,_U,_U,_U,_U,                               /* 80-87 */
-_U,_U,_U,_P,_P,_P,_P,_P,                               /* 88-95 */
-_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,             /* 96-103 */
-_L,_L,_L,_L,_L,_L,_L,_L,                               /* 104-111 */
-_L,_L,_L,_L,_L,_L,_L,_L,                               /* 112-119 */
-_L,_L,_L,_P,_P,_P,_P,_C,                               /* 120-127 */
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                       /* 128-143 */
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                       /* 144-159 */
-_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,   /* 160-175 */
-_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,       /* 176-191 */
-_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,       /* 192-207 */
-_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,       /* 208-223 */
-_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,       /* 224-239 */
-_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L};      /* 240-255 */
-
-/**
- * rand - Returns a pseudo random number
- */
-
-static unsigned int randseed;
-unsigned int rand(void)
-{
-       randseed = 129 * randseed + 907633385;
-       return randseed;
-}
-
-void srand(unsigned int seed)
-{
-       randseed = seed;
-}
-
-void abort(void)
-{
-       printf("Aborted.");
-       while(1);
-}
diff --git a/software/libbase/linker-sdram.ld b/software/libbase/linker-sdram.ld
deleted file mode 100644 (file)
index b55b50f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-INCLUDE generated/output_format.ld
-ENTRY(_start)
-
-__DYNAMIC = 0;
-
-INCLUDE generated/regions.ld
-
-SECTIONS
-{
-       .text :
-       {
-               _ftext = .;
-               *(.text .stub .text.* .gnu.linkonce.t.*)
-               _etext = .;
-       } > main_ram
-
-       .got :
-       {
-               _GLOBAL_OFFSET_TABLE_ = .;
-               *(.got)
-       } > main_ram
-
-       .got.plt :
-       {
-               *(.got.plt)
-       } > main_ram
-
-       .rodata :
-       {
-               . = ALIGN(4);
-               _frodata = .;
-               *(.rodata .rodata.* .gnu.linkonce.r.*)
-               *(.rodata1)
-               _erodata = .;
-       } > main_ram
-
-       .data :
-       {
-               . = ALIGN(4);
-               _fdata = .;
-               *(.data .data.* .gnu.linkonce.d.*)
-               *(.data1)
-               *(.sdata .sdata.* .gnu.linkonce.s.*)
-               _edata = .;
-       } > main_ram
-
-       .bss :
-       {
-               . = ALIGN(4);
-               _fbss = .;
-               *(.dynsbss)
-               *(.sbss .sbss.* .gnu.linkonce.sb.*)
-               *(.scommon)
-               *(.dynbss)
-               *(.bss .bss.* .gnu.linkonce.b.*)
-               *(COMMON)
-               . = ALIGN(4);
-               _ebss = .;
-               . = ALIGN(8);
-               _heapstart = .;
-       } > main_ram
-}
-
-PROVIDE(_fstack = ORIGIN(main_ram) + LENGTH(main_ram) - 4);
diff --git a/software/libbase/qsort.c b/software/libbase/qsort.c
deleted file mode 100644 (file)
index 4df3987..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/****************************************************************************
- * lib/stdlib/lib_qsort.c
- *
- *   Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
- *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
- *
- * Leveraged from:
- *
- *  Copyright (c) 1992, 1993
- *  The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    This product includes software developed by the University of
- *    California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- ****************************************************************************/
-
-#include <stdlib.h>
-
-#define min(a, b)  (a) < (b) ? a : b
-
-#define swapcode(TYPE, parmi, parmj, n) \
-  { \
-    long i = (n) / sizeof (TYPE); \
-    register TYPE *pi = (TYPE *) (parmi); \
-    register TYPE *pj = (TYPE *) (parmj); \
-    do { \
-      register TYPE  t = *pi; \
-      *pi++ = *pj; \
-      *pj++ = t; \
-    } while (--i > 0); \
-  }
-
-#define SWAPINIT(a, size) \
-  swaptype = ((char *)a - (char *)0) % sizeof(long) || \
-  size % sizeof(long) ? 2 : size == sizeof(long)? 0 : 1;
-
-#define swap(a, b) \
-  if (swaptype == 0) \
-    { \
-      long t = *(long *)(a); \
-      *(long *)(a) = *(long *)(b); \
-      *(long *)(b) = t; \
-    } \
-  else \
-    { \
-      swapfunc(a, b, size, swaptype); \
-    }
-
-#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
-
-static inline void swapfunc(char *a, char *b, int n, int swaptype);
-static inline char *med3(char *a, char *b, char *c,
-                         int (*compar)(const void *, const void *));
-
-static inline void swapfunc(char *a, char *b, int n, int swaptype)
-{
-  if(swaptype <= 1)
-    {
-      swapcode(long, a, b, n)
-    }
-  else
-    {
-      swapcode(char, a, b, n)
-    }
-}
-
-static inline char *med3(char *a, char *b, char *c,
-                         int (*compar)(const void *, const void *))
-{
-  return compar(a, b) < 0 ?
-         (compar(b, c) < 0 ? b : (compar(a, c) < 0 ? c : a ))
-              :(compar(b, c) > 0 ? b : (compar(a, c) < 0 ? a : c ));
-}
-
-/****************************************************************************
- * Name: qsort
- *
- * Description:
- *   Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
- *
- ****************************************************************************/
-
-void qsort(void *base, size_t nmemb, size_t size,
-           int(*compar)(const void *, const void *))
-{
-  char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
-  int d, r, swaptype, swap_cnt;
-
-loop:
-  SWAPINIT(base, size);
-  swap_cnt = 0;
-  if (nmemb < 7)
-    {
-      for (pm = (char *) base + size; pm < (char *) base + nmemb * size; pm += size)
-        {
-          for (pl = pm; pl > (char *) base && compar(pl - size, pl) > 0; pl -= size)
-            {
-              swap(pl, pl - size);
-            }
-        }
-      return;
-  }
-
-  pm = (char *) base + (nmemb / 2) * size;
-  if (nmemb > 7)
-    {
-      pl = base;
-      pn = (char *) base + (nmemb - 1) * size;
-      if (nmemb > 40)
-        {
-          d = (nmemb / 8) * size;
-          pl = med3(pl, pl + d, pl + 2 * d, compar);
-          pm = med3(pm - d, pm, pm + d, compar);
-          pn = med3(pn - 2 * d, pn - d, pn, compar);
-        }
-      pm = med3(pl, pm, pn, compar);
-    }
-  swap(base, pm);
-  pa = pb = (char *) base + size;
-
-  pc = pd = (char *) base + (nmemb - 1) * size;
-  for (;;)
-    {
-      while (pb <= pc && (r = compar(pb, base)) <= 0)
-        {
-          if (r == 0)
-            {
-              swap_cnt = 1;
-              swap(pa, pb);
-              pa += size;
-            }
-          pb += size;
-        }
-      while (pb <= pc && (r = compar(pc, base)) >= 0)
-        {
-          if (r == 0)
-            {
-              swap_cnt = 1;
-              swap(pc, pd);
-              pd -= size;
-            }
-          pc -= size;
-        }
-
-      if (pb > pc)
-        {
-          break;
-        }
-
-      swap(pb, pc);
-      swap_cnt = 1;
-      pb += size;
-      pc -= size;
-    }
-
-  if (swap_cnt == 0)
-    {
-      /* Switch to insertion sort */
-
-      for (pm = (char *) base + size; pm < (char *) base + nmemb * size; pm += size)
-        {
-          for (pl = pm; pl > (char *) base && compar(pl - size, pl) > 0; pl -= size)
-            {
-              swap(pl, pl - size);
-            }
-        }
-      return;
-    }
-
-  pn = (char *) base + nmemb * size;
-  r = min(pa - (char *)base, pb - pa);
-  vecswap(base, pb - r, r);
-  r = min(pd - pc, pn - pd - size);
-  vecswap(pb, pn - r, r);
-
-  if ((r = pb - pa) > size)
-    {
-      qsort(base, r / size, size, compar);
-    }
-
-  if ((r = pd - pc) > size)
-    {
-      /* Iterate rather than recurse to save stack space */
-      base = pn - r;
-      nmemb = r / size;
-      goto loop;
-    }
-}
-
diff --git a/software/libbase/spiflash.c b/software/libbase/spiflash.c
deleted file mode 100644 (file)
index 31d56a1..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-#include <generated/csr.h>
-
-#if (defined CSR_SPIFLASH_BASE && defined SPIFLASH_PAGE_SIZE)
-
-#include <spiflash.h>
-
-#define PAGE_PROGRAM_CMD 0x02
-#define WRDI_CMD         0x04
-#define RDSR_CMD         0x05
-#define WREN_CMD         0x06
-#define SE_CMD           0xd8
-
-#define BITBANG_CLK         (1 << 1)
-#define BITBANG_CS_N        (1 << 2)
-#define BITBANG_DQ_INPUT    (1 << 3)
-
-#define SR_WIP              1
-
-static void flash_write_byte(unsigned char b);
-static void flash_write_addr(unsigned int addr);
-static void wait_for_device_ready(void);
-
-#define min(a,b)  (a>b?b:a)
-
-static void flash_write_byte(unsigned char b)
-{
-    int i;
-    spiflash_bitbang_write(0); // ~CS_N ~CLK
-
-    for(i = 0; i < 8; i++, b <<= 1) {
-
-        spiflash_bitbang_write((b & 0x80) >> 7);
-        spiflash_bitbang_write(((b & 0x80) >> 7) | BITBANG_CLK);
-    }
-
-    spiflash_bitbang_write(0); // ~CS_N ~CLK
-
-}
-
-static void flash_write_addr(unsigned int addr)
-{
-    int i;
-    spiflash_bitbang_write(0);
-
-    for(i = 0; i < 24; i++, addr <<= 1) {
-        spiflash_bitbang_write((addr & 0x800000) >> 23);
-        spiflash_bitbang_write(((addr & 0x800000) >> 23) | BITBANG_CLK);
-    }
-
-    spiflash_bitbang_write(0);
-}
-
-static void wait_for_device_ready(void)
-{
-    unsigned char sr;
-    unsigned char i;
-    do {
-        sr = 0;
-        flash_write_byte(RDSR_CMD);
-        spiflash_bitbang_write(BITBANG_DQ_INPUT);
-        for(i = 0; i < 8; i++) {
-            sr <<= 1;
-            spiflash_bitbang_write(BITBANG_CLK | BITBANG_DQ_INPUT);
-            sr |= spiflash_miso_read();
-            spiflash_bitbang_write(0           | BITBANG_DQ_INPUT);
-        }
-        spiflash_bitbang_write(0);
-        spiflash_bitbang_write(BITBANG_CS_N);
-    } while(sr & SR_WIP);
-}
-
-void erase_flash_sector(unsigned int addr)
-{
-    unsigned int sector_addr = addr & ~(SPIFLASH_SECTOR_SIZE - 1);
-
-    spiflash_bitbang_en_write(1);
-
-    wait_for_device_ready();
-
-    flash_write_byte(WREN_CMD);
-    spiflash_bitbang_write(BITBANG_CS_N);
-
-    flash_write_byte(SE_CMD);
-    flash_write_addr(sector_addr);
-    spiflash_bitbang_write(BITBANG_CS_N);
-
-    wait_for_device_ready();
-
-    spiflash_bitbang_en_write(0);
-}
-
-void write_to_flash_page(unsigned int addr, const unsigned char *c, unsigned int len)
-{
-    unsigned int i;
-
-    if(len > SPIFLASH_PAGE_SIZE)
-        len = SPIFLASH_PAGE_SIZE;
-
-    spiflash_bitbang_en_write(1);
-
-    wait_for_device_ready();
-
-    flash_write_byte(WREN_CMD);
-    spiflash_bitbang_write(BITBANG_CS_N);
-    flash_write_byte(PAGE_PROGRAM_CMD);
-    flash_write_addr((unsigned int)addr);
-    for(i = 0; i < len; i++)
-        flash_write_byte(*c++);
-
-    spiflash_bitbang_write(BITBANG_CS_N);
-    spiflash_bitbang_write(0);
-
-    wait_for_device_ready();
-
-    spiflash_bitbang_en_write(0);
-}
-
-#define SPIFLASH_PAGE_MASK (SPIFLASH_PAGE_SIZE - 1)
-
-void write_to_flash(unsigned int addr, const unsigned char *c, unsigned int len)
-{
-   unsigned int written = 0;
-
-   if(addr & SPIFLASH_PAGE_MASK) {
-       written = min(SPIFLASH_PAGE_SIZE - (addr & SPIFLASH_PAGE_MASK), len);
-       write_to_flash_page(addr, c, written);
-       c += written;
-       addr += written;
-       len -= written;
-   }
-
-   while(len > 0) {
-       written = min(len, SPIFLASH_PAGE_SIZE);
-       write_to_flash_page(addr, c, written);
-       c += written;
-       addr += written;
-       len -= written;
-   }
-}
-
-#endif /* CSR_SPIFLASH_BASE && SPIFLASH_PAGE_SIZE */
diff --git a/software/libbase/strtod.c b/software/libbase/strtod.c
deleted file mode 100644 (file)
index e79a1ee..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-/****************************************************************************
- * lib/string/lib_strtod.c
- * Convert string to double
- *
- *   Copyright (C) 2002 Michael Ringgaard. All rights reserved.
- *   Copyright (C) 2006-2007 H. Peter Anvin.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <errno.h>
-
-/****************************************************************************
- * Pre-processor definitions
- ****************************************************************************/
-
-/* These are predefined with GCC, but could be issues for other compilers. If
- * not defined, an arbitrary big number is put in for now.  These should be
- * added to nuttx/compiler for your compiler.
- */
-
-#if !defined(__DBL_MIN_EXP__) || !defined(__DBL_MAX_EXP__)
-#  ifdef CONFIG_CPP_HAVE_WARNING
-#    warning "Size of exponent is unknown"
-#  endif
-#  undef  __DBL_MIN_EXP__
-#  define __DBL_MIN_EXP__ (-1021)
-#  undef  __DBL_MAX_EXP__
-#  define __DBL_MAX_EXP__ (1024)
-#endif
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-static inline int is_real(double x)
-{
-  const double infinite = 1.0/0.0;
-  return (x < infinite) && (x >= -infinite);
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/***************************************************(************************
- * Name: strtod
- *
- * Description:
- *   Convert a string to a double value
- *
- ****************************************************************************/
-
-double strtod(const char *str, char **endptr)
-{
-  double number;
-  int exponent;
-  int negative;
-  char *p = (char *) str;
-  double p10;
-  int n;
-  int num_digits;
-  int num_decimals;
-  const double infinite = 1.0/0.0;
-
-  /* Skip leading whitespace */
-
-  while (isspace(*p))
-    {
-      p++;
-    }
-
-  /* Handle optional sign */
-
-  negative = 0;
-  switch (*p)
-    {
-    case '-':
-      negative = 1; /* Fall through to increment position */
-    case '+':
-      p++;
-    }
-
-  number       = 0.;
-  exponent     = 0;
-  num_digits   = 0;
-  num_decimals = 0;
-
-  /* Process string of digits */
-
-  while (isdigit(*p))
-    {
-      number = number * 10. + (*p - '0');
-      p++;
-      num_digits++;
-    }
-
-  /* Process decimal part */
-
-  if (*p == '.')
-    {
-      p++;
-
-      while (isdigit(*p))
-      {
-        number = number * 10. + (*p - '0');
-        p++;
-        num_digits++;
-        num_decimals++;
-      }
-
-      exponent -= num_decimals;
-    }
-
-  if (num_digits == 0)
-    {
-      errno = ERANGE;
-      return 0.0;
-    }
-
-  /* Correct for sign */
-
-  if (negative)
-    {
-      number = -number;
-    }
-
-  /* Process an exponent string */
-
-  if (*p == 'e' || *p == 'E')
-    {
-      /* Handle optional sign */
-
-      negative = 0;
-      switch(*++p)
-        {
-        case '-':
-          negative = 1;   /* Fall through to increment pos */
-        case '+':
-          p++;
-        }
-
-      /* Process string of digits */
-
-      n = 0;
-      while (isdigit(*p))
-        {
-          n = n * 10 + (*p - '0');
-          p++;
-        }
-
-      if (negative)
-        {
-          exponent -= n;
-        }
-      else
-        {
-          exponent += n;
-        }
-    }
-
-  if (exponent < __DBL_MIN_EXP__ ||
-      exponent > __DBL_MAX_EXP__)
-    {
-      errno = ERANGE;
-      return infinite;
-    }
-
-  /* Scale the result */
-
-  p10 = 10.;
-  n = exponent;
-  if (n < 0) n = -n;
-  while (n)
-    {
-      if (n & 1)
-        {
-          if (exponent < 0)
-            {
-              number /= p10;
-            }
-          else
-            {
-              number *= p10;
-            }
-        }
-      n >>= 1;
-      p10 *= p10;
-    }
-
-  if (!is_real(number))
-    {
-      errno = ERANGE;
-    }
-
-  if (endptr)
-    {
-      *endptr = p;
-    }
-
-  return number;
-}
-
diff --git a/software/libbase/system.c b/software/libbase/system.c
deleted file mode 100644 (file)
index c973653..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-#include <irq.h>
-#include <uart.h>
-#ifdef __or1k__
-#include <spr-defs.h>
-#endif
-
-#include <system.h>
-#include <generated/mem.h>
-#include <generated/csr.h>
-
-void flush_cpu_icache(void)
-{
-#if defined (__lm32__)
-       asm volatile(
-               "wcsr ICC, r0\n"
-               "nop\n"
-               "nop\n"
-               "nop\n"
-               "nop\n"
-       );
-#elif defined (__or1k__)
-       unsigned long iccfgr;
-       unsigned long cache_set_size;
-       unsigned long cache_ways;
-       unsigned long cache_block_size;
-       unsigned long cache_size;
-       int i;
-
-       iccfgr = mfspr(SPR_ICCFGR);
-       cache_ways = 1 << (iccfgr & SPR_ICCFGR_NCW);
-       cache_set_size = 1 << ((iccfgr & SPR_ICCFGR_NCS) >> 3);
-       cache_block_size = (iccfgr & SPR_ICCFGR_CBS) ? 32 : 16;
-       cache_size = cache_set_size * cache_ways * cache_block_size;
-
-       for (i = 0; i < cache_size; i += cache_block_size)
-               mtspr(SPR_ICBIR, i);
-#else
-#error Unsupported architecture
-#endif
-}
-
-void flush_cpu_dcache(void)
-{
-#if defined (__lm32__)
-       asm volatile(
-               "wcsr DCC, r0\n"
-               "nop\n"
-       );
-#elif defined (__or1k__)
-       unsigned long dccfgr;
-       unsigned long cache_set_size;
-       unsigned long cache_ways;
-       unsigned long cache_block_size;
-       unsigned long cache_size;
-       int i;
-
-       dccfgr = mfspr(SPR_DCCFGR);
-       cache_ways = 1 << (dccfgr & SPR_ICCFGR_NCW);
-       cache_set_size = 1 << ((dccfgr & SPR_DCCFGR_NCS) >> 3);
-       cache_block_size = (dccfgr & SPR_DCCFGR_CBS) ? 32 : 16;
-       cache_size = cache_set_size * cache_ways * cache_block_size;
-
-       for (i = 0; i < cache_size; i += cache_block_size)
-               mtspr(SPR_DCBIR, i);
-#else
-#error Unsupported architecture
-#endif
-}
-
-#ifdef L2_SIZE
-void flush_l2_cache(void)
-{
-       unsigned int i;
-       register unsigned int addr;
-       register unsigned int dummy;
-
-       for(i=0;i<2*L2_SIZE/4;i++) {
-               addr = MAIN_RAM_BASE + i*4;
-#if defined (__lm32__)
-               __asm__ volatile("lw %0, (%1+0)\n":"=r"(dummy):"r"(addr));
-#elif defined (__or1k__)
-               __asm__ volatile("l.lwz %0, 0(%1)\n":"=r"(dummy):"r"(addr));
-#else
-#error Unsupported architecture
-#endif
-       }
-}
-#endif
diff --git a/software/libbase/time.c b/software/libbase/time.c
deleted file mode 100644 (file)
index 4bf9547..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <generated/csr.h>
-#include <time.h>
-
-void time_init(void)
-{
-       int t;
-
-       timer0_en_write(0);
-       t = 2*identifier_frequency_read();
-       timer0_reload_write(t);
-       timer0_load_write(t);
-       timer0_en_write(1);
-}
-
-int elapsed(int *last_event, int period)
-{
-       int t, dt;
-
-       timer0_update_value_write(1);
-       t = timer0_reload_read() - timer0_value_read();
-       if(period < 0) {
-               *last_event = t;
-               return 1;
-       }
-       dt = t - *last_event;
-       if(dt < 0)
-               dt += timer0_reload_read();
-       if((dt > period) || (dt < 0)) {
-               *last_event = t;
-               return 1;
-       } else
-               return 0;
-}
diff --git a/software/libbase/uart.c b/software/libbase/uart.c
deleted file mode 100644 (file)
index 921459f..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-#include <uart.h>
-#include <irq.h>
-#include <generated/csr.h>
-#include <hw/flags.h>
-
-/*
- * Buffer sizes must be a power of 2 so that modulos can be computed
- * with logical AND.
- */
-
-#define UART_RINGBUFFER_SIZE_RX 128
-#define UART_RINGBUFFER_MASK_RX (UART_RINGBUFFER_SIZE_RX-1)
-
-static char rx_buf[UART_RINGBUFFER_SIZE_RX];
-static volatile unsigned int rx_produce;
-static unsigned int rx_consume;
-
-#define UART_RINGBUFFER_SIZE_TX 128
-#define UART_RINGBUFFER_MASK_TX (UART_RINGBUFFER_SIZE_TX-1)
-
-static char tx_buf[UART_RINGBUFFER_SIZE_TX];
-static unsigned int tx_produce;
-static volatile unsigned int tx_consume;
-
-void uart_isr(void)
-{
-       unsigned int stat, rx_produce_next;
-
-       stat = uart_ev_pending_read();
-
-       if(stat & UART_EV_RX) {
-               while(!uart_rxempty_read()) {
-                       rx_produce_next = (rx_produce + 1) & UART_RINGBUFFER_MASK_RX;
-                       if(rx_produce_next != rx_consume) {
-                               rx_buf[rx_produce] = uart_rxtx_read();
-                               rx_produce = rx_produce_next;
-                       }
-                       uart_ev_pending_write(UART_EV_RX);
-               }
-       }
-
-       if(stat & UART_EV_TX) {
-               uart_ev_pending_write(UART_EV_TX);
-               while((tx_consume != tx_produce) && !uart_txfull_read()) {
-                       uart_rxtx_write(tx_buf[tx_consume]);
-                       tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;
-               }
-       }
-}
-
-/* Do not use in interrupt handlers! */
-char uart_read(void)
-{
-       char c;
-
-       if(irq_getie()) {
-               while(rx_consume == rx_produce);
-       } else if (rx_consume == rx_produce) {
-               return 0;
-       }
-
-       c = rx_buf[rx_consume];
-       rx_consume = (rx_consume + 1) & UART_RINGBUFFER_MASK_RX;
-       return c;
-}
-
-int uart_read_nonblock(void)
-{
-       return (rx_consume != rx_produce);
-}
-
-void uart_write(char c)
-{
-       unsigned int oldmask;
-       unsigned int tx_produce_next = (tx_produce + 1) & UART_RINGBUFFER_MASK_TX;
-
-       if(irq_getie()) {
-               while(tx_produce_next == tx_consume);
-       } else if(tx_produce_next == tx_consume) {
-               return;
-       }
-
-       oldmask = irq_getmask();
-       irq_setmask(oldmask & ~(1 << UART_INTERRUPT));
-       if((tx_consume != tx_produce) || uart_txfull_read()) {
-               tx_buf[tx_produce] = c;
-               tx_produce = tx_produce_next;
-       } else {
-               uart_rxtx_write(c);
-       }
-       irq_setmask(oldmask);
-}
-
-void uart_init(void)
-{
-       rx_produce = 0;
-       rx_consume = 0;
-
-       tx_produce = 0;
-       tx_consume = 0;
-
-       uart_ev_pending_write(uart_ev_pending_read());
-       uart_ev_enable_write(UART_EV_TX | UART_EV_RX);
-       irq_setmask(irq_getmask() | (1 << UART_INTERRUPT));
-}
-
-void uart_sync(void)
-{
-       while(tx_consume != tx_produce);
-}
diff --git a/software/libbase/vsnprintf.c b/software/libbase/vsnprintf.c
deleted file mode 100644 (file)
index 2192974..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * MiSoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * Copyright (C) Linux kernel developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
-
-/**
- * vsnprintf - Format a string and place it in a buffer
- * @buf: The buffer to place the result into
- * @size: The size of the buffer, including the trailing null space
- * @fmt: The format string to use
- * @args: Arguments for the format string
- *
- * The return value is the number of characters which would
- * be generated for the given input, excluding the trailing
- * '\0', as per ISO C99. If you want to have the exact
- * number of characters written into @buf as return value
- * (not including the trailing '\0'), use vscnprintf(). If the
- * return is greater than or equal to @size, the resulting
- * string is truncated.
- *
- * Call this function if you are already dealing with a va_list.
- * You probably want snprintf() instead.
- */
-int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
-{
-       int len;
-       unsigned long long num;
-       int i, base;
-       char *str, *end, c;
-       const char *s;
-
-       int flags;              /* flags to number() */
-
-       int field_width;        /* width of output field */
-       int precision;          /* min. # of digits for integers; max
-                                  number of chars for from string */
-       int qualifier;          /* 'h', 'l', or 'L' for integer fields */
-                               /* 'z' support added 23/7/1999 S.H.    */
-                               /* 'z' changed to 'Z' --davidm 1/25/99 */
-                               /* 't' added for ptrdiff_t */
-
-       /* Reject out-of-range values early.  Large positive sizes are
-          used for unknown buffer sizes. */
-       if (unlikely((int) size < 0))
-               return 0;
-
-       str = buf;
-       end = buf + size;
-
-       /* Make sure end is always >= buf */
-       if (end < buf) {
-               end = ((void *)-1);
-               size = end - buf;
-       }
-
-       for (; *fmt ; ++fmt) {
-               if (*fmt != '%') {
-                       if (str < end)
-                               *str = *fmt;
-                       ++str;
-                       continue;
-               }
-
-               /* process flags */
-               flags = 0;
-               repeat:
-                       ++fmt;          /* this also skips first '%' */
-                       switch (*fmt) {
-                               case '-': flags |= PRINTF_LEFT; goto repeat;
-                               case '+': flags |= PRINTF_PLUS; goto repeat;
-                               case ' ': flags |= PRINTF_SPACE; goto repeat;
-                               case '#': flags |= PRINTF_SPECIAL; goto repeat;
-                               case '0': flags |= PRINTF_ZEROPAD; goto repeat;
-                       }
-
-               /* get field width */
-               field_width = -1;
-               if (isdigit(*fmt))
-                       field_width = skip_atoi(&fmt);
-               else if (*fmt == '*') {
-                       ++fmt;
-                       /* it's the next argument */
-                       field_width = va_arg(args, int);
-                       if (field_width < 0) {
-                               field_width = -field_width;
-                               flags |= PRINTF_LEFT;
-                       }
-               }
-
-               /* get the precision */
-               precision = -1;
-               if (*fmt == '.') {
-                       ++fmt;  
-                       if (isdigit(*fmt))
-                               precision = skip_atoi(&fmt);
-                       else if (*fmt == '*') {
-                               ++fmt;
-                               /* it's the next argument */
-                               precision = va_arg(args, int);
-                       }
-                       if (precision < 0)
-                               precision = 0;
-               }
-
-               /* get the conversion qualifier */
-               qualifier = -1;
-               if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
-                   *fmt =='Z' || *fmt == 'z' || *fmt == 't') {
-                       qualifier = *fmt;
-                       ++fmt;
-                       if (qualifier == 'l' && *fmt == 'l') {
-                               qualifier = 'L';
-                               ++fmt;
-                       }
-               }
-
-               /* default base */
-               base = 10;
-
-               switch (*fmt) {
-                       case 'c':
-                               if (!(flags & PRINTF_LEFT)) {
-                                       while (--field_width > 0) {
-                                               if (str < end)
-                                                       *str = ' ';
-                                               ++str;
-                                       }
-                               }
-                               c = (unsigned char) va_arg(args, int);
-                               if (str < end)
-                                       *str = c;
-                               ++str;
-                               while (--field_width > 0) {
-                                       if (str < end)
-                                               *str = ' ';
-                                       ++str;
-                               }
-                               continue;
-
-                       case 's':
-                               s = va_arg(args, char *);
-                               if (s == NULL)
-                                       s = "<NULL>";
-
-                               len = strnlen(s, precision);
-
-                               if (!(flags & PRINTF_LEFT)) {
-                                       while (len < field_width--) {
-                                               if (str < end)
-                                                       *str = ' ';
-                                               ++str;
-                                       }
-                               }
-                               for (i = 0; i < len; ++i) {
-                                       if (str < end)
-                                               *str = *s;
-                                       ++str; ++s;
-                               }
-                               while (len < field_width--) {
-                                       if (str < end)
-                                               *str = ' ';
-                                       ++str;
-                               }
-                               continue;
-
-                       case 'p':
-                               if (field_width == -1) {
-                                       field_width = 2*sizeof(void *);
-                                       flags |= PRINTF_ZEROPAD;
-                               }
-                               str = number(str, end,
-                                               (unsigned long) va_arg(args, void *),
-                                               16, field_width, precision, flags);
-                               continue;
-
-#ifndef NO_FLOAT
-                       case 'g':
-                       case 'f': {
-                               int m;
-                               double f;
-                               int integer;
-                               
-                               f = va_arg(args, double);
-                               if(f < 0.0) {
-                                       *str = '-';
-                                       str++;
-                                       f = -f;
-                               }
-
-                               integer = f;
-                               if(integer > 0) {
-                                       m = 1;
-                                       while(integer > (m*10)) m *= 10;
-                                       while((m >= 1) && (str < end)) {
-                                               int n;
-                                               n = integer/m;
-                                               *str = '0' + n;
-                                               str++;
-                                               f = f - m*n;
-                                               integer = integer - m*n;
-                                               m /= 10;
-                                       }
-                               } else if(str < end) {
-                                       *str = '0';
-                                       str++;
-                               }
-
-                               if(str < end) {
-                                       *str = '.';
-                                       str++;
-                               }
-
-                               for(i=0;i<6;i++) {
-                                       int n;
-
-                                       f = f*10.0;
-                                       n = f;
-                                       f = f - n;
-                                       if(str >= end) break;
-                                       *str = '0' + n;
-                                       str++;
-                               }
-                               
-                               continue;
-                       }
-#endif
-
-                       case 'n':
-                               /* FIXME:
-                                * What does C99 say about the overflow case here? */
-                               if (qualifier == 'l') {
-                                       long * ip = va_arg(args, long *);
-                                       *ip = (str - buf);
-                               } else if (qualifier == 'Z' || qualifier == 'z') {
-                                       size_t * ip = va_arg(args, size_t *);
-                                       *ip = (str - buf);
-                               } else {
-                                       int * ip = va_arg(args, int *);
-                                       *ip = (str - buf);
-                               }
-                               continue;
-
-                       case '%':
-                               if (str < end)
-                                       *str = '%';
-                               ++str;
-                               continue;
-
-                               /* integer number formats - set up the flags and "break" */
-                       case 'o':
-                               base = 8;
-                               break;
-
-                       case 'X':
-                               flags |= PRINTF_LARGE;
-                       case 'x':
-                               base = 16;
-                               break;
-
-                       case 'd':
-                       case 'i':
-                               flags |= PRINTF_SIGN;
-                       case 'u':
-                               break;
-
-                       default:
-                               if (str < end)
-                                       *str = '%';
-                               ++str;
-                               if (*fmt) {
-                                       if (str < end)
-                                               *str = *fmt;
-                                       ++str;
-                               } else {
-                                       --fmt;
-                               }
-                               continue;
-               }
-               if (qualifier == 'L')
-                       num = va_arg(args, long long);
-               else if (qualifier == 'l') {
-                       num = va_arg(args, unsigned long);
-                       if (flags & PRINTF_SIGN)
-                               num = (signed long) num;
-               } else if (qualifier == 'Z' || qualifier == 'z') {
-                       num = va_arg(args, size_t);
-               } else if (qualifier == 't') {
-                       num = va_arg(args, ptrdiff_t);
-               } else if (qualifier == 'h') {
-                       num = (unsigned short) va_arg(args, int);
-                       if (flags & PRINTF_SIGN)
-                               num = (signed short) num;
-               } else {
-                       num = va_arg(args, unsigned int);
-                       if (flags & PRINTF_SIGN)
-                               num = (signed int) num;
-               }
-               str = number(str, end, num, base,
-                               field_width, precision, flags);
-       }
-       if (size > 0) {
-               if (str < end)
-                       *str = '\0';
-               else
-                       end[-1] = '\0';
-       }
-       /* the trailing null byte doesn't count towards the total */
-       return str-buf;
-}
diff --git a/software/libcompiler-rt/Makefile b/software/libcompiler-rt/Makefile
deleted file mode 100644 (file)
index 917c0ae..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-MSCDIR=../..
-include $(MSCDIR)/software/common.mak
-
-CFLAGS+=-D_YUGA_LITTLE_ENDIAN=0 -D_YUGA_BIG_ENDIAN=1 -Wno-missing-prototypes
-
-OBJECTS=divsi3.o modsi3.o comparedf2.o negsf2.o negdf2.o addsf3.o subsf3.o mulsf3.o divsf3.o lshrdi3.o muldi3.o divdi3.o ashldi3.o ashrdi3.o udivmoddi4.o \
-  floatsisf.o floatunsisf.o fixsfsi.o fixdfdi.o fixunssfsi.o adddf3.o subdf3.o muldf3.o divdf3.o floatsidf.o floatunsidf.o floatdidf.o fixdfsi.o fixunsdfsi.o \
-  clzsi2.o ctzsi2.o udivdi3.o umoddi3.o moddi3.o ucmpdi2.o
-
-all: libcompiler-rt.a
-
-# pull in dependency info for *existing* .o files
--include $(OBJECTS:.o=.d)
-
-libcompiler-rt.a: $(OBJECTS)
-       $(AR) crs libcompiler-rt.a $(OBJECTS)
-
-%.o: $(MSCDIR)/software/compiler-rt/lib/builtins/%.c
-       $(compile-dep)
-
-.PHONY: clean
-
-clean:
-       $(RM) $(OBJECTS) $(OBJECTS:.o=.ts) $(OBJECTS:.o=.d) libcompiler-rt.a .*~ *~
diff --git a/software/libdyld/Makefile b/software/libdyld/Makefile
deleted file mode 100644 (file)
index 27a29db..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-MSCDIR=../..
-include $(MSCDIR)/software/common.mak
-
-COMMONFLAGS += -I$(MSCDIR)/software/include/dyld
-
-OBJECTS=dyld.o
-
-all: libdyld.a
-
-# pull in dependency info for *existing* .o files
--include $(OBJECTS:.o=.d)
-
-libdyld.a: $(OBJECTS)
-       $(AR) crs libdyld.a $(OBJECTS)
-
-.PHONY: clean
-
-clean:
-       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) libdyld.a .*~ *~
diff --git a/software/libdyld/dyld.c b/software/libdyld/dyld.c
deleted file mode 100644 (file)
index a328e04..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <dyld.h>
-
-static int fixup_rela(struct dyld_info *info, const Elf32_Rela *rela,
-                      Elf32_Addr (*resolve_import)(const char *),
-                      const char **error_out)
-{
-    const Elf32_Sym *sym = NULL;
-    if(ELF32_R_SYM(rela->r_info) != 0)
-        sym = &info->symtab[ELF32_R_SYM(rela->r_info)];
-    Elf32_Addr value;
-
-    switch(ELF32_R_TYPE(rela->r_info)) {
-        case R_OR1K_NONE:
-        return 1; // Does nothing.
-
-        case R_OR1K_RELATIVE:
-        value = info->base + rela->r_addend;
-        break;
-
-        case R_OR1K_32:
-        case R_OR1K_GLOB_DAT:
-        case R_OR1K_JMP_SLOT:
-        value = (Elf32_Addr)dyld_lookup(&info->strtab[sym->st_name], info);
-        if(value != 0)
-            break;
-
-        value = resolve_import(&info->strtab[sym->st_name]);
-        if(value == 0) {
-            static char error[256];
-            snprintf(error, sizeof(error),
-                     "ELF object has an unresolved symbol: %s",
-                     &info->strtab[sym->st_name]);
-            *error_out = error;
-            return 0;
-        }
-        break;
-
-        default:
-        *error_out = "ELF object uses an unsupported relocation type";
-        return 0;
-    }
-
-    memcpy((Elf32_Addr*)(info->base + rela->r_offset), &value,
-           sizeof(Elf32_Addr));
-
-    return 1;
-}
-
-int dyld_load(const void *shlib, Elf32_Addr base,
-              Elf32_Addr (*resolve_import)(const char *),
-              struct dyld_info *info, const char **error_out)
-{
-    const Elf32_Ehdr *ehdr = (const Elf32_Ehdr *)shlib;
-
-    const unsigned char expected_ident[EI_NIDENT] = {
-        ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,
-        ELFCLASS32, ELFDATA2MSB, EV_CURRENT,
-        ELFOSABI_NONE, /* ABI version */ 0
-    };
-    if(memcmp(ehdr->e_ident, expected_ident, EI_NIDENT) ||
-       ehdr->e_type != ET_DYN) {
-        *error_out = "ELF object is not a shared library";
-        return 0;
-    }
-
-#ifdef __or1k__
-    if(ehdr->e_machine != EM_OPENRISC) {
-        *error_out = "ELF object does not contain OpenRISC machine code";
-        return 0;
-    }
-#else
-#error Unsupported architecture
-#endif
-
-    const Elf32_Phdr *phdr = (const Elf32_Phdr *)((intptr_t)shlib + ehdr->e_phoff);
-    const Elf32_Dyn *dyn = NULL;
-    for(int i = 0; i < ehdr->e_phnum; i++) {
-        if(phdr[i].p_type == PT_DYNAMIC)
-            dyn = (const Elf32_Dyn *)((intptr_t)shlib + phdr[i].p_offset);
-
-        memcpy((void*)(base + phdr[i].p_vaddr),
-               (const void*)((intptr_t)shlib + phdr[i].p_offset),
-               phdr[i].p_filesz);
-    }
-
-    if(dyn == NULL) {
-        *error_out = "ELF object does not have a PT_DYNAMIC header";
-        return 0;
-    }
-
-    const char *strtab = NULL;
-    const Elf32_Sym *symtab = NULL;
-    const Elf32_Rela *rela = NULL, *pltrel = NULL;
-    const Elf32_Word *hash = NULL;
-    Elf32_Word init = 0;
-    size_t syment = sizeof(Elf32_Sym), relaent = sizeof(Elf32_Rela),
-           relanum = 0, pltrelnum = 0;
-    while(dyn->d_tag != DT_NULL) {
-        switch(dyn->d_tag) {
-            case DT_STRTAB:   strtab    = (const char *)(base + dyn->d_un.d_ptr); break;
-            case DT_SYMTAB:   symtab    = (const Elf32_Sym *)(base + dyn->d_un.d_ptr); break;
-            case DT_SYMENT:   syment    = dyn->d_un.d_val; break;
-            case DT_RELA:     rela      = (const Elf32_Rela *)(base + dyn->d_un.d_ptr); break;
-            case DT_RELAENT:  relaent   = dyn->d_un.d_val; break;
-            case DT_RELASZ:   relanum   = dyn->d_un.d_val / sizeof(Elf32_Rela); break;
-            case DT_JMPREL:   pltrel    = (const Elf32_Rela *)(base + dyn->d_un.d_ptr); break;
-            case DT_PLTRELSZ: pltrelnum = dyn->d_un.d_val / sizeof(Elf32_Rela); break;
-            case DT_HASH:     hash      = (const Elf32_Word *)(base + dyn->d_un.d_ptr); break;
-            case DT_INIT:     init      = dyn->d_un.d_val; break;
-
-            case DT_REL:
-            *error_out = "ELF object uses Rel relocations, which are not supported";
-            return 0;
-        }
-
-        ++dyn;
-    }
-
-    if(symtab == NULL || syment == 0 || strtab == NULL) {
-        *error_out = "ELF object must contain a symbol table";
-        return 0;
-    }
-
-    if(syment != sizeof(Elf32_Sym) || relaent != sizeof(Elf32_Rela)) {
-        *error_out = "ELF object uses an unknown format for symbols and relocations";
-        return 0;
-    }
-
-    info->base         = base;
-    info->init         = (void*)(base + init);
-    info->strtab       = strtab;
-    info->symtab       = symtab;
-    info->hash.nbucket = hash[0];
-    info->hash.nchain  = hash[1];
-    info->hash.bucket  = &hash[2];
-    info->hash.chain   = &hash[2 + info->hash.nbucket];
-
-    for(int i = 0; i < relanum; i++) {
-        if(!fixup_rela(info, &rela[i], resolve_import, error_out))
-            return 0;
-    }
-
-    for(int i = 0; i < pltrelnum; i++) {
-        if(!fixup_rela(info, &pltrel[i], resolve_import, error_out))
-            return 0;
-    }
-
-    return 1;
-}
-
-static unsigned long elf_hash(const unsigned char *name)
-{
-    unsigned long h = 0, g;
-    while(*name) {
-        h = (h << 4) + *name++;
-        if((g = h & 0xf0000000)) {
-            h ^= g >> 24;
-            h &= ~g;
-        }
-    }
-    return h;
-}
-
-void *dyld_lookup(const char *symbol, struct dyld_info *info)
-{
-    unsigned hash = elf_hash((const unsigned char*) symbol);
-    unsigned index = info->hash.bucket[hash % info->hash.nbucket];
-    while(strcmp(&info->strtab[info->symtab[index].st_name], symbol)) {
-        if(index == STN_UNDEF)
-            return NULL;
-        index = info->hash.chain[index];
-    }
-
-    Elf32_Addr value = info->symtab[index].st_value;
-    if(value != 0)
-        return (void*)(info->base + value);
-    else
-        return NULL;
-}
diff --git a/software/libnet/Makefile b/software/libnet/Makefile
deleted file mode 100644 (file)
index dc2a283..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-MSCDIR=../..
-include $(MSCDIR)/software/common.mak
-
-OBJECTS=microudp.o tftp.o
-
-all: libnet.a
-
-# pull in dependency info for *existing* .o files
--include $(OBJECTS:.o=.d)
-
-libnet.a: $(OBJECTS)
-       $(AR) crs libnet.a $(OBJECTS)
-
-%.o: %.c
-       $(compile-dep)
-
-%.o: %.S
-       $(assemble)
-
-.PHONY: clean
-
-clean:
-       $(RM) $(OBJECTS) $(OBJECTS:.o=.ts) $(OBJECTS:.o=.d) libnet.a .*~ *~
diff --git a/software/libnet/microudp.c b/software/libnet/microudp.c
deleted file mode 100644 (file)
index c92e445..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-#include <generated/csr.h>
-#ifdef CSR_ETHMAC_BASE
-
-#include <stdio.h>
-#include <system.h>
-#include <crc.h>
-#include <hw/flags.h>
-#include <hw/ethmac_mem.h>
-
-#include <net/microudp.h>
-
-#define ETHERTYPE_ARP 0x0806
-#define ETHERTYPE_IP  0x0800
-
-#ifdef CSR_ETHMAC_PREAMBLE_CRC_ADDR
-#define HW_PREAMBLE_CRC
-#endif
-
-struct ethernet_header {
-#ifndef HW_PREAMBLE_CRC
-       unsigned char preamble[8];
-#endif
-       unsigned char destmac[6];
-       unsigned char srcmac[6];
-       unsigned short ethertype;
-} __attribute__((packed));
-
-static void fill_eth_header(struct ethernet_header *h, const unsigned char *destmac, const unsigned char *srcmac, unsigned short ethertype)
-{
-       int i;
-
-#ifndef HW_PREAMBLE_CRC
-       for(i=0;i<7;i++)
-               h->preamble[i] = 0x55;
-       h->preamble[7] = 0xd5;
-#endif
-       for(i=0;i<6;i++)
-               h->destmac[i] = destmac[i];
-       for(i=0;i<6;i++)
-               h->srcmac[i] = srcmac[i];
-       h->ethertype = ethertype;
-}
-
-#define ARP_HWTYPE_ETHERNET 0x0001
-#define ARP_PROTO_IP        0x0800
-#ifndef HW_PREAMBLE_CRC
-#define ARP_PACKET_LENGTH 68
-#else
-#define ARP_PACKET_LENGTH 60
-#endif
-
-#define ARP_OPCODE_REQUEST  0x0001
-#define ARP_OPCODE_REPLY    0x0002
-
-struct arp_frame {
-       unsigned short hwtype;
-       unsigned short proto;
-       unsigned char hwsize;
-       unsigned char protosize;
-       unsigned short opcode;
-       unsigned char sender_mac[6];
-       unsigned int sender_ip;
-       unsigned char target_mac[6];
-       unsigned int target_ip;
-       unsigned char padding[18];
-} __attribute__((packed));
-
-#define IP_IPV4                        0x45
-#define IP_DONT_FRAGMENT       0x4000
-#define IP_TTL                 64
-#define IP_PROTO_UDP           0x11
-
-struct ip_header {
-       unsigned char version;
-       unsigned char diff_services;
-       unsigned short total_length;
-       unsigned short identification;
-       unsigned short fragment_offset;
-       unsigned char ttl;
-       unsigned char proto;
-       unsigned short checksum;
-       unsigned int src_ip;
-       unsigned int dst_ip;
-} __attribute__((packed));
-
-struct udp_header {
-       unsigned short src_port;
-       unsigned short dst_port;
-       unsigned short length;
-       unsigned short checksum;
-} __attribute__((packed));
-
-struct udp_frame {
-       struct ip_header ip;
-       struct udp_header udp;
-       char payload[];
-} __attribute__((packed));
-
-struct ethernet_frame {
-       struct ethernet_header eth_header;
-       union {
-               struct arp_frame arp;
-               struct udp_frame udp;
-       } contents;
-} __attribute__((packed));
-
-typedef union {
-       struct ethernet_frame frame;
-       unsigned char raw[1532];
-} ethernet_buffer;
-
-
-static unsigned int rxslot;
-static unsigned int rxlen;
-static ethernet_buffer *rxbuffer;
-static ethernet_buffer *rxbuffer0;
-static ethernet_buffer *rxbuffer1;
-static unsigned int txslot;
-static unsigned int txlen;
-static ethernet_buffer *txbuffer;
-static ethernet_buffer *txbuffer0;
-static ethernet_buffer *txbuffer1;
-
-static void send_packet(void)
-{
-#ifndef HW_PREAMBLE_CRC
-       unsigned int crc;
-       crc = crc32(&txbuffer->raw[8], txlen-8);
-       txbuffer->raw[txlen  ] = (crc & 0xff);
-       txbuffer->raw[txlen+1] = (crc & 0xff00) >> 8;
-       txbuffer->raw[txlen+2] = (crc & 0xff0000) >> 16;
-       txbuffer->raw[txlen+3] = (crc & 0xff000000) >> 24;
-       txlen += 4;
-#endif
-       ethmac_sram_reader_slot_write(txslot);
-       ethmac_sram_reader_length_write(txlen);
-       while(!(ethmac_sram_reader_ready_read()));
-       ethmac_sram_reader_start_write(1);
-       txslot = (txslot+1)%2;
-       if (txslot)
-               txbuffer = txbuffer1;
-       else
-               txbuffer = txbuffer0;
-}
-
-static unsigned char my_mac[6];
-static unsigned int my_ip;
-
-/* ARP cache - one entry only */
-static unsigned char cached_mac[6];
-static unsigned int cached_ip;
-
-static void process_arp(void)
-{
-       const struct arp_frame *rx_arp = &rxbuffer->frame.contents.arp;
-       struct arp_frame *tx_arp = &txbuffer->frame.contents.arp;
-
-       if(rxlen < ARP_PACKET_LENGTH) return;
-       if(rx_arp->hwtype != ARP_HWTYPE_ETHERNET) return;
-       if(rx_arp->proto != ARP_PROTO_IP) return;
-       if(rx_arp->hwsize != 6) return;
-       if(rx_arp->protosize != 4) return;
-       if(rx_arp->opcode == ARP_OPCODE_REPLY) {
-               if(rx_arp->sender_ip == cached_ip) {
-                       int i;
-                       for(i=0;i<6;i++)
-                               cached_mac[i] = rx_arp->sender_mac[i];
-               }
-               return;
-       }
-       if(rx_arp->opcode == ARP_OPCODE_REQUEST) {
-               if(rx_arp->target_ip == my_ip) {
-                       int i;
-
-                       fill_eth_header(&txbuffer->frame.eth_header,
-                               rx_arp->sender_mac,
-                               my_mac,
-                               ETHERTYPE_ARP);
-                       txlen = ARP_PACKET_LENGTH;
-                       tx_arp->hwtype = ARP_HWTYPE_ETHERNET;
-                       tx_arp->proto = ARP_PROTO_IP;
-                       tx_arp->hwsize = 6;
-                       tx_arp->protosize = 4;
-                       tx_arp->opcode = ARP_OPCODE_REPLY;
-                       tx_arp->sender_ip = my_ip;
-                       for(i=0;i<6;i++)
-                               tx_arp->sender_mac[i] = my_mac[i];
-                       tx_arp->target_ip = rx_arp->sender_ip;
-                       for(i=0;i<6;i++)
-                               tx_arp->target_mac[i] = rx_arp->sender_mac[i];
-                       send_packet();
-               }
-               return;
-       }
-}
-
-static const unsigned char broadcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-
-int microudp_arp_resolve(unsigned int ip)
-{
-       struct arp_frame *arp = &txbuffer->frame.contents.arp;
-       int i;
-       int tries;
-       int timeout;
-
-       if(cached_ip == ip) {
-               for(i=0;i<6;i++)
-                       if(cached_mac[i]) return 1;
-       }
-       cached_ip = ip;
-       for(i=0;i<6;i++)
-               cached_mac[i] = 0;
-
-       for(tries=0;tries<5;tries++) {
-               /* Send an ARP request */
-               fill_eth_header(&txbuffer->frame.eth_header,
-                               broadcast,
-                               my_mac,
-                               ETHERTYPE_ARP);
-               txlen = ARP_PACKET_LENGTH;
-               arp->hwtype = ARP_HWTYPE_ETHERNET;
-               arp->proto = ARP_PROTO_IP;
-               arp->hwsize = 6;
-               arp->protosize = 4;
-               arp->opcode = ARP_OPCODE_REQUEST;
-               arp->sender_ip = my_ip;
-               for(i=0;i<6;i++)
-                       arp->sender_mac[i] = my_mac[i];
-               arp->target_ip = ip;
-               for(i=0;i<6;i++)
-                       arp->target_mac[i] = 0;
-               send_packet();
-
-               /* Do we get a reply ? */
-               for(timeout=0;timeout<2000000;timeout++) {
-                       microudp_service();
-                       for(i=0;i<6;i++)
-                               if(cached_mac[i]) return 1;
-               }
-       }
-
-       return 0;
-}
-
-static unsigned short ip_checksum(unsigned int r, void *buffer, unsigned int length, int complete)
-{
-       unsigned char *ptr;
-       unsigned int i;
-
-       ptr = (unsigned char *)buffer;
-       length >>= 1;
-
-       for(i=0;i<length;i++)
-               r += ((unsigned int)(ptr[2*i]) << 8)|(unsigned int)(ptr[2*i+1]) ;
-
-       /* Add overflows */
-       while(r >> 16)
-               r = (r & 0xffff) + (r >> 16);
-
-       if(complete) {
-               r = ~r;
-               r &= 0xffff;
-               if(r == 0) r = 0xffff;
-       }
-       return r;
-}
-
-void *microudp_get_tx_buffer(void)
-{
-       return txbuffer->frame.contents.udp.payload;
-}
-
-struct pseudo_header {
-       unsigned int src_ip;
-       unsigned int dst_ip;
-       unsigned char zero;
-       unsigned char proto;
-       unsigned short length;
-} __attribute__((packed));
-
-int microudp_send(unsigned short src_port, unsigned short dst_port, unsigned int length)
-{
-       struct pseudo_header h;
-       unsigned int r;
-
-       if((cached_mac[0] == 0) && (cached_mac[1] == 0) && (cached_mac[2] == 0)
-               && (cached_mac[3] == 0) && (cached_mac[4] == 0) && (cached_mac[5] == 0))
-               return 0;
-
-       txlen = length + sizeof(struct ethernet_header) + sizeof(struct udp_frame);
-       if(txlen < ARP_PACKET_LENGTH) txlen = ARP_PACKET_LENGTH;
-
-       fill_eth_header(&txbuffer->frame.eth_header,
-               cached_mac,
-               my_mac,
-               ETHERTYPE_IP);
-
-       txbuffer->frame.contents.udp.ip.version = IP_IPV4;
-       txbuffer->frame.contents.udp.ip.diff_services = 0;
-       txbuffer->frame.contents.udp.ip.total_length = length + sizeof(struct udp_frame);
-       txbuffer->frame.contents.udp.ip.identification = 0;
-       txbuffer->frame.contents.udp.ip.fragment_offset = IP_DONT_FRAGMENT;
-       txbuffer->frame.contents.udp.ip.ttl = IP_TTL;
-       h.proto = txbuffer->frame.contents.udp.ip.proto = IP_PROTO_UDP;
-       txbuffer->frame.contents.udp.ip.checksum = 0;
-       h.src_ip = txbuffer->frame.contents.udp.ip.src_ip = my_ip;
-       h.dst_ip = txbuffer->frame.contents.udp.ip.dst_ip = cached_ip;
-       txbuffer->frame.contents.udp.ip.checksum = ip_checksum(0, &txbuffer->frame.contents.udp.ip,
-               sizeof(struct ip_header), 1);
-
-       txbuffer->frame.contents.udp.udp.src_port = src_port;
-       txbuffer->frame.contents.udp.udp.dst_port = dst_port;
-       h.length = txbuffer->frame.contents.udp.udp.length = length + sizeof(struct udp_header);
-       txbuffer->frame.contents.udp.udp.checksum = 0;
-
-       h.zero = 0;
-       r = ip_checksum(0, &h, sizeof(struct pseudo_header), 0);
-       if(length & 1) {
-               txbuffer->frame.contents.udp.payload[length] = 0;
-               length++;
-       }
-       r = ip_checksum(r, &txbuffer->frame.contents.udp.udp,
-               sizeof(struct udp_header)+length, 1);
-       txbuffer->frame.contents.udp.udp.checksum = r;
-
-       send_packet();
-
-       return 1;
-}
-
-static udp_callback rx_callback;
-
-static void process_ip(void)
-{
-       if(rxlen < (sizeof(struct ethernet_header)+sizeof(struct udp_frame))) return;
-       /* We don't verify UDP and IP checksums and rely on the Ethernet checksum solely */
-       if(rxbuffer->frame.contents.udp.ip.version != IP_IPV4) return;
-       // check disabled for QEMU compatibility
-       //if(rxbuffer->frame.contents.udp.ip.diff_services != 0) return;
-       if(rxbuffer->frame.contents.udp.ip.total_length < sizeof(struct udp_frame)) return;
-       // check disabled for QEMU compatibility
-       //if(rxbuffer->frame.contents.udp.ip.fragment_offset != IP_DONT_FRAGMENT) return;
-       if(rxbuffer->frame.contents.udp.ip.proto != IP_PROTO_UDP) return;
-       if(rxbuffer->frame.contents.udp.ip.dst_ip != my_ip) return;
-       if(rxbuffer->frame.contents.udp.udp.length < sizeof(struct udp_header)) return;
-
-       if(rx_callback)
-               rx_callback(rxbuffer->frame.contents.udp.ip.src_ip, rxbuffer->frame.contents.udp.udp.src_port, rxbuffer->frame.contents.udp.udp.dst_port, rxbuffer->frame.contents.udp.payload, rxbuffer->frame.contents.udp.udp.length-sizeof(struct udp_header));
-}
-
-void microudp_set_callback(udp_callback callback)
-{
-       rx_callback = callback;
-}
-
-static void process_frame(void)
-{
-       flush_cpu_dcache();
-
-#ifndef HW_PREAMBLE_CRC
-       int i;
-       for(i=0;i<7;i++)
-               if(rxbuffer->frame.eth_header.preamble[i] != 0x55) return;
-       if(rxbuffer->frame.eth_header.preamble[7] != 0xd5) return;
-#endif
-
-#ifndef HW_PREAMBLE_CRC
-       unsigned int received_crc;
-       unsigned int computed_crc;
-       received_crc = ((unsigned int)rxbuffer->raw[rxlen-1] << 24)
-               |((unsigned int)rxbuffer->raw[rxlen-2] << 16)
-               |((unsigned int)rxbuffer->raw[rxlen-3] <<  8)
-               |((unsigned int)rxbuffer->raw[rxlen-4]);
-       computed_crc = crc32(&rxbuffer->raw[8], rxlen-12);
-       if(received_crc != computed_crc) return;
-
-       rxlen -= 4; /* strip CRC here to be consistent with TX */
-#endif
-
-       if(rxbuffer->frame.eth_header.ethertype == ETHERTYPE_ARP) process_arp();
-       else if(rxbuffer->frame.eth_header.ethertype == ETHERTYPE_IP) process_ip();
-}
-
-void microudp_start(const unsigned char *macaddr, unsigned int ip)
-{
-       int i;
-       ethmac_sram_reader_ev_pending_write(ETHMAC_EV_SRAM_READER);
-       ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
-
-       rxbuffer0 = (ethernet_buffer *)ETHMAC_RX0_BASE;
-       rxbuffer1 = (ethernet_buffer *)ETHMAC_RX1_BASE;
-       txbuffer0 = (ethernet_buffer *)ETHMAC_TX0_BASE;
-       txbuffer1 = (ethernet_buffer *)ETHMAC_TX1_BASE;
-
-       rxslot = 0;
-       txslot = 0;
-
-       rxbuffer = rxbuffer0;
-       txbuffer = txbuffer0;
-
-       for(i=0;i<6;i++)
-               my_mac[i] = macaddr[i];
-       my_ip = ip;
-
-       cached_ip = 0;
-       for(i=0;i<6;i++)
-               cached_mac[i] = 0;
-
-       rx_callback = (udp_callback)0;
-}
-
-void microudp_service(void)
-{
-       if(ethmac_sram_writer_ev_pending_read() & ETHMAC_EV_SRAM_WRITER) {
-               rxslot = ethmac_sram_writer_slot_read();
-               rxlen = ethmac_sram_writer_length_read();
-               if (rxslot)
-                       rxbuffer = rxbuffer1;
-               else
-                       rxbuffer = rxbuffer0;
-               process_frame();
-               ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
-       }
-}
-
-static void busy_wait(unsigned int ds)
-{
-       timer0_en_write(0);
-       timer0_reload_write(0);
-       timer0_load_write(identifier_frequency_read()/10*ds);
-       timer0_en_write(1);
-       timer0_update_value_write(1);
-       while(timer0_value_read()) timer0_update_value_write(1);
-}
-
-void eth_init(void)
-{
-       ethphy_crg_reset_write(0);
-       busy_wait(2);
-       /* that pesky ethernet PHY needs two resets at times... */
-       ethphy_crg_reset_write(1);
-       busy_wait(2);
-       ethphy_crg_reset_write(0);
-       busy_wait(2);
-}
-
-#ifdef CSR_ETHPHY_MODE_DETECTION_MODE_ADDR
-void eth_mode(void)
-{
-       printf("Ethernet phy mode: ");
-       if (ethphy_mode_detection_mode_read())
-               printf("MII");
-       else
-               printf("GMII");
-       printf("\n");
-}
-#endif
-
-#endif
diff --git a/software/libnet/tftp.c b/software/libnet/tftp.c
deleted file mode 100644 (file)
index 4579684..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-#include <stdint.h>
-#include <string.h>
-
-#include <net/microudp.h>
-#include <net/tftp.h>
-
-#define PORT_OUT       69
-#define PORT_IN                7642
-
-enum {
-       TFTP_RRQ        = 1,    /* Read request */
-       TFTP_WRQ        = 2,    /* Write request */
-       TFTP_DATA       = 3,    /* Data */
-       TFTP_ACK        = 4,    /* Acknowledgment */
-       TFTP_ERROR      = 5,    /* Error */
-};
-
-#define        BLOCK_SIZE      512     /* block size in bytes */
-
-
-static int format_request(uint8_t *buf, uint16_t op, const char *filename)
-{
-       int len = strlen(filename);
-
-       *buf++ = op >> 8; /* Opcode */
-       *buf++ = op;
-       memcpy(buf, filename, len);
-       buf += len;
-       *buf++ = 0x00;
-       *buf++ = 'o';
-       *buf++ = 'c';
-       *buf++ = 't';
-       *buf++ = 'e';
-       *buf++ = 't';
-       *buf++ = 0x00;
-       return 9+strlen(filename);
-}
-
-static int format_ack(uint8_t *buf, uint16_t block)
-{
-       *buf++ = 0x00; /* Opcode: Ack */
-       *buf++ = TFTP_ACK;
-       *buf++ = (block & 0xff00) >> 8;
-       *buf++ = (block & 0x00ff);
-       return 4;
-}
-
-static int format_data(uint8_t *buf, uint16_t block, const void *data, int len)
-{
-       *buf++ = 0x00; /* Opcode: Data*/
-       *buf++ = TFTP_DATA;
-       *buf++ = (block & 0xff00) >> 8;
-       *buf++ = (block & 0x00ff);
-       memcpy(buf, data, len);
-       return len+4;
-}
-
-static uint8_t *packet_data;
-static int total_length;
-static int transfer_finished;
-static uint8_t *dst_buffer;
-static int last_ack; /* signed, so we can use -1 */
-static uint16_t data_port;
-
-static void rx_callback(uint32_t src_ip, uint16_t src_port,
-    uint16_t dst_port, void *_data, unsigned int length)
-{
-       uint8_t *data = _data;
-       uint16_t opcode;
-       uint16_t block;
-       int i;
-       int offset;
-
-       if(length < 4) return;
-       if(dst_port != PORT_IN) return;
-       opcode = data[0] << 8 | data[1];
-       block = data[2] << 8 | data[3];
-       if(opcode == TFTP_ACK) { /* Acknowledgement */
-               data_port = src_port;
-               last_ack = block;
-               return;
-       }
-       if(block < 1) return;
-       if(opcode == TFTP_DATA) { /* Data */
-               length -= 4;
-               offset = (block-1)*BLOCK_SIZE;
-               for(i=0;i<length;i++)
-                       dst_buffer[offset+i] = data[i+4];
-               total_length += length;
-               if(length < BLOCK_SIZE)
-                       transfer_finished = 1;
-
-               packet_data = microudp_get_tx_buffer();
-               length = format_ack(packet_data, block);
-               microudp_send(PORT_IN, src_port, length);
-       }
-       if(opcode == TFTP_ERROR) { /* Error */
-               total_length = -1;
-               transfer_finished = 1;
-       }
-}
-
-int tftp_get(uint32_t ip, const char *filename, void *buffer)
-{
-       int len;
-       int tries;
-       int i;
-       int length_before;
-
-       if(!microudp_arp_resolve(ip))
-               return -1;
-
-       microudp_set_callback(rx_callback);
-
-       dst_buffer = buffer;
-
-       total_length = 0;
-       transfer_finished = 0;
-       tries = 5;
-       while(1) {
-               packet_data = microudp_get_tx_buffer();
-               len = format_request(packet_data, TFTP_RRQ, filename);
-               microudp_send(PORT_IN, PORT_OUT, len);
-               for(i=0;i<2000000;i++) {
-                       microudp_service();
-                       if((total_length > 0) || transfer_finished) break;
-               }
-               if((total_length > 0) || transfer_finished) break;
-               tries--;
-               if(tries == 0) {
-                       microudp_set_callback(NULL);
-                       return -1;
-               }
-       }
-
-       length_before = total_length;
-       while(!transfer_finished) {
-               if(length_before != total_length) {
-                       i = 12000000;
-                       length_before = total_length;
-               }
-               if(i-- == 0) {
-                       microudp_set_callback(NULL);
-                       return -1;
-               }
-               microudp_service();
-       }
-
-       microudp_set_callback(NULL);
-
-       return total_length;
-}
-
-int tftp_put(uint32_t ip, const char *filename, const void *buffer, int size)
-{
-       int len, send;
-       int tries;
-       int i;
-       int block = 0, sent = 0;
-
-       if(!microudp_arp_resolve(ip))
-               return -1;
-
-       microudp_set_callback(rx_callback);
-
-       packet_data = microudp_get_tx_buffer();
-
-       total_length = 0;
-       transfer_finished = 0;
-       tries = 5;
-       while(1) {
-               packet_data = microudp_get_tx_buffer();
-               len = format_request(packet_data, TFTP_WRQ, filename);
-               microudp_send(PORT_IN, PORT_OUT, len);
-               for(i=0;i<2000000;i++) {
-                       last_ack = -1;
-                       microudp_service();
-                       if(last_ack == block)
-                               goto send_data;
-                       if(transfer_finished)
-                               goto fail;
-               }
-               tries--;
-               if(tries == 0)
-                       goto fail;
-       }
-
-send_data:
-       do {
-               block++;
-               send = sent+BLOCK_SIZE > size ? size-sent : BLOCK_SIZE;
-               tries = 5;
-               while(1) {
-                       packet_data = microudp_get_tx_buffer();
-                       len = format_data(packet_data, block, buffer, send);
-                       microudp_send(PORT_IN, data_port, len);
-                       for(i=0;i<12000000;i++) {
-                               microudp_service();
-                               if(transfer_finished)
-                                       goto fail;
-                               if(last_ack == block)
-                                       goto next;
-                       }
-                       if (!--tries)
-                               goto fail;
-               }
-next:
-               sent += send;
-               buffer += send;
-       } while (send == BLOCK_SIZE);
-
-       microudp_set_callback(NULL);
-
-       return sent;
-
-fail:
-       microudp_set_callback(NULL);
-       return -1;
-}
diff --git a/software/libunwind/Makefile b/software/libunwind/Makefile
deleted file mode 100644 (file)
index 579ad4d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-MSCDIR=../..
-include $(MSCDIR)/software/common.mak
-
-COMMONFLAGS+=-integrated-as \
-       -I. -I$(MSCDIR)/software/include/dyld/ -I$(MSCDIR)/software/unwinder/include/ \
-       -D__ELF__ -D__linux__ -D_LIBUNWIND_NO_HEAP -DNDEBUG
-
-OBJECTS=UnwindRegistersSave.o UnwindRegistersRestore.o UnwindLevel1.o libunwind.o
-
-all: libunwind.a
-
-# pull in dependency info for *existing* .o files
--include $(OBJECTS:.o=.d)
-
-libunwind.a: $(OBJECTS)
-       $(AR) crs libunwind.a $(OBJECTS)
-
-%.o: $(MSCDIR)/software/unwinder/src/%.cpp
-       $(compilexx-dep)
-
-%.o: $(MSCDIR)/software/unwinder/src/%.c
-       $(compile-dep)
-
-%.o: $(MSCDIR)/software/unwinder/src/%.S
-       $(assemble)
-
-.PHONY: clean
-
-clean:
-       $(RM) $(OBJECTS) $(OBJECTS:.o=.ts) $(OBJECTS:.o=.d) libuwind.a .*~ *~
diff --git a/software/libunwind/__cxxabi_config.h b/software/libunwind/__cxxabi_config.h
deleted file mode 100644 (file)
index 42cd6fe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#define LIBCXXABI_ARM_EHABI 0
diff --git a/software/memtest/Makefile b/software/memtest/Makefile
deleted file mode 100644 (file)
index ea93a3a..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-MSCDIR=../..
-include $(MSCDIR)/software/common.mak
-
-OBJECTS=isr.o main.o
-
-all: memtest.bin
-
-# pull in dependency info for *existing* .o files
--include $(OBJECTS:.o=.d)
-
-%.bin: %.elf
-       $(OBJCOPY) -O binary $< $@
-       chmod -x $@
-
-memtest.elf: $(OBJECTS) libs
-
-%.elf:
-       $(LD) $(LDFLAGS) \
-               -T $(MSCDIR)/software/libbase/linker-sdram.ld \
-               -N -o $@ \
-               $(MSCDIR)/software/libbase/crt0-$(CPU).o \
-               $(OBJECTS) \
-               -L$(MSCDIR)/software/libbase \
-               -L$(MSCDIR)/software/libcompiler-rt \
-               -lbase -lcompiler-rt
-       chmod -x $@
-
-main.o: main.c
-       $(compile-dep)
-
-%.o: %.c
-       $(compile-dep)
-
-%.o: %.S
-       $(assemble)
-
-libs:
-       $(MAKE) -C $(MSCDIR)/software/libcompiler-rt
-       $(MAKE) -C $(MSCDIR)/software/libbase
-
-load: memtest.bin
-       $(MAKE) -C $(MSCDIR)/tools
-       $(MSCDIR)/tools/flterm --port /dev/ttyUSB0 --kernel memtest.bin
-
-
-clean:
-       $(RM) $(OBJECTS) $(OBJECTS:.o=.d) memtest.elf memtest.bin
-       $(RM) .*~ *~
-
-.PHONY: all main.o clean libs load
diff --git a/software/memtest/isr.c b/software/memtest/isr.c
deleted file mode 100644 (file)
index c49d31d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <generated/csr.h>
-#include <irq.h>
-#include <uart.h>
-
-void isr(void);
-void isr(void)
-{
-       unsigned int irqs;
-       
-       irqs = irq_pending() & irq_getmask();
-       
-       if(irqs & (1 << UART_INTERRUPT))
-               uart_isr();
-}
diff --git a/software/memtest/main.c b/software/memtest/main.c
deleted file mode 100644 (file)
index c885802..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <irq.h>
-#include <uart.h>
-#include <time.h>
-#include <generated/csr.h>
-#include <generated/mem.h>
-#include <hw/flags.h>
-#include <console.h>
-#include <system.h>
-
-static unsigned int log2(unsigned int v)
-{
-  unsigned int r;
-  r = 0;
-  while(v>>=1) r++;
-  return r;
-}
-
-static void membw_service(void)
-{
-       static int last_event;
-       unsigned long long int nr, nw;
-       unsigned long long int f;
-       unsigned int rdb, wrb;
-       unsigned int dw;
-
-       if(elapsed(&last_event, identifier_frequency_read())) {
-               sdram_controller_bandwidth_update_write(1);
-               nr = sdram_controller_bandwidth_nreads_read();
-               nw = sdram_controller_bandwidth_nwrites_read();
-               f = identifier_frequency_read();
-               dw = sdram_controller_bandwidth_data_width_read();
-               rdb = (nr*f >> (24 - log2(dw)))/1000000ULL;
-               wrb = (nw*f >> (24 - log2(dw)))/1000000ULL;
-               printf("read:%5dMbps  write:%5dMbps  all:%5dMbps\n", rdb, wrb, rdb + wrb);
-       }
-}
-
-//#define DEBUG
-
-static void memtest_service(void)
-{
-       static unsigned int test_buffer[(MAIN_RAM_SIZE/2)/4] __attribute__((aligned(16)));
-       static unsigned char reading;
-       static unsigned int err, total_err;
-#ifdef DEBUG
-       int i;
-#endif
-
-       if(reading) {
-               if(!memtest_w_busy_read()) {
-#ifdef DEBUG
-                       flush_l2_cache();
-                       flush_cpu_dcache();
-                       printf("starting read\n");
-                       for(i=0;i<64;i++) {
-                               printf("%08x", test_buffer[i]);
-                               if((i % 4) == 3)
-                                       printf("\n");
-                       }
-#endif
-                       memtest_r_reset_write(1);
-                       memtest_r_base_write((unsigned int)test_buffer);
-                       memtest_r_length_write(sizeof(test_buffer));
-                       memtest_r_shoot_write(1);
-                       reading = 0;
-               }
-       } else {
-               if(!memtest_r_busy_read()) {
-                       err = memtest_r_error_count_read();
-                       total_err += err;
-                       printf("err=%d\t\ttotal=%d\n", err, total_err);
-                       memtest_w_reset_write(1);
-                       memtest_w_base_write((unsigned int)test_buffer);
-                       memtest_w_length_write(sizeof(test_buffer));
-                       memtest_w_shoot_write(1);
-                       reading = 1;
-               }
-       }
-}
-
-int main(void)
-{
-       irq_setmask(0);
-       irq_setie(1);
-       uart_init();
-
-       puts("Memory testing software built "__DATE__" "__TIME__"\n");
-
-       if((memtest_w_magic_read() != 0x361f) || (memtest_r_magic_read() != 0x361f)) {
-               printf("Memory test cores not detected\n");
-               while(1);
-       }
-
-       time_init();
-
-       flush_l2_cache();
-       while(1) {
-               memtest_service();
-               membw_service();
-       }
-
-       return 0;
-}
diff --git a/software/unwinder b/software/unwinder
deleted file mode 160000 (submodule)
index 8b11966..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 8b1196692d823a090a9879a695050baa7acc39ee
index 45554155a26fc34beac9760d4738ffc6630a31c9..bc53c47533c005bab4642c2db6e24a0df5959ab2 100644 (file)
@@ -1,18 +1,13 @@
-TARGETS=flterm byteswap
+TARGETS=byteswap
 CC=gcc
 RM ?= rm -f
-PREFIX ?= /usr/local
 
 all: $(TARGETS)
 
 %: %.c
        $(CC) -O2 -Wall -I../common -s -o $@ $<
 
-install: flterm
-       install -d $(PREFIX)/bin
-       install -m755 -t $(PREFIX)/bin $^
-
-.PHONY: all clean install
+.PHONY: all clean
 
 clean:
        $(RM) $(TARGETS)
diff --git a/tools/flterm.c b/tools/flterm.c
deleted file mode 100644 (file)
index 17d28a2..0000000
+++ /dev/null
@@ -1,793 +0,0 @@
-/*
- * MiSoC
- * Copyright (C) 2007, 2008, 2009, 2010, 2011 Sebastien Bourdeauducq
- * Copyright (C) 2011 Michael Walle
- * Copyright (C) 2004 MontaVista Software, Inc
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <string.h>
-#include <ctype.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <poll.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <sfl.h>
-
-#ifdef __linux__
-#include <linux/serial.h>
-#endif
-
-#define DEFAULT_KERNELADR      (0x40000000)
-#define DEFAULT_CMDLINEADR     (0x41000000)
-#define DEFAULT_INITRDADR      (0x41002000)
-
-#define GDBBUFLEN 1000
-
-unsigned int crc16_table[256] = {
-       0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
-       0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
-       0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
-       0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
-       0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
-       0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
-       0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
-       0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
-       0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
-       0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
-       0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
-       0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
-       0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
-       0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
-       0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
-       0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
-       0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
-       0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
-       0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
-       0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
-       0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
-       0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
-       0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
-       0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
-       0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
-       0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
-       0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
-       0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
-       0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
-       0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
-       0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
-       0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
-};
-
-static int debug = 0;
-
-static unsigned short crc16(const void *_buffer, int len)
-{
-       const unsigned char *buffer = (const unsigned char *)_buffer;
-       unsigned short crc;
-       
-       crc = 0;
-       while(len-- > 0)
-           crc = crc16_table[((crc >> 8) ^ (*buffer++)) & 0xFF] ^ (crc << 8);
-       
-       return crc;
-}
-
-static int write_exact(int fd, const char *data, unsigned int length)
-{
-       int r;
-       
-       while(length > 0) {
-               r = write(fd, data, length);
-               if(r <= 0) return 0;
-               length -= r;
-               data += r;
-       }
-       return 1;
-}
-
-/* length, cmd and payload must be filled in */
-static int send_frame(int serialfd, struct sfl_frame *frame)
-{
-       unsigned short int crc;
-       int retry;
-       char reply;
-       
-       crc = crc16(&frame->cmd, frame->length+1);
-       frame->crc[0] = (crc & 0xff00) >> 8;
-       frame->crc[1] = (crc & 0x00ff);
-       
-       retry = 0;
-       do {
-               if(!write_exact(serialfd, (char *)frame, frame->length+4)) {
-                       perror("[FLTERM] Unable to write to serial port.");
-                       return 0;
-               }
-               /* Get the reply from the device */
-               read(serialfd, &reply, 1); /* TODO: timeout */
-               switch(reply) {
-                       case SFL_ACK_SUCCESS:
-                               retry = 0;
-                               break;
-                       case SFL_ACK_CRCERROR:
-                               retry = 1;
-                               break;
-                       default:
-                               fprintf(stderr, "[FLTERM] Got unknown reply '%c' from the device, aborting.\n", reply);
-                               return 0;
-               }
-       } while(retry);
-       return 1;
-}
-
-static int upload_fd(int serialfd, const char *name, int firmwarefd, unsigned int load_address)
-{
-       struct sfl_frame frame;
-       int readbytes;
-       int length;
-       int position;
-       unsigned int current_address;
-       struct timeval t0;
-       struct timeval t1;
-       int millisecs;
-       
-       length = lseek(firmwarefd, 0, SEEK_END);
-       lseek(firmwarefd, 0, SEEK_SET);
-       
-       printf("[FLTERM] Uploading %s (%d bytes)...\n", name, length);
-       
-       gettimeofday(&t0, NULL);
-       
-       current_address = load_address;
-       position = 0;
-       while(1) {
-               printf("%d%%\r", 100*position/length);
-               fflush(stdout);
-       
-               readbytes = read(firmwarefd, &frame.payload[4], sizeof(frame.payload) - 4);
-               if(readbytes < 0) {
-                       perror("[FLTERM] Unable to read image.");
-                       return -1;
-               }
-               if(readbytes == 0) break;
-               
-               frame.length = readbytes+4;
-               frame.cmd = SFL_CMD_LOAD;
-               frame.payload[0] = (current_address & 0xff000000) >> 24;
-               frame.payload[1] = (current_address & 0x00ff0000) >> 16;
-               frame.payload[2] = (current_address & 0x0000ff00) >> 8;
-               frame.payload[3] = (current_address & 0x000000ff);
-               
-               if(!send_frame(serialfd, &frame)) return -1;
-               
-               current_address += readbytes;
-               position += readbytes;
-       }
-       
-       gettimeofday(&t1, NULL);
-       
-       millisecs = (t1.tv_sec - t0.tv_sec)*1000 + (t1.tv_usec - t0.tv_usec)/1000;
-       
-       printf("[FLTERM] Upload complete (%.1fKB/s).\n", 1000.0*(double)length/((double)millisecs*1024.0));
-       return length;
-}
-
-static const char sfl_magic_req[SFL_MAGIC_LEN] = SFL_MAGIC_REQ;
-static const char sfl_magic_ack[SFL_MAGIC_LEN] = SFL_MAGIC_ACK;
-
-static void answer_magic(int serialfd,
-       const char *kernel_image, unsigned int kernel_address,
-       const char *cmdline, unsigned int cmdline_address,
-       const char *initrd_image, unsigned int initrd_address)
-{
-       int kernelfd, initrdfd;
-       struct sfl_frame frame;
-       
-       printf("[FLTERM] Received firmware download request from the device.\n");
-       
-       kernelfd = open(kernel_image, O_RDONLY);
-       if(kernelfd == -1) {
-               perror("[FLTERM] Unable to open kernel image (request ignored).");
-               return;
-       }
-       initrdfd = -1;
-       if(initrd_image != NULL) {
-               initrdfd = open(initrd_image, O_RDONLY);
-               if(initrdfd == -1) {
-                       perror("[FLTERM] Unable to open initrd image (request ignored).");
-                       close(kernelfd);
-                       return;
-               }
-       }
-
-       write_exact(serialfd, sfl_magic_ack, SFL_MAGIC_LEN);
-       
-       upload_fd(serialfd, "kernel", kernelfd, kernel_address);
-       if(cmdline != NULL) {
-               int len;
-
-               printf("[FLTERM] Setting kernel command line: '%s'.\n", cmdline);
-
-               len = strlen(cmdline)+1;
-               if(len > (254-4)) {
-                       fprintf(stderr, "[FLTERM] Kernel command line too long, load aborted.\n");
-                       close(initrdfd);
-                       close(kernelfd);
-                       return;
-               }
-               frame.length = len+4;
-               frame.cmd = SFL_CMD_LOAD;
-               frame.payload[0] = (cmdline_address & 0xff000000) >> 24;
-               frame.payload[1] = (cmdline_address & 0x00ff0000) >> 16;
-               frame.payload[2] = (cmdline_address & 0x0000ff00) >> 8;
-               frame.payload[3] = (cmdline_address & 0x000000ff);
-               strcpy((char *)&frame.payload[4], cmdline);
-               send_frame(serialfd, &frame);
-
-               frame.length = 4;
-               frame.cmd = SFL_CMD_CMDLINE;
-               frame.payload[0] = (cmdline_address & 0xff000000) >> 24;
-               frame.payload[1] = (cmdline_address & 0x00ff0000) >> 16;
-               frame.payload[2] = (cmdline_address & 0x0000ff00) >> 8;
-               frame.payload[3] = (cmdline_address & 0x000000ff);
-               send_frame(serialfd, &frame);
-       }
-       if(initrdfd != -1) {
-               int len;
-               
-               len = upload_fd(serialfd, "initrd", initrdfd, initrd_address);
-               if(len <= 0) return;
-               
-               frame.length = 4;
-               frame.cmd = SFL_CMD_INITRDSTART;
-               frame.payload[0] = (initrd_address & 0xff000000) >> 24;
-               frame.payload[1] = (initrd_address & 0x00ff0000) >> 16;
-               frame.payload[2] = (initrd_address & 0x0000ff00) >> 8;
-               frame.payload[3] = (initrd_address & 0x000000ff);
-               send_frame(serialfd, &frame);
-
-               initrd_address += len-1;
-
-               frame.length = 4;
-               frame.cmd = SFL_CMD_INITRDEND;
-               frame.payload[0] = (initrd_address & 0xff000000) >> 24;
-               frame.payload[1] = (initrd_address & 0x00ff0000) >> 16;
-               frame.payload[2] = (initrd_address & 0x0000ff00) >> 8;
-               frame.payload[3] = (initrd_address & 0x000000ff);
-               send_frame(serialfd, &frame);
-       }
-
-       /* Send the jump command */
-       printf("[FLTERM] Booting the device.\n");
-       frame.length = 4;
-       frame.cmd = SFL_CMD_JUMP;
-       frame.payload[0] = (kernel_address & 0xff000000) >> 24;
-       frame.payload[1] = (kernel_address & 0x00ff0000) >> 16;
-       frame.payload[2] = (kernel_address & 0x0000ff00) >> 8;
-       frame.payload[3] = (kernel_address & 0x000000ff);
-       if(!send_frame(serialfd, &frame)) return;
-
-       printf("[FLTERM] Done.\n");
-
-       close(initrdfd);
-       close(kernelfd);
-}
-
-static int hex(unsigned char c)
-{
-       if(c >= 'a' && c <= 'f') {
-               return c - 'a' + 10;
-       }
-       if(c >= '0' && c <= '9') {
-               return c - '0';
-       }
-       if(c >= 'A' && c <= 'F') {
-               return c - 'A' + 10;
-       }
-       return 0;
-}
-
-/*
- * This is taken from kdmx2.
- * Author: Tom Rini <trini@mvista.com>
- */
-static void gdb_process_packet(int infd, int outfd, int altfd)
-{
-       /* gdb packet handling */
-       char gdbbuf[GDBBUFLEN + 1];
-       int pos = 0;
-       unsigned char runcksum = 0;
-       unsigned char recvcksum = 0;
-       struct pollfd fds;
-       char c;
-       int seen_hash = 0;
-
-       fds.fd = infd;
-       fds.events = POLLIN;
-
-       memset(gdbbuf, 0, sizeof(gdbbuf));
-       gdbbuf[0] = '$';
-       pos++;
-
-       while (1) {
-               fds.revents = 0;
-               if(poll(&fds, 1, 100) == 0) {
-                       /* timeout */
-                       if(altfd != -1) {
-                               write(altfd, gdbbuf, pos);
-                       }
-                       break;
-               }
-               if(pos == GDBBUFLEN) {
-                       if(altfd != -1) {
-                               write(altfd, gdbbuf, pos);
-                       }
-                       break;
-               }
-               read(infd, &c, 1);
-               gdbbuf[pos++] = c;
-               if(c == '#') {
-                       seen_hash = 1;
-               } else if(seen_hash == 0) {
-                       runcksum += c;
-               } else if(seen_hash == 1) {
-                       recvcksum = hex(c) << 4;
-                       seen_hash = 2;
-               } else if(seen_hash == 2) {
-                       recvcksum |= hex(c);
-                       seen_hash = 3;
-               }
-
-               if(seen_hash == 3) {
-                       /* we're done */
-                       runcksum %= 256;
-                       if(recvcksum == runcksum) {
-                               if(debug) {
-                                       fprintf(stderr, "[GDB %s]\n", gdbbuf);
-                               }
-                               write(outfd, gdbbuf, pos);
-                       } else {
-                               if(altfd != -1) {
-                                       write(altfd, gdbbuf, pos);
-                               }
-                       }
-                       seen_hash = 0;
-                       break;
-               }
-       }
-}
-
-static void do_terminal(char *serial_port,
-       int baud, int gdb_passthrough,
-       const char *kernel_image, unsigned int kernel_address,
-       const char *cmdline, unsigned int cmdline_address,
-       const char *initrd_image, unsigned int initrd_address,
-       char *log_path)
-{
-       int serialfd;
-       int gdbfd = -1;
-       FILE *logfd = NULL;
-       struct termios my_termios;
-       char c;
-       int recognized;
-       struct pollfd fds[3];
-       int flags;
-       int rsp_pending = 0;
-       int c_cflag;
-       int custom_divisor;
-       
-       /* Open and configure the serial port */
-       if(log_path != NULL) {
-               logfd = fopen(log_path, "a+");
-               if(logfd == NULL) {
-                       perror("Unable to open log file");
-                       return;
-               }
-       }
-
-       serialfd = open(serial_port, O_RDWR|O_NOCTTY);
-       if(serialfd == -1) {
-               perror("Unable to open serial port");
-               return;
-       }
-
-       custom_divisor = 0;
-       switch(baud) {
-               case 9600: c_cflag = B9600; break;
-               case 19200: c_cflag = B19200; break;
-               case 38400: c_cflag = B38400; break;
-               case 57600: c_cflag = B57600; break;
-               case 115200: c_cflag = B115200; break;
-               case 230400: c_cflag = B230400; break;
-               default:
-                       c_cflag = B38400;
-                       custom_divisor = 1;
-                       break;
-       }
-
-#ifdef __linux__
-       if(custom_divisor) {
-               struct serial_struct serial_info;
-               ioctl(serialfd, TIOCGSERIAL, &serial_info);
-               serial_info.custom_divisor = serial_info.baud_base / baud;
-               serial_info.flags &= ~ASYNC_SPD_MASK;
-               serial_info.flags |= ASYNC_SPD_CUST;
-               ioctl(serialfd, TIOCSSERIAL, &serial_info);
-       }
-#else
-       if(custom_divisor) {
-               fprintf(stderr, "[FLTERM] baudrate not supported\n");
-               return;
-       }
-#endif
-
-       /* Thanks to Julien Schmitt (GTKTerm) for figuring out the correct parameters
-        * to put into that weird struct.
-        */
-       tcgetattr(serialfd, &my_termios);
-       my_termios.c_cflag = c_cflag;
-       my_termios.c_cflag |= CS8;
-       my_termios.c_cflag |= CREAD;
-       my_termios.c_iflag = IGNPAR | IGNBRK;
-       my_termios.c_cflag |= CLOCAL;
-       my_termios.c_oflag = 0;
-       my_termios.c_lflag = 0;
-       my_termios.c_cc[VTIME] = 0;
-       my_termios.c_cc[VMIN] = 1;
-       tcsetattr(serialfd, TCSANOW, &my_termios);
-       tcflush(serialfd, TCOFLUSH);
-       tcflush(serialfd, TCIFLUSH);
-
-       /* Prepare the fdset for poll() */
-       fds[0].fd = 0;
-       fds[0].events = POLLIN;
-       fds[1].fd = serialfd;
-       fds[1].events = POLLIN;
-
-       recognized = 0;
-       flags = fcntl(serialfd, F_GETFL, 0);
-       while(1) {
-               if(gdbfd == -1 && gdb_passthrough) {
-                       gdbfd = open("/dev/ptmx", O_RDWR);
-                       if(grantpt(gdbfd) != 0) {
-                               perror("grantpt()");
-                               return;
-                       }
-                       if(unlockpt(gdbfd) != 0) {
-                               perror("unlockpt()");
-                               return;
-                       }
-                       printf("[GDB passthrough] use %s as GDB remote device\n",
-                                       ptsname(gdbfd));
-                       fds[2].fd = gdbfd;
-                       fds[2].events = POLLIN;
-               }
-
-               fds[0].revents = 0;
-               fds[1].revents = 0;
-               fds[2].revents = 0;
-
-               /* poll() behaves strangely when the serial port descriptor is in
-                * blocking mode. So work around this.
-                */
-               fcntl(serialfd, F_SETFL, flags|O_NONBLOCK);
-               if(poll(&fds[0], (gdbfd == -1) ? 2 : 3, -1) < 0) break;
-               fcntl(serialfd, F_SETFL, flags);
-
-               if(fds[0].revents & POLLIN) {
-                       if(read(0, &c, 1) <= 0) break;
-                       if(write(serialfd, &c, 1) <= 0) break;
-               }
-
-               if(fds[2].revents & POLLIN) {
-                       rsp_pending = 1;
-                       if(read(gdbfd, &c, 1) <= 0) break;
-                       if(c == '\03') {
-                               /* convert ETX to breaks */
-                               if(debug) {
-                                       fprintf(stderr, "[GDB BREAK]\n");
-                               }
-                               tcsendbreak(serialfd, 0);
-                       } else if(c == '$') {
-                               gdb_process_packet(gdbfd, serialfd, -1);
-                       } else if(c == '+' || c == '-') {
-                               write(serialfd, &c, 1);
-                       } else {
-                               fprintf(stderr, "Internal error (line %d)", __LINE__);
-                               exit(1);
-                       }
-               }
-
-               if(fds[2].revents & POLLHUP) {
-                       /* close and reopen new pair */
-                       close(gdbfd);
-                       gdbfd = -1;
-                       continue;
-               }
-
-               if(fds[1].revents & POLLIN) {
-                       if(read(serialfd, &c, 1) <= 0) break;
-
-                       if(logfd && c && isascii(c)) {
-                               fwrite(&c, sizeof(c), 1, logfd);
-                               if(c == '\n') fflush(logfd);
-                       }
-
-                       if(gdbfd != -1 && rsp_pending && (c == '+' || c == '-')) {
-                               rsp_pending = 0;
-                               write(gdbfd, &c, 1);
-                       } else if(gdbfd != -1 && c == '$') {
-                               gdb_process_packet(serialfd, gdbfd, 0);
-                       } else {
-                               /* write to terminal */
-                               write(0, &c, 1);
-                       
-                               if(kernel_image != NULL) {
-                                       if(c == sfl_magic_req[recognized]) {
-                                               recognized++;
-                                               if(recognized == SFL_MAGIC_LEN) {
-                                                       /* We've got the magic string ! */
-                                                       recognized = 0;
-                                                       answer_magic(serialfd,
-                                                               kernel_image, kernel_address,
-                                                               cmdline, cmdline_address,
-                                                               initrd_image, initrd_address);
-                                               }
-                                       } else {
-                                               if(c == sfl_magic_req[0]) recognized = 1; else recognized = 0;
-                                       }
-                               }
-                       }
-               }
-       }
-       
-       close(serialfd);
-
-       if(gdbfd != -1) close(gdbfd);
-       if(logfd) fclose(logfd);
-}
-
-enum {
-       OPTION_PORT,
-       OPTION_GDB_PASSTHROUGH,
-       OPTION_SPEED,
-       OPTION_DEBUG,
-       OPTION_KERNEL,
-       OPTION_KERNELADR,
-       OPTION_CMDLINE,
-       OPTION_CMDLINEADR,
-       OPTION_INITRD,
-       OPTION_INITRDADR,
-       OPTION_LOG,
-       OPTION_HELP,
-};
-
-static const struct option options[] = {
-       {
-               .name = "port",
-               .has_arg = 1,
-               .val = OPTION_PORT
-       },
-       {
-               .name = "gdb-passthrough",
-               .has_arg = 0,
-               .val = OPTION_GDB_PASSTHROUGH
-       },
-       {
-               .name = "debug",
-               .has_arg = 0,
-               .val = OPTION_DEBUG
-       },
-       {
-               .name = "speed",
-               .has_arg = 1,
-               .val = OPTION_SPEED
-       },
-       {
-               .name = "kernel",
-               .has_arg = 1,
-               .val = OPTION_KERNEL
-       },
-       {
-               .name = "kernel-adr",
-               .has_arg = 1,
-               .val = OPTION_KERNELADR
-       },
-       {
-               .name = "cmdline",
-               .has_arg = 1,
-               .val = OPTION_CMDLINE
-       },
-       {
-               .name = "cmdline-adr",
-               .has_arg = 1,
-               .val = OPTION_CMDLINEADR
-       },
-       {
-               .name = "initrd",
-               .has_arg = 1,
-               .val = OPTION_INITRD
-       },
-       {
-               .name = "initrd-adr",
-               .has_arg = 1,
-               .val = OPTION_INITRDADR
-       },
-       {
-               .name = "log",
-               .has_arg = 1,
-               .val = OPTION_LOG
-       },
-       {
-               .name = "help",
-               .has_arg = 0,
-               .val = OPTION_HELP
-       },
-       {
-               .name = NULL
-       }
-};
-
-static void print_usage()
-{
-       fprintf(stderr, "Serial boot program for MiSoC - v. 2.4\n");
-       fprintf(stderr, "Copyright (C) 2007, 2008, 2009, 2010, 2011 Sebastien Bourdeauducq\n");
-       fprintf(stderr, "Copyright (C) 2011 Michael Walle\n");
-       fprintf(stderr, "Copyright (C) 2004 MontaVista Software, Inc\n\n");
-
-       fprintf(stderr, "This program is free software: you can redistribute it and/or modify\n");
-       fprintf(stderr, "it under the terms of the GNU General Public License as published by\n");
-       fprintf(stderr, "the Free Software Foundation, version 3 of the License.\n\n");
-
-       fprintf(stderr, "Usage: flterm --port <port>\n");
-       fprintf(stderr, "              [--speed <speed>] [--gdb-passthrough] [--debug]\n");
-       fprintf(stderr, "              [--kernel <kernel_image> [--kernel-adr <address>]]\n");
-       fprintf(stderr, "              [--cmdline <cmdline> [--cmdline-adr <address>]]\n");
-       fprintf(stderr, "              [--initrd <initrd_image> [--initrd-adr <address>]]\n");
-       fprintf(stderr, "              [--log <log_file>]\n\n");
-       fprintf(stderr, "Default load addresses:\n");
-       fprintf(stderr, "  kernel:  0x%08x\n", DEFAULT_KERNELADR);
-       fprintf(stderr, "  cmdline: 0x%08x\n", DEFAULT_CMDLINEADR);
-       fprintf(stderr, "  initrd:  0x%08x\n", DEFAULT_INITRDADR);
-}
-
-int main(int argc, char *argv[])
-{
-       int opt;
-       char *serial_port;
-       int baud;
-       int gdb_passthrough;
-       char *kernel_image;
-       unsigned int kernel_address;
-       char *cmdline;
-       unsigned int cmdline_address;
-       char *initrd_image;
-       unsigned int initrd_address;
-       char *endptr;
-       char *log_path;
-       struct termios otty, ntty;
-       
-       /* Fetch command line arguments */
-       serial_port = NULL;
-       baud = 115200;
-       gdb_passthrough = 0;
-       kernel_image = NULL;
-       kernel_address = DEFAULT_KERNELADR;
-       cmdline = NULL;
-       cmdline_address = DEFAULT_CMDLINEADR;
-       initrd_image = NULL;
-       initrd_address = DEFAULT_INITRDADR;
-       log_path = NULL;
-       while((opt = getopt_long(argc, argv, "", options, NULL)) != -1) {
-               if(opt == '?') {
-                       print_usage();
-                       return 1;
-               }
-               switch(opt) {
-                       case OPTION_PORT:
-                               free(serial_port);
-                               serial_port = strdup(optarg);
-                               break;
-                       case OPTION_SPEED:
-                               baud = strtoul(optarg, &endptr, 0);
-                               if(*endptr != 0) {
-                                       fprintf(stderr, "[FLTERM] Couldn't parse baudrate\n");
-                                       return 1;
-                               }
-                               break;
-                       case OPTION_DEBUG:
-                               debug = 1;
-                               break;
-                       case OPTION_GDB_PASSTHROUGH:
-                               gdb_passthrough = 1;
-                               break;
-                       case OPTION_KERNEL:
-                               free(kernel_image);
-                               kernel_image = strdup(optarg);
-                               break;
-                       case OPTION_KERNELADR:
-                               kernel_address = strtoul(optarg, &endptr, 0);
-                               if(*endptr != 0) {
-                                       fprintf(stderr, "[FLTERM] Couldn't parse kernel address\n");
-                                       return 1;
-                               }
-                               break;
-                       case OPTION_CMDLINE:
-                               free(cmdline);
-                               cmdline = strdup(optarg);
-                               break;
-                       case OPTION_CMDLINEADR:
-                               cmdline_address = strtoul(optarg, &endptr, 0);
-                               if(*endptr != 0) {
-                                       fprintf(stderr, "[FLTERM] Couldn't parse cmdline address\n");
-                                       return 1;
-                               }
-                               break;
-                       case OPTION_INITRD:
-                               free(initrd_image);
-                               initrd_image = strdup(optarg);
-                               break;
-                       case OPTION_INITRDADR:
-                               initrd_address = strtoul(optarg, &endptr, 0);
-                               if(*endptr != 0) {
-                                       fprintf(stderr, "[FLTERM] Couldn't parse initrd address\n");
-                                       return 1;
-                               }
-                               break;
-                       case OPTION_LOG:
-                               free(log_path);
-                               log_path = strdup(optarg);
-                               break;
-                       case OPTION_HELP:
-                               print_usage();
-                               return 0;
-               }
-       }
-
-       if(serial_port == NULL) {
-               fprintf(stderr, "[FLTERM] No port given\n");
-               return 1;
-       }
-
-       /* Banner */
-       printf("[FLTERM] Starting...\n");
-       
-       /* Set up stdin/out */
-       tcgetattr(0, &otty);
-       ntty = otty;
-       ntty.c_lflag &= ~(ECHO | ICANON);
-       tcsetattr(0, TCSANOW, &ntty);
-
-       /* Do the bulk of the work */
-       do_terminal(serial_port, baud, gdb_passthrough,
-               kernel_image, kernel_address,
-               cmdline, cmdline_address,
-               initrd_image, initrd_address,
-               log_path);
-       
-       /* Restore stdin/out into their previous state */
-       tcsetattr(0, TCSANOW, &otty);
-       
-       return 0;
-}