Next: mvme.S, Previous: crt0.S, Up: Code Listings [Contents]
/*
* glue.c -- all the code to make GCC and the libraries run on
* a bare target board. These should work with any
* target if inbyte() and outbyte() exist.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#ifndef NULL
#define NULL 0
#endif
/* FIXME: this is a hack till libc builds */
__main()
{
return;
}
#undef errno
int errno;
extern caddr_t _end; /* _end is set in the linker command file */
extern int outbyte();
extern unsigned char inbyte();
extern int havebyte();
/* just in case, most boards have at least some memory */
#ifndef RAMSIZE
# define RAMSIZE (caddr_t)0x100000
#endif
/*
* read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
*/
int
read(fd, buf, nbytes)
int fd;
char *buf;
int nbytes;
{
int i = 0;
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i)) = 0;
break;
}
}
return (i);
}
/*
* write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
*/
int
write(fd, buf, nbytes)
int fd;
char *buf;
int nbytes;
{
int i;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
}
outbyte (*(buf + i));
}
return (nbytes);
}
/*
* open -- open a file descriptor. We don't have a filesystem, so
* we return an error.
*/
int
open(buf, flags, mode)
char *buf;
int flags;
int mode;
{
errno = EIO;
return (-1);
}
/*
* close -- close a file descriptor. We don't need
* to do anything, but pretend we did.
*/
int
close(fd)
int fd;
{
return (0);
}
/*
* sbrk -- changes heap size size. Get nbytes more
* RAM. We just increment a pointer in what's
* left of memory on the board.
*/
caddr_t
sbrk(nbytes)
int nbytes;
{
static caddr_t heap_ptr = NULL;
caddr_t base;
if (heap_ptr == NULL) {
heap_ptr = (caddr_t)&_end;
}
if ((RAMSIZE - heap_ptr) >= 0) {
base = heap_ptr;
heap_ptr += nbytes;
return (base);
} else {
errno = ENOMEM;
return ((caddr_t)-1);
}
}
/*
* isatty -- returns 1 if connected to a terminal device,
* returns 0 if not. Since we're hooked up to a
* serial port, we'll say yes and return a 1.
*/
int
isatty(fd)
int fd;
{
return (1);
}
/*
* lseek -- move read/write pointer. Since a serial port
* is non-seekable, we return an error.
*/
off_t
lseek(fd, offset, whence)
int fd;
off_t offset;
int whence;
{
errno = ESPIPE;
return ((off_t)-1);
}
/*
* fstat -- get status of a file. Since we have no file
* system, we just return an error.
*/
int
fstat(fd, buf)
int fd;
struct stat *buf;
{
errno = EIO;
return (-1);
}
/*
* getpid -- only one process, so just return 1.
*/
#define __MYPID 1
int
getpid()
{
return __MYPID;
}
/*
* kill -- go out via exit...
*/
int
kill(pid, sig)
int pid;
int sig;
{
if(pid == __MYPID)
_exit(sig);
return 0;
}
/*
* print -- do a raw print of a string
*/
int
print(ptr)
char *ptr;
{
while (*ptr) {
outbyte (*ptr++);
}
}
/*
* putnum -- print a 32 bit number in hex
*/
int
putnum (num)
unsigned int num;
{
char buffer[9];
int count;
char *bufptr = buffer;
int digit;
for (count = 7 ; count >= 0 ; count--) {
digit = (num >> (count * 4)) & 0xf;
if (digit <= 9)
*bufptr++ = (char) ('0' + digit);
else
*bufptr++ = (char) ('a' - 10 + digit);
}
*bufptr = (char) 0;
print (buffer);
return;
}
Next: mvme.S, Previous: crt0.S, Up: Code Listings [Contents]