From eee119de6a2bd0487e91daf69e7962351e2a3c9c Mon Sep 17 00:00:00 2001
From: "Nicolas \"Pixel\" Noble" <pixel@nobis-crew.org>
Date: Mon, 24 Jan 2011 18:23:01 +0100
Subject: Dummy software compiles; fixed a few linking issues. Also, most of
 the kernel syscalls are missing.

---
 Makefile                      |  2 +-
 arch/arm/lpc17xx/ldscript-mpu | 10 +++-------
 os/Makefile                   |  2 +-
 os/src/close.c                |  4 ++++
 os/src/fclose.c               |  6 ++++++
 os/src/free.c                 |  5 +++++
 os/src/lseek.c                |  4 ++++
 os/src/malloc.c               |  5 +++++
 os/src/read.c                 |  5 +++++
 os/src/sprintf.c              | 10 ++++++++++
 os/src/write.c                |  4 ++++
 target-rules.mk               |  5 ++++-
 12 files changed, 52 insertions(+), 10 deletions(-)
 create mode 100644 os/src/close.c
 create mode 100644 os/src/fclose.c
 create mode 100644 os/src/free.c
 create mode 100644 os/src/lseek.c
 create mode 100644 os/src/malloc.c
 create mode 100644 os/src/read.c
 create mode 100644 os/src/sprintf.c
 create mode 100644 os/src/write.c

diff --git a/Makefile b/Makefile
index 8de95f8..d875646 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 TARGET = demo.bin
-LIBS = FreeRTOS/libFreeRTOS.a arch/libarch.a -lc os/libos.a
+LIBS = -Wl,--start-group -lc FreeRTOS/libFreeRTOS.a arch/libarch.a os/libos.a -Wl,--end-group
 
 export ROOTDIR = $(CURDIR)
 
diff --git a/arch/arm/lpc17xx/ldscript-mpu b/arch/arm/lpc17xx/ldscript-mpu
index ce71313..3af58a9 100644
--- a/arch/arm/lpc17xx/ldscript-mpu
+++ b/arch/arm/lpc17xx/ldscript-mpu
@@ -148,10 +148,11 @@ SECTIONS
   __cs3_region_size_rom = LENGTH(rom);
   __cs3_region_num = 1;
 
-  .privileged_data :
+  .data :
   {
+    __cs3_region_start_ram = .;
     __privileged_data_start__ = .;
-    *(.priviledge_data)
+    *( privileged_data )
     __privileged_data_end___len = . - __privileged_data_start__ - 1 ;
     __privileged_data_end___len |= __privileged_data_end___len >> 1 ;
     __privileged_data_end___len |= __privileged_data_end___len >> 2 ;
@@ -161,11 +162,6 @@ SECTIONS
     . = ALIGN( MAX( __privileged_data_end___len + 1, 32 ) ) ;
 
     __privileged_data_end__ = .;
-  } >ram
-
-  .data :
-  {
-    __cs3_region_start_ram = .;
     *(.cs3.region-head.ram)
     KEEP(*(.jcr))
     *(.got.plt) *(.got)
diff --git a/os/Makefile b/os/Makefile
index 070566d..c19d685 100644
--- a/os/Makefile
+++ b/os/Makefile
@@ -6,7 +6,7 @@ include $(ROOTDIR)/common.mk
 include config.mk
 include $(ROOTDIR)/FreeRTOS/config.mk
 
-TARGET_SRCS = src/init.c src/sbrk.c
+TARGET_SRCS = src/init.c src/sbrk.c src/sprintf.c src/malloc.c src/free.c src/fclose.c src/read.c src/lseek.c src/write.c src/close.c
 
 include $(ROOTDIR)/target-rules.mk
 
diff --git a/os/src/close.c b/os/src/close.c
new file mode 100644
index 0000000..46ee8c5
--- /dev/null
+++ b/os/src/close.c
@@ -0,0 +1,4 @@
+#include <reent.h>
+
+int _close_r(struct _reent * reent, int fd) {
+}
diff --git a/os/src/fclose.c b/os/src/fclose.c
new file mode 100644
index 0000000..fe81f62
--- /dev/null
+++ b/os/src/fclose.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+#include <reent.h>
+
+int fclose(FILE * fp) {
+    return _fclose_r(_impure_ptr, fp);
+}
diff --git a/os/src/free.c b/os/src/free.c
new file mode 100644
index 0000000..f2d1fe5
--- /dev/null
+++ b/os/src/free.c
@@ -0,0 +1,5 @@
+#include <reent.h>
+
+void free(void * ptr) {
+    _free_r(_impure_ptr, ptr);
+}
diff --git a/os/src/lseek.c b/os/src/lseek.c
new file mode 100644
index 0000000..1b86dbb
--- /dev/null
+++ b/os/src/lseek.c
@@ -0,0 +1,4 @@
+#include <reent.h>
+
+_off_t _lseek_r(struct _reent * reent, int fd, _off_t seek, int wheel) {
+}
diff --git a/os/src/malloc.c b/os/src/malloc.c
new file mode 100644
index 0000000..7d5f965
--- /dev/null
+++ b/os/src/malloc.c
@@ -0,0 +1,5 @@
+#include <reent.h>
+
+void * malloc(size_t size) {
+    return _malloc_r(_impure_ptr, size);
+}
diff --git a/os/src/read.c b/os/src/read.c
new file mode 100644
index 0000000..08351a7
--- /dev/null
+++ b/os/src/read.c
@@ -0,0 +1,5 @@
+#include <reent.h>
+
+_ssize_t _read_r(struct _reent * reent, int fd, void * ptr, size_t size) {
+    return 0;
+}
diff --git a/os/src/sprintf.c b/os/src/sprintf.c
new file mode 100644
index 0000000..76ea9a2
--- /dev/null
+++ b/os/src/sprintf.c
@@ -0,0 +1,10 @@
+#include <reent.h>
+#include <stdarg.h>
+
+int sprintf(char * str, const char * fmt, ...) {
+    int r;
+    va_list ap;
+    va_start(ap, fmt);
+    r = _vsprintf_r(_impure_ptr, str, fmt, ap);
+    va_end(ap);
+}
diff --git a/os/src/write.c b/os/src/write.c
new file mode 100644
index 0000000..a1bf474
--- /dev/null
+++ b/os/src/write.c
@@ -0,0 +1,4 @@
+#include <reent.h>
+
+_ssize_t _write_r(struct _reent * reent, int fd, const void * buf, size_t size) {
+}
diff --git a/target-rules.mk b/target-rules.mk
index 5b976bc..1ce9487 100644
--- a/target-rules.mk
+++ b/target-rules.mk
@@ -11,12 +11,15 @@ TARGET_OBJS = $(addsuffix .o, $(basename $(TARGET_SRCS)))
 ifneq ($(TARGET),)
 TARGET_ELF = $(addsuffix .elf, $(basename $(TARGET)))
 TARGET_BIN = $(addsuffix .bin, $(basename $(TARGET)))
+TARGET_MAP = $(addsuffix .map, $(basename $(TARGET)))
 TARGET_OBJS += $(addsuffix .o, $(basename $(TARGET)))
 endif
 
 $(TARGET_ELF): $(TARGET_OBJS)
 	$(E) [TL]     Linking $@
-	$(Q)$(TARGET_LD) -o $@ $^ -T$(LDSCRIPT) $(LIBS)
+	$(Q)$(TARGET_LD) -Wl,--gc-sections -Wl,-O3 -Wl,-Map=$(TARGET_MAP) -o $@ $^ -T$(LDSCRIPT) $(LIBS)
+
+$(TARGET_MAP): $(TARGET_ELF)
 
 $(TARGET_BIN): $(TARGET_ELF)
 	$(E) [TB]     Creating $@
-- 
cgit v1.2.3