summaryrefslogtreecommitdiffhomepage
path: root/digital/ucoolib/ucoolib
diff options
context:
space:
mode:
authorNicolas Schodet2012-11-05 00:09:10 +0100
committerNicolas Schodet2012-12-01 18:45:17 +0100
commit47b1617af97bde84ef273479eedae61d46490498 (patch)
tree4d9ce88122b0daf2bde0fb3b6a9ceea864c0632f /digital/ucoolib/ucoolib
parenta2e0f176e7e5b1983ce34ed1b66794cc82d7e50d (diff)
digital/ucoolib/ucoolib/arch: add newlib syscalls
Minimal implementation on minimal system.
Diffstat (limited to 'digital/ucoolib/ucoolib')
-rw-r--r--digital/ucoolib/ucoolib/arch/Module2
-rw-r--r--digital/ucoolib/ucoolib/arch/syscalls.newlib.c96
-rw-r--r--digital/ucoolib/ucoolib/arch/syscalls_cc.cc36
3 files changed, 131 insertions, 3 deletions
diff --git a/digital/ucoolib/ucoolib/arch/Module b/digital/ucoolib/ucoolib/arch/Module
index e97fe250..06db976b 100644
--- a/digital/ucoolib/ucoolib/arch/Module
+++ b/digital/ucoolib/ucoolib/arch/Module
@@ -1 +1 @@
-arch_SOURCES := syscalls.newlib.c
+arch_SOURCES := syscalls.newlib.c syscalls_cc.cc
diff --git a/digital/ucoolib/ucoolib/arch/syscalls.newlib.c b/digital/ucoolib/ucoolib/arch/syscalls.newlib.c
index ecb29bdd..308b4b1b 100644
--- a/digital/ucoolib/ucoolib/arch/syscalls.newlib.c
+++ b/digital/ucoolib/ucoolib/arch/syscalls.newlib.c
@@ -21,18 +21,110 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* }}} */
+#include <reent.h>
+#include <sys/stat.h>
+#include <errno.h>
/** This is needed by C++ ABI, this simple definition will do. See:
* http://lists.debian.org/debian-gcc/2003/07/msg00057.html */
void *__dso_handle = (void*) &__dso_handle;
/** This function is called when a pure virtual function is called. This is
- * needed by linker because when a abstrat class constructor or destructor is
+ * needed by linker because when a abstract class constructor or destructor is
* called, object is not complete. Replace the one provided by the toolchain
* to avoid including the world. */
void
__cxa_pure_virtual (void)
{
while (1)
- ;
+ ;
}
+
+/** Increase program data space. */
+void *
+_sbrk_r (struct _reent *ptr, int incr)
+{
+ extern char end; /* Defined in linker script. */
+ static char *heap_end;
+ char *prev_heap_end;
+ if (heap_end == 0)
+ heap_end = &end;
+ prev_heap_end = heap_end;
+ heap_end += incr;
+ return (void *) prev_heap_end;
+}
+
+/** Exit program, endless loop to stop program, to be improved. */
+void
+_exit (int n)
+{
+ while (1)
+ ;
+}
+
+/** Close a file, unimplemented. */
+int
+_close_r (struct _reent *ptr, int fd)
+{
+ return -1;
+}
+
+/** Status of open file, consider all files as character devices. */
+int
+_fstat_r (struct _reent *ptr, int fd, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+/** Get PID, minimal implementation. */
+int
+_getpid_r (struct _reent *ptr)
+{
+ return 1;
+}
+
+/** Whether file is a terminal, consider this is always true. */
+int
+_isatty_r (struct _reent *ptr, int fd)
+{
+ return 1;
+}
+
+/** Send a signal, no process, no signal. */
+int
+_kill_r (struct _reent *ptr, int pid, int sig)
+{
+ ptr->_errno = EINVAL;
+ return -1;
+}
+
+/** Set position in a file, no-op. */
+off_t
+_lseek_r (struct _reent *ptr, int fd, off_t pos, int whence)
+{
+ return 0;
+}
+
+/** Open a file, unimplemented. */
+int
+_open_r (struct _reent *ptr, const char *file, int flags, int mode)
+{
+ return -1;
+}
+
+/** Read from file, to be improved to read from stream. */
+int
+_read_r (struct _reent *ptr, int fd, void *buf, size_t cnt)
+{
+ return 0;
+}
+
+/** Write to file, to be improved to write to stream. */
+int
+_write_r (struct _reent *ptr, int fd, const void *buf, size_t cnt)
+{
+ ptr->_errno = EBADF;
+ return -1;
+}
+
diff --git a/digital/ucoolib/ucoolib/arch/syscalls_cc.cc b/digital/ucoolib/ucoolib/arch/syscalls_cc.cc
new file mode 100644
index 00000000..030e7b40
--- /dev/null
+++ b/digital/ucoolib/ucoolib/arch/syscalls_cc.cc
@@ -0,0 +1,36 @@
+// ucoolib - Microcontroller object oriented library. {{{
+//
+// Copyright (C) 2012 Nicolas Schodet
+//
+// APBTeam:
+// Web: http://apbteam.org/
+// Email: team AT apbteam DOT org
+//
+// 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.
+//
+// }}}
+
+namespace __gnu_cxx {
+
+/// Replaces the default verbose terminate handler.
+/// Avoids the inclusion of code to inpect C++ objects.
+void
+__verbose_terminate_handler ()
+{
+ while (1)
+ ;
+}
+
+} //namespace __gnu_cxx