Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | /*
* Copyright (c) 2015, Intel Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#include <linker-defs.h>
#include <misc/util.h>
#define USED_RAM_END_ADDR POINTER_TO_UINT(&_end)
#if CONFIG_X86
#define USED_RAM_SIZE (USED_RAM_END_ADDR - CONFIG_PHYS_RAM_ADDR)
#define MAX_HEAP_SIZE ((KB(CONFIG_RAM_SIZE)) - USED_RAM_SIZE)
#elif CONFIG_NIOS2
#include <layout.h>
#define USED_RAM_SIZE (USED_RAM_END_ADDR - _RAM_ADDR)
#define MAX_HEAP_SIZE (_RAM_SIZE - USED_RAM_SIZE)
#else
#define USED_RAM_SIZE (USED_RAM_END_ADDR - CONFIG_SRAM_BASE_ADDRESS)
#define MAX_HEAP_SIZE ((KB(CONFIG_SRAM_SIZE)) - USED_RAM_SIZE)
#endif
static unsigned char *heap_base = UINT_TO_POINTER(USED_RAM_END_ADDR);
static unsigned int heap_sz;
static int _stdout_hook_default(int c)
{
(void)(c); /* Prevent warning about unused argument */
return EOF;
}
static int (*_stdout_hook)(int) = _stdout_hook_default;
void __stdout_hook_install(int (*hook)(int))
{
_stdout_hook = hook;
}
static unsigned char _stdin_hook_default(void)
{
return 0;
}
static unsigned char (*_stdin_hook)(void) = _stdin_hook_default;
void __stdin_hook_install(unsigned char (*hook)(void))
{
_stdin_hook = hook;
}
int _read(int fd, char *buf, int nbytes)
{
int i = 0;
for (i = 0; i < nbytes; i++) {
*(buf + i) = _stdin_hook();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
i++;
break;
}
}
return i;
}
FUNC_ALIAS(_read, read, int);
int _write(int fd, char *buf, int nbytes)
{
int i;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
_stdout_hook('\r');
}
_stdout_hook(*(buf + i));
}
return nbytes;
}
FUNC_ALIAS(_write, write, int);
int _isatty(int file)
{
return 1;
}
FUNC_ALIAS(_isatty, isatty, int);
int _kill(int i, int j)
{
return 0;
}
FUNC_ALIAS(_kill, kill, int);
int _getpid(void)
{
return 0;
}
FUNC_ALIAS(_getpid, getpid, int);
int _fstat(int file, struct stat *st)
{
st->st_mode = S_IFCHR;
return 0;
}
FUNC_ALIAS(_fstat, fstat, int);
void _exit(int status)
{
_write(1, "exit", 4);
while (1) {
;
}
}
int _open(const char *name, int mode)
{
return -1;
}
FUNC_ALIAS(_open, open, int);
int _close(int file)
{
return -1;
}
FUNC_ALIAS(_close, close, int);
int _lseek(int file, int ptr, int dir)
{
return 0;
}
FUNC_ALIAS(_lseek, lseek, int);
void *_sbrk(int count)
{
void *ptr = heap_base + heap_sz;
if ((heap_sz + count) < MAX_HEAP_SIZE) {
heap_sz += count;
return ptr;
} else {
return (void *)-1;
}
}
FUNC_ALIAS(_sbrk, sbrk, void *);
|