diff options
| author | Michael Gielda <mgielda@antmicro.com> | 2014-04-03 14:53:04 +0200 |
|---|---|---|
| committer | Michael Gielda <mgielda@antmicro.com> | 2014-04-03 14:53:04 +0200 |
| commit | ae1e4e08a1005a0c487f03ba189d7536e7fdcba6 (patch) | |
| tree | f1c296f8a966a9a39876b0e98e16d9c5da1776dd /ecos/packages/compat/posix/current/src/misc.cxx | |
| parent | f157da5337118d3c5cd464266796de4262ac9dbd (diff) | |
Added the OS files
Diffstat (limited to 'ecos/packages/compat/posix/current/src/misc.cxx')
| -rw-r--r-- | ecos/packages/compat/posix/current/src/misc.cxx | 393 |
1 files changed, 393 insertions, 0 deletions
diff --git a/ecos/packages/compat/posix/current/src/misc.cxx b/ecos/packages/compat/posix/current/src/misc.cxx new file mode 100644 index 0000000..b7e5035 --- /dev/null +++ b/ecos/packages/compat/posix/current/src/misc.cxx @@ -0,0 +1,393 @@ +//========================================================================== +// +// misc.cxx +// +// POSIX misc function implementations +// +//========================================================================== +// ####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later +// version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License +// along with eCos; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// As a special exception, if other files instantiate templates or use +// macros or inline functions from this file, or you compile this file +// and link it with other works to produce a work based on this file, +// this file does not by itself cause the resulting work to be covered by +// the GNU General Public License. However the source code for this file +// must still be made available in accordance with section (3) of the GNU +// General Public License v2. +// +// This exception does not invalidate any other reasons why a work based +// on this file might be covered by the GNU General Public License. +// ------------------------------------------- +// ####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 2000-07-18 +// Purpose: POSIX misc function implementation +// Description: This file contains the implementation of miscellaneous POSIX +// functions that do not belong elsewhere. +// +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/system.h> +#include <pkgconf/hal.h> +#include <pkgconf/kernel.h> +#include <pkgconf/posix.h> + +#include <cyg/kernel/ktypes.h> // base kernel types +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros + +#include "pprivate.h" // POSIX private header + +#include <unistd.h> +#ifdef CYGPKG_POSIX_UTSNAME +#include <sys/utsname.h> // My header +#endif +#include <string.h> // strcpy +#include <limits.h> +#include <time.h> + +#include <cyg/kernel/sched.hxx> + +#include <cyg/kernel/sched.inl> + +// ------------------------------------------------------------------------- +// Supply some suitable values for constants that may not be present +// in all configurations. + +#ifndef MQ_OPEN_MAX +#define MQ_OPEN_MAX 0 +#endif +#ifndef MQ_PRIO_MAX +#define MQ_PRIO_MAX 0 +#endif + +// ------------------------------------------------------------------------- + +#define __string(_x) #_x +#define __xstring(_x) __string(_x) + +// ------------------------------------------------------------------------- +// uname() + +#ifdef CYGPKG_POSIX_UTSNAME +__externC int uname( struct utsname *name ) +{ + CYG_REPORT_FUNCTYPE( "returning %d" ); + + strcpy( name->sysname, "eCos" ); + strcpy( name->nodename, "" ); // should use gethostname() + strcpy( name->release, __xstring( CYGNUM_KERNEL_VERSION_MAJOR ) ); + strcpy( name->version, __xstring( CYGNUM_KERNEL_VERSION_MINOR ) ); + strcpy( name->machine, "" ); + + CYG_REPORT_RETVAL(0); + return 0; +} +#endif + +// ------------------------------------------------------------------------- +// sysconf() + +#define SC_CASE( _name, _val ) case _name: return _val + +__externC long sysconf( int name ) +{ + + switch( name ) + { + SC_CASE( _SC_AIO_LISTIO_MAX, AIO_LISTIO_MAX ); + SC_CASE( _SC_AIO_MAX, AIO_MAX ); + SC_CASE( _SC_AIO_PRIO_DELTA_MAX, AIO_PRIO_DELTA_MAX ); + SC_CASE( _SC_ARG_MAX, ARG_MAX ); + SC_CASE( _SC_CHILD_MAX, CHILD_MAX ); + SC_CASE( _SC_DELAYTIMER_MAX, DELAYTIMER_MAX ); + SC_CASE( _SC_GETGR_R_SIZE_MAX, 0 ); + SC_CASE( _SC_GETPW_R_SIZE_MAX, 0 ); + SC_CASE( _SC_LOGIN_NAME_MAX, LOGIN_NAME_MAX ); +#ifdef CYGPKG_POSIX_MQUEUES + SC_CASE( _SC_MQ_OPEN_MAX, MQ_OPEN_MAX ); + SC_CASE( _SC_MQ_PRIO_MAX, MQ_PRIO_MAX ); +#endif + SC_CASE( _SC_NGROUPS_MAX, NGROUPS_MAX ); + SC_CASE( _SC_OPEN_MAX, OPEN_MAX ); + SC_CASE( _SC_PAGESIZE, PAGESIZE ); + SC_CASE( _SC_RTSIG_MAX, RTSIG_MAX ); +#ifdef CYGPKG_POSIX_SEMAPHORES + SC_CASE( _SC_SEM_NSEMS_MAX, SEM_NSEMS_MAX ); + SC_CASE( _SC_SEM_VALUE_MAX, SEM_VALUE_MAX ); +#endif + SC_CASE( _SC_SIGQUEUE_MAX, SIGQUEUE_MAX ); + SC_CASE( _SC_STREAM_MAX, STREAM_MAX ); +#ifdef CYGPKG_POSIX_PTHREAD + SC_CASE( _SC_THREAD_DESTRUCTOR_ITERATIONS, PTHREAD_DESTRUCTOR_ITERATIONS ); + SC_CASE( _SC_THREAD_KEYS_MAX, PTHREAD_KEYS_MAX ); + SC_CASE( _SC_THREAD_STACK_MIN, PTHREAD_STACK_MIN ); + SC_CASE( _SC_THREAD_THREADS_MAX, PTHREAD_THREADS_MAX ); +#endif + SC_CASE( _SC_TIMER_MAX, TIMER_MAX ); + SC_CASE( _SC_TTY_NAME_MAX, TTY_NAME_MAX ); + SC_CASE( _SC_TZNAME_MAX, TZNAME_MAX ); + SC_CASE( _SC_VERSION, _POSIX_VERSION ); + +#ifdef CYGPKG_POSIX_TIMERS + case _SC_CLK_TCK: + { + struct timespec ts; + ts.tv_sec = 1; + ts.tv_nsec = 0; + cyg_tick_count ticks = cyg_timespec_to_ticks( &ts ); + return ticks; + } +#endif + + case _SC_ASYNCHRONOUS_IO: + #ifdef _POSIX_ASYNCHRONOUS_IO + return 1; + #else + return -1; + #endif + + case _SC_FSYNC: + #ifdef _POSIX_FSYNC + return 1; + #else + return -1; + #endif + + case _SC_JOB_CONTROL: + #ifdef _POSIX_JOB_CONTROL + return 1; + #else + return -1; + #endif + + case _SC_MAPPED_FILES: + #ifdef _POSIX_MAPPED_FILES + return 1; + #else + return -1; + #endif + + case _SC_MEMLOCK: + #ifdef _POSIX_MEMLOCK + return 1; + #else + return -1; + #endif + + case _SC_MEMLOCK_RANGE: + #ifdef _POSIX_MEMLOCK_RANGE + return 1; + #else + return -1 ; + #endif + + case _SC_MEMORY_PROTECTION: + #ifdef _POSIX_MEMORY_PROTECTION + return 1; + #else + return -1; + #endif + + case _SC_MESSAGE_PASSING: + #ifdef _POSIX_MESSAGE_PASSING + return 1; + #else + return -1; + #endif + + case _SC_PRIORITIZED_IO: + #ifdef _POSIX_PRIORITIZED_IO + return 1; + #else + return -1; + #endif + + case _SC_PRIORITY_SCHEDULING: + #ifdef _POSIX_PRIORITY_SCHEDULING + return 1; + #else + return -1; + #endif + + case _SC_REALTIME_SIGNALS: + #ifdef _POSIX_REALTIME_SIGNALS + return 1; + #else + return -1; + #endif + + case _SC_SAVED_IDS: + #ifdef _POSIX_SAVED_IDS + return 1; + #else + return -1; + #endif + + case _SC_SEMAPHORES: + #ifdef _POSIX_SEMAPHORES + return 1; + #else + return -1; + #endif + + case _SC_SHARED_MEMORY_OBJECTS: + #ifdef _POSIX_SHARED_MEMORY_OBJECTS + return 1; + #else + return -1; + #endif + + case _SC_SYNCHRONIZED_IO: + #ifdef _POSIX_SYNCHRONIZED_IO + return 1; + #else + return -1; + #endif + + case _SC_THREADS: + #ifdef _POSIX_THREADS + return 1; + #else + return -1; + #endif + + case _SC_THREAD_ATTR_STACKADDR: + #ifdef _POSIX_THREAD_ATTR_STACKADDR + return 1; + #else + return -1; + #endif + + case _SC_THREAD_ATTR_STACKSIZE: + #ifdef _POSIX_THREAD_ATTR_STACKSIZE + return 1; + #else + return -1; + #endif + + case _SC_THREAD_PRIO_INHERIT: + #ifdef _POSIX_THREAD_PRIO_INHERIT + return 1; + #else + return -1; + #endif + + case _SC_THREAD_PRIO_PROTECT: + #ifdef _POSIX_THREAD_PRIO_PROTECT + return 1; + #else + return -1; + #endif + + case _SC_THREAD_PRIORITY_SCHEDULING: + #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING + return 1; + #else + return -1; + #endif + + case _SC_THREAD_PROCESS_SHARED: + #ifdef _POSIX_THREAD_PROCESS_SHARED + return 1; + #else + return -1; + #endif + + case _SC_THREAD_SAFE_FUNCTIONS: + #ifdef _POSIX_THREAD_SAFE_FUNCTIONS + return 1; + #else + return -1; + #endif + + case _SC_TIMERS: + #ifdef _POSIX_TIMERS + return 1; + #else + return -1; + #endif + + + default: + errno = EINVAL; + return -1; + } +} + +//========================================================================== +// Some trivial compatibility functions. +// These are merely present to permit existing code to be ported a little +// more easily, and to provide adequate standards compatibility. + +__externC pid_t getpid ( void ) { return 42; } +__externC pid_t getppid ( void ) { return 41; } +__externC uid_t getuid ( void ) { return 666; } +__externC uid_t geteuid ( void ) { return 666; } +__externC gid_t getgid ( void ) { return 88; } +__externC gid_t getegid ( void ) { return 88; } +__externC int setuid ( uid_t uid ) { errno = EPERM; return -1; } +__externC int setgid ( uid_t gid ) { errno = EPERM; return -1; } +__externC int getgroups ( int gidsetsize, gid_t grouplist[] ) { return 0; }; +__externC pid_t getpgrp ( void ) { return 42; } +__externC pid_t setsid ( void ) { errno = EPERM; return -1; } +__externC int setpgid ( pid_t pid, pid_t pgid ) { errno = ENOSYS; return -1; } + +//========================================================================== +// Exports to other packages + +// ------------------------------------------------------------------------- +// POSIX API function entry + +__externC void cyg_posix_function_start() +{ + Cyg_Thread *self = Cyg_Scheduler::get_current_thread(); + + // Inhibit ASR delivery in this function until it returns. + + self->set_asr_inhibit(); +} + +// ------------------------------------------------------------------------- + +__externC void cyg_posix_function_finish() +{ + Cyg_Thread *self = Cyg_Scheduler::get_current_thread(); + + // Re-allow ASR delivery. + + self->clear_asr_inhibit(); + + // After clearing the inhibit flag, blip the scheduler lock + // to get any pending ASRs delivered. + Cyg_Scheduler::lock(); + Cyg_Scheduler::unlock(); +} + +// ------------------------------------------------------------------------- +// EOF misc.cxx |
