[PATCH 02/21] Add UHI for MIPS architecture
Aleksandar Rikalo <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
From: Jaydeep Patil <[email protected]> Signed-off-by: Jaydeep Patil <[email protected]> Signed-off-by: Aleksandar Rikalo <[email protected]> --- libgloss/mips/Makefile.in | 10 ++ libgloss/mips/hal/mips_excpt_handler.c | 3 + libgloss/mips/include/mips/hal.h | 4 + libgloss/mips/include/mips/uhi_syscalls.h | 70 ++++++++ libgloss/mips/malta32-yamon.ld | 2 - libgloss/mips/uhi/uhi_assert.c | 75 +++++++++ libgloss/mips/uhi/uhi_break.c | 64 ++++++++ libgloss/mips/uhi/uhi_close.c | 73 +++++++++ libgloss/mips/uhi/uhi_exception.c | 65 ++++++++ libgloss/mips/uhi/uhi_exit.c | 89 +++++++++++ libgloss/mips/uhi/uhi_fstat.c | 161 +++++++++++++++++++ libgloss/mips/uhi/uhi_get_ram_range.c | 64 ++++++++ libgloss/mips/uhi/uhi_getargs.S | 108 +++++++++++++ libgloss/mips/uhi/uhi_indirect.c | 58 +++++++ libgloss/mips/uhi/uhi_link.c | 82 ++++++++++ libgloss/mips/uhi/uhi_lseek.c | 78 +++++++++ libgloss/mips/uhi/uhi_open.c | 77 +++++++++ libgloss/mips/uhi/uhi_plog.c | 81 ++++++++++ libgloss/mips/uhi/uhi_pread.c | 80 ++++++++++ libgloss/mips/uhi/uhi_pwrite.c | 80 ++++++++++ libgloss/mips/uhi/uhi_read.c | 77 +++++++++ libgloss/mips/uhi/uhi_stat.c | 60 +++++++ libgloss/mips/uhi/uhi_stat.h | 53 +++++++ libgloss/mips/uhi/uhi_unlink.c | 79 +++++++++ libgloss/mips/uhi/uhi_write.c | 77 +++++++++ libgloss/mips/uhi/yamon_close.c | 83 ++++++++++ libgloss/mips/uhi/yamon_exception.c | 54 +++++++ libgloss/mips/uhi/yamon_exit.c | 62 ++++++++ libgloss/mips/uhi/yamon_fstat.c | 185 ++++++++++++++++++++++ libgloss/mips/uhi/yamon_read.c | 103 ++++++++++++ libgloss/mips/uhi/yamon_syscalls.h | 35 ++++ libgloss/mips/uhi/yamon_write.c | 100 ++++++++++++ 32 files changed, 2290 insertions(+), 2 deletions(-) create mode 100644 libgloss/mips/include/mips/uhi_syscalls.h create mode 100644 libgloss/mips/uhi/uhi_assert.c create mode 100644 libgloss/mips/uhi/uhi_break.c create mode 100644 libgloss/mips/uhi/uhi_close.c create mode 100644 libgloss/mips/uhi/uhi_exception.c create mode 100644 libgloss/mips/uhi/uhi_exit.c create mode 100644 libgloss/mips/uhi/uhi_fstat.c create mode 100644 libgloss/mips/uhi/uhi_get_ram_range.c create mode 100644 libgloss/mips/uhi/uhi_getargs.S create mode 100644 libgloss/mips/uhi/uhi_indirect.c create mode 100644 libgloss/mips/uhi/uhi_link.c create mode 100644 libgloss/mips/uhi/uhi_lseek.c create mode 100644 libgloss/mips/uhi/uhi_open.c create mode 100644 libgloss/mips/uhi/uhi_plog.c create mode 100644 libgloss/mips/uhi/uhi_pread.c create mode 100644 libgloss/mips/uhi/uhi_pwrite.c create mode 100644 libgloss/mips/uhi/uhi_read.c create mode 100644 libgloss/mips/uhi/uhi_stat.c create mode 100644 libgloss/mips/uhi/uhi_stat.h create mode 100644 libgloss/mips/uhi/uhi_unlink.c create mode 100644 libgloss/mips/uhi/uhi_write.c create mode 100644 libgloss/mips/uhi/yamon_close.c create mode 100644 libgloss/mips/uhi/yamon_exception.c create mode 100644 libgloss/mips/uhi/yamon_exit.c create mode 100644 libgloss/mips/uhi/yamon_fstat.c create mode 100644 libgloss/mips/uhi/yamon_read.c create mode 100644 libgloss/mips/uhi/yamon_syscalls.h create mode 100644 libgloss/mips/uhi/yamon_write.c diff --git a/libgloss/mips/Makefile.in b/libgloss/mips/Makefile.in index 65581ec71..6e764dc14 100644 --- a/libgloss/mips/Makefile.in +++ b/libgloss/mips/Makefile.in @@ -94,6 +94,16 @@ endef $(call GENISROBJ,256) +UHIOBJS = uhi_assert.o uhi_close.o uhi_exit.o uhi_fstat.o \ + uhi_lseek.o uhi_open.o uhi_plog.o \ + uhi_pread.o uhi_pwrite.o uhi_read.o uhi_link.o uhi_stat.o \ + uhi_unlink.o uhi_write.o uhi_getargs.o uhi_exception.o \ + uhi_get_ram_range.o uhi_indirect.o uhi_break.o \ + syscalls.o getpid.o isatty.o kill.o + +YAMONOBJS = yamon_read.o yamon_write.o yamon_exit.o yamon_close.o \ + yamon_fstat.o yamon_exception.o + HALOBJ = mips64_tlb.o mips_clean_cache.o mips_flush_cache.o mips_l2size.o \ mips_lock_cache.o mips_size_cache.o mips_sync_cache.o mips_tlb.o \ mips_fp.o mips_msa.o \ diff --git a/libgloss/mips/hal/mips_excpt_handler.c b/libgloss/mips/hal/mips_excpt_handler.c index 4c83c9b0a..1893de719 100644 --- a/libgloss/mips/hal/mips_excpt_handler.c +++ b/libgloss/mips/hal/mips_excpt_handler.c @@ -158,6 +158,9 @@ __exception_handle_quiet (struct gpctx *ctx, int exception) __uhi_indirect (ctx); return; case EXC_BP: + /* Return from exception handler if breakpoint is handled. */ + if (__uhi_break && __uhi_break (ctx)) + return; PUTSNS ("Breakpoint @0x", ctx->epc, "\n"); break; case EXC_RI: diff --git a/libgloss/mips/include/mips/hal.h b/libgloss/mips/include/mips/hal.h index b161dfb89..21c3ca37b 100644 --- a/libgloss/mips/include/mips/hal.h +++ b/libgloss/mips/include/mips/hal.h @@ -436,6 +436,10 @@ extern int _MIPS_HAL_NOMIPS16 extern void _MIPS_HAL_NOMIPS16 __uhi_assert (const char *, const char *, int32_t); +/* Forward a breakpoint exception to boot. */ +extern int _MIPS_HAL_NOMIPS16 + __uhi_break (struct gpctx *) __attribute__((weak)); + #ifdef NDEBUG /* required by ANSI standard */ # define uhi_assert(__e) ((void)0) #else diff --git a/libgloss/mips/include/mips/uhi_syscalls.h b/libgloss/mips/include/mips/uhi_syscalls.h new file mode 100644 index 000000000..a6aa9506c --- /dev/null +++ b/libgloss/mips/include/mips/uhi_syscalls.h @@ -0,0 +1,70 @@ +/* + * Copyright 2014-2017, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + + +#ifndef _UHI_SYSCALLS_ +#define _UHI_SYSCALLS_ + +#define __MIPS_UHI_EXIT 1 +#define __MIPS_UHI_OPEN 2 +#define __MIPS_UHI_CLOSE 3 +#define __MIPS_UHI_READ 4 +#define __MIPS_UHI_WRITE 5 +#define __MIPS_UHI_LSEEK 6 +#define __MIPS_UHI_UNLINK 7 +#define __MIPS_UHI_FSTAT 8 +#define __MIPS_UHI_ARGC 9 +#define __MIPS_UHI_ARGLEN 10 +#define __MIPS_UHI_ARGN 11 +#define __MIPS_UHI_RAMRANGE 12 +#define __MIPS_UHI_LOG 13 +#define __MIPS_UHI_ASSERT 14 +#define __MIPS_UHI_EXCEPTION 15 +#define __MIPS_UHI_PREAD 19 +#define __MIPS_UHI_PWRITE 20 +#define __MIPS_UHI_LINK 22 +#define __MIPS_UHI_BOOTFAIL 23 +#define __MIPS_UHI_BREAK 24 + +#define __MIPS_UHI_BF_CACHE 1 + +#define __xstr(s) __str(s) +#define __str(s) #s +#define __MIPS_UHI_SYSCALL_NUM 1 + +#ifdef __MIPS_SDBBP__ + #define SYSCALL(NUM) "\tsdbbp " __xstr (NUM) + #define ASM_SYSCALL(NUM) sdbbp NUM +#else + #define SYSCALL(NUM) "\tsyscall " __xstr (NUM) + #define ASM_SYSCALL(NUM) syscall NUM +#endif + +#endif // _UHI_SYSCALLS_ diff --git a/libgloss/mips/malta32-yamon.ld b/libgloss/mips/malta32-yamon.ld index 5175071c2..31e077894 100644 --- a/libgloss/mips/malta32-yamon.ld +++ b/libgloss/mips/malta32-yamon.ld @@ -25,8 +25,6 @@ EXTERN(__exception_entry) * informative */ EXTERN(__exception_handle_verbose) -/* Force the interrupt handlers to be included in the link */ -EXTERN(__isr_vec) /* Force ISRs 0-7 to be included in the link */ EXTERN(_isr_vec_7) /* Require the UHI getargs support */ diff --git a/libgloss/mips/uhi/uhi_assert.c b/libgloss/mips/uhi/uhi_assert.c new file mode 100644 index 000000000..f906258be --- /dev/null +++ b/libgloss/mips/uhi/uhi_assert.c @@ -0,0 +1,75 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis void __assert_func (const char *filename, int32_t line_num, + * const char *func, const char *expr); + * + * Parameters: + * filename - Name of the file + * line_num - Line number + * func - Name of the function + * expr - Expression + * + * Return: + * None + * + * Arguments to syscall: + * $25 - Operation code for __assert_func + * $4 - Name of the file + * $5 - Line number + * $6 - Name of the function + * $7 - Expression + * + * Return from syscall: + * None + * + * @Description Assert +*/ + +#include <stdint.h> +#include <mips/hal.h> +#include <mips/uhi_syscalls.h> + +void _MIPS_HAL_NOMIPS16 +__uhi_assert (const char *message, const char *filename, int32_t line_num) +{ + register const char *arg1 asm ("$4") = message; + register const char *arg2 asm ("$5") = filename; + register int32_t arg3 asm ("$6") = line_num; + register int32_t op asm ("$25") = __MIPS_UHI_ASSERT; + register int32_t ret1 asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t ret2 asm ("$3") = 0; + + __asm__ __volatile__ (" # __assert_func(%0, %1, %2, %3, %4, %5) op=%6\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret1), "+r" (ret2), "+r" (arg1), "+r" (arg2) + : "r" (arg3), "r" (op)); +} diff --git a/libgloss/mips/uhi/uhi_break.c b/libgloss/mips/uhi/uhi_break.c new file mode 100644 index 000000000..e597274e7 --- /dev/null +++ b/libgloss/mips/uhi/uhi_break.c @@ -0,0 +1,64 @@ +/* + * Copyright 2017, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int __uhi_break (struct gp_ctx *ctx); + * + * Parameters: + * $4 - GP context + * + * Arguments to break: + * $25 - Operation code for __uhi_break + * $4 - GP context + * + * Return from break: + * $2 - Return 1 if breakpoint exception is handled else 0 + * + * @Description Handle a breakpoint exception +*/ + +#include <stdint.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +/* Forward a breakpoint exception to boot. */ +int _MIPS_HAL_NOMIPS16 +__uhi_break (struct gpctx *ctx) +{ + register struct gpctx *arg1 asm ("$4") = ctx; + register int32_t op asm ("$25") = __MIPS_UHI_BREAK; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + + __asm__ __volatile__ (" # %0 = __uhi_break(%1) op=%2\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret) + : "r" (arg1), "r" (op)); + return ret; +} diff --git a/libgloss/mips/uhi/uhi_close.c b/libgloss/mips/uhi/uhi_close.c new file mode 100644 index 000000000..306f16bdd --- /dev/null +++ b/libgloss/mips/uhi/uhi_close.c @@ -0,0 +1,73 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis close + * + * Arguments to syscall: + * $25 - Operation code for close + * $4 - File handle + * + * Return from syscall: + * $2 - 0 on success else -1 + * $3 - errno + * + * @Description File close +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int _MIPS_HAL_NOMIPS16 +close (int fd) +{ + register int32_t arg1 asm ("$4") = fd; + register int32_t op asm ("$25") = __MIPS_UHI_CLOSE; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = close(%2) op=%3\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1) + : "r" (op) + : "$5"); + + if (ret != 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_exception.c b/libgloss/mips/uhi/uhi_exception.c new file mode 100644 index 000000000..1feaa55ce --- /dev/null +++ b/libgloss/mips/uhi/uhi_exception.c @@ -0,0 +1,65 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int __uhi_exception (struct gp_ctx *ctx); + * + * Parameters: + * $4 - GP context + * + * Arguments to syscall: + * $25 - Operation code for __uhi_exception + * $4 - GP context + * + * Return from syscall: + * $2 - + * + * @Description Handle an unhandled exception +*/ + +#include <stdint.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int32_t _MIPS_HAL_NOMIPS16 +__uhi_exception (struct gpctx *ctx, int32_t abi) +{ + register struct gpctx *arg1 asm ("$4") = ctx; + register int32_t arg2 asm ("$5") = abi; + register int32_t op asm ("$25") = __MIPS_UHI_EXCEPTION; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + + __asm__ __volatile__ (" # %0 = __uhi_exception(%1, %2) op=%3\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret) + : "r" (arg1), "r" (arg2), "r" (op) + : "$3"); + return ret; +} diff --git a/libgloss/mips/uhi/uhi_exit.c b/libgloss/mips/uhi/uhi_exit.c new file mode 100644 index 000000000..2342154b5 --- /dev/null +++ b/libgloss/mips/uhi/uhi_exit.c @@ -0,0 +1,89 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis void __exit (int32_t exit_code); + * + * Parameters: + * exit_code - Exit code + * + * Return: + * None + * + * Arguments to syscall: + * $25 - Operation code for exit + * $4 - Exit code + * + * @Description Transfer control to the debug port +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +void __return_to_boot (int32_t exit_code) __attribute__((noreturn)) + __attribute__((weak)); + +/* Defined in .ld file */ +extern char __use_excpt_boot[]; + +/* _exit has been declared weak to allow its defination in the application */ +int _MIPS_HAL_NOMIPS16 +__exit (int exit_code) +{ + register int32_t arg1 asm ("$4") = exit_code; + register int32_t op asm ("$25") = __MIPS_UHI_EXIT; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + + __asm__ __volatile__ (" # _exit(%0 %1) op=%2\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "+r" (arg1) + : "r" (op) + : "$3", "$5"); + + /* exit wasn't handled, return to caller of _start + * __use_excpt_boot has following values + * 0 = Do not use exception handler present in boot + * 1 = Use exception handler present in boot if BEV + is 0 at startup + * 2 = Always use exception handler present in boot + */ + if (((long) __use_excpt_boot == 2 + || ((long) __use_excpt_boot == 1 + && __get_startup_BEV + && __get_startup_BEV () == 0)) + && __return_to_boot) + __return_to_boot (exit_code); + + /* Infinite loop if control returns. */ + __exit (exit_code); + return exit_code; +} diff --git a/libgloss/mips/uhi/uhi_fstat.c b/libgloss/mips/uhi/uhi_fstat.c new file mode 100644 index 000000000..9b81638ab --- /dev/null +++ b/libgloss/mips/uhi/uhi_fstat.c @@ -0,0 +1,161 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t fstat (int32_t file, struct stat *sbuf); + * + * Parameters: + * file - File handle + * sbuf - Pointer to dst buffer + * + * Return: + * 0 on success else -1 + * + * Arguments to syscall: + * $25 - Operation code for fstat + * $4 - File handle + * $5 - Pointer to dst buffer (struct stat *) + * + * Return from syscall: + * $2 - 0 on success else -1 + * $3 - errno + * + * @Description File statistics +*/ + +#include <stdio.h> +#include <stdint.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <stddef.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> +#include "uhi_stat.h" + +/* This macro declares a dummy type with -ve size if CONDITION is false */ +#define __paste(STR1, STR2) STR1##STR2 +#define __check(LINE, CONDITION) typedef char __paste(assertion_failed_at_line_, LINE) [(int)(CONDITION)-1] + +int _MIPS_HAL_NOMIPS16 +fstat (int file, struct stat *sbuf) +{ + struct uhi_stat hbuf = {0,}; + register int32_t arg1 asm ("$4") = file; + register struct uhi_stat *arg2 asm ("$5") = &hbuf; + register int32_t op asm ("$25") = __MIPS_UHI_FSTAT; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + /* + * We assume that NewLib has following 'struct stat'. Any change in + * this structure (either offset or size) would generate a compile + * time error. + */ +#if defined (_LP64) + __check (__LINE__, sizeof (struct stat) == 104); + __check (__LINE__, offsetof (struct stat, st_dev) == 0); + __check (__LINE__, offsetof (struct stat, st_ino) == 2); + __check (__LINE__, offsetof (struct stat, st_mode) == 4); + __check (__LINE__, offsetof (struct stat, st_nlink) == 8); + __check (__LINE__, offsetof (struct stat, st_uid) == 10); + __check (__LINE__, offsetof (struct stat, st_gid) == 12); + __check (__LINE__, offsetof (struct stat, st_rdev) == 14); + __check (__LINE__, offsetof (struct stat, st_size) == 16); + __check (__LINE__, offsetof (struct stat, st_atime) == 24); + __check (__LINE__, offsetof (struct stat, st_spare1) == 32); + __check (__LINE__, offsetof (struct stat, st_mtime) == 40); + __check (__LINE__, offsetof (struct stat, st_spare2) == 48); + __check (__LINE__, offsetof (struct stat, st_ctime) == 56); + __check (__LINE__, offsetof (struct stat, st_spare3) == 64); + __check (__LINE__, offsetof (struct stat, st_blksize) == 72); + __check (__LINE__, offsetof (struct stat, st_blocks) == 80); + __check (__LINE__, offsetof (struct stat, st_spare4) == 88); +#else + __check (__LINE__, sizeof (struct stat) == 60); + __check (__LINE__, offsetof (struct stat, st_dev) == 0); + __check (__LINE__, offsetof (struct stat, st_ino) == 2); + __check (__LINE__, offsetof (struct stat, st_mode) == 4); + __check (__LINE__, offsetof (struct stat, st_nlink) == 8); + __check (__LINE__, offsetof (struct stat, st_uid) == 10); + __check (__LINE__, offsetof (struct stat, st_gid) == 12); + __check (__LINE__, offsetof (struct stat, st_rdev) == 14); + __check (__LINE__, offsetof (struct stat, st_size) == 16); + __check (__LINE__, offsetof (struct stat, st_atime) == 20); + __check (__LINE__, offsetof (struct stat, st_spare1) == 24); + __check (__LINE__, offsetof (struct stat, st_mtime) == 28); + __check (__LINE__, offsetof (struct stat, st_spare2) == 32); + __check (__LINE__, offsetof (struct stat, st_ctime) == 36); + __check (__LINE__, offsetof (struct stat, st_spare3) == 40); + __check (__LINE__, offsetof (struct stat, st_blksize) == 44); + __check (__LINE__, offsetof (struct stat, st_blocks) == 48); + __check (__LINE__, offsetof (struct stat, st_spare4) == 52); +#endif + + __asm__ __volatile__ (" # %0,%1 = fstat(%2, %3) op=%4\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), + "+r" (arg2) + : "r" (op)); + + if (ret != 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + else + { + sbuf->st_dev = hbuf.st_dev; + sbuf->st_ino = hbuf.st_ino; + sbuf->st_mode = hbuf.st_mode; + sbuf->st_nlink = hbuf.st_nlink; + sbuf->st_uid = hbuf.st_uid; + sbuf->st_gid = hbuf.st_gid; + sbuf->st_rdev = hbuf.st_rdev; + sbuf->st_size = (long) hbuf.st_size; + sbuf->st_atime = (time_t) hbuf.st_atime; + sbuf->st_spare1 = (long) hbuf.st_spare1; + sbuf->st_mtime = (time_t) hbuf.st_mtime; + sbuf->st_spare2 = (long) hbuf.st_spare2; + sbuf->st_ctime = (time_t) hbuf.st_ctime; + sbuf->st_spare3 = (long) hbuf.st_spare3; + sbuf->st_blksize = (long) hbuf.st_blksize; + sbuf->st_blocks = (long) hbuf.st_blocks; + sbuf->st_spare4[0] = (long) hbuf.st_spare4[0]; + sbuf->st_spare4[1] = (long) hbuf.st_spare4[1]; + } + + return ret; +} + +#undef __paste +#undef __check diff --git a/libgloss/mips/uhi/uhi_get_ram_range.c b/libgloss/mips/uhi/uhi_get_ram_range.c new file mode 100644 index 000000000..427a91994 --- /dev/null +++ b/libgloss/mips/uhi/uhi_get_ram_range.c @@ -0,0 +1,64 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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 <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +extern char __attribute__((weak)) __memory_size[]; +extern char __attribute__((weak)) __memory_base[]; + +void _MIPS_HAL_NOMIPS16 +_get_ram_range (void **ram_base, void **ram_extent) +{ + register int32_t op asm ("$25") = __MIPS_UHI_RAMRANGE; + register void* r_base asm ("$2") = (void*)__MIPS_UHI_SYSCALL_NUM; + register void* r_extent asm ("$3") = NULL; + + if (__memory_size != NULL) + { + if (ram_base) + *ram_base = (void*)(unsigned long)__memory_base; + *ram_extent = (void*)((unsigned long)__memory_base + + (unsigned long)__memory_size); + return; + } + + __asm__ __volatile__ (" # %0,%1 = ramrange() op=%2\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (r_base), "=r" (r_extent) + : "r" (op) + : "$4", "$5"); + + if (ram_base) + *ram_base = r_base; + *ram_extent = r_extent; +} diff --git a/libgloss/mips/uhi/uhi_getargs.S b/libgloss/mips/uhi/uhi_getargs.S new file mode 100644 index 000000000..fe2485fed --- /dev/null +++ b/libgloss/mips/uhi/uhi_getargs.S @@ -0,0 +1,108 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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 <mips/asm.h> +#include <mips/regdef.h> +#include <mips/cpu.h> +#include <mips/uhi_syscalls.h> + +MIPS_NOMIPS16 + + .text + .align 2 + .globl __getargs + .ent __getargs + .type __getargs, @function +__getargs: + + move t0, zero /* argc */ + move t1, zero /* argv */ + + li t9, __MIPS_UHI_ARGC + li vt0, __MIPS_UHI_SYSCALL_NUM + + ASM_SYSCALL (__MIPS_UHI_SYSCALL_NUM) + + /* return on error (-1) */ + blez vt0, .Lreturn + + move t0, vt0 /* argc: number of arguments */ + sll t3, t0, LOG2_SZPTR /* Multiply by size of pointer */ + addiu t3, t3, ALSZ /* Round to stack alignment */ + and t3, t3, ALMASK + PTR_SUBU sp, sp, t3 /* make room for argv */ + move t1, sp /* argv */ + move t2, zero + +.Lloop: + + li t9, __MIPS_UHI_ARGLEN + li vt0, __MIPS_UHI_SYSCALL_NUM + move a0, t2 /* argument number */ + + ASM_SYSCALL (__MIPS_UHI_SYSCALL_NUM) /* get length of arg N */ + + blez vt0, .Lreturn /* return on error */ + + addiu vt0, vt0, 1 + addiu vt0, vt0, ALSZ + and vt0, vt0, ALMASK + PTR_SUBU sp, sp, vt0 + sll t3, t2, LOG2_SZPTR + PTR_ADDU t3, t3, t1 + PTR_S sp, 0(t3) /* argv[i] */ + + li t9, __MIPS_UHI_ARGN + li vt0, __MIPS_UHI_SYSCALL_NUM + move a0, t2 /* argument number */ + move a1, sp /* argument buffer */ + + ASM_SYSCALL (__MIPS_UHI_SYSCALL_NUM) + + bltz vt0, .Lreturn /* return on error */ + + addiu t2, t2, 1 + slt vt0, t2, t0 + bnez vt0, .Lloop + +.Lreturn: + move a0, t0 + move a1, t1 + + /* Leave 16-bytes for register arguments and up to 8 bytes for + a null envp. Round up to 32 for alignment. */ + PTR_SUBU sp, sp, 16+(NARGSAVE*SZARG) + PTR_ADDU a2, sp, (NARGSAVE*SZARG) + PTR_S zero, 0(a2) + + jr $31 + + .end __getargs + .size __getargs, .-__getargs diff --git a/libgloss/mips/uhi/uhi_indirect.c b/libgloss/mips/uhi/uhi_indirect.c new file mode 100644 index 000000000..e0fa075cd --- /dev/null +++ b/libgloss/mips/uhi/uhi_indirect.c @@ -0,0 +1,58 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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 <mips/hal.h> + +/* Forward a UHI SYSCALL operation to SDBPP interface. */ +int _MIPS_HAL_NOMIPS16 +__uhi_indirect (struct gpctx *ctx) +{ + register reg_t arg1 asm ("$4") = ctx->r[C_CTX_REGNO(4)]; + register reg_t arg2 asm ("$5") = ctx->r[C_CTX_REGNO(5)]; + register reg_t arg3 asm ("$6") = ctx->r[C_CTX_REGNO(6)]; + register reg_t arg4 asm ("$7") = ctx->r[C_CTX_REGNO(7)]; + register reg_t op asm ("$25") = ctx->r[C_CTX_REGNO(25)]; + register reg_t ret1 asm ("$2") = 1; + register reg_t ret2 asm ("$3"); + + __asm__ __volatile__(" # UHI indirect\n" + "\tsdbbp 1" + : "+r" (ret1), "=r" (ret2), "+r" (arg1), "+r" (arg2) + : "r" (arg3), "r" (arg4), "r" (op)); + + ctx->r[C_CTX_REGNO(2)] = ret1; + ctx->r[C_CTX_REGNO(3)] = ret2; + ctx->r[C_CTX_REGNO(4)] = arg1; + ctx->r[C_CTX_REGNO(5)] = arg2; + /* Handled, move on. SYSCALL is 4-bytes in all ISAs. */ + ctx->epc += 4; + + return 1; /* exception handled */ +} diff --git a/libgloss/mips/uhi/uhi_link.c b/libgloss/mips/uhi/uhi_link.c new file mode 100644 index 000000000..3c4d271ac --- /dev/null +++ b/libgloss/mips/uhi/uhi_link.c @@ -0,0 +1,82 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t link (const char *oldname, const char *newname); + * + * Parameters: + * oldname - Name of the file to rename + * newname - New file name + * + * Return: + * $2 - Zero on success or -1 in case of error + * + * Arguments to syscall: + * $25 - Operation code for rename + * $4 - Name of the file to rename + * $5 - New file name + * + * Return from syscall: + * $2 - Zero on success or -1 in case of error + * $3 - errno + * + * @Description Rename a file +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int _MIPS_HAL_NOMIPS16 +link (const char *oldname, const char *newname) +{ + register const char *arg1 asm ("$4") = oldname; + register const char *arg2 asm ("$5") = newname; + register int32_t op asm ("$25") = __MIPS_UHI_LINK; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = link(%2, %3) op=%4\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), + "+r" (arg2) + : "r" (op)); + + if (ret != 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_lseek.c b/libgloss/mips/uhi/uhi_lseek.c new file mode 100644 index 000000000..274cbca22 --- /dev/null +++ b/libgloss/mips/uhi/uhi_lseek.c @@ -0,0 +1,78 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis lseek + * + * Arguments to syscall: + * $25 - Operation code for seek + * $4 - File handle + * $5 - Offset + * $6 - Direction + * + * Return from syscall: + * $2 - New offset + * $3 - errno + * + * @Description File seek +*/ + +#include <sys/types.h> +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +off_t _MIPS_HAL_NOMIPS16 +lseek (int fd, off_t offset, int whence) +{ + register int32_t arg1 asm ("$4") = fd; + register int32_t arg2 asm ("$5") = offset; + register int32_t arg3 asm ("$6") = whence; + register int32_t op asm ("$25") = __MIPS_UHI_LSEEK; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = lseek(%2, %3, %4) op=%5\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), + "+r" (arg2) + : "r" (arg3), "r" (op)); + + if (ret == -1) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_open.c b/libgloss/mips/uhi/uhi_open.c new file mode 100644 index 000000000..9c482e3cc --- /dev/null +++ b/libgloss/mips/uhi/uhi_open.c @@ -0,0 +1,77 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis open + * + * Arguments to syscall: + * $25 - Operation code for open + * $4 - Name of the file + * $5 - Read/Write etc. flags + * $6 - Privileges + * + * Return from syscall: + * $2 - File handle + * $3 - errno + * + * @Description File open +*/ + +#include <sys/types.h> +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int _MIPS_HAL_NOMIPS16 +open (const char *file_name, int flags, mode_t mode) +{ + register const char * arg1 asm ("$4") = file_name; + register int32_t arg2 asm ("$5") = flags; + register int32_t arg3 asm ("$6") = mode; + register int32_t op asm ("$25") = __MIPS_UHI_OPEN; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = open(%2, %3, %4) op=%5\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), "+r" (arg2) + : "r" (arg3), "r" (op)); + + if (ret == -1) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_plog.c b/libgloss/mips/uhi/uhi_plog.c new file mode 100644 index 000000000..26e4079cf --- /dev/null +++ b/libgloss/mips/uhi/uhi_plog.c @@ -0,0 +1,81 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t plog (int8_t *fmt, int32_t num); + * + * Parameters: + * fmt - Format string + * num - The only int argument + * + * Return: + * Number of chars written + * + * Arguments to syscall: + * $25 - Operation code for __plog + * $4 - Format string + * $5 - The only int argument + * + * Return from syscall: + * $2 - Number of chars written + * $3 - errno + * + * @Description Print information +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/hal.h> +#include <mips/uhi_syscalls.h> + +int32_t _MIPS_HAL_NOMIPS16 +__plog (int8_t *fmt, int32_t num) +{ + register int8_t *arg1 asm ("$4") = fmt; + register int32_t arg2 asm ("$5") = num; + register int32_t op asm ("$25") = __MIPS_UHI_LOG; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = __plog(%2, %3) op=%4\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), "+r" (arg2) + : "r" (op)); + + if (ret != 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_pread.c b/libgloss/mips/uhi/uhi_pread.c new file mode 100644 index 000000000..9fb3ad57a --- /dev/null +++ b/libgloss/mips/uhi/uhi_pread.c @@ -0,0 +1,80 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis pread + * + * Arguments to syscall: + * $25 - Operation code for pread + * $4 - File handle + * $5 - Destination buffer + * $6 - Max number of bytes to read + * $7 - Offset in file from which bytes to be read + * + * Return from syscall: + * $2 - Number of bytes read or -1 in case of error + * $3 - errno + * + * @Description File read from a given offset +*/ + +#include <sys/types.h> +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +ssize_t _MIPS_HAL_NOMIPS16 +pread (int fd, void *buf, size_t count, off_t offset) +{ + register int32_t arg1 asm ("$4") = fd; + register void *arg2 asm ("$5") = buf; + register int32_t arg3 asm ("$6") = count; + register int32_t arg4 asm ("$7") = offset; + register int32_t op asm ("$25") = __MIPS_UHI_PREAD; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = pread(%2, %3, %4, %5) op=%6\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), + "+r" (arg2) + : "r" (arg3), "r" (arg4), "r" (op)); + + if (ret == -1) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_pwrite.c b/libgloss/mips/uhi/uhi_pwrite.c new file mode 100644 index 000000000..9ce7684cc --- /dev/null +++ b/libgloss/mips/uhi/uhi_pwrite.c @@ -0,0 +1,80 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis pwrite + * + * Arguments to syscall: + * $25 - Operation code for pwrite + * $4 - File handle + * $5 - Buffer to write + * $6 - Length of the buffer + * $7 - Offset in file at which bytes to be written + * + * Return from syscall: + * $2 - Number of bytes written + * $3 - errno + * + * @Description Write to a file at a given offset +*/ + +#include <sys/types.h> +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +ssize_t _MIPS_HAL_NOMIPS16 +pwrite (int fd, const void *buf, size_t count, off_t offset) +{ + register int32_t arg1 asm ("$4") = fd; + register const void *arg2 asm ("$5") = buf; + register int32_t arg3 asm ("$6") = count; + register int32_t arg4 asm ("$7") = offset; + register int32_t op asm ("$25") = __MIPS_UHI_PWRITE; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = pwrite(%2, %3, %4 %5) op=%6\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), + "+r" (arg2) + : "r" (arg3), "r" (arg4), "r" (op)); + + if (ret == -1) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_read.c b/libgloss/mips/uhi/uhi_read.c new file mode 100644 index 000000000..1daf31f69 --- /dev/null +++ b/libgloss/mips/uhi/uhi_read.c @@ -0,0 +1,77 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis read + * + * Arguments to syscall: + * $25 - Operation code for read + * $4 - File handle + * $5 - Destination buffer + * $6 - Max number of bytes to read + * + * Return from syscall: + * $2 - Number of bytes read + * $3 - errno + * + * @Description File read +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int _MIPS_HAL_NOMIPS16 +read (int fd, void *buffer, size_t len) +{ + register int32_t arg1 asm ("$4") = fd; + register void *arg2 asm ("$5") = buffer; + register int32_t arg3 asm ("$6") = len; + register int32_t op asm ("$25") = __MIPS_UHI_READ; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = read(%2, %3, %4) op=%5\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), + "+r" (arg2) + : "r" (arg3), "r" (op)); + + if (ret == -1) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_stat.c b/libgloss/mips/uhi/uhi_stat.c new file mode 100644 index 000000000..b9b95adf4 --- /dev/null +++ b/libgloss/mips/uhi/uhi_stat.c @@ -0,0 +1,60 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis stat + * + * @Description File statistics +*/ + +#include <stdint.h> +#include <unistd.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> +#include "uhi_stat.h" + +int +stat (const char *filename, struct stat *buf) +{ + int32_t fid, ret = -1; + + fid = open (filename, 0, 0666); /* open in read mode */ + + if (fid >= 0) + { + ret = fstat (fid, buf); + close (fid); + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_stat.h b/libgloss/mips/uhi/uhi_stat.h new file mode 100644 index 000000000..e90717f5c --- /dev/null +++ b/libgloss/mips/uhi/uhi_stat.h @@ -0,0 +1,53 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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 <stdio.h> +#include <time.h> + +struct uhi_stat +{ + short st_dev; + unsigned short st_ino; + unsigned int st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + short st_rdev; + unsigned long long st_size; + unsigned long long st_atime; + unsigned long long st_spare1; + unsigned long long st_mtime; + unsigned long long st_spare2; + unsigned long long st_ctime; + unsigned long long st_spare3; + unsigned long long st_blksize; + unsigned long long st_blocks; + unsigned long long st_spare4[2]; +}; diff --git a/libgloss/mips/uhi/uhi_unlink.c b/libgloss/mips/uhi/uhi_unlink.c new file mode 100644 index 000000000..212515464 --- /dev/null +++ b/libgloss/mips/uhi/uhi_unlink.c @@ -0,0 +1,79 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t unlink (const char *file); + * + * Parameters: + * file - Name of the file + * + * Return: + * 0 on success else -1 + * + * Arguments to syscall: + * $25 - Operation code for unlink + * $4 - Name of the file + * + * Return from syscall: + * $2 - 0 on success else -1 + * $3 - errno + * + * @Description Unlink a file +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int _MIPS_HAL_NOMIPS16 +unlink (const char *file) +{ + register const char *arg1 asm ("$4") = file; + register int32_t op asm ("$25") = __MIPS_UHI_UNLINK; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = unlink(%2) op=%3\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1) + : "r" (op) + : "$5"); + + if (ret != 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/uhi_write.c b/libgloss/mips/uhi/uhi_write.c new file mode 100644 index 000000000..9e8a256c5 --- /dev/null +++ b/libgloss/mips/uhi/uhi_write.c @@ -0,0 +1,77 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis write + * + * Arguments to syscall: + * $25 - Operation code for write + * $4 - File handle + * $5 - Buffer to write + * $6 - Length of the buffer + * + * Return from syscall: + * $2 - Number of bytes written + * $3 - errno + * + * @Description File write +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int _MIPS_HAL_NOMIPS16 +write (int fd, const void *buf, size_t count) +{ + register int32_t arg1 asm ("$4") = fd; + register const void *arg2 asm ("$5") = buf; + register int32_t arg3 asm ("$6") = count; + register int32_t op asm ("$25") = __MIPS_UHI_WRITE; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + __asm__ __volatile__ (" # %0,%1 = write(%2, %3, %4) op=%5\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), + "+r" (arg2) + : "r" (arg3), "r" (op)); + + if (ret == -1) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} diff --git a/libgloss/mips/uhi/yamon_close.c b/libgloss/mips/uhi/yamon_close.c new file mode 100644 index 000000000..eb9001cab --- /dev/null +++ b/libgloss/mips/uhi/yamon_close.c @@ -0,0 +1,83 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t close (int32_t fd); + * + * Parameters: + * $4 - File handle + * + * Return: + * $2 - 0 on success else -1 + * + * Arguments to syscall: + * $25 - Operation code for close + * $4 - File handle + * + * Return from syscall: + * $2 - 0 on success else -1 + * $3 - errno + * + * @Description File close +*/ + +#include <stdint.h> +#include <errno.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int32_t _MIPS_HAL_NOMIPS16 +close (int32_t fd) +{ + register int32_t arg1 asm ("$4") = fd; + register int32_t op asm ("$25") = __MIPS_UHI_CLOSE; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + if (fd == 0 || fd == 1 || fd == 2) + return 0; + + __asm__ __volatile__(" # %0,%1 = close(%2) op=%3\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1) + : "r" (op) + : "$5"); + + if (ret != 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} + diff --git a/libgloss/mips/uhi/yamon_exception.c b/libgloss/mips/uhi/yamon_exception.c new file mode 100644 index 000000000..770936f5a --- /dev/null +++ b/libgloss/mips/uhi/yamon_exception.c @@ -0,0 +1,54 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int __uhi_exception (struct gp_ctx *ctx); + * + * Parameters: + * $4 - GP context + * + * Arguments to syscall: + * $25 - Operation code for __uhi_exception + * $4 - GP context + * + * Return from syscall: + * $2 - + * + * @Description Handle an unhandled exception +*/ + +#include <stdint.h> +#include <mips/hal.h> + +int32_t _MIPS_HAL_NOMIPS16 +__uhi_exception (struct gpctx *ctx, int32_t abi) +{ + return -1; +} diff --git a/libgloss/mips/uhi/yamon_exit.c b/libgloss/mips/uhi/yamon_exit.c new file mode 100644 index 000000000..b6c1ddbaa --- /dev/null +++ b/libgloss/mips/uhi/yamon_exit.c @@ -0,0 +1,62 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis void __exit (int32_t exit_code); + * + * Parameters: + * $4 - Exit code + * + * Return: + * None + * + * @Description Transfer control to the debug port +*/ + +#include <stdint.h> +#include <errno.h> +#include "yamon_syscalls.h" +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +__attribute__ ((weak)) int _MIPS_HAL_NOMIPS16 +__exit (int exit_code) +{ + typedef void (*funcptr) (int32_t); + extern funcptr __yamon_functions[]; + funcptr yamonexit; + + yamonexit = (funcptr)__yamon_functions[__YAMON_EXIT]; + (yamonexit) (exit_code); + + __exit (exit_code); /* just to avoide the warning */ + return exit_code; +} + diff --git a/libgloss/mips/uhi/yamon_fstat.c b/libgloss/mips/uhi/yamon_fstat.c new file mode 100644 index 000000000..ee3259351 --- /dev/null +++ b/libgloss/mips/uhi/yamon_fstat.c @@ -0,0 +1,185 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t fstat (int32_t file, struct stat *sbuf); + * + * Parameters: + * $4 - File handle + * $5 - Pointer to dst buffer (struct stat *) + * + * Return: + * $2 - 0 on success else -1 + * + * Arguments to syscall: + * $25 - Operation code for fstat + * $4 - File handle + * $5 - Pointer to dst buffer (struct stat *) + * + * Return from syscall: + * $2 - 0 on success else -1 + * $3 - errno + * + * @Description File statistics +*/ + +#include <stdio.h> +#include <stdint.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stddef.h> +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> +#include "uhi_stat.h" + +/* This macro declares a dummy type with -ve size if CONDITION is false */ +#define __paste(STR1, STR2) STR1##STR2 +#define __check(LINE, CONDITION) typedef char __paste(assertion_failed_at_line_, LINE) [(int)(CONDITION)-1] + +int _MIPS_HAL_NOMIPS16 +fstat (int file, struct stat *sbuf) +{ + struct uhi_stat hbuf = {0,}; + register int32_t arg1 asm ("$4") = file; + register struct uhi_stat *arg2 asm ("$5") = &hbuf; + register int32_t op asm ("$25") = __MIPS_UHI_FSTAT; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + /* + * We assume that NewLib has following 'struct stat'. Any change in + * this structure (either offset or size) would generate a compile + * time error. + */ +#if defined (_LP64) + __check (__LINE__, sizeof (struct stat) == 104); + __check (__LINE__, offsetof (struct stat, st_dev) == 0); + __check (__LINE__, offsetof (struct stat, st_ino) == 2); + __check (__LINE__, offsetof (struct stat, st_mode) == 4); + __check (__LINE__, offsetof (struct stat, st_nlink) == 8); + __check (__LINE__, offsetof (struct stat, st_uid) == 10); + __check (__LINE__, offsetof (struct stat, st_gid) == 12); + __check (__LINE__, offsetof (struct stat, st_rdev) == 14); + __check (__LINE__, offsetof (struct stat, st_size) == 16); + __check (__LINE__, offsetof (struct stat, st_atime) == 24); + __check (__LINE__, offsetof (struct stat, st_spare1) == 32); + __check (__LINE__, offsetof (struct stat, st_mtime) == 40); + __check (__LINE__, offsetof (struct stat, st_spare2) == 48); + __check (__LINE__, offsetof (struct stat, st_ctime) == 56); + __check (__LINE__, offsetof (struct stat, st_spare3) == 64); + __check (__LINE__, offsetof (struct stat, st_blksize) == 72); + __check (__LINE__, offsetof (struct stat, st_blocks) == 80); + __check (__LINE__, offsetof (struct stat, st_spare4) == 88); +#else + __check (__LINE__, sizeof (struct stat) == 60); + __check (__LINE__, offsetof (struct stat, st_dev) == 0); + __check (__LINE__, offsetof (struct stat, st_ino) == 2); + __check (__LINE__, offsetof (struct stat, st_mode) == 4); + __check (__LINE__, offsetof (struct stat, st_nlink) == 8); + __check (__LINE__, offsetof (struct stat, st_uid) == 10); + __check (__LINE__, offsetof (struct stat, st_gid) == 12); + __check (__LINE__, offsetof (struct stat, st_rdev) == 14); + __check (__LINE__, offsetof (struct stat, st_size) == 16); + __check (__LINE__, offsetof (struct stat, st_atime) == 20); + __check (__LINE__, offsetof (struct stat, st_spare1) == 24); + __check (__LINE__, offsetof (struct stat, st_mtime) == 28); + __check (__LINE__, offsetof (struct stat, st_spare2) == 32); + __check (__LINE__, offsetof (struct stat, st_ctime) == 36); + __check (__LINE__, offsetof (struct stat, st_spare3) == 40); + __check (__LINE__, offsetof (struct stat, st_blksize) == 44); + __check (__LINE__, offsetof (struct stat, st_blocks) == 48); + __check (__LINE__, offsetof (struct stat, st_spare4) == 52); +#endif + + if (file == 0 || file == 1 || file == 2) + { + sbuf->st_mode = S_IRUSR | S_IWUSR | S_IWGRP; + sbuf->st_blksize = BUFSIZ; + sbuf->st_dev = 0; + sbuf->st_ino = 0; + sbuf->st_nlink = 0; + sbuf->st_uid = 0; + sbuf->st_gid = 0; + sbuf->st_rdev = 0; + sbuf->st_size = 0; + sbuf->st_atime = (time_t) 0; + sbuf->st_spare1 = 0; + sbuf->st_mtime = (time_t) 0; + sbuf->st_spare2 = 0; + sbuf->st_ctime = (time_t) 0; + sbuf->st_spare3 = 0; + sbuf->st_blocks = 0; + sbuf->st_spare4[0] = 0; + sbuf->st_spare4[1] = 0; + return 0; + } + + __asm__ __volatile__(" # %0,%1 = fstat(%2, %3) op=%4\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), "+r" (arg2) + : "r" (op)); + + if (ret != 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + else + { + sbuf->st_dev = hbuf.st_dev; + sbuf->st_ino = hbuf.st_ino; + sbuf->st_mode = hbuf.st_mode; + sbuf->st_nlink = hbuf.st_nlink; + sbuf->st_uid = hbuf.st_uid; + sbuf->st_gid = hbuf.st_gid; + sbuf->st_rdev = hbuf.st_rdev; + sbuf->st_size = (long) hbuf.st_size; + sbuf->st_atime = (time_t) hbuf.st_atime; + sbuf->st_spare1 = (long) hbuf.st_spare1; + sbuf->st_mtime = (time_t) hbuf.st_mtime; + sbuf->st_spare2 = (long) hbuf.st_spare2; + sbuf->st_ctime = (time_t) hbuf.st_ctime; + sbuf->st_spare3 = (long) hbuf.st_spare3; + sbuf->st_blksize = (long) hbuf.st_blksize; + sbuf->st_blocks = (long) hbuf.st_blocks; + sbuf->st_spare4[0] = (long) hbuf.st_spare4[0]; + sbuf->st_spare4[1] = (long) hbuf.st_spare4[1]; + } + + return ret; +} + +#undef __paste +#undef __check + diff --git a/libgloss/mips/uhi/yamon_read.c b/libgloss/mips/uhi/yamon_read.c new file mode 100644 index 000000000..41ea07361 --- /dev/null +++ b/libgloss/mips/uhi/yamon_read.c @@ -0,0 +1,103 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t read (int32_t fd, void *buffer, int32_t len); + * + * Parameters: + * $4 - File handle + * $5 - Destination buffer + * $6 - Max number of bytes to read + * + * Return: + * $2 - Number of bytes read + * + * Arguments to syscall: + * $25 - Operation code for read + * $4 - File handle + * $5 - Destination buffer + * $6 - Max number of bytes to read + * + * Return from syscall: + * $2 - Number of bytes read + * $3 - errno + * + * @Description File read +*/ + +#include <stdint.h> +#include <errno.h> +#include "yamon_syscalls.h" +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + + +int32_t _MIPS_HAL_NOMIPS16 +read (int32_t fd, void *buffer, int32_t len) +{ + register int32_t arg1 asm ("$4") = fd; + register void *arg2 asm ("$5") = buffer; + register int32_t arg3 asm ("$6") = len; + register int32_t op asm ("$25") = __MIPS_UHI_READ; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + /* yamon getchar always reads from stdin */ + if (fd == 0) + { + typedef int32_t (*funcptr) (int32_t, char *); + extern funcptr __yamon_functions[]; + funcptr yamonread; + int32_t i; + yamonread = (funcptr)__yamon_functions[__YAMON_GETCHAR]; + + for (i=0; i<=len; i++) + ret += (yamonread) (fd, (char*)buffer+i); + } + else + { + /* Use UHI read when reading from source other than stdin */ + __asm__ __volatile__(" # %0,%1 = read (%2, %3, %4) op=%5\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), "+r" (arg2) + : "r" (arg3), "r" (op)); + } + + if (ret < 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} + diff --git a/libgloss/mips/uhi/yamon_syscalls.h b/libgloss/mips/uhi/yamon_syscalls.h new file mode 100644 index 000000000..3eea590b7 --- /dev/null +++ b/libgloss/mips/uhi/yamon_syscalls.h @@ -0,0 +1,35 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* These defines are used as array indices in c code */ +#define __YAMON_PRINT_COUNT 0x01 /* At location 0x04 in vector table */ +#define __YAMON_GETCHAR 0x14 /* At location 0x50 in vector table */ +#define __YAMON_EXIT 0x08 /* At location 0x20 in vector table */ + diff --git a/libgloss/mips/uhi/yamon_write.c b/libgloss/mips/uhi/yamon_write.c new file mode 100644 index 000000000..53bf2ec49 --- /dev/null +++ b/libgloss/mips/uhi/yamon_write.c @@ -0,0 +1,100 @@ +/* + * Copyright 2014-2015, Imagination Technologies Limited and/or its + * affiliated group companies. + * 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. Neither the name of the copyright holder 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 HOLDER 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. +*/ + +/* + * @Synopsis int32_t write (int32_t fd, void *buffer, int32_t count); + * + * Parameters: + * $4 - File handle + * $5 - Buffer to write + * $6 - Length of the buffer + * + * Return: + * $2 - Number of bytes written + * + * Arguments to syscall: + * $25 - Operation code for write + * $4 - File handle + * $5 - Buffer to write + * $6 - Length of the buffer + * + * Return from syscall: + * $2 - Number of bytes written + * $3 - errno + * + * @Description File write +*/ + +#include <stdint.h> +#include <errno.h> +#include "yamon_syscalls.h" +#include <mips/uhi_syscalls.h> +#include <mips/hal.h> + +int32_t _MIPS_HAL_NOMIPS16 +write (int32_t fd, void *buffer, int32_t count) +{ + register int32_t arg1 asm ("$4") = fd; + register void *arg2 asm ("$5") = buffer; + register int32_t arg3 asm ("$6") = count; + register int32_t op asm ("$25") = __MIPS_UHI_WRITE; + register int32_t ret asm ("$2") = __MIPS_UHI_SYSCALL_NUM; + register int32_t new_errno asm ("$3") = 0; + + /* yamon print_count always writes to stdout */ + if (fd == 1 || fd == 2) + { + typedef int32_t (*funcptr) (int32_t, char *, int32_t); + extern funcptr __yamon_functions[]; + funcptr yamonwrite; + + yamonwrite = (funcptr)__yamon_functions[__YAMON_PRINT_COUNT]; + + ret = (yamonwrite) (0, buffer, count); + } + else + { + /* Use UHI write when writing to destination other than stdout */ + __asm__ __volatile__(" # %0,%1 = write(%2, %3, %4) op=%5\n" + SYSCALL (__MIPS_UHI_SYSCALL_NUM) + : "+r" (ret), "=r" (new_errno), "+r" (arg1), "+r" (arg2) + : "r" (arg3), "r" (op)); + } + if (ret < 0) + { + /* Do a dance to set errno, errno is a function call that can + clobber $3. */ + volatile uint32_t errno_tmp = new_errno; + errno = errno_tmp; + } + + return ret; +} + -- 2.25.1