summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-09-17 16:12:04 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-09-17 16:12:04 +0000
commitd40da79b04ee4756675c3356cfc156fb7d9bd547 (patch)
treef55cad54aadd9cac001bccbbb37922cc27597107
parent2008-09-17 Miao Yan <yanmiaobest@gmail.com> (diff)
downloadrtems-d40da79b04ee4756675c3356cfc156fb7d9bd547.tar.bz2
2008-09-17 Miao Yan <yanmiaobest@gmail.com>
* Makefile.am, preinstall.am, libcsupport/Makefile.am, libcsupport/include/rtems/libcsupport.h, libcsupport/include/rtems/libio.h, libcsupport/src/base_fs.c, libcsupport/src/libio_init.c, libcsupport/src/newlibc_exit.c, libcsupport/src/newlibc_init.c, libcsupport/src/sync.c, libfs/Makefile.am, libfs/src/imfs/deviceio.c, sapi/include/confdefs.h: Merge GSOC project code to add simple device only filesystem (devfs), optionally completely drop out filesystem, and to clean up disabling newlib reentrancy support. This dropped 17K from the minimum.exe for sparc/sis and arm/rtl22xx_t now has a 15K code space. * libcsupport/src/__usrenv.c, libcsupport/src/newlibc_reent.c, libfs/src/devfs/devclose.c, libfs/src/devfs/devfs.h, libfs/src/devfs/devfs_eval.c, libfs/src/devfs/devfs_init.c, libfs/src/devfs/devfs_mknod.c, libfs/src/devfs/devfs_node_type.c, libfs/src/devfs/devfs_show.c, libfs/src/devfs/devioctl.c, libfs/src/devfs/devopen.c, libfs/src/devfs/devread.c, libfs/src/devfs/devstat.c, libfs/src/devfs/devwrite.c, libfs/src/imfs/deviceerrno.c: New files. * libcsupport/src/newlibc.c: Removed.
Diffstat (limited to '')
-rw-r--r--cpukit/ChangeLog23
-rw-r--r--cpukit/Makefile.am3
-rw-r--r--cpukit/libcsupport/Makefile.am4
-rw-r--r--cpukit/libcsupport/include/rtems/libcsupport.h24
-rw-r--r--cpukit/libcsupport/include/rtems/libio.h12
-rw-r--r--cpukit/libcsupport/src/__usrenv.c27
-rw-r--r--cpukit/libcsupport/src/base_fs.c9
-rw-r--r--cpukit/libcsupport/src/libio_init.c3
-rw-r--r--cpukit/libcsupport/src/newlibc_exit.c8
-rw-r--r--cpukit/libcsupport/src/newlibc_init.c20
-rw-r--r--cpukit/libcsupport/src/newlibc_reent.c (renamed from cpukit/libcsupport/src/newlibc.c)35
-rw-r--r--cpukit/libcsupport/src/sync.c8
-rw-r--r--cpukit/libfs/Makefile.am8
-rw-r--r--cpukit/libfs/src/devfs/devclose.c43
-rw-r--r--cpukit/libfs/src/devfs/devfs.h294
-rw-r--r--cpukit/libfs/src/devfs/devfs_eval.c65
-rw-r--r--cpukit/libfs/src/devfs/devfs_init.c87
-rw-r--r--cpukit/libfs/src/devfs/devfs_mknod.c81
-rw-r--r--cpukit/libfs/src/devfs/devfs_node_type.c26
-rw-r--r--cpukit/libfs/src/devfs/devfs_show.c35
-rw-r--r--cpukit/libfs/src/devfs/devioctl.c45
-rw-r--r--cpukit/libfs/src/devfs/devopen.c44
-rw-r--r--cpukit/libfs/src/devfs/devread.c48
-rw-r--r--cpukit/libfs/src/devfs/devstat.c40
-rw-r--r--cpukit/libfs/src/devfs/devwrite.c48
-rw-r--r--cpukit/libfs/src/imfs/deviceerrno.c57
-rw-r--r--cpukit/libfs/src/imfs/deviceio.c2
-rw-r--r--cpukit/preinstall.am4
-rw-r--r--cpukit/sapi/include/confdefs.h60
29 files changed, 1082 insertions, 81 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index 048bb0be4f..49437b8323 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,3 +1,26 @@
+2008-09-17 Miao Yan <yanmiaobest@gmail.com>
+
+ * Makefile.am, preinstall.am, libcsupport/Makefile.am,
+ libcsupport/include/rtems/libcsupport.h,
+ libcsupport/include/rtems/libio.h, libcsupport/src/base_fs.c,
+ libcsupport/src/libio_init.c, libcsupport/src/newlibc_exit.c,
+ libcsupport/src/newlibc_init.c, libcsupport/src/sync.c,
+ libfs/Makefile.am, libfs/src/imfs/deviceio.c,
+ sapi/include/confdefs.h: Merge GSOC project code to add simple device
+ only filesystem (devfs), optionally completely drop out filesystem,
+ and to clean up disabling newlib reentrancy support. This dropped 17K
+ from the minimum.exe for sparc/sis and arm/rtl22xx_t now has a 15K
+ code space.
+ * libcsupport/src/__usrenv.c, libcsupport/src/newlibc_reent.c,
+ libfs/src/devfs/devclose.c, libfs/src/devfs/devfs.h,
+ libfs/src/devfs/devfs_eval.c, libfs/src/devfs/devfs_init.c,
+ libfs/src/devfs/devfs_mknod.c, libfs/src/devfs/devfs_node_type.c,
+ libfs/src/devfs/devfs_show.c, libfs/src/devfs/devioctl.c,
+ libfs/src/devfs/devopen.c, libfs/src/devfs/devread.c,
+ libfs/src/devfs/devstat.c, libfs/src/devfs/devwrite.c,
+ libfs/src/imfs/deviceerrno.c: New files.
+ * libcsupport/src/newlibc.c: Removed.
+
2008-09-16 Joel Sherrill <joel.sherrill@OARcorp.com>
* sapi/include/confdefs.h: Revert previous patch. Does not apply to
diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
index 35900e7325..e9d916a0c6 100644
--- a/cpukit/Makefile.am
+++ b/cpukit/Makefile.am
@@ -79,6 +79,9 @@ include_rtems_HEADERS += include/rtems/irq-extension.h
## libfs
include_rtems_HEADERS += libfs/src/imfs/imfs.h
+## devfs
+include_rtems_HEADERS += libfs/src/devfs/devfs.h
+
if LIBDOSFS
include_rtems_HEADERS += libfs/src/dosfs/dosfs.h
endif
diff --git a/cpukit/libcsupport/Makefile.am b/cpukit/libcsupport/Makefile.am
index f5cb6fdae3..12395b1af7 100644
--- a/cpukit/libcsupport/Makefile.am
+++ b/cpukit/libcsupport/Makefile.am
@@ -47,7 +47,7 @@ ASSOCIATION_C_FILES = src/assoclocalbyname.c \
BASE_FS_C_FILES = src/base_fs.c src/mount.c src/unmount.c src/libio.c \
src/libio_init.c \
src/libio_sockets.c src/eval.c src/fs_null_handlers.c src/privateenv.c \
- src/open_dev_console.c
+ src/open_dev_console.c src/__usrenv.c
TERMIOS_C_FILES = src/cfgetispeed.c src/cfgetospeed.c src/cfsetispeed.c \
src/cfsetospeed.c src/tcgetattr.c src/tcsetattr.c src/tcdrain.c \
@@ -94,7 +94,7 @@ TERMINAL_IDENTIFICATION_C_FILES = src/ctermid.c src/isatty.c src/ttyname.c
LIBC_GLUE_C_FILES = src/__getpid.c src/__gettod.c src/__times.c \
src/truncate.c src/access.c src/stat.c src/lstat.c src/pathconf.c \
- src/newlibc.c src/newlibc_init.c src/newlibc_exit.c src/no_posix.c \
+ src/newlibc_reent.c src/newlibc_init.c src/newlibc_exit.c src/no_posix.c \
src/no_libc.c src/utsname.c
BSD_LIBC_C_FILES = src/strlcpy.c src/strlcat.c
diff --git a/cpukit/libcsupport/include/rtems/libcsupport.h b/cpukit/libcsupport/include/rtems/libcsupport.h
index 2c6efd1536..7197df5708 100644
--- a/cpukit/libcsupport/include/rtems/libcsupport.h
+++ b/cpukit/libcsupport/include/rtems/libcsupport.h
@@ -45,33 +45,33 @@ extern void open_dev_console(void);
/*
* Prototypes required to install newlib reentrancy user extension
*/
-bool libc_create_hook(
+bool newlib_create_hook(
rtems_tcb *current_task,
rtems_tcb *creating_task
);
#if defined(RTEMS_UNIX) && !defined(hpux)
- rtems_extension libc_begin_hook(rtems_tcb *current_task);
- #define __RTEMS_NEWLIB_BEGIN libc_begin_hook
+ rtems_extension newlib_begin_hook(rtems_tcb *current_task);
+ #define __RTEMS_NEWLIB_BEGIN newlib_begin_hook
#else
#define __RTEMS_NEWLIB_BEGIN 0
#endif
-rtems_extension libc_delete_hook(
+rtems_extension newlib_delete_hook(
rtems_tcb *current_task,
rtems_tcb *deleted_task
);
#define RTEMS_NEWLIB_EXTENSION \
{ \
- libc_create_hook, /* rtems_task_create */ \
- 0, /* rtems_task_start */ \
- 0, /* rtems_task_restart */ \
- libc_delete_hook, /* rtems_task_delete */ \
- 0, /* task_switch */ \
- __RTEMS_NEWLIB_BEGIN, /* task_begin */ \
- 0, /* task_exitted */ \
- 0 /* fatal */ \
+ newlib_create_hook, /* rtems_task_create */ \
+ 0, /* rtems_task_start */ \
+ 0, /* rtems_task_restart */ \
+ newlib_delete_hook, /* rtems_task_delete */ \
+ 0, /* task_switch */ \
+ __RTEMS_NEWLIB_BEGIN, /* task_begin */ \
+ 0, /* task_exitted */ \
+ 0 /* fatal */ \
}
#ifdef __cplusplus
diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h
index 1767d1d789..9147218629 100644
--- a/cpukit/libcsupport/include/rtems/libio.h
+++ b/cpukit/libcsupport/include/rtems/libio.h
@@ -634,6 +634,18 @@ typedef struct {
extern const rtems_filesystem_mount_table_t *rtems_filesystem_mount_table;
extern const int rtems_filesystem_mount_table_size;
+
+typedef void (*rtems_libio_init_functions_t)(void);
+extern rtems_libio_init_functions_t rtems_libio_init_helper;
+
+void open_dev_console(void);
+
+typedef void (*rtems_libio_supp_functions_t)(void);
+extern rtems_libio_supp_functions_t rtems_libio_supp_helper;
+
+typedef void (*rtems_fs_init_functions_t)(void);
+extern rtems_fs_init_functions_t rtems_fs_init_helper;
+
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/libcsupport/src/__usrenv.c b/cpukit/libcsupport/src/__usrenv.c
new file mode 100644
index 0000000000..0b3469fa1a
--- /dev/null
+++ b/cpukit/libcsupport/src/__usrenv.c
@@ -0,0 +1,27 @@
+/*
+ * COPYRIGHT (c) 1989-2008.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <rtems/libio_.h>
+
+/*
+ * Global information for POSIX Process Environment Support
+ */
+
+rtems_user_env_t rtems_global_user_env;
+rtems_user_env_t * rtems_current_user_env = &rtems_global_user_env;
+
+
diff --git a/cpukit/libcsupport/src/base_fs.c b/cpukit/libcsupport/src/base_fs.c
index 4ce53b0e4b..91466a5b07 100644
--- a/cpukit/libcsupport/src/base_fs.c
+++ b/cpukit/libcsupport/src/base_fs.c
@@ -1,7 +1,7 @@
/*
* Base file system initialization
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -20,13 +20,6 @@
#include <rtems/libio_.h>
/*
- * Global information for the base file system.
- */
-
-rtems_user_env_t rtems_global_user_env;
-rtems_user_env_t * rtems_current_user_env = &rtems_global_user_env;
-
-/*
* Default mode for created files.
*/
diff --git a/cpukit/libcsupport/src/libio_init.c b/cpukit/libcsupport/src/libio_init.c
index 4968058637..9bb96e40c2 100644
--- a/cpukit/libcsupport/src/libio_init.c
+++ b/cpukit/libcsupport/src/libio_init.c
@@ -86,5 +86,6 @@ void rtems_libio_init( void )
* Initialize the base file system infrastructure.
*/
- rtems_filesystem_initialize();
+ if (rtems_fs_init_helper)
+ (* rtems_fs_init_helper)();
}
diff --git a/cpukit/libcsupport/src/newlibc_exit.c b/cpukit/libcsupport/src/newlibc_exit.c
index 68212b692e..f7f8a6e481 100644
--- a/cpukit/libcsupport/src/newlibc_exit.c
+++ b/cpukit/libcsupport/src/newlibc_exit.c
@@ -40,7 +40,7 @@ int _fwalk(struct _reent *ptr, int (*function) (FILE *) );
/* do we think we are reentrant? */
extern int libc_reentrant;
-extern struct _reent libc_global_reent __ATTRIBUTE_IMPURE_PTR__;
+extern struct _reent * const _global_impure_ptr __ATTRIBUTE_IMPURE_PTR__;
/*
* CYGNUS newlib routine that does atexit() processing and flushes
@@ -66,15 +66,15 @@ void libc_wrapup(void)
_wrapup_reent(0);
*/
- if (_REENT != &libc_global_reent) {
- _wrapup_reent(&libc_global_reent);
+ if (_REENT != _global_impure_ptr) {
+ _wrapup_reent(_global_impure_ptr);
#if 0
/* Don't reclaim this one, just in case we do printfs
* on the way out to ROM.
*/
_reclaim_reent(&libc_global_reent);
#endif
- _REENT = &libc_global_reent;
+ _REENT = _global_impure_ptr;
}
/*
diff --git a/cpukit/libcsupport/src/newlibc_init.c b/cpukit/libcsupport/src/newlibc_init.c
index a37ab29663..dbf9544fd5 100644
--- a/cpukit/libcsupport/src/newlibc_init.c
+++ b/cpukit/libcsupport/src/newlibc_init.c
@@ -17,22 +17,7 @@
#include "config.h"
#endif
-#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
-#include <rtems.h>
-
#if defined(RTEMS_NEWLIB)
-#include <rtems/libcsupport.h>
-
-/* Since we compile with strict ANSI we need to undef it to get
- * prototypes for extensions
- */
-#undef __STRICT_ANSI__
-
-#include <stdlib.h> /* for free() */
-#include <string.h> /* for memset() */
-
-#include <sys/reent.h> /* for extern of _REENT (aka _impure_ptr) */
-#include <errno.h>
/*
* Init libc for CYGNUS newlib
@@ -48,14 +33,9 @@
*/
-struct _reent libc_global_reent
- __ATTRIBUTE_IMPURE_PTR__ = _REENT_INIT(libc_global_reent);
void
libc_init(void)
{
- _REENT = &libc_global_reent;
-
- _Thread_Set_libc_reent (&_REENT);
}
#endif
diff --git a/cpukit/libcsupport/src/newlibc.c b/cpukit/libcsupport/src/newlibc_reent.c
index 79c1dc7dd4..ba8078a135 100644
--- a/cpukit/libcsupport/src/newlibc.c
+++ b/cpukit/libcsupport/src/newlibc_reent.c
@@ -1,10 +1,4 @@
/*
- * Implementation of hooks for the CYGNUS newlib libc
- * These hooks set things up so that:
- * + '_REENT' is switched at task switch time.
- *
- * COPYRIGHT (c) 1994 by Division Incorporated
- *
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE.
@@ -50,8 +44,7 @@
int _fwalk(struct _reent *ptr, int (*function) (FILE *) );
-extern struct _reent libc_global_reent __ATTRIBUTE_IMPURE_PTR__;
-
+extern struct _reent * const _global_impure_ptr __ATTRIBUTE_IMPURE_PTR__;
/*
* reent struct allocation moved here from libc_start_hook() to avoid
* mutual exclusion problems when memory is allocated from the start hook.
@@ -59,13 +52,20 @@ extern struct _reent libc_global_reent __ATTRIBUTE_IMPURE_PTR__;
* Memory is also now allocated from the workspace rather than the heap.
* -- ptorre 9/30/03
*/
-bool libc_create_hook(
+bool newlib_create_hook(
rtems_tcb *current_task,
rtems_tcb *creating_task
)
{
struct _reent *ptr;
+ if (_Thread_libc_reent == 0)
+ {
+ _REENT = _global_impure_ptr;
+
+ _Thread_Set_libc_reent (&_REENT);
+ }
+
/* NOTE: The RTEMS malloc is reentrant without a reent ptr since
* it is based on the Classic API Region Manager.
*/
@@ -81,13 +81,12 @@ bool libc_create_hook(
#endif
if (ptr) {
-
- _REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */
- creating_task->libc_reent = ptr;
- return true;
+ _REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */
+ creating_task->libc_reent = ptr;
+ return TRUE;
}
- else
- return false;
+
+ return FALSE;
}
/*
@@ -95,7 +94,7 @@ bool libc_create_hook(
*/
#ifdef NEED_SETVBUF
-rtems_extension libc_begin_hook(rtems_tcb *current_task)
+rtems_extension newlib_begin_hook(rtems_tcb *current_task)
{
setvbuf( stdout, NULL, _IOLBF, BUFSIZ );
}
@@ -128,7 +127,7 @@ int newlib_free_buffers(
return 0;
}
-rtems_extension libc_delete_hook(
+rtems_extension newlib_delete_hook(
rtems_tcb *current_task,
rtems_tcb *deleted_task
)
@@ -145,7 +144,7 @@ rtems_extension libc_delete_hook(
ptr = deleted_task->libc_reent;
}
- if (ptr && ptr != &libc_global_reent) {
+ if (ptr && ptr != _global_impure_ptr) {
/*
_wrapup_reent(ptr);
_reclaim_reent(ptr);
diff --git a/cpukit/libcsupport/src/sync.c b/cpukit/libcsupport/src/sync.c
index 14c20cebb3..8db3f62161 100644
--- a/cpukit/libcsupport/src/sync.c
+++ b/cpukit/libcsupport/src/sync.c
@@ -7,7 +7,7 @@
* fsync()
* fdatasync()
*
- * COPYRIGHT (c) 1989-2003.
+ * COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -71,10 +71,10 @@ static void sync_per_thread(Thread_Control *t)
}
/*
- * libc_global_reent is not prototyped in any .h files.
+ * _global_impure_ptr is not prototyped in any .h files.
* We have to extern it here.
*/
-extern struct _reent libc_global_reent;
+extern struct _reent * const _global_impure_ptr __ATTRIBUTE_IMPURE_PTR__;
void sync(void)
{
@@ -82,7 +82,7 @@ void sync(void)
/*
* Walk the one used initially by RTEMS.
*/
- _fwalk(&libc_global_reent, sync_wrapper);
+ _fwalk(_global_impure_ptr, sync_wrapper);
/*
* XXX Do we walk the one used globally by newlib?
diff --git a/cpukit/libfs/Makefile.am b/cpukit/libfs/Makefile.am
index 83e9347968..fe8562b081 100644
--- a/cpukit/libfs/Makefile.am
+++ b/cpukit/libfs/Makefile.am
@@ -31,7 +31,13 @@ libimfs_a_SOURCES += src/imfs/imfs_chown.c src/imfs/imfs_config.c \
src/imfs/imfs_debug.c src/imfs/imfs_rmnod.c src/imfs/imfs_symlink.c \
src/imfs/imfs_readlink.c src/imfs/imfs_fdatasync.c src/imfs/imfs_fcntl.c \
src/imfs/ioman.c src/imfs/miniimfs_init.c src/imfs/imfs_load_tar.c \
- src/imfs/imfs.h
+ src/imfs/imfs.h \
+ src/imfs/deviceerrno.c \
+ src/devfs/devfs_init.c src/devfs/devfs_eval.c src/devfs/devfs_mknod.c \
+ src/devfs/devfs_show.c src/devfs/devfs_node_type.c \
+ src/devfs/devopen.c src/devfs/devread.c src/devfs/devwrite.c \
+ src/devfs/devclose.c src/devfs/devioctl.c src/devfs/devstat.c \
+ src/devfs/devfs.h
endif
# dosfs
diff --git a/cpukit/libfs/src/devfs/devclose.c b/cpukit/libfs/src/devfs/devclose.c
new file mode 100644
index 0000000000..a87e12f338
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devclose.c
@@ -0,0 +1,43 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/io.h>
+
+#include "devfs.h"
+
+int devFS_close(
+ rtems_libio_t *iop
+)
+{
+ rtems_libio_open_close_args_t args;
+ rtems_status_code status;
+ rtems_driver_name_t *np;
+
+ np = (rtems_device_name_t *)iop->file_info;
+
+ args.iop = iop;
+ args.flags = 0;
+ args.mode = 0;
+
+ status = rtems_io_close(
+ np->major,
+ np->minor,
+ (void *) &args
+ );
+ if ( status ) {
+ return rtems_deviceio_errno(status);
+ }
+ return 0;
+}
+
+
diff --git a/cpukit/libfs/src/devfs/devfs.h b/cpukit/libfs/src/devfs/devfs.h
new file mode 100644
index 0000000000..ea3b965bbc
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devfs.h
@@ -0,0 +1,294 @@
+/**
+* @file libfs/devfs/devfs.h
+*
+* This include file contains all constants and structures associated
+* with the 'device-only' filesystem.
+*/
+
+#ifndef _RTEMS_DEVFS_H
+#define _RTEMS_DEVFS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/libio_.h>
+
+/**
+ * This structure define the type of device table
+ */
+
+typedef struct
+{
+ /** This member pointes to device name which is a null-terminated string */
+ char *device_name;
+ /** This member is the name length of a device */
+ uint32_t device_name_length;
+ /** major number of a device */
+ rtems_device_major_number major;
+ /** minor number of a device */
+ rtems_device_minor_number minor;
+ /** device creation mode, only device file can be created */
+ mode_t mode;
+
+}rtems_device_name_t;
+
+
+
+/**
+ * This routine associates RTEMS status code with errno
+ */
+
+extern int rtems_deviceio_errno(rtems_status_code code);
+
+
+/**
+ * The following defines the device table size. This values
+ * is configured during application configuration time by
+ * the user. The default value is set to 4.
+ */
+
+extern uint32_t rtems_device_table_size;
+
+
+/**
+ * The following defines the device-only filesystem operating
+ * handlers.
+ */
+
+extern rtems_filesystem_operations_table devFS_ops;
+
+/**
+ * The following defines the device-only filesystem operating
+ * handlers.
+ */
+
+extern rtems_filesystem_file_handlers_r devFS_file_handlers;
+
+
+/**
+ * This handler maps open operation to rtems_io_open.
+ * @param iop This is the RTEMS's internal representation of file.
+ * @param pathname a null-terminated string that starts with /dev.
+ * @param flag access flags
+ * @param mode access mode
+ * @retval the same as open
+ */
+
+int devFS_open(
+ rtems_libio_t *iop,
+ const char *pathname,
+ uint32_t flag,
+ uint32_t mode
+);
+
+
+/**
+ * This handler maps close operation to rtems_io_close.
+ * @param iop This is the RTEMS's internal representation of file
+ * @retval the same as close
+ */
+
+
+int devFS_close(
+ rtems_libio_t *iop
+);
+
+
+/**
+ * This handler maps read operation to rtems_io_read.
+ * @param iop This is the RTEMS's internal representation of file
+ * @param buffer memory location to store read data
+ * @param count how many bytes to read
+ * @retval On successful, this routine returns total bytes read. On error
+ * it returns -1 and errno is set to proper value.
+ */
+
+ssize_t devFS_read(
+ rtems_libio_t *iop,
+ void *buffer,
+ size_t count
+);
+
+
+/**
+ * This handler maps write operation to rtems_io_write.
+ * @param iop This is the RTEMS's internal representation of file
+ * @param buffer data to be written
+ * @param count how many bytes to write
+ * @retval On successful, this routine returns total bytes written. On error
+ * it returns -1 and errno is set to proper value.
+ */
+
+ssize_t devFS_write(
+ rtems_libio_t *iop,
+ const void *buffer,
+ size_t count
+);
+
+
+/**
+ * This handler maps ioctl operation to rtems_io_ioctl.
+ * @param iop This is the RTEMS's internal representation of file
+ * @param command io control command
+ * @param buffer io control parameters
+ * @retval On successful, this routine returns total bytes written. On error
+ * it returns -1 and errno is set to proper value.
+ */
+
+int devFS_ioctl(
+ rtems_libio_t *iop,
+ uint32_t command,
+ void *buffer
+);
+
+
+
+
+/**
+ * This handler gets the device file information. This routine only set the following member of struct stat:
+ * st_dev : device number
+ * st_mode: device file creation mode, only two mode are accepted:
+ * S_IFCHR: character device file
+ * S_IFBLK: block device file
+ * @param loc contains filesystem access information
+ * @param buf buffer to hold the device file's information
+ * @retval On successful, this routine returns 0. On error
+ * it returns -1 and errno is set to proper value.
+ */
+
+int devFS_stat(
+ rtems_filesystem_location_info_t *loc,
+ struct stat *buf
+);
+
+
+
+/**
+ * This routine is invoked upon determination of a node type.
+ * Since this is a device-only filesystem, so there is only
+ * one node type in the system.
+ *
+ * @param pathloc contains filesytem access information, this
+ * parameter is ignored
+ * @retval always returns RTEMS_FILESYSTEM_DEVICE
+ */
+
+int devFS_node_type(
+ rtems_filesystem_location_info_t *pathloc
+);
+
+
+
+/**
+ * This routine is invoked to determine if 'pathname' exists.
+ * This routine first check access flags, then it searches
+ * the device table to get the information.
+ *
+ * @param pathname device name to be searched
+ * @param flags access flags
+ * @param pathloc contains filesystem access information
+ * @retval upon success(pathname exists), this routines
+ * returns 0; if 'flag' is invalid, it returns -1 and errno
+ * is set to EIO; otherwise, it returns -1 and errno is set to ENOENT
+ */
+
+int devFS_evaluate_path(
+ const char *pathname,
+ int flags,
+ rtems_filesystem_location_info_t *pathloc
+);
+
+
+/**
+ * This routine is given a path to evaluate and a valid start
+ * location. It is responsible for finding the parent node for
+ * a requested make command, setting pathloc information to
+ * identify the parent node, and setting the name pointer to
+ * the first character of the name of the new node. In device
+ * only filesystem, devices do not has a tree hierarchy, there
+ * are no parent-child relationship. So this routine is rather
+ * simple, it just set *name to path and returns
+ *
+ * @param path device path to be evaluated
+ * @param pathloc contains filesystem access information, this
+ * parameter is ignored
+ * @param name
+ * @retval always returns 0
+ */
+
+int devFS_evaluate_for_make(
+ const char *path,
+ rtems_filesystem_location_info_t *pathloc,
+ const char **name
+);
+
+
+
+/**
+ * This routine is invoked upon registration of a new device
+ * file. It is responsible for creating a item in the main
+ * device table. This routine searches the device table in
+ * sequential order, when found a empty slot, it fills the slot
+ * with proper values.
+ *
+ * @param path the device file name to be registered
+ * @param mode file mode, this parameter is ignored
+ * @param dev device major and minor number
+ * @param pathloc contains filesystem access information
+ * @retval upon success, this routine returns 0; if 'path'
+ * already exist, it returns -1 and errno is set to EEXIST;
+ * if device table is full, it returns -1 and errno is set
+ * to ENOMEM
+ */
+
+int devFS_mknod(
+ const char *path,
+ mode_t mode,
+ dev_t dev,
+ rtems_filesystem_location_info_t *pathloc
+);
+
+
+/**
+ * This routine is invoked upon rtems filesystem initialization.
+ * It is responsible for creating the main device table,
+ * initializing it to a known state, and set device file operation
+ * handlers. After this, the device-only filesytem is ready for use
+ *
+ * @param temp_mt_entry
+ * @retval upon success, this routine returns 0; otherwise it returns
+ * -1 and errno is set to proper value. The only error is when malloc
+ * failed, and errno is set to NOMEM.
+ */
+
+int devFS_initialize(
+ rtems_filesystem_mount_table_entry_t *temp_mt_entry
+);
+
+
+/**
+ * This routine retrieves all the device registered in system, and
+ * prints out their detail information. For example, on one system,
+ * devFS_show will print out following message:
+ *
+ * /dev/console 0 0
+ * /dev/clock 1 0
+ * /dev/tty0 0 0
+ * /flash 2 0
+ *
+ * This routine is intended for debugging, and can be used by shell
+ * program to provide user with the system information.
+ *
+ * @param none
+ * @retval 0
+ */
+
+int devFS_Show(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/cpukit/libfs/src/devfs/devfs_eval.c b/cpukit/libfs/src/devfs/devfs_eval.c
new file mode 100644
index 0000000000..8f7fb90c87
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devfs_eval.c
@@ -0,0 +1,65 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/seterr.h>
+#include <fcntl.h>
+#include <assert.h>
+#include "devfs.h"
+
+int devFS_evaluate_path(
+ const char *pathname,
+ int flags,
+ rtems_filesystem_location_info_t *pathloc
+)
+{
+ int i;
+ rtems_device_name_t *device_name_table;
+
+ /* see if 'flags' is valid */
+ if ( !rtems_libio_is_valid_perms( flags ) ) {
+ assert( 0 );
+ rtems_set_errno_and_return_minus_one( EIO );
+ }
+
+ /* get the device name table */
+ device_name_table = (rtems_device_name_t *)pathloc->node_access;
+ if (!device_name_table)
+ rtems_set_errno_and_return_minus_one( EFAULT );
+
+ for (i = 0; i < rtems_device_table_size; i++){
+ if ((device_name_table[i].device_name) &&
+ (strcmp(device_name_table[i].device_name, pathname) == 0)){
+ /* find the device, set proper values */
+ pathloc->node_access = (void *)&device_name_table[i];
+ pathloc->handlers = &devFS_file_handlers;
+ pathloc->ops = &devFS_ops;
+ pathloc->mt_entry = &rtems_filesystem_root;
+ return 0;
+ }
+ }
+ /* no such file or directory */
+ rtems_set_errno_and_return_minus_one( ENOENT );
+}
+
+
+
+int devFS_evaluate_for_make(
+ const char *path,
+ rtems_filesystem_location_info_t *pathloc,
+ const char **name
+)
+{
+ /* we do nothing, just set name to path */
+ *name = path;
+ return 0;
+}
+
diff --git a/cpukit/libfs/src/devfs/devfs_init.c b/cpukit/libfs/src/devfs/devfs_init.c
new file mode 100644
index 0000000000..e54eaa654a
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devfs_init.c
@@ -0,0 +1,87 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/seterr.h>
+#include <stdlib.h>
+#include "devfs.h"
+
+rtems_filesystem_operations_table devFS_ops =
+{
+ devFS_evaluate_path,
+ devFS_evaluate_for_make,
+ NULL,
+ NULL,
+ devFS_node_type,
+ devFS_mknod,
+ NULL,
+ NULL,
+ NULL,
+ devFS_initialize,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+
+rtems_filesystem_file_handlers_r devFS_file_handlers =
+{
+ devFS_open,
+ devFS_close,
+ devFS_read,
+ devFS_write,
+ devFS_ioctl,
+ NULL,
+ devFS_stat,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+
+
+int devFS_initialize(
+ rtems_filesystem_mount_table_entry_t *temp_mt_entry
+)
+{
+ rtems_device_name_t *device_name_table;
+
+ /* allocate device only filesystem name table */
+ device_name_table = (rtems_device_name_t *)_Workspace_Allocate(
+ sizeof( rtems_device_name_t ) * ( rtems_device_table_size )
+ );
+
+ /* no memory for device filesystem */
+ if (!device_name_table)
+ rtems_set_errno_and_return_minus_one( ENOMEM );
+
+ memset(
+ device_name_table, 0,
+ sizeof( rtems_device_name_t ) * ( rtems_device_table_size )
+ );
+
+ /* set file handlers */
+ temp_mt_entry->mt_fs_root.handlers = &devFS_file_handlers;
+ temp_mt_entry->mt_fs_root.ops = &devFS_ops;
+
+ /* Set the node_access to device name table */
+ temp_mt_entry->mt_fs_root.node_access = (void *)device_name_table;
+
+ return 0;
+}
+
diff --git a/cpukit/libfs/src/devfs/devfs_mknod.c b/cpukit/libfs/src/devfs/devfs_mknod.c
new file mode 100644
index 0000000000..6757877efc
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devfs_mknod.c
@@ -0,0 +1,81 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <rtems/seterr.h>
+#include "devfs.h"
+
+int devFS_mknod(
+ const char *path,
+ mode_t mode,
+ dev_t dev,
+ rtems_filesystem_location_info_t *pathloc
+)
+{
+ int i;
+ int slot;
+ rtems_device_name_t *device_name_table;
+ rtems_device_major_number major;
+ rtems_device_minor_number minor;
+ ISR_Level level;
+
+ /*
+ * This is a special case. In rtems_filesystem_initialize,
+ * a special device '/dev' will be created. We check this
+ * condition and do not create the '/dev' and the 'path'
+ * actually passed in is 'dev', not '/dev'. Just return 0 to
+ * indicate we are OK.
+ */
+
+ if ((path[0] == 'd') && (path[1] == 'e') &&
+ (path[2] == 'v') && (path[3] == '\0'))
+ return 0;
+
+ /* must be a character device or a block device */
+ if (!S_ISBLK(mode) && !S_ISCHR(mode))
+ rtems_set_errno_and_return_minus_one( EINVAL );
+ else
+ rtems_filesystem_split_dev_t(dev, major, minor);
+
+ /* Find an empty slot in device name table */
+ device_name_table = (rtems_device_name_t *)pathloc->node_access;
+ if (!device_name_table)
+ rtems_set_errno_and_return_minus_one( EFAULT );
+
+ for (slot = -1, i = 0; i < rtems_device_table_size; i++){
+ if (device_name_table[i].device_name == NULL)
+ slot = i;
+ else
+ if (strcmp(path, device_name_table[i].device_name) == 0)
+ rtems_set_errno_and_return_minus_one( EEXIST );
+ }
+
+ if (slot == -1)
+ rtems_set_errno_and_return_minus_one( ENOMEM );
+
+ _ISR_Disable(level);
+ device_name_table[slot].device_name = (char *)path;
+ device_name_table[slot].device_name_length = strlen(path);
+ device_name_table[slot].major = major;
+ device_name_table[slot].minor = minor;
+ device_name_table[slot].mode = mode;
+ _ISR_Enable(level);
+
+ return 0;
+}
+
diff --git a/cpukit/libfs/src/devfs/devfs_node_type.c b/cpukit/libfs/src/devfs/devfs_node_type.c
new file mode 100644
index 0000000000..37b7052459
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devfs_node_type.c
@@ -0,0 +1,26 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "devfs.h"
+
+int devFS_node_type(
+ rtems_filesystem_location_info_t *pathloc
+)
+{
+ /*
+ * There is only one type of node: device
+ */
+
+ return RTEMS_FILESYSTEM_DEVICE;
+}
+
+
diff --git a/cpukit/libfs/src/devfs/devfs_show.c b/cpukit/libfs/src/devfs/devfs_show.c
new file mode 100644
index 0000000000..026e3e4d69
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devfs_show.c
@@ -0,0 +1,35 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "devfs.h"
+
+int devFS_Show(void)
+{
+ int i;
+ rtems_filesystem_location_info_t *temp_loc;
+ rtems_device_name_t *device_name_table;
+
+ temp_loc = &rtems_filesystem_root;
+ device_name_table = (rtems_device_name_t *)temp_loc->node_access;
+ if (!device_name_table)
+ rtems_set_errno_and_return_minus_one( EFAULT );
+
+ for (i = 0; i < rtems_device_table_size; i++){
+ if (device_name_table[i].device_name){
+ printk("/%s %d %d\n", device_name_table[i].device_name,
+ device_name_table[i].major, device_name_table[i].minor);
+ }
+ }
+ return 0;
+}
+
+
diff --git a/cpukit/libfs/src/devfs/devioctl.c b/cpukit/libfs/src/devfs/devioctl.c
new file mode 100644
index 0000000000..9f3ec47e41
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devioctl.c
@@ -0,0 +1,45 @@
+#if HAVE_CONFIG_H
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/io.h>
+
+#include "devfs.h"
+
+int devFS_ioctl(
+ rtems_libio_t *iop,
+ uint32_t command,
+ void *buffer
+)
+{
+ rtems_libio_ioctl_args_t args;
+ rtems_status_code status;
+ rtems_driver_name_t *np;
+
+ np = (rtems_device_name_t *)iop->file_info;
+
+ args.iop = iop;
+ args.command = command;
+ args.buffer = buffer;
+
+ status = rtems_io_control(
+ np->major,
+ np->minor,
+ (void *) &args
+ );
+
+ if ( status )
+ return rtems_deviceio_errno(status);
+
+ return args.ioctl_return;
+}
+
diff --git a/cpukit/libfs/src/devfs/devopen.c b/cpukit/libfs/src/devfs/devopen.c
new file mode 100644
index 0000000000..db9a9a7aec
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devopen.c
@@ -0,0 +1,44 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/io.h>
+
+#include "devfs.h"
+
+int devFS_open(
+ rtems_libio_t *iop,
+ const char *pathname,
+ uint32_t flag,
+ uint32_t mode
+)
+{
+ rtems_libio_open_close_args_t args;
+ rtems_status_code status;
+ rtems_driver_name_t *np;
+
+ np = (rtems_device_name_t *)iop->file_info;
+
+ args.iop = iop;
+ args.flags = iop->flags;
+ args.mode = mode;
+
+ status = rtems_io_open(
+ np->major,
+ np->minor,
+ (void *) &args
+ );
+ if ( status )
+ return rtems_deviceio_errno(status);
+
+ return 0;
+}
diff --git a/cpukit/libfs/src/devfs/devread.c b/cpukit/libfs/src/devfs/devread.c
new file mode 100644
index 0000000000..d532ba3d33
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devread.c
@@ -0,0 +1,48 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/io.h>
+
+#include "devfs.h"
+
+ssize_t devFS_read(
+ rtems_libio_t *iop,
+ void *buffer,
+ size_t count
+)
+{
+ rtems_libio_rw_args_t args;
+ rtems_status_code status;
+ rtems_driver_name_t *np;
+
+ np = (rtems_device_name_t *)iop->file_info;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ status = rtems_io_read(
+ np->major,
+ np->minor,
+ (void *) &args
+ );
+
+ if ( status )
+ return rtems_deviceio_errno(status);
+
+ return (ssize_t) args.bytes_moved;
+}
+
diff --git a/cpukit/libfs/src/devfs/devstat.c b/cpukit/libfs/src/devfs/devstat.c
new file mode 100644
index 0000000000..6c6ee3e6b1
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devstat.c
@@ -0,0 +1,40 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/io.h>
+#include <rtems/seterr.h>
+#include <rtems/libio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "devfs.h"
+
+int devFS_stat(
+ rtems_filesystem_location_info_t *loc,
+ struct stat *buf
+)
+{
+ rtems_device_name_t *the_dev;
+
+ the_dev = (rtems_device_name_t *)loc->node_access;
+ if (!the_dev)
+ rtems_set_errno_and_return_minus_one( EFAULT );
+
+ buf->st_dev = rtems_filesystem_make_dev_t( the_dev->major, the_dev->minor );
+
+ buf->st_mode = the_dev->mode;
+
+ return 0;
+}
+
+
diff --git a/cpukit/libfs/src/devfs/devwrite.c b/cpukit/libfs/src/devfs/devwrite.c
new file mode 100644
index 0000000000..bc0822251c
--- /dev/null
+++ b/cpukit/libfs/src/devfs/devwrite.c
@@ -0,0 +1,48 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/io.h>
+
+#include "devfs.h"
+
+ssize_t devFS_write(
+ rtems_libio_t *iop,
+ const void *buffer,
+ size_t count
+)
+{
+ rtems_libio_rw_args_t args;
+ rtems_status_code status;
+ rtems_driver_name_t *np;
+
+ np = (rtems_device_name_t *)iop->file_info;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = (void *) buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ status = rtems_io_write(
+ np->major,
+ np->minor,
+ (void *) &args
+ );
+
+ if ( status )
+ return rtems_deviceio_errno(status);
+
+ return (ssize_t) args.bytes_moved;
+}
+
diff --git a/cpukit/libfs/src/imfs/deviceerrno.c b/cpukit/libfs/src/imfs/deviceerrno.c
new file mode 100644
index 0000000000..9a3251f7c5
--- /dev/null
+++ b/cpukit/libfs/src/imfs/deviceerrno.c
@@ -0,0 +1,57 @@
+/*
+ * IMFS Device Node Handlers
+ *
+ * This file contains the set of handlers used to map operations on
+ * IMFS device nodes onto calls to the RTEMS Classic API IO Manager.
+ *
+ * COPYRIGHT (c) 1989-2008.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <rtems/assoc.h> /* assoc.h not included by rtems.h */
+#include <errno.h>
+
+/*
+ * Convert RTEMS status to a UNIX errno
+ */
+
+const rtems_assoc_t errno_assoc[] = {
+ { "OK", RTEMS_SUCCESSFUL, 0 },
+ { "BUSY", RTEMS_RESOURCE_IN_USE, EBUSY },
+ { "INVALID NAME", RTEMS_INVALID_NAME, EINVAL },
+ { "NOT IMPLEMENTED", RTEMS_NOT_IMPLEMENTED, ENOSYS },
+ { "TIMEOUT", RTEMS_TIMEOUT, ETIMEDOUT },
+ { "NO MEMORY", RTEMS_NO_MEMORY, ENOMEM },
+ { "NO DEVICE", RTEMS_UNSATISFIED, ENODEV },
+ { "INVALID NUMBER", RTEMS_INVALID_NUMBER, EBADF},
+ { "NOT RESOURCE OWNER", RTEMS_NOT_OWNER_OF_RESOURCE, EPERM},
+ { "IO ERROR", RTEMS_IO_ERROR, EIO},
+ { 0, 0, 0 },
+};
+
+int
+rtems_deviceio_errno(rtems_status_code code)
+{
+ int rc;
+
+ if ((rc = rtems_assoc_remote_by_local(errno_assoc, (uint32_t ) code)))
+ {
+ errno = rc;
+ return -1;
+ }
+ return -1;
+}
+
+
diff --git a/cpukit/libfs/src/imfs/deviceio.c b/cpukit/libfs/src/imfs/deviceio.c
index 5d8c383b89..6bf46066e2 100644
--- a/cpukit/libfs/src/imfs/deviceio.c
+++ b/cpukit/libfs/src/imfs/deviceio.c
@@ -4,7 +4,7 @@
* This file contains the set of handlers used to map operations on
* IMFS device nodes onto calls to the RTEMS Classic API IO Manager.
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
diff --git a/cpukit/preinstall.am b/cpukit/preinstall.am
index 7c5cc69b3f..3977050929 100644
--- a/cpukit/preinstall.am
+++ b/cpukit/preinstall.am
@@ -146,6 +146,10 @@ $(PROJECT_INCLUDE)/rtems/imfs.h: libfs/src/imfs/imfs.h $(PROJECT_INCLUDE)/rtems/
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/imfs.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/imfs.h
+$(PROJECT_INCLUDE)/rtems/devfs.h: libfs/src/devfs/devfs.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/devfs.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/devfs.h
+
if LIBDOSFS
$(PROJECT_INCLUDE)/rtems/dosfs.h: libfs/src/dosfs/dosfs.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/dosfs.h
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index acc03b7434..aeb149fc6a 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -72,6 +72,37 @@ extern rtems_configuration_table Configuration;
#define CONFIGURE_NEWLIB_EXTENSION 0
#endif
+
+#include <rtems/libio.h>
+
+#ifdef CONFIGURE_INIT
+rtems_libio_init_functions_t rtems_libio_init_helper =
+ #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
+ NULL;
+ #else
+ rtems_libio_init;
+ #endif
+
+rtems_libio_supp_functions_t rtems_libio_supp_helper =
+ #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
+ NULL;
+ #else
+ open_dev_console;
+ #endif
+
+rtems_fs_init_functions_t rtems_fs_init_helper =
+ #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
+ NULL;
+ #else
+ rtems_filesystem_initialize;
+ #endif
+#endif
+
+
+#ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
+ #define CONFIGURE_HAS_OWN_MOUNT_TABLE
+#endif
+
/**
* This macro defines the number of POSIX file descriptors allocated
* and managed by libio. These are the "integer" file descriptors that
@@ -138,6 +169,22 @@ extern rtems_configuration_table Configuration;
extern int rtems_telnetd_maximum_ptys;
#endif
+#ifdef CONFIGURE_INIT
+ #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
+ extern uint32_t rtems_device_table_size;
+ #define CONFIGURE_MEMORY_FOR_DEVFS 0
+ #elif defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
+ #ifndef CONFIGURE_MAXIMUM_DEVICES
+ #define CONFIGURE_MAXIMUM_DEVICES 4
+ #endif
+ #include <rtems/devfs.h>
+ uint32_t rtems_device_table_size = CONFIGURE_MAXIMUM_DEVICES;
+ #define CONFIGURE_MEMORY_FOR_DEVFS _Configure_Object_RAM(CONFIGURE_MAXIMUM_DEVICES, sizeof (rtems_device_name_t))
+ #else
+ #define CONFIGURE_MEMORY_FOR_DEVFS 0
+ #endif
+#endif
+
/*
* Mount Table Configuration
*/
@@ -162,6 +209,8 @@ extern rtems_configuration_table Configuration;
const rtems_filesystem_mount_table_t configuration_mount_table = {
#ifdef CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
&IMFS_ops,
+ #elif defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
+ &devFS_ops,
#else /* using miniIMFS as base filesystem */
&miniIMFS_ops,
#endif
@@ -574,16 +623,6 @@ extern rtems_configuration_table Configuration;
#define CONFIGURE_MAXIMUM_DRIVERS CONFIGURE_NUMBER_OF_DRIVERS
#endif
-/**
- * Default the number of devices per device driver. This value may be
- * overridden by the user.
- *
- * @note This configuration parameter is obsolete. Thus we will warn the
- * user that it is obsolete.
- */
-#ifdef CONFIGURE_MAXIMUM_DEVICES
- #warning "CONFIGURE_MAXIMUM_DEVICES is obsolete. Do not use any longer."
-#endif
#ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
/*
@@ -1681,6 +1720,7 @@ extern rtems_configuration_table Configuration;
#define CONFIGURE_EXECUTIVE_RAM_SIZE \
(( \
CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD + \
+ CONFIGURE_MEMORY_FOR_DEVFS + \
CONFIGURE_MEMORY_FOR_TASKS( \
CONFIGURE_TOTAL_TASKS_AND_THREADS, CONFIGURE_TOTAL_TASKS_AND_THREADS) + \
CONFIGURE_MEMORY_FOR_CLASSIC + \