diff options
Diffstat (limited to '')
36 files changed, 1769 insertions, 566 deletions
diff --git a/c/src/exec/libcsupport/include/clockdrv.h b/c/src/exec/libcsupport/include/clockdrv.h index aad9bd6d3b..258c590e0d 100644 --- a/c/src/exec/libcsupport/include/clockdrv.h +++ b/c/src/exec/libcsupport/include/clockdrv.h @@ -23,31 +23,24 @@ extern "C" { /* variables */ extern volatile rtems_unsigned32 Clock_driver_ticks; +extern rtems_device_major_number rtems_clock_major; +extern rtems_device_minor_number rtems_clock_minor; -/* functions */ - -rtems_task Exit_task(); -void exit_task_init(); - -void Install_clock( rtems_isr_entry ); -void ReInstall_clock( rtems_isr_entry ); -void Clock_exit(); - -rtems_isr Clock_isr( - rtems_vector_number -); - -/* driver entries */ +/* default clock driver entry */ #define CLOCK_DRIVER_TABLE_ENTRY \ - { Clock_initialize, NULL, NULL, NULL, NULL, NULL } - + { Clock_initialize, NULL, NULL, NULL, NULL, Clock_control } + rtems_device_driver Clock_initialize( rtems_device_major_number, rtems_device_minor_number, - void *, - rtems_id, - rtems_unsigned32 * + void * +); + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp ); #ifdef __cplusplus diff --git a/c/src/exec/libcsupport/include/rtems/assoc.h b/c/src/exec/libcsupport/include/rtems/assoc.h new file mode 100644 index 0000000000..c820cfa973 --- /dev/null +++ b/c/src/exec/libcsupport/include/rtems/assoc.h @@ -0,0 +1,44 @@ +/* + * @(#)assoc.h 1.2 - 95/06/28 + * + * + * Rtems associativity routines. Mainly used to convert a value from + * one space to another (eg: our errno's to host errno's and v.v) + * + * + * $Id$ + */ + +#ifndef _INCLUDE_ASSOC_H +#define _INCLUDE_ASSOC_H + +typedef struct { + char *name; + unsigned32 local_value; + unsigned32 remote_value; +} rtems_assoc_t; + +/* + * Flag/marker for optional default value in each table + */ + +#define RTEMS_ASSOC_DEFAULT_NAME "(default)" + +rtems_assoc_t *rtems_assoc_ptr_by_name(rtems_assoc_t *, char *); +rtems_assoc_t *rtems_assoc_ptr_by_value(rtems_assoc_t *, unsigned32); +rtems_assoc_t *rtems_assoc_ptr_by_remote(rtems_assoc_t *, unsigned32); + +unsigned32 rtems_assoc_remote_by_local(rtems_assoc_t *, unsigned32); +unsigned32 rtems_assoc_local_by_remote(rtems_assoc_t *, unsigned32); +unsigned32 rtems_assoc_remote_by_name(rtems_assoc_t *, char *); +unsigned32 rtems_assoc_local_by_name(rtems_assoc_t *, char *); +char *rtems_assoc_name_by_local(rtems_assoc_t *, unsigned32); +char *rtems_assoc_name_by_remote(rtems_assoc_t *, unsigned32); + +unsigned32 rtems_assoc_remote_by_local_bitfield(rtems_assoc_t *, unsigned32); +char *rtems_assoc_name_by_local_bitfield(rtems_assoc_t *, unsigned32, char *); +char *rtems_assoc_name_by_remote_bitfield(rtems_assoc_t *, unsigned32, char *); +unsigned32 rtems_assoc_local_by_remote_bitfield(rtems_assoc_t *ap, unsigned32); + + +#endif /* ! _INCLUDE_ASSOC_H */ diff --git a/c/src/exec/libcsupport/include/rtems/error.h b/c/src/exec/libcsupport/include/rtems/error.h new file mode 100644 index 0000000000..a41f0aa534 --- /dev/null +++ b/c/src/exec/libcsupport/include/rtems/error.h @@ -0,0 +1,26 @@ +/* + * @(#)error.h 1.1 - 95/08/02 + * + * + * Defines and externs for rtems error reporting + * + * $Id$ + */ + +/* + * rtems_error() and rtems_panic() support + */ + +#define RTEMS_ERROR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */ +#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */ +#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */ + +#define RTEMS_ERROR_MASK (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \ + RTEMS_ERROR_PANIC) /* all */ + +char *rtems_status_text(rtems_status_code); +int rtems_error(int error_code, char *printf_format, ...); +void rtems_panic(char *printf_format, ...); + +extern int rtems_panic_in_progress; + diff --git a/c/src/exec/libcsupport/include/rtems/libio.h b/c/src/exec/libcsupport/include/rtems/libio.h new file mode 100644 index 0000000000..f80a1954a3 --- /dev/null +++ b/c/src/exec/libcsupport/include/rtems/libio.h @@ -0,0 +1,101 @@ +/* + * @(#)libio.h 1.1 - 95/06/02 + * + * + * General purpose communication channel for RTEMS to allow UNIX/POSIX + * system call behavior on top of RTEMS IO devices. + * + * TODO + * stat(2) + * unlink(2) + * rename(2) + * + * $Id$ + */ + +#ifndef _RTEMS_LIBIO_H +#define _RTEMS_LIBIO_H + +typedef unsigned32 rtems_libio_offset_t; + +/* + * An open file data structure, indexed by 'fd' + * TODO: + * should really have a separate per/file data structure that this + * points to (eg: size, offset, driver, pathname should be in that) + */ + +typedef struct { + rtems_driver_name_t *driver; + rtems_libio_offset_t size; /* size of file */ + rtems_libio_offset_t offset; /* current offset into the file */ + unsigned32 flags; + char *pathname; /* opened pathname */ + Objects_Id sem; + unsigned32 data0; /* private to "driver" */ + unsigned32 data1; /* ... */ +} rtems_libio_t; + + +/* + * param block for read/write + * Note: it must include 'offset' instead of using iop's offset since + * we can have multiple outstanding i/o's on a device. + */ + +typedef struct { + rtems_libio_t *iop; + rtems_libio_offset_t offset; + unsigned8 *buffer; + unsigned32 count; + unsigned32 flags; + unsigned32 bytes_moved; +} rtems_libio_rw_args_t; + +/* + * param block for open/close + */ + +typedef struct { + rtems_libio_t *iop; + unsigned32 flags; + unsigned32 mode; +} rtems_libio_open_close_args_t; + +/* + * param block for ioctl + */ + +typedef struct { + rtems_libio_t *iop; + unsigned32 command; + void *buffer; + unsigned32 ioctl_return; +} rtems_libio_ioctl_args_t; + + +/* + * Values for 'flag' + */ + +#define LIBIO_FLAGS_NO_DELAY 0x0001 /* return immediately if no data */ +#define LIBIO_FLAGS_READ 0x0002 /* reading */ +#define LIBIO_FLAGS_WRITE 0x0004 /* writing */ +#define LIBIO_FLAGS_LINE_BUFFERED 0x0008 /* line buffered io (^h, ^u, etc) */ +#define LIBIO_FLAGS_OPEN 0x0100 /* device is open */ +#define LIBIO_FLAGS_APPEND 0x0200 /* all writes append */ +#define LIBIO_FLAGS_CREATE 0x0400 /* create file */ + +#define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE) + +void rtems_libio_config(rtems_configuration_table *config, unsigned32 max_fds); +void rtems_libio_init(void); + +int __open(const char *pathname, unsigned32 flag, unsigned32 mode); +int __close(int fd); +int __read(int fd, void *buffer, unsigned32 count); +int __write(int fd, const void *buffer, unsigned32 count); +int __ioctl(int fd, unsigned32 command, void *buffer); +int __lseek(int fd, rtems_libio_offset_t offset, int whence); + +#endif /* _RTEMS_LIBIO_H */ diff --git a/c/src/exec/libcsupport/src/assoc.c b/c/src/exec/libcsupport/src/assoc.c new file mode 100644 index 0000000000..c18359ef8a --- /dev/null +++ b/c/src/exec/libcsupport/src/assoc.c @@ -0,0 +1,258 @@ +/* + * @(#)assoc.c 1.4 - 95/08/02 + * + * + * assoc.c + * rtems assoc routines + * + * $Id$ + */ + + +#include <rtems.h> +#include "assoc.h" + +#include <stdio.h> /* sprintf */ +#include <string.h> /* strcat, strcmp */ + +#define STREQ(a,b) (strcmp((a), (b)) == 0) +#define rtems_assoc_is_default(ap) ((ap)->name && STREQ(ap->name, RTEMS_ASSOC_DEFAULT_NAME)) + +rtems_assoc_t * +rtems_assoc_ptr_by_name( + rtems_assoc_t *ap, + char *name + ) +{ + rtems_assoc_t *default_ap = 0; + + if (rtems_assoc_is_default(ap)) + default_ap = ap++; + + for ( ; ap->name; ap++) + if (strcmp(ap->name, name) == 0) + return ap; + + return default_ap; +} + +rtems_assoc_t * +rtems_assoc_ptr_by_local( + rtems_assoc_t *ap, + unsigned32 local_value + ) +{ + rtems_assoc_t *default_ap = 0; + + if (rtems_assoc_is_default(ap)) + default_ap = ap++; + + for ( ; ap->name; ap++) + if (ap->local_value == local_value) + return ap; + + return default_ap; +} + + +rtems_assoc_t * +rtems_assoc_ptr_by_remote( + rtems_assoc_t *ap, + unsigned32 remote_value + ) +{ + rtems_assoc_t *default_ap = 0; + + if (rtems_assoc_is_default(ap)) + default_ap = ap++; + + for ( ; ap->name; ap++) + if (ap->remote_value == remote_value) + return ap; + + return default_ap; +} + + +/* + * Get values + */ + +unsigned32 +rtems_assoc_remote_by_local( + rtems_assoc_t *ap, + unsigned32 local_value + ) +{ + rtems_assoc_t *nap; + nap = rtems_assoc_ptr_by_local(ap, local_value); + if (nap) + return nap->remote_value; + + return 0; +} + +unsigned32 +rtems_assoc_local_by_remote( + rtems_assoc_t *ap, + unsigned32 remote_value + ) +{ + rtems_assoc_t *nap; + nap = rtems_assoc_ptr_by_remote(ap, remote_value); + if (nap) + return nap->local_value; + + return 0; +} + +unsigned32 +rtems_assoc_remote_by_name( + rtems_assoc_t *ap, + char *name + ) +{ + rtems_assoc_t *nap; + nap = rtems_assoc_ptr_by_name(ap, name); + if (nap) + return nap->remote_value; + + return 0; +} + +unsigned32 +rtems_assoc_local_by_name( + rtems_assoc_t *ap, + char *name + ) +{ + rtems_assoc_t *nap; + nap = rtems_assoc_ptr_by_name(ap, name); + if (nap) + return nap->local_value; + + return 0; +} + +/* + * what to return if a value is not found + * this is not reentrant, but it really shouldn't be invoked anyway + */ + +char * +rtems_assoc_name_bad( + unsigned32 bad_value +) +{ + static char bad_buffer[32]; + + sprintf(bad_buffer, "< %d [0x%x] >", bad_value, bad_value); + return bad_buffer; +} + + +char * +rtems_assoc_name_by_local( + rtems_assoc_t *ap, + unsigned32 local_value + ) +{ + rtems_assoc_t *nap; + nap = rtems_assoc_ptr_by_local(ap, local_value); + if (nap) + return nap->name; + + return rtems_assoc_name_bad(local_value); +} + +char * +rtems_assoc_name_by_remote( + rtems_assoc_t *ap, + unsigned32 remote_value + ) +{ + rtems_assoc_t *nap; + nap = rtems_assoc_ptr_by_remote(ap, remote_value); + if (nap) + return nap->name; + + return rtems_assoc_name_bad(remote_value); +} + +/* + * Bitfield functions assume just 1 bit set in each of remote and local + * entries; they do not check for this. + */ + +unsigned32 rtems_assoc_remote_by_local_bitfield( + rtems_assoc_t *ap, + unsigned32 local_value + ) +{ + unsigned32 b; + unsigned32 remote_value = 0; + + for (b = 1; b; b <<= 1) + if (b & local_value) + remote_value |= rtems_assoc_remote_by_local(ap, b); + + return remote_value; +} + + +unsigned32 rtems_assoc_local_by_remote_bitfield( + rtems_assoc_t *ap, + unsigned32 remote_value + ) +{ + unsigned32 b; + unsigned32 local_value = 0; + + for (b = 1; b; b <<= 1) + if (b & remote_value) + local_value |= rtems_assoc_local_by_remote(ap, b); + + return local_value; +} + +char *rtems_assoc_name_by_remote_bitfield( + rtems_assoc_t *ap, + unsigned32 value, + char *buffer + ) +{ + unsigned32 b; + + *buffer = 0; + + for (b = 1; b; b <<= 1) + if (b & value) + { + if (*buffer) + strcat(buffer, " "); + strcat(buffer, rtems_assoc_name_by_remote(ap, b)); + } + + return buffer; +} + +char *rtems_assoc_name_by_local_bitfield( + rtems_assoc_t *ap, + unsigned32 value, + char *buffer + ) +{ + unsigned32 b; + + *buffer = 0; + + for (b = 1; b; b <<= 1) + if (b & value) + { + if (*buffer) + strcat(buffer, " "); + strcat(buffer, rtems_assoc_name_by_local(ap, b)); + } + + return buffer; +} diff --git a/c/src/exec/libcsupport/src/error.c b/c/src/exec/libcsupport/src/error.c new file mode 100644 index 0000000000..8cf46f0565 --- /dev/null +++ b/c/src/exec/libcsupport/src/error.c @@ -0,0 +1,212 @@ +/* + * @(#)error.c 1.2 - 95/08/02 + * + * + * report errors and panics to RTEMS' stderr. + * Currently just used by RTEMS monitor. + * + * + * $Id$ + */ + + +/* + * These routines provide general purpose error reporting. + * rtems_error reports an error to stderr and allows use of + * printf style formatting. A newline is appended to all messages. + * + * error_flag can be specified as any of the following: + * + * RTEMS_ERROR_ERRNO -- include errno text in output + * RTEMS_ERROR_PANIC -- halts local system after output + * RTEMS_ERROR_ABORT -- abort after output + * + * It can also include a rtems_status value which can be OR'd + * with the above flags. * + * + * EXAMPLE + * #include <rtems.h> + * #include <rtems/error.h> + * rtems_error(0, "stray interrupt %d", intr); + * + * EXAMPLE + * if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL) + * { + * rtems_error(status | RTEMS_ERROR_ABORT, + * "could not create task"); + * } + * + * EXAMPLE + * if ((fd = open(pathname, O_RDNLY)) < 0) + * { + * rtems_error(FLOSS_ERROR_ERRNO, "open of '%s' failed", pathname); + * goto failed; + * } + */ + +#include <rtems.h> + +#include "error.h" +#include "assoc.h" + +#include <stdio.h> +#include <stdarg.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> /* _exit() */ + +/* bug in hpux <errno.h>: no prototypes unless you are C++ */ +#ifdef hpux9 +char *strerror(int); +#endif + +extern char *rtems_progname; +int rtems_panic_in_progress; + +rtems_assoc_t rtems_status_assoc[] = { + { "successful completion", RTEMS_SUCCESSFUL, }, + { "returned from a thread", RTEMS_TASK_EXITTED, }, + { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, }, + { "invalid object name", RTEMS_INVALID_NAME, }, + { "invalid object id", RTEMS_INVALID_ID, }, + { "too many", RTEMS_TOO_MANY, }, + { "timed out waiting", RTEMS_TIMEOUT, }, + { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, }, + { "specified size was invalid", RTEMS_INVALID_SIZE, }, + { "address specified is invalid", RTEMS_INVALID_ADDRESS, }, + { "number was invalid", RTEMS_INVALID_NUMBER, }, + { "item has not been initialized", RTEMS_NOT_DEFINED, }, + { "resources still outstanding", RTEMS_RESOURCE_IN_USE, }, + { "request not satisfied", RTEMS_UNSATISFIED, }, + { "thread is in wrong state", RTEMS_INCORRECT_STATE, }, + { "thread already in state", RTEMS_ALREADY_SUSPENDED, }, + { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, }, + { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, }, + { "called from wrong environment", RTEMS_CALLED_FROM_ISR, }, + { "invalid thread priority", RTEMS_INVALID_PRIORITY, }, + { "invalid date/time", RTEMS_INVALID_CLOCK, }, + { "invalid node id", RTEMS_INVALID_NODE, }, + { "directive not configured", RTEMS_NOT_CONFIGURED, }, + { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , }, + { "directive not implemented", RTEMS_NOT_IMPLEMENTED, }, + { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, }, + { "internal multiprocessing only", RTEMS_PROXY_BLOCKING, }, + { "could not get enough memory", RTEMS_NO_MEMORY, }, + { 0, 0, 0 }, +}; + + +char * +rtems_status_text( + rtems_status_code status +) +{ + return rtems_assoc_name_by_local(rtems_status_assoc, status); +} + + +static int rtems_verror( + unsigned32 error_flag, + char *printf_format, + va_list arglist +) +{ + int local_errno = 0; + int chars_written = 0; + rtems_status_code status; + + if (error_flag & RTEMS_ERROR_PANIC) + { + rtems_panic_in_progress++; + + /* disable task switches */ + _Thread_Disable_dispatch(); + + /* don't aggravate things */ + if (rtems_panic_in_progress > 2) + return 0; + } + + (void) fflush(stdout); /* in case stdout/stderr same */ + + status = error_flag & ~RTEMS_ERROR_MASK; + if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ + local_errno = errno; + + if (_Configuration_Is_multiprocessing()) + fprintf(stderr, "[%d] ", _Configuration_MP_table->node); + + if (rtems_progname && *rtems_progname) + chars_written += fprintf(stderr, "%s: ", rtems_progname); + chars_written += vfprintf(stderr, printf_format, arglist); + + if (status) + chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); + + if (local_errno) + if ((local_errno > 0) && *strerror(local_errno)) + chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); + else + chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); + + chars_written += fprintf(stderr, "\n"); + + (void) fflush(stderr); + + if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT)) + { + if (error_flag & RTEMS_ERROR_PANIC) + { + rtems_error(0, "fatal error, exiting"); + _exit(local_errno); + } + else + { + rtems_error(0, "fatal error, aborting"); + abort(); + } + } + return chars_written; +} + + +/* + * Report an error. + * error_flag is as above; printf_format is a normal + * printf(3) format string, with its concommitant arguments. + * + * Returns the number of characters written. + */ + +int rtems_error( + int error_flag, + char *printf_format, + ... + ) +{ + va_list arglist; + int chars_written; + + va_start(arglist, printf_format); + chars_written = rtems_verror(error_flag, printf_format, arglist); + va_end(arglist); + + return chars_written; +} + +/* + * rtems_panic is shorthand for rtems_error(RTEMS_ERROR_PANIC, ...) + */ + +void rtems_panic( + char *printf_format, + ... + ) +{ + va_list arglist; + + va_start(arglist, printf_format); + (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist); + va_end(arglist); +} diff --git a/c/src/exec/libcsupport/src/libio.c b/c/src/exec/libcsupport/src/libio.c new file mode 100644 index 0000000000..ce41643a09 --- /dev/null +++ b/c/src/exec/libcsupport/src/libio.c @@ -0,0 +1,433 @@ +/* + * @(#)libio.c 1.1 - 95/06/02 + * + * + * Provide UNIX/POSIX-like io system calls for RTEMS using the + * RTEMS IO manager + * + * TODO + * + * $Id$ + */ + +#include <rtems.h> +#include <rtems/assoc.h> /* assoc.h not included by rtems.h */ + +#include <fcntl.h> /* O_RDONLY, et.al. */ +#if defined(solaris2) +#define O_NDELAY O_NONBLOCK +#endif +#include <errno.h> +#include <string.h> /* strcmp */ +#include <unistd.h> +#include <stdlib.h> /* calloc() */ + +#include "libio.h" /* libio.h not pulled in by rtems */ + +/* + * Semaphore to protect the io table + */ + +Objects_Id rtems_libio_semaphore; + +#define RTEMS_LIBIO_SEM rtems_build_name('L', 'B', 'I', 'O') +#define RTEMS_LIBIO_IOP_SEM(n) rtems_build_name('L', 'B', 'I', n) + +unsigned32 rtems_libio_number_iops; +rtems_libio_t *rtems_libio_iops; +rtems_libio_t *rtems_libio_last_iop; + +#define rtems_libio_iop(fd) ((((unsigned32)(fd)) < rtems_libio_number_iops) ? \ + &rtems_libio_iops[fd] : 0) + +#define rtems_libio_check_fd(fd) \ + do { \ + if ((fd) >= rtems_libio_number_iops) \ + { \ + errno = EBADF; \ + return -1; \ + } \ + } while (0) + +#define rtems_libio_check_buffer(buffer) \ + do { \ + if ((buffer) == 0) \ + { \ + errno = EINVAL; \ + return -1; \ + } \ + } while (0) + +#define rtems_libio_check_count(count) \ + do { \ + if ((count) == 0) \ + { \ + return 0; \ + } \ + } while (0) + +#define rtems_libio_check_permissions(iop, flag) \ + do { \ + if (((iop)->flags & (flag)) == 0) \ + { \ + errno = EINVAL; \ + return -1; \ + } \ + } while (0) + + +void +rtems_libio_config( + rtems_configuration_table *config, + unsigned32 max_fds + ) +{ + rtems_libio_number_iops = max_fds; + + /* + * tweak config to reflect # of semaphores we will need + */ + + config->maximum_semaphores += 1; /* one for iop table */ + config->maximum_semaphores += max_fds; +} + +/* + * Called by bsp startup code to init the libio area. + */ + +void +rtems_libio_init(void) +{ + rtems_status_code rc; + + if (rtems_libio_number_iops > 0) + { + rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, + sizeof(rtems_libio_t)); + if (rtems_libio_iops == NULL) + rtems_fatal_error_occurred(RTEMS_NO_MEMORY); + + rtems_libio_last_iop = rtems_libio_iops + (rtems_libio_number_iops - 1); + } + + rc = rtems_semaphore_create(RTEMS_LIBIO_SEM, + 1, + RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, + &rtems_libio_semaphore); + if (rc != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(rc); +} + +/* + * Convert RTEMS status to a UNIX errno + */ + +rtems_assoc_t errno_assoc[] = { + { "OK", RTEMS_SUCCESSFUL, 0 }, + { "TIMEOUT", RTEMS_TIMEOUT, ETIME }, + { "NO MEMORY", RTEMS_NO_MEMORY, ENOMEM }, + { 0, 0, 0 }, +}; + +static unsigned32 +rtems_libio_errno(rtems_status_code code) +{ + int rc; + + if ((rc = rtems_assoc_remote_by_local(errno_assoc, (unsigned32) code))) + { + errno = rc; + return -1; + } + return 0; +} + +/* + * Convert UNIX fnctl(2) flags to ones that RTEMS drivers understand + */ + +rtems_assoc_t access_modes_assoc[] = { + { "READ", LIBIO_FLAGS_READ, O_RDONLY }, + { "WRITE", LIBIO_FLAGS_WRITE, O_WRONLY }, + { "READ/WRITE", LIBIO_FLAGS_READ_WRITE, O_RDWR }, + { 0, 0, 0 }, +}; + +rtems_assoc_t status_flags_assoc[] = { + { "NO DELAY", LIBIO_FLAGS_NO_DELAY, O_NDELAY }, + { "APPEND", LIBIO_FLAGS_APPEND, O_APPEND }, + { "CREATE", LIBIO_FLAGS_CREATE, O_CREAT }, + { 0, 0, 0 }, +}; + +static unsigned32 +rtems_libio_fcntl_flags(unsigned32 fcntl_flags) +{ + unsigned32 flags = 0; + unsigned32 access_modes; + + /* + * Access mode is a small integer + */ + + access_modes = fcntl_flags & O_ACCMODE; + fcntl_flags &= ~O_ACCMODE; + flags = rtems_assoc_local_by_remote(access_modes_assoc, access_modes); + + /* + * Everything else is single bits + */ + + flags |= rtems_assoc_local_by_remote_bitfield(status_flags_assoc, fcntl_flags); + return flags; +} + + +static rtems_libio_t * +rtems_libio_allocate(void) +{ + rtems_libio_t *iop; + rtems_status_code rc; + + rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + + for (iop = rtems_libio_iops; iop <= rtems_libio_last_iop; iop++) + if ((iop->flags & LIBIO_FLAGS_OPEN) == 0) + { + /* + * Got one; create a semaphore for it + */ + + rc = rtems_semaphore_create(RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops), + 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, + &iop->sem); + if (rc != RTEMS_SUCCESSFUL) + goto failed; + + iop->flags = LIBIO_FLAGS_OPEN; + goto done; + } + +failed: + iop = 0; + +done: + rtems_semaphore_release(rtems_libio_semaphore); + return iop; +} + +static void +rtems_libio_free(rtems_libio_t *iop) +{ + rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + + if (iop->sem) + rtems_semaphore_delete(iop->sem); + (void) memset(iop, 0, sizeof(*iop)); + + rtems_semaphore_release(rtems_libio_semaphore); +} + +int +__open( + const char *pathname, + unsigned32 flag, + unsigned32 mode) +{ + rtems_status_code rc; + rtems_libio_t *iop = 0; + rtems_driver_name_t *np; + rtems_libio_open_close_args_t args; + + if ((rc = rtems_io_lookup_name(pathname, &np)) != RTEMS_SUCCESSFUL) + goto done; + + iop = rtems_libio_allocate(); + if (iop == 0) + { + rc = RTEMS_TOO_MANY; + goto done; + } + + iop->driver = np; + iop->pathname = (char *) pathname; + iop->flags |= rtems_libio_fcntl_flags(flag); + + args.iop = iop; + args.flags = iop->flags; + args.mode = mode; + + rc = rtems_io_open(np->major, np->minor, (void *) &args); + +done: + if (rc != RTEMS_SUCCESSFUL) + { + if (iop) + rtems_libio_free(iop); + return rtems_libio_errno(rc); + } + + return iop - rtems_libio_iops; +} + +int +__close( + int fd + ) +{ + rtems_status_code rc; + rtems_driver_name_t *np; + rtems_libio_t *iop = rtems_libio_iop(fd); + rtems_libio_open_close_args_t args; + + rtems_libio_check_fd(fd); + + np = iop->driver; + + args.iop = iop; + args.flags = 0; + args.mode = 0; + + rc = rtems_io_close(np->major, np->minor, (void *) &args); + + if (rc != RTEMS_SUCCESSFUL) + return rtems_libio_errno(rc); + return 0; +} + +int +__read( + int fd, + void * buffer, + unsigned32 count + ) +{ + rtems_status_code rc; + rtems_driver_name_t *np; + rtems_libio_t *iop = rtems_libio_iop(fd); + rtems_libio_rw_args_t args; + + rtems_libio_check_fd(fd); + rtems_libio_check_buffer(buffer); + rtems_libio_check_count(count); + rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ); + + np = iop->driver; + + args.iop = iop; + args.offset = iop->offset; + args.buffer = buffer; + args.count = count; + args.flags = iop->flags; + args.bytes_moved = 0; + + rc = rtems_io_read(np->major, np->minor, (void *) &args); + + iop->offset += args.bytes_moved; + + if (rc != RTEMS_SUCCESSFUL) + return rtems_libio_errno(rc); + + return args.bytes_moved; +} + +int +__write( + int fd, + const void *buffer, + unsigned32 count + ) +{ + rtems_status_code rc; + rtems_driver_name_t *np; + rtems_libio_t *iop = rtems_libio_iop(fd); + rtems_libio_rw_args_t args; + + rtems_libio_check_fd(fd); + rtems_libio_check_buffer(buffer); + rtems_libio_check_count(count); + rtems_libio_check_permissions(iop, LIBIO_FLAGS_WRITE); + + np = iop->driver; + + args.iop = iop; + args.offset = iop->offset; + args.buffer = (void *) buffer; + args.count = count; + args.flags = iop->flags; + args.bytes_moved = 0; + + rc = rtems_io_write(np->major, np->minor, (void *) &args); + + iop->offset += args.bytes_moved; + + if (rc != RTEMS_SUCCESSFUL) + return rtems_libio_errno(rc); + + return args.bytes_moved; +} + +int +__ioctl( + int fd, + unsigned32 command, + void * buffer) +{ + rtems_status_code rc; + rtems_driver_name_t *np; + rtems_libio_t *iop = rtems_libio_iop(fd); + rtems_libio_ioctl_args_t args; + + rtems_libio_check_fd(fd); + + np = iop->driver; + + args.iop = iop; + args.command = command; + args.buffer = buffer; + + rc = rtems_io_control(np->major, np->minor, (void *) &args); + + if (rc != RTEMS_SUCCESSFUL) + return rtems_libio_errno(rc); + + return args.ioctl_return; +} + +/* + * internal only?? + */ + + +int +__lseek( + int fd, + rtems_libio_offset_t offset, + int whence + ) +{ + rtems_libio_t *iop = rtems_libio_iop(fd); + + rtems_libio_check_fd(fd); + + switch (whence) + { + case SEEK_SET: + iop->offset = offset; + break; + + case SEEK_CUR: + iop->offset += offset; + break; + + case SEEK_END: + iop->offset = iop->size - offset; + break; + + default: + errno = EINVAL; + return -1; + } + return 0; +} diff --git a/c/src/exec/rtems/headers/message.h b/c/src/exec/rtems/headers/message.h index aefcea3c36..04aa6dfb16 100644 --- a/c/src/exec/rtems/headers/message.h +++ b/c/src/exec/rtems/headers/message.h @@ -41,14 +41,22 @@ extern "C" { /* * The following defines the data types needed to manipulate * the contents of message buffers. + * Since msgs are variable length we just make a ptr to 1. */ typedef struct { - unsigned32 field1; - unsigned32 field2; - unsigned32 field3; - unsigned32 field4; -} Message_queue_Buffer; + unsigned32 size; + +#ifndef __cplusplus + /* NOTE: [0] is gcc specific, + * but specifically disallowed by ANSI STD C++ + * g++ warns about it, so we #ifdef it out to + * get rid of warnings when compiled by g++. + */ + unsigned32 buffer[0]; +#endif + +} Message_queue_Buffer; /* * The following records define the organization of a message @@ -68,10 +76,13 @@ typedef struct { typedef struct { Objects_Control Object; Thread_queue_Control Wait_queue; - rtems_attribute attribute_set; + rtems_attribute attribute_set; unsigned32 maximum_pending_messages; unsigned32 number_of_pending_messages; + unsigned32 maximum_message_size; Chain_Control Pending_messages; + Message_queue_Buffer *message_buffers; + Chain_Control Inactive_messages; } Message_queue_Control; /* @@ -82,13 +93,6 @@ typedef struct { EXTERN Objects_Information _Message_queue_Information; /* - * The following defines the data structures used to - * manage the pool of inactive message buffers. - */ - -EXTERN Chain_Control _Message_queue_Inactive_messages; - -/* * The following enumerated type details the modes in which a message * may be submitted to a message queue. The message may be posted * in a send or urgent fashion. @@ -108,8 +112,7 @@ typedef enum { */ void _Message_queue_Manager_initialization( - unsigned32 maximum_message_queues, - unsigned32 maximum_messages + unsigned32 maximum_message_queues ); /* @@ -126,10 +129,11 @@ void _Message_queue_Manager_initialization( */ rtems_status_code rtems_message_queue_create( - Objects_Name name, - unsigned32 count, + Objects_Name name, + unsigned32 count, + unsigned32 max_message_size, rtems_attribute attribute_set, - Objects_Id *id + Objects_Id *id ); /* @@ -183,7 +187,8 @@ rtems_status_code rtems_message_queue_delete( rtems_status_code rtems_message_queue_send( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ); /* @@ -204,7 +209,8 @@ rtems_status_code rtems_message_queue_send( rtems_status_code rtems_message_queue_urgent( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ); /* @@ -226,6 +232,7 @@ rtems_status_code rtems_message_queue_urgent( rtems_status_code rtems_message_queue_broadcast( Objects_Id id, void *buffer, + unsigned32 size, unsigned32 *count ); @@ -246,8 +253,9 @@ rtems_status_code rtems_message_queue_broadcast( rtems_status_code rtems_message_queue_receive( Objects_Id id, void *buffer, + unsigned32 *size_p, unsigned32 option_set, - rtems_interval timeout + rtems_interval timeout ); /* @@ -276,8 +284,9 @@ rtems_status_code rtems_message_queue_flush( */ STATIC INLINE void _Message_queue_Copy_buffer ( - Message_queue_Buffer *source, - Message_queue_Buffer *destination + void *source, + void *destination, + unsigned32 size ); /* @@ -295,7 +304,8 @@ STATIC INLINE void _Message_queue_Copy_buffer ( boolean _Message_queue_Seize( Message_queue_Control *the_message_queue, unsigned32 option_set, - Message_queue_Buffer *buffer + void *buffer, + unsigned32 *size_p ); /* @@ -322,7 +332,8 @@ unsigned32 _Message_queue_Flush_support( rtems_status_code _Message_queue_Submit( Objects_Id id, - Message_queue_Buffer *buffer, + void *buffer, + unsigned32 size, Message_queue_Submit_types submit_type ); @@ -336,7 +347,9 @@ rtems_status_code _Message_queue_Submit( */ STATIC INLINE Message_queue_Buffer_control * - _Message_queue_Allocate_message_buffer ( void ); + _Message_queue_Allocate_message_buffer ( + Message_queue_Control *the_message_queue +); /* * _Message_queue_Free_message_buffer @@ -348,6 +361,7 @@ STATIC INLINE Message_queue_Buffer_control * */ STATIC INLINE void _Message_queue_Free_message_buffer ( + Message_queue_Control *the_message_queue, Message_queue_Buffer_control *the_message ); @@ -415,14 +429,17 @@ STATIC INLINE boolean _Message_queue_Is_null ( * the inactive chain of free message queue control blocks. */ -STATIC INLINE Message_queue_Control *_Message_queue_Allocate ( void ); +Message_queue_Control *_Message_queue_Allocate ( + unsigned32 count, + unsigned32 max_message_size +); /* * _Message_queue_Free * * DESCRIPTION: * - * This routine allocates a message queue control block from + * This routine deallocates a message queue control block into * the inactive chain of free message queue control blocks. */ diff --git a/c/src/exec/rtems/headers/msgmp.h b/c/src/exec/rtems/headers/msgmp.h index 486bf00002..d3e40fe123 100644 --- a/c/src/exec/rtems/headers/msgmp.h +++ b/c/src/exec/rtems/headers/msgmp.h @@ -55,15 +55,14 @@ typedef enum { */ typedef struct { - rtems_packet_prefix Prefix; + rtems_packet_prefix Prefix; Message_queue_MP_Remote_operations operation; Objects_Name name; - rtems_option option_set; + rtems_option option_set; Objects_Id proxy_id; unsigned32 count; + unsigned32 size; unsigned32 pad0; - unsigned32 pad1; - unsigned32 pad2; Message_queue_Buffer Buffer; } Message_queue_MP_Packet; @@ -95,9 +94,10 @@ void _Message_queue_MP_Send_process_packet ( rtems_status_code _Message_queue_MP_Send_request_packet ( Message_queue_MP_Remote_operations operation, Objects_Id message_queue_id, - Message_queue_Buffer *buffer, - rtems_option option_set, - rtems_interval timeout + void *buffer, + unsigned32 *size_p, + rtems_option option_set, + rtems_interval timeout ); /* diff --git a/c/src/exec/rtems/include/rtems/rtems/message.h b/c/src/exec/rtems/include/rtems/rtems/message.h index aefcea3c36..04aa6dfb16 100644 --- a/c/src/exec/rtems/include/rtems/rtems/message.h +++ b/c/src/exec/rtems/include/rtems/rtems/message.h @@ -41,14 +41,22 @@ extern "C" { /* * The following defines the data types needed to manipulate * the contents of message buffers. + * Since msgs are variable length we just make a ptr to 1. */ typedef struct { - unsigned32 field1; - unsigned32 field2; - unsigned32 field3; - unsigned32 field4; -} Message_queue_Buffer; + unsigned32 size; + +#ifndef __cplusplus + /* NOTE: [0] is gcc specific, + * but specifically disallowed by ANSI STD C++ + * g++ warns about it, so we #ifdef it out to + * get rid of warnings when compiled by g++. + */ + unsigned32 buffer[0]; +#endif + +} Message_queue_Buffer; /* * The following records define the organization of a message @@ -68,10 +76,13 @@ typedef struct { typedef struct { Objects_Control Object; Thread_queue_Control Wait_queue; - rtems_attribute attribute_set; + rtems_attribute attribute_set; unsigned32 maximum_pending_messages; unsigned32 number_of_pending_messages; + unsigned32 maximum_message_size; Chain_Control Pending_messages; + Message_queue_Buffer *message_buffers; + Chain_Control Inactive_messages; } Message_queue_Control; /* @@ -82,13 +93,6 @@ typedef struct { EXTERN Objects_Information _Message_queue_Information; /* - * The following defines the data structures used to - * manage the pool of inactive message buffers. - */ - -EXTERN Chain_Control _Message_queue_Inactive_messages; - -/* * The following enumerated type details the modes in which a message * may be submitted to a message queue. The message may be posted * in a send or urgent fashion. @@ -108,8 +112,7 @@ typedef enum { */ void _Message_queue_Manager_initialization( - unsigned32 maximum_message_queues, - unsigned32 maximum_messages + unsigned32 maximum_message_queues ); /* @@ -126,10 +129,11 @@ void _Message_queue_Manager_initialization( */ rtems_status_code rtems_message_queue_create( - Objects_Name name, - unsigned32 count, + Objects_Name name, + unsigned32 count, + unsigned32 max_message_size, rtems_attribute attribute_set, - Objects_Id *id + Objects_Id *id ); /* @@ -183,7 +187,8 @@ rtems_status_code rtems_message_queue_delete( rtems_status_code rtems_message_queue_send( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ); /* @@ -204,7 +209,8 @@ rtems_status_code rtems_message_queue_send( rtems_status_code rtems_message_queue_urgent( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ); /* @@ -226,6 +232,7 @@ rtems_status_code rtems_message_queue_urgent( rtems_status_code rtems_message_queue_broadcast( Objects_Id id, void *buffer, + unsigned32 size, unsigned32 *count ); @@ -246,8 +253,9 @@ rtems_status_code rtems_message_queue_broadcast( rtems_status_code rtems_message_queue_receive( Objects_Id id, void *buffer, + unsigned32 *size_p, unsigned32 option_set, - rtems_interval timeout + rtems_interval timeout ); /* @@ -276,8 +284,9 @@ rtems_status_code rtems_message_queue_flush( */ STATIC INLINE void _Message_queue_Copy_buffer ( - Message_queue_Buffer *source, - Message_queue_Buffer *destination + void *source, + void *destination, + unsigned32 size ); /* @@ -295,7 +304,8 @@ STATIC INLINE void _Message_queue_Copy_buffer ( boolean _Message_queue_Seize( Message_queue_Control *the_message_queue, unsigned32 option_set, - Message_queue_Buffer *buffer + void *buffer, + unsigned32 *size_p ); /* @@ -322,7 +332,8 @@ unsigned32 _Message_queue_Flush_support( rtems_status_code _Message_queue_Submit( Objects_Id id, - Message_queue_Buffer *buffer, + void *buffer, + unsigned32 size, Message_queue_Submit_types submit_type ); @@ -336,7 +347,9 @@ rtems_status_code _Message_queue_Submit( */ STATIC INLINE Message_queue_Buffer_control * - _Message_queue_Allocate_message_buffer ( void ); + _Message_queue_Allocate_message_buffer ( + Message_queue_Control *the_message_queue +); /* * _Message_queue_Free_message_buffer @@ -348,6 +361,7 @@ STATIC INLINE Message_queue_Buffer_control * */ STATIC INLINE void _Message_queue_Free_message_buffer ( + Message_queue_Control *the_message_queue, Message_queue_Buffer_control *the_message ); @@ -415,14 +429,17 @@ STATIC INLINE boolean _Message_queue_Is_null ( * the inactive chain of free message queue control blocks. */ -STATIC INLINE Message_queue_Control *_Message_queue_Allocate ( void ); +Message_queue_Control *_Message_queue_Allocate ( + unsigned32 count, + unsigned32 max_message_size +); /* * _Message_queue_Free * * DESCRIPTION: * - * This routine allocates a message queue control block from + * This routine deallocates a message queue control block into * the inactive chain of free message queue control blocks. */ diff --git a/c/src/exec/rtems/include/rtems/rtems/msgmp.h b/c/src/exec/rtems/include/rtems/rtems/msgmp.h index 486bf00002..d3e40fe123 100644 --- a/c/src/exec/rtems/include/rtems/rtems/msgmp.h +++ b/c/src/exec/rtems/include/rtems/rtems/msgmp.h @@ -55,15 +55,14 @@ typedef enum { */ typedef struct { - rtems_packet_prefix Prefix; + rtems_packet_prefix Prefix; Message_queue_MP_Remote_operations operation; Objects_Name name; - rtems_option option_set; + rtems_option option_set; Objects_Id proxy_id; unsigned32 count; + unsigned32 size; unsigned32 pad0; - unsigned32 pad1; - unsigned32 pad2; Message_queue_Buffer Buffer; } Message_queue_MP_Packet; @@ -95,9 +94,10 @@ void _Message_queue_MP_Send_process_packet ( rtems_status_code _Message_queue_MP_Send_request_packet ( Message_queue_MP_Remote_operations operation, Objects_Id message_queue_id, - Message_queue_Buffer *buffer, - rtems_option option_set, - rtems_interval timeout + void *buffer, + unsigned32 *size_p, + rtems_option option_set, + rtems_interval timeout ); /* diff --git a/c/src/exec/rtems/inline/attr.inl b/c/src/exec/rtems/inline/attr.inl index c657a08211..15a9296b7e 100644 --- a/c/src/exec/rtems/inline/attr.inl +++ b/c/src/exec/rtems/inline/attr.inl @@ -84,19 +84,6 @@ STATIC INLINE boolean _Attributes_Is_priority( /*PAGE * - * _Attributes_Is_limit - * - */ - -STATIC INLINE boolean _Attributes_Is_limit( - rtems_attribute attribute_set -) -{ - return ( attribute_set & RTEMS_LIMIT ); -} - -/*PAGE - * * _Attributes_Is_binary_semaphore * */ diff --git a/c/src/exec/rtems/inline/message.inl b/c/src/exec/rtems/inline/message.inl index ee8d5f6cb1..18d793d2fe 100644 --- a/c/src/exec/rtems/inline/message.inl +++ b/c/src/exec/rtems/inline/message.inl @@ -17,6 +17,8 @@ #ifndef __MESSAGE_QUEUE_inl #define __MESSAGE_QUEUE_inl +#include <rtems/wkspace.h> + /*PAGE * * _Message_queue_Copy_buffer @@ -24,11 +26,12 @@ */ STATIC INLINE void _Message_queue_Copy_buffer ( - Message_queue_Buffer *source, - Message_queue_Buffer *destination + void *source, + void *destination, + unsigned32 size ) { - *destination = *source; + memcpy(destination, source, size); } /*PAGE @@ -38,10 +41,12 @@ STATIC INLINE void _Message_queue_Copy_buffer ( */ STATIC INLINE Message_queue_Buffer_control * - _Message_queue_Allocate_message_buffer ( void ) +_Message_queue_Allocate_message_buffer ( + Message_queue_Control *the_message_queue +) { return (Message_queue_Buffer_control *) - _Chain_Get( &_Message_queue_Inactive_messages ); + _Chain_Get( &the_message_queue->Inactive_messages ); } /*PAGE @@ -51,10 +56,11 @@ STATIC INLINE Message_queue_Buffer_control * */ STATIC INLINE void _Message_queue_Free_message_buffer ( - Message_queue_Buffer_control *the_message + Message_queue_Control *the_message_queue, + Message_queue_Buffer_control *the_message ) { - _Chain_Append( &_Message_queue_Inactive_messages, &the_message->Node ); + _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node ); } /*PAGE @@ -116,17 +122,6 @@ STATIC INLINE boolean _Message_queue_Is_null ( return ( the_message_queue == NULL ); } -/*PAGE - * - * _Message_queue_Allocate - * - */ - -STATIC INLINE Message_queue_Control *_Message_queue_Allocate ( void ) -{ - return (Message_queue_Control *) - _Objects_Allocate( &_Message_queue_Information ); -} /*PAGE * @@ -138,6 +133,12 @@ STATIC INLINE void _Message_queue_Free ( Message_queue_Control *the_message_queue ) { + if (the_message_queue->message_buffers) + { + _Workspace_Free((void *) the_message_queue->message_buffers); + the_message_queue->message_buffers = 0; + } + _Objects_Free( &_Message_queue_Information, &the_message_queue->Object ); } diff --git a/c/src/exec/rtems/inline/rtems/rtems/attr.inl b/c/src/exec/rtems/inline/rtems/rtems/attr.inl index c657a08211..15a9296b7e 100644 --- a/c/src/exec/rtems/inline/rtems/rtems/attr.inl +++ b/c/src/exec/rtems/inline/rtems/rtems/attr.inl @@ -84,19 +84,6 @@ STATIC INLINE boolean _Attributes_Is_priority( /*PAGE * - * _Attributes_Is_limit - * - */ - -STATIC INLINE boolean _Attributes_Is_limit( - rtems_attribute attribute_set -) -{ - return ( attribute_set & RTEMS_LIMIT ); -} - -/*PAGE - * * _Attributes_Is_binary_semaphore * */ diff --git a/c/src/exec/rtems/inline/rtems/rtems/message.inl b/c/src/exec/rtems/inline/rtems/rtems/message.inl index ee8d5f6cb1..18d793d2fe 100644 --- a/c/src/exec/rtems/inline/rtems/rtems/message.inl +++ b/c/src/exec/rtems/inline/rtems/rtems/message.inl @@ -17,6 +17,8 @@ #ifndef __MESSAGE_QUEUE_inl #define __MESSAGE_QUEUE_inl +#include <rtems/wkspace.h> + /*PAGE * * _Message_queue_Copy_buffer @@ -24,11 +26,12 @@ */ STATIC INLINE void _Message_queue_Copy_buffer ( - Message_queue_Buffer *source, - Message_queue_Buffer *destination + void *source, + void *destination, + unsigned32 size ) { - *destination = *source; + memcpy(destination, source, size); } /*PAGE @@ -38,10 +41,12 @@ STATIC INLINE void _Message_queue_Copy_buffer ( */ STATIC INLINE Message_queue_Buffer_control * - _Message_queue_Allocate_message_buffer ( void ) +_Message_queue_Allocate_message_buffer ( + Message_queue_Control *the_message_queue +) { return (Message_queue_Buffer_control *) - _Chain_Get( &_Message_queue_Inactive_messages ); + _Chain_Get( &the_message_queue->Inactive_messages ); } /*PAGE @@ -51,10 +56,11 @@ STATIC INLINE Message_queue_Buffer_control * */ STATIC INLINE void _Message_queue_Free_message_buffer ( - Message_queue_Buffer_control *the_message + Message_queue_Control *the_message_queue, + Message_queue_Buffer_control *the_message ) { - _Chain_Append( &_Message_queue_Inactive_messages, &the_message->Node ); + _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node ); } /*PAGE @@ -116,17 +122,6 @@ STATIC INLINE boolean _Message_queue_Is_null ( return ( the_message_queue == NULL ); } -/*PAGE - * - * _Message_queue_Allocate - * - */ - -STATIC INLINE Message_queue_Control *_Message_queue_Allocate ( void ) -{ - return (Message_queue_Control *) - _Objects_Allocate( &_Message_queue_Information ); -} /*PAGE * @@ -138,6 +133,12 @@ STATIC INLINE void _Message_queue_Free ( Message_queue_Control *the_message_queue ) { + if (the_message_queue->message_buffers) + { + _Workspace_Free((void *) the_message_queue->message_buffers); + the_message_queue->message_buffers = 0; + } + _Objects_Free( &_Message_queue_Information, &the_message_queue->Object ); } diff --git a/c/src/exec/rtems/macros/attr.inl b/c/src/exec/rtems/macros/attr.inl index 602622ca35..97d3463d53 100644 --- a/c/src/exec/rtems/macros/attr.inl +++ b/c/src/exec/rtems/macros/attr.inl @@ -62,15 +62,6 @@ /*PAGE * - * _Attributes_Is_limit - * - */ - -#define _Attributes_Is_limit( _attribute_set ) \ - ( (_attribute_set) & RTEMS_LIMIT ) - -/*PAGE - * * _Attributes_Is_binary_semaphore * */ diff --git a/c/src/exec/rtems/macros/rtems/rtems/attr.inl b/c/src/exec/rtems/macros/rtems/rtems/attr.inl index 602622ca35..97d3463d53 100644 --- a/c/src/exec/rtems/macros/rtems/rtems/attr.inl +++ b/c/src/exec/rtems/macros/rtems/rtems/attr.inl @@ -62,15 +62,6 @@ /*PAGE * - * _Attributes_Is_limit - * - */ - -#define _Attributes_Is_limit( _attribute_set ) \ - ( (_attribute_set) & RTEMS_LIMIT ) - -/*PAGE - * * _Attributes_Is_binary_semaphore * */ diff --git a/c/src/exec/rtems/optman/no-msg.c b/c/src/exec/rtems/optman/no-msg.c index f2ab5492c0..bee0295df5 100644 --- a/c/src/exec/rtems/optman/no-msg.c +++ b/c/src/exec/rtems/optman/no-msg.c @@ -26,8 +26,7 @@ #include <rtems/wkspace.h> void _Message_queue_Manager_initialization( - unsigned32 maximum_message_queues, - unsigned32 maximum_messages + unsigned32 maximum_message_queues ) { } @@ -35,7 +34,8 @@ void _Message_queue_Manager_initialization( rtems_status_code rtems_message_queue_create( Objects_Name name, unsigned32 count, - rtems_attribute attribute_set, + unsigned32 max_message_size, + rtems_attribute attribute_set, Objects_Id *id ) { @@ -60,7 +60,8 @@ rtems_status_code rtems_message_queue_delete( rtems_status_code rtems_message_queue_send( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ) { return( RTEMS_NOT_CONFIGURED ); @@ -68,7 +69,8 @@ rtems_status_code rtems_message_queue_send( rtems_status_code rtems_message_queue_urgent( Objects_Id id, - void *buffer + void *buffer, + unsigned32 size ) { return( RTEMS_NOT_CONFIGURED ); @@ -77,6 +79,7 @@ rtems_status_code rtems_message_queue_urgent( rtems_status_code rtems_message_queue_broadcast( Objects_Id id, void *buffer, + unsigned32 size, unsigned32 *count ) { @@ -86,8 +89,9 @@ rtems_status_code rtems_message_queue_broadcast( rtems_status_code rtems_message_queue_receive( Objects_Id id, void *buffer, + unsigned32 *size_p, unsigned32 option_set, - rtems_interval timeout + rtems_interval timeout ) { return( RTEMS_NOT_CONFIGURED ); @@ -110,8 +114,9 @@ unsigned32 _Message_queue_Flush_support( boolean _Message_queue_Seize( Message_queue_Control *the_message_queue, - rtems_option option_set, - Message_queue_Buffer *buffer + rtems_option option_set, + void *buffer, + unsigned32 *size_p ) { _Thread_Executing->Wait.return_code = RTEMS_UNSATISFIED; @@ -120,7 +125,8 @@ boolean _Message_queue_Seize( rtems_status_code _Message_queue_Submit( Objects_Id id, - Message_queue_Buffer *buffer, + void *buffer, + unsigned32 size, Message_queue_Submit_types submit_type ) { diff --git a/c/src/exec/sapi/headers/config.h b/c/src/exec/sapi/headers/config.h index b5080b6133..c2001c8074 100644 --- a/c/src/exec/sapi/headers/config.h +++ b/c/src/exec/sapi/headers/config.h @@ -32,14 +32,14 @@ extern "C" { */ typedef struct { - Objects_Name name; /* task name */ - unsigned32 stack_size; /* task stack size */ + Objects_Name name; /* task name */ + unsigned32 stack_size; /* task stack size */ rtems_task_priority initial_priority; /* task priority */ - rtems_attribute attribute_set; /* task attributes */ - rtems_task_entry entry_point; /* task entry point */ - rtems_mode mode_set; /* task initial mode */ - unsigned32 argument; /* task argument */ -} rtems_initialization_tasks_table; + rtems_attribute attribute_set; /* task attributes */ + rtems_task_entry entry_point; /* task entry point */ + rtems_mode mode_set; /* task initial mode */ + unsigned32 argument; /* task argument */ +} rtems_initialization_tasks_table; /* * @@ -56,14 +56,12 @@ typedef struct { typedef unsigned32 rtems_device_major_number; typedef unsigned32 rtems_device_minor_number; -typedef void rtems_device_driver; +typedef rtems_status_code rtems_device_driver; typedef rtems_device_driver ( *rtems_device_driver_entry )( rtems_device_major_number, rtems_device_minor_number, - void *, - Objects_Id, - unsigned32 * + void * ); typedef struct { @@ -173,12 +171,13 @@ typedef rtems_mpci_entry ( *rtems_mpci_receive_entry )( typedef struct { unsigned32 default_timeout; /* in ticks */ + unsigned32 maximum_packet_size; rtems_mpci_initialization_entry initialization; rtems_mpci_get_packet_entry get_packet; rtems_mpci_return_packet_entry return_packet; rtems_mpci_send_entry send_packet; rtems_mpci_receive_entry receive_packet; -} rtems_mpci_table; +} rtems_mpci_table; /* * The following records define the Multiprocessor Configuration @@ -192,8 +191,7 @@ struct Configuration_Table_MP { unsigned32 maximum_nodes; /* maximum # nodes in system */ unsigned32 maximum_global_objects; /* maximum # global objects */ unsigned32 maximum_proxies; /* maximum # proxies */ - rtems_mpci_table *User_mpci_table; - /* pointer to MPCI table */ + rtems_mpci_table *User_mpci_table; /* pointer to MPCI table */ }; /* @@ -209,25 +207,24 @@ struct Configuration_Table_MP { */ struct Configuration_Table { - void *work_space_start; - unsigned32 work_space_size; - unsigned32 maximum_tasks; - unsigned32 maximum_timers; - unsigned32 maximum_semaphores; - unsigned32 maximum_message_queues; - unsigned32 maximum_messages; - unsigned32 maximum_partitions; - unsigned32 maximum_regions; - unsigned32 maximum_ports; - unsigned32 maximum_periods; - unsigned32 maximum_extensions; - unsigned32 microseconds_per_tick; - unsigned32 ticks_per_timeslice; - unsigned32 number_of_initialization_tasks; + void *work_space_start; + unsigned32 work_space_size; + unsigned32 maximum_tasks; + unsigned32 maximum_timers; + unsigned32 maximum_semaphores; + unsigned32 maximum_message_queues; + unsigned32 maximum_partitions; + unsigned32 maximum_regions; + unsigned32 maximum_ports; + unsigned32 maximum_periods; + unsigned32 maximum_extensions; + unsigned32 microseconds_per_tick; + unsigned32 ticks_per_timeslice; + unsigned32 number_of_initialization_tasks; rtems_initialization_tasks_table *User_initialization_tasks_table; - unsigned32 number_of_device_drivers; + unsigned32 number_of_device_drivers; rtems_driver_address_table *Device_driver_table; - rtems_extensions_table *User_extension_table; + rtems_extensions_table *User_extension_table; rtems_multiprocessing_table *User_multiprocessing_table; }; @@ -244,7 +241,7 @@ extern const rtems_multiprocessing_table * configuration information. */ -EXTERN rtems_configuration_table *_Configuration_Table; +EXTERN rtems_configuration_table *_Configuration_Table; EXTERN rtems_multiprocessing_table *_Configuration_MP_table; EXTERN rtems_mpci_table *_Configuration_MPCI_table; @@ -258,7 +255,7 @@ EXTERN rtems_mpci_table *_Configuration_MPCI_table; */ STATIC INLINE void _Configuration_Handler_initialization( - rtems_configuration_table *configuration_table, + rtems_configuration_table *configuration_table, rtems_multiprocessing_table *multiprocessing_table, rtems_mpci_table *users_mpci_table ); diff --git a/c/src/exec/sapi/headers/directives.h b/c/src/exec/sapi/headers/directives.h index 263811cdca..2b26672a0c 100644 --- a/c/src/exec/sapi/headers/directives.h +++ b/c/src/exec/sapi/headers/directives.h @@ -10,10 +10,12 @@ * This material may be reproduced by or for the U.S. Government pursuant * to the copyright license under the clause at DFARS 252.227-7013. This * notice must appear in all copies of this file and its derivatives. + * + * $Id$ */ #ifndef __RTEMS_DIRECTIVES_h -#define RTEMS___DIRECTIVES_h +#define __RTEMS_DIRECTIVES_h #ifdef __cplusplus extern "C" { @@ -85,20 +87,24 @@ extern "C" { #define RTEMS_DUAL_PORTED_MEMORY_EXTERNAL_TO_INTERNAL 63 #define RTEMS_DUAL_PORTED_MEMORY_INTERNAL_TO_EXTERNAL 64 #define RTEMS_IO_INITIALIZE 65 -#define RTEMS_IO_OPEN 66 -#define RTEMS_IO_CLOSE 67 -#define RTEMS_IO_READ 68 -#define RTEMS_IO_WRITE 69 -#define RTEMS_IO_CONTROL 70 -#define RTEMS_FATAL_ERROR_OCCURRED 71 -#define RTEMS_RATE_MONOTONIC_CREATE 72 -#define RTEMS_RATE_MONOTONIC_NAME_TO_ID 73 -#define RTEMS_RATE_MONOTONIC_DELETE 74 -#define RTEMS_RATE_MONOTONIC_CANCEL 75 -#define RTEMS_RATE_MONOTONIC_PERIOD 76 -#define RTEMS_MULTIPROCESSING_ANNOUNCE 77 -#define RTEMS_DEBUG_ENABLE 78 -#define RTEMS_DEBUG_DISABLE 79 +#define RTEMS_IO_REGISTER_NAME 66 +#define RTEMS_IO_LOOKUP_NAME 67 +#define RTEMS_IO_OPEN 68 +#define RTEMS_IO_CLOSE 69 +#define RTEMS_IO_READ 70 +#define RTEMS_IO_WRITE 71 +#define RTEMS_IO_CONTROL 72 +#define RTEMS_FATAL_ERROR_OCCURRED 73 +#define RTEMS_RATE_MONOTONIC_CREATE 74 +#define RTEMS_RATE_MONOTONIC_NAME_TO_ID 75 +#define RTEMS_RATE_MONOTONIC_DELETE 76 +#define RTEMS_RATE_MONOTONIC_CANCEL 77 +#define RTEMS_RATE_MONOTONIC_PERIOD 78 +#define RTEMS_MULTIPROCESSING_ANNOUNCE 79 +#define RTEMS_DEBUG_ENABLE 80 +#define RTEMS_DEBUG_DISABLE 81 + +#define RTEMS_NUMBER_OF_ENTRY_POINTS 82 #ifdef __cplusplus } diff --git a/c/src/exec/sapi/headers/io.h b/c/src/exec/sapi/headers/io.h index 43c52cd35d..ef9fc69d03 100644 --- a/c/src/exec/sapi/headers/io.h +++ b/c/src/exec/sapi/headers/io.h @@ -35,27 +35,30 @@ extern "C" { #include <rtems/config.h> /* - * The following type defines the set of IO operations which are - * recognized by _IO_Handler and can be supported by a RTEMS - * device driver. + * The following declare the data required to manage the Device Driver + * Address Table. */ -typedef enum { - IO_INITIALIZE_OPERATION = 0, - IO_OPEN_OPERATION = 1, - IO_CLOSE_OPERATION = 2, - IO_READ_OPERATION = 3, - IO_WRITE_OPERATION = 4, - IO_CONTROL_OPERATION = 5 -} IO_operations; +EXTERN unsigned32 _IO_Number_of_drivers; +EXTERN rtems_driver_address_table *_IO_Driver_address_table; /* - * The following declare the data required to manage the Device Driver - * Address Table. + * Table for the io device names */ -EXTERN unsigned32 _IO_Number_of_drivers; -EXTERN rtems_driver_address_table *_IO_Driver_address_table; +typedef struct { + char *device_name; + unsigned32 device_name_length; + rtems_device_major_number major; + rtems_device_minor_number minor; +} rtems_driver_name_t; + +/*XXX this really should be allocated some better way... */ +/*XXX it should probably be a chain and use a 'maximum' drivers field + * in config table */ +#define RTEMS_MAX_DRIVER_NAMES 20 +EXTERN rtems_driver_name_t rtems_driver_name_table[RTEMS_MAX_DRIVER_NAMES]; + /* * _IO_Manager_initialization @@ -71,6 +74,36 @@ STATIC INLINE void _IO_Manager_initialization( ); /* + * rtems_io_register_name + * + * DESCRIPTION: + * + * Associate a name with a driver. + * + */ + +rtems_status_code rtems_io_register_name( + char *device_name, + rtems_device_major_number major, + rtems_device_minor_number minor +); + + +/* + * rtems_io_lookup_name + * + * DESCRIPTION: + * + * Find what driver "owns" this name + */ + +rtems_status_code rtems_io_lookup_name( + const char *pathname, + rtems_driver_name_t **rnp +); + + +/* * rtems_io_initialize * * DESCRIPTION: @@ -82,8 +115,7 @@ STATIC INLINE void _IO_Manager_initialization( rtems_status_code rtems_io_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -98,8 +130,7 @@ rtems_status_code rtems_io_initialize( rtems_status_code rtems_io_open( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -114,8 +145,7 @@ rtems_status_code rtems_io_open( rtems_status_code rtems_io_close( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -130,8 +160,7 @@ rtems_status_code rtems_io_close( rtems_status_code rtems_io_read( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -146,8 +175,7 @@ rtems_status_code rtems_io_read( rtems_status_code rtems_io_write( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -162,8 +190,7 @@ rtems_status_code rtems_io_write( rtems_status_code rtems_io_control( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -177,23 +204,6 @@ rtems_status_code rtems_io_control( void _IO_Initialize_all_drivers( void ); -/* - * _IO_Handler_routine - * - * DESCRIPTION: - * - * This routine provides the common foundation for all of the IO - * Manager's directives. - */ - -rtems_status_code _IO_Handler_routine( - IO_operations operation, - rtems_device_major_number major, - rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value -); - #include <rtems/io.inl> #ifdef __cplusplus diff --git a/c/src/exec/sapi/headers/sptables.h b/c/src/exec/sapi/headers/sptables.h index e74577d263..bbfd132760 100644 --- a/c/src/exec/sapi/headers/sptables.h +++ b/c/src/exec/sapi/headers/sptables.h @@ -49,7 +49,7 @@ const char _RTEMS_version[] = * This table is used by the single entry point code. */ -const void * _Entry_points[ NUMBER_OF_ENTRY_POINTS + 1 ] = { +const void * _Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ] = { (void *) rtems_initialize_executive, /* 0 */ (void *) rtems_initialize_executive_early, /* 1 */ (void *) rtems_initialize_executive_late, /* 2 */ @@ -116,20 +116,22 @@ const void * _Entry_points[ NUMBER_OF_ENTRY_POINTS + 1 ] = { (void *) rtems_port_external_to_internal, /* 63 */ (void *) rtems_port_internal_to_external, /* 64 */ (void *) rtems_io_initialize, /* 65 */ - (void *) rtems_io_open, /* 66 */ - (void *) rtems_io_close, /* 67 */ - (void *) rtems_io_read, /* 68 */ - (void *) rtems_io_write, /* 69 */ - (void *) rtems_io_control, /* 70 */ - (void *) rtems_fatal_error_occurred, /* 71 */ - (void *) rtems_rate_monotonic_create, /* 72 */ - (void *) rtems_rate_monotonic_ident, /* 73 */ - (void *) rtems_rate_monotonic_delete, /* 74 */ - (void *) rtems_rate_monotonic_cancel, /* 75 */ - (void *) rtems_rate_monotonic_period, /* 76 */ - (void *) rtems_multiprocessing_announce, /* 77 */ - (void *) rtems_debug_enable, /* 78 */ - (void *) rtems_debug_disable /* 79 */ + (void *) rtems_io_register_name, /* 66 */ + (void *) rtems_io_lookup_name, /* 67 */ + (void *) rtems_io_open, /* 68 */ + (void *) rtems_io_close, /* 69 */ + (void *) rtems_io_read, /* 70 */ + (void *) rtems_io_write, /* 71 */ + (void *) rtems_io_control, /* 72 */ + (void *) rtems_fatal_error_occurred, /* 73 */ + (void *) rtems_rate_monotonic_create, /* 74 */ + (void *) rtems_rate_monotonic_ident, /* 75 */ + (void *) rtems_rate_monotonic_delete, /* 76 */ + (void *) rtems_rate_monotonic_cancel, /* 77 */ + (void *) rtems_rate_monotonic_period, /* 78 */ + (void *) rtems_multiprocessing_announce, /* 79 */ + (void *) rtems_debug_enable, /* 80 */ + (void *) rtems_debug_disable /* 81 */ }; #ifdef __cplusplus diff --git a/c/src/exec/sapi/include/rtems/config.h b/c/src/exec/sapi/include/rtems/config.h index b5080b6133..c2001c8074 100644 --- a/c/src/exec/sapi/include/rtems/config.h +++ b/c/src/exec/sapi/include/rtems/config.h @@ -32,14 +32,14 @@ extern "C" { */ typedef struct { - Objects_Name name; /* task name */ - unsigned32 stack_size; /* task stack size */ + Objects_Name name; /* task name */ + unsigned32 stack_size; /* task stack size */ rtems_task_priority initial_priority; /* task priority */ - rtems_attribute attribute_set; /* task attributes */ - rtems_task_entry entry_point; /* task entry point */ - rtems_mode mode_set; /* task initial mode */ - unsigned32 argument; /* task argument */ -} rtems_initialization_tasks_table; + rtems_attribute attribute_set; /* task attributes */ + rtems_task_entry entry_point; /* task entry point */ + rtems_mode mode_set; /* task initial mode */ + unsigned32 argument; /* task argument */ +} rtems_initialization_tasks_table; /* * @@ -56,14 +56,12 @@ typedef struct { typedef unsigned32 rtems_device_major_number; typedef unsigned32 rtems_device_minor_number; -typedef void rtems_device_driver; +typedef rtems_status_code rtems_device_driver; typedef rtems_device_driver ( *rtems_device_driver_entry )( rtems_device_major_number, rtems_device_minor_number, - void *, - Objects_Id, - unsigned32 * + void * ); typedef struct { @@ -173,12 +171,13 @@ typedef rtems_mpci_entry ( *rtems_mpci_receive_entry )( typedef struct { unsigned32 default_timeout; /* in ticks */ + unsigned32 maximum_packet_size; rtems_mpci_initialization_entry initialization; rtems_mpci_get_packet_entry get_packet; rtems_mpci_return_packet_entry return_packet; rtems_mpci_send_entry send_packet; rtems_mpci_receive_entry receive_packet; -} rtems_mpci_table; +} rtems_mpci_table; /* * The following records define the Multiprocessor Configuration @@ -192,8 +191,7 @@ struct Configuration_Table_MP { unsigned32 maximum_nodes; /* maximum # nodes in system */ unsigned32 maximum_global_objects; /* maximum # global objects */ unsigned32 maximum_proxies; /* maximum # proxies */ - rtems_mpci_table *User_mpci_table; - /* pointer to MPCI table */ + rtems_mpci_table *User_mpci_table; /* pointer to MPCI table */ }; /* @@ -209,25 +207,24 @@ struct Configuration_Table_MP { */ struct Configuration_Table { - void *work_space_start; - unsigned32 work_space_size; - unsigned32 maximum_tasks; - unsigned32 maximum_timers; - unsigned32 maximum_semaphores; - unsigned32 maximum_message_queues; - unsigned32 maximum_messages; - unsigned32 maximum_partitions; - unsigned32 maximum_regions; - unsigned32 maximum_ports; - unsigned32 maximum_periods; - unsigned32 maximum_extensions; - unsigned32 microseconds_per_tick; - unsigned32 ticks_per_timeslice; - unsigned32 number_of_initialization_tasks; + void *work_space_start; + unsigned32 work_space_size; + unsigned32 maximum_tasks; + unsigned32 maximum_timers; + unsigned32 maximum_semaphores; + unsigned32 maximum_message_queues; + unsigned32 maximum_partitions; + unsigned32 maximum_regions; + unsigned32 maximum_ports; + unsigned32 maximum_periods; + unsigned32 maximum_extensions; + unsigned32 microseconds_per_tick; + unsigned32 ticks_per_timeslice; + unsigned32 number_of_initialization_tasks; rtems_initialization_tasks_table *User_initialization_tasks_table; - unsigned32 number_of_device_drivers; + unsigned32 number_of_device_drivers; rtems_driver_address_table *Device_driver_table; - rtems_extensions_table *User_extension_table; + rtems_extensions_table *User_extension_table; rtems_multiprocessing_table *User_multiprocessing_table; }; @@ -244,7 +241,7 @@ extern const rtems_multiprocessing_table * configuration information. */ -EXTERN rtems_configuration_table *_Configuration_Table; +EXTERN rtems_configuration_table *_Configuration_Table; EXTERN rtems_multiprocessing_table *_Configuration_MP_table; EXTERN rtems_mpci_table *_Configuration_MPCI_table; @@ -258,7 +255,7 @@ EXTERN rtems_mpci_table *_Configuration_MPCI_table; */ STATIC INLINE void _Configuration_Handler_initialization( - rtems_configuration_table *configuration_table, + rtems_configuration_table *configuration_table, rtems_multiprocessing_table *multiprocessing_table, rtems_mpci_table *users_mpci_table ); diff --git a/c/src/exec/sapi/include/rtems/directives.h b/c/src/exec/sapi/include/rtems/directives.h index 263811cdca..2b26672a0c 100644 --- a/c/src/exec/sapi/include/rtems/directives.h +++ b/c/src/exec/sapi/include/rtems/directives.h @@ -10,10 +10,12 @@ * This material may be reproduced by or for the U.S. Government pursuant * to the copyright license under the clause at DFARS 252.227-7013. This * notice must appear in all copies of this file and its derivatives. + * + * $Id$ */ #ifndef __RTEMS_DIRECTIVES_h -#define RTEMS___DIRECTIVES_h +#define __RTEMS_DIRECTIVES_h #ifdef __cplusplus extern "C" { @@ -85,20 +87,24 @@ extern "C" { #define RTEMS_DUAL_PORTED_MEMORY_EXTERNAL_TO_INTERNAL 63 #define RTEMS_DUAL_PORTED_MEMORY_INTERNAL_TO_EXTERNAL 64 #define RTEMS_IO_INITIALIZE 65 -#define RTEMS_IO_OPEN 66 -#define RTEMS_IO_CLOSE 67 -#define RTEMS_IO_READ 68 -#define RTEMS_IO_WRITE 69 -#define RTEMS_IO_CONTROL 70 -#define RTEMS_FATAL_ERROR_OCCURRED 71 -#define RTEMS_RATE_MONOTONIC_CREATE 72 -#define RTEMS_RATE_MONOTONIC_NAME_TO_ID 73 -#define RTEMS_RATE_MONOTONIC_DELETE 74 -#define RTEMS_RATE_MONOTONIC_CANCEL 75 -#define RTEMS_RATE_MONOTONIC_PERIOD 76 -#define RTEMS_MULTIPROCESSING_ANNOUNCE 77 -#define RTEMS_DEBUG_ENABLE 78 -#define RTEMS_DEBUG_DISABLE 79 +#define RTEMS_IO_REGISTER_NAME 66 +#define RTEMS_IO_LOOKUP_NAME 67 +#define RTEMS_IO_OPEN 68 +#define RTEMS_IO_CLOSE 69 +#define RTEMS_IO_READ 70 +#define RTEMS_IO_WRITE 71 +#define RTEMS_IO_CONTROL 72 +#define RTEMS_FATAL_ERROR_OCCURRED 73 +#define RTEMS_RATE_MONOTONIC_CREATE 74 +#define RTEMS_RATE_MONOTONIC_NAME_TO_ID 75 +#define RTEMS_RATE_MONOTONIC_DELETE 76 +#define RTEMS_RATE_MONOTONIC_CANCEL 77 +#define RTEMS_RATE_MONOTONIC_PERIOD 78 +#define RTEMS_MULTIPROCESSING_ANNOUNCE 79 +#define RTEMS_DEBUG_ENABLE 80 +#define RTEMS_DEBUG_DISABLE 81 + +#define RTEMS_NUMBER_OF_ENTRY_POINTS 82 #ifdef __cplusplus } diff --git a/c/src/exec/sapi/include/rtems/io.h b/c/src/exec/sapi/include/rtems/io.h index 43c52cd35d..ef9fc69d03 100644 --- a/c/src/exec/sapi/include/rtems/io.h +++ b/c/src/exec/sapi/include/rtems/io.h @@ -35,27 +35,30 @@ extern "C" { #include <rtems/config.h> /* - * The following type defines the set of IO operations which are - * recognized by _IO_Handler and can be supported by a RTEMS - * device driver. + * The following declare the data required to manage the Device Driver + * Address Table. */ -typedef enum { - IO_INITIALIZE_OPERATION = 0, - IO_OPEN_OPERATION = 1, - IO_CLOSE_OPERATION = 2, - IO_READ_OPERATION = 3, - IO_WRITE_OPERATION = 4, - IO_CONTROL_OPERATION = 5 -} IO_operations; +EXTERN unsigned32 _IO_Number_of_drivers; +EXTERN rtems_driver_address_table *_IO_Driver_address_table; /* - * The following declare the data required to manage the Device Driver - * Address Table. + * Table for the io device names */ -EXTERN unsigned32 _IO_Number_of_drivers; -EXTERN rtems_driver_address_table *_IO_Driver_address_table; +typedef struct { + char *device_name; + unsigned32 device_name_length; + rtems_device_major_number major; + rtems_device_minor_number minor; +} rtems_driver_name_t; + +/*XXX this really should be allocated some better way... */ +/*XXX it should probably be a chain and use a 'maximum' drivers field + * in config table */ +#define RTEMS_MAX_DRIVER_NAMES 20 +EXTERN rtems_driver_name_t rtems_driver_name_table[RTEMS_MAX_DRIVER_NAMES]; + /* * _IO_Manager_initialization @@ -71,6 +74,36 @@ STATIC INLINE void _IO_Manager_initialization( ); /* + * rtems_io_register_name + * + * DESCRIPTION: + * + * Associate a name with a driver. + * + */ + +rtems_status_code rtems_io_register_name( + char *device_name, + rtems_device_major_number major, + rtems_device_minor_number minor +); + + +/* + * rtems_io_lookup_name + * + * DESCRIPTION: + * + * Find what driver "owns" this name + */ + +rtems_status_code rtems_io_lookup_name( + const char *pathname, + rtems_driver_name_t **rnp +); + + +/* * rtems_io_initialize * * DESCRIPTION: @@ -82,8 +115,7 @@ STATIC INLINE void _IO_Manager_initialization( rtems_status_code rtems_io_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -98,8 +130,7 @@ rtems_status_code rtems_io_initialize( rtems_status_code rtems_io_open( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -114,8 +145,7 @@ rtems_status_code rtems_io_open( rtems_status_code rtems_io_close( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -130,8 +160,7 @@ rtems_status_code rtems_io_close( rtems_status_code rtems_io_read( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -146,8 +175,7 @@ rtems_status_code rtems_io_read( rtems_status_code rtems_io_write( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -162,8 +190,7 @@ rtems_status_code rtems_io_write( rtems_status_code rtems_io_control( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ); /* @@ -177,23 +204,6 @@ rtems_status_code rtems_io_control( void _IO_Initialize_all_drivers( void ); -/* - * _IO_Handler_routine - * - * DESCRIPTION: - * - * This routine provides the common foundation for all of the IO - * Manager's directives. - */ - -rtems_status_code _IO_Handler_routine( - IO_operations operation, - rtems_device_major_number major, - rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value -); - #include <rtems/io.inl> #ifdef __cplusplus diff --git a/c/src/exec/sapi/include/rtems/sptables.h b/c/src/exec/sapi/include/rtems/sptables.h index e74577d263..bbfd132760 100644 --- a/c/src/exec/sapi/include/rtems/sptables.h +++ b/c/src/exec/sapi/include/rtems/sptables.h @@ -49,7 +49,7 @@ const char _RTEMS_version[] = * This table is used by the single entry point code. */ -const void * _Entry_points[ NUMBER_OF_ENTRY_POINTS + 1 ] = { +const void * _Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ] = { (void *) rtems_initialize_executive, /* 0 */ (void *) rtems_initialize_executive_early, /* 1 */ (void *) rtems_initialize_executive_late, /* 2 */ @@ -116,20 +116,22 @@ const void * _Entry_points[ NUMBER_OF_ENTRY_POINTS + 1 ] = { (void *) rtems_port_external_to_internal, /* 63 */ (void *) rtems_port_internal_to_external, /* 64 */ (void *) rtems_io_initialize, /* 65 */ - (void *) rtems_io_open, /* 66 */ - (void *) rtems_io_close, /* 67 */ - (void *) rtems_io_read, /* 68 */ - (void *) rtems_io_write, /* 69 */ - (void *) rtems_io_control, /* 70 */ - (void *) rtems_fatal_error_occurred, /* 71 */ - (void *) rtems_rate_monotonic_create, /* 72 */ - (void *) rtems_rate_monotonic_ident, /* 73 */ - (void *) rtems_rate_monotonic_delete, /* 74 */ - (void *) rtems_rate_monotonic_cancel, /* 75 */ - (void *) rtems_rate_monotonic_period, /* 76 */ - (void *) rtems_multiprocessing_announce, /* 77 */ - (void *) rtems_debug_enable, /* 78 */ - (void *) rtems_debug_disable /* 79 */ + (void *) rtems_io_register_name, /* 66 */ + (void *) rtems_io_lookup_name, /* 67 */ + (void *) rtems_io_open, /* 68 */ + (void *) rtems_io_close, /* 69 */ + (void *) rtems_io_read, /* 70 */ + (void *) rtems_io_write, /* 71 */ + (void *) rtems_io_control, /* 72 */ + (void *) rtems_fatal_error_occurred, /* 73 */ + (void *) rtems_rate_monotonic_create, /* 74 */ + (void *) rtems_rate_monotonic_ident, /* 75 */ + (void *) rtems_rate_monotonic_delete, /* 76 */ + (void *) rtems_rate_monotonic_cancel, /* 77 */ + (void *) rtems_rate_monotonic_period, /* 78 */ + (void *) rtems_multiprocessing_announce, /* 79 */ + (void *) rtems_debug_enable, /* 80 */ + (void *) rtems_debug_disable /* 81 */ }; #ifdef __cplusplus diff --git a/c/src/exec/sapi/optman/no-io.c b/c/src/exec/sapi/optman/no-io.c index 177ec4b091..d0fc7676f1 100644 --- a/c/src/exec/sapi/optman/no-io.c +++ b/c/src/exec/sapi/optman/no-io.c @@ -23,11 +23,27 @@ void _IO_Initialize_all_drivers( void ) { } +rtems_status_code rtems_io_register_name( + char *device_name, + rtems_device_major_number major, + rtems_device_minor_number minor + ) +{ + return RTEMS_NOT_CONFIGURED; +} + +rtems_status_code rtems_io_lookup_name( + const char *pathname, + rtems_driver_name_t **rnp + ) +{ + return RTEMS_NOT_CONFIGURED; +} + rtems_status_code rtems_io_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { return( RTEMS_NOT_CONFIGURED ); @@ -36,8 +52,7 @@ rtems_status_code rtems_io_initialize( rtems_status_code rtems_io_open( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { return( RTEMS_NOT_CONFIGURED ); @@ -46,8 +61,7 @@ rtems_status_code rtems_io_open( rtems_status_code rtems_io_close( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { return( RTEMS_NOT_CONFIGURED ); @@ -56,8 +70,7 @@ rtems_status_code rtems_io_close( rtems_status_code rtems_io_read( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { return( RTEMS_NOT_CONFIGURED ); @@ -66,8 +79,7 @@ rtems_status_code rtems_io_read( rtems_status_code rtems_io_write( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { return( RTEMS_NOT_CONFIGURED ); @@ -76,19 +88,7 @@ rtems_status_code rtems_io_write( rtems_status_code rtems_io_control( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value -) -{ - return( RTEMS_NOT_CONFIGURED ); -} - -rtems_status_code _IO_Handler_routine( - IO_operations operation, - rtems_device_major_number major, - rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { return( RTEMS_NOT_CONFIGURED ); diff --git a/c/src/exec/sapi/src/exinit.c b/c/src/exec/sapi/src/exinit.c index 984dca68be..2d3261c256 100644 --- a/c/src/exec/sapi/src/exinit.c +++ b/c/src/exec/sapi/src/exinit.c @@ -177,8 +177,7 @@ rtems_interrupt_level rtems_initialize_executive_early( _Event_Manager_initialization(); _Message_queue_Manager_initialization( - configuration_table->maximum_message_queues, - configuration_table->maximum_messages + configuration_table->maximum_message_queues ); _Semaphore_Manager_initialization( diff --git a/c/src/exec/sapi/src/io.c b/c/src/exec/sapi/src/io.c index 916053da7e..4ab45b33f5 100644 --- a/c/src/exec/sapi/src/io.c +++ b/c/src/exec/sapi/src/io.c @@ -18,6 +18,9 @@ #include <rtems/io.h> #include <rtems/isr.h> #include <rtems/thread.h> +#include <rtems/intr.h> + +#include <string.h> /*PAGE * @@ -33,12 +36,82 @@ void _IO_Initialize_all_drivers( void ) { rtems_device_major_number major; - unsigned32 ignored; for ( major=0 ; major < _IO_Number_of_drivers ; major ++ ) - (void) rtems_io_initialize( major, 0, _Configuration_Table, &ignored ); + (void) rtems_io_initialize( major, 0, _Configuration_Table); +} + +/*PAGE + * + * rtems_io_register_name + * + * Associate a name with a driver + * + * Input Paramters: + * + * Output Parameters: + */ + +rtems_status_code rtems_io_register_name( + char *device_name, + rtems_device_major_number major, + rtems_device_minor_number minor + ) +{ + rtems_driver_name_t *np; + unsigned32 level; + + /* find an empty slot */ + for (np = rtems_driver_name_table; np < &rtems_driver_name_table[RTEMS_MAX_DRIVER_NAMES]; np++) + { + rtems_interrupt_disable(level); + if (np->device_name == 0) + { + np->device_name = device_name; + np->device_name_length = strlen(device_name); + np->major = major; + np->minor = minor; + rtems_interrupt_enable(level); + + return RTEMS_SUCCESSFUL; + } + rtems_interrupt_enable(level); + } + + return RTEMS_TOO_MANY; +} + +/*PAGE + * + * rtems_io_lookup_name + * + * Find what driver "owns" this name + * + * Input Paramters: + * + * Output Parameters: + */ + +rtems_status_code rtems_io_lookup_name( + const char *pathname, + rtems_driver_name_t **rnp + ) +{ + rtems_driver_name_t *np; + + for (np = rtems_driver_name_table; np < &rtems_driver_name_table[RTEMS_MAX_DRIVER_NAMES]; np++) + if (np->device_name) + if (strncmp(np->device_name, pathname, np->device_name_length) == 0) + { + *rnp = np; + return RTEMS_SUCCESSFUL; + } + + *rnp = 0; + return RTEMS_UNSATISFIED; } + /*PAGE * * rtems_io_initialize @@ -49,27 +122,24 @@ void _IO_Initialize_all_drivers( void ) * major - device driver number * minor - device number * argument - pointer to argument(s) - * return_value - pointer to driver's return value * * Output Parameters: * returns - return code - * *return_value - driver's return code */ rtems_status_code rtems_io_initialize( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { - return _IO_Handler_routine( - IO_INITIALIZE_OPERATION, - major, - minor, - argument, - return_value - ); + rtems_device_driver_entry callout; + + if ( major >= _IO_Number_of_drivers ) + return RTEMS_INVALID_NUMBER; + + callout = _IO_Driver_address_table[major].initialization; + return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL; } /*PAGE @@ -82,27 +152,24 @@ rtems_status_code rtems_io_initialize( * major - device driver number * minor - device number * argument - pointer to argument(s) - * return_value - pointer to driver's return value * * Output Parameters: * returns - return code - * *return_value - driver's return code */ rtems_status_code rtems_io_open( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { - return _IO_Handler_routine( - IO_OPEN_OPERATION, - major, - minor, - argument, - return_value - ); + rtems_device_driver_entry callout; + + if ( major >= _IO_Number_of_drivers ) + return RTEMS_INVALID_NUMBER; + + callout = _IO_Driver_address_table[major].open; + return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL; } /*PAGE @@ -115,27 +182,24 @@ rtems_status_code rtems_io_open( * major - device driver number * minor - device number * argument - pointer to argument(s) - * return_value - pointer to driver's return value * * Output Parameters: * returns - return code - * *return_value - driver's return code */ rtems_status_code rtems_io_close( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { - return _IO_Handler_routine( - IO_CLOSE_OPERATION, - major, - minor, - argument, - return_value - ); + rtems_device_driver_entry callout; + + if ( major >= _IO_Number_of_drivers ) + return RTEMS_INVALID_NUMBER; + + callout = _IO_Driver_address_table[major].close; + return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL; } /*PAGE @@ -148,27 +212,24 @@ rtems_status_code rtems_io_close( * major - device driver number * minor - device number * argument - pointer to argument(s) - * return_value - pointer to driver's return value * * Output Parameters: * returns - return code - * *return_value - driver's return code */ rtems_status_code rtems_io_read( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { - return _IO_Handler_routine( - IO_READ_OPERATION, - major, - minor, - argument, - return_value - ); + rtems_device_driver_entry callout; + + if ( major >= _IO_Number_of_drivers ) + return RTEMS_INVALID_NUMBER; + + callout = _IO_Driver_address_table[major].read; + return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL; } /*PAGE @@ -181,27 +242,24 @@ rtems_status_code rtems_io_read( * major - device driver number * minor - device number * argument - pointer to argument(s) - * return_value - pointer to driver's return value * * Output Parameters: * returns - return code - * *return_value - driver's return code */ rtems_status_code rtems_io_write( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { - return _IO_Handler_routine( - IO_WRITE_OPERATION, - major, - minor, - argument, - return_value - ); + rtems_device_driver_entry callout; + + if ( major >= _IO_Number_of_drivers ) + return RTEMS_INVALID_NUMBER; + + callout = _IO_Driver_address_table[major].write; + return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL; } /*PAGE @@ -214,103 +272,23 @@ rtems_status_code rtems_io_write( * major - device driver number * minor - device number * argument - pointer to argument(s) - * return_value - pointer to driver's return value * * Output Parameters: * returns - return code - * *return_value - driver's return code */ rtems_status_code rtems_io_control( rtems_device_major_number major, rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value + void *argument ) { - return _IO_Handler_routine( - IO_CONTROL_OPERATION, - major, - minor, - argument, - return_value - ); -} - -/*PAGE - * - * _IO_Handler_routine - * - * This routine implements all IO manager directives. - * - * Input Paramters: - * operation - I/O operation to be performed - * major - device driver number - * minor - device number - * argument - pointer to argument(s) - * return_value - pointer to driver's return value - * - * Output Parameters: - * returns - return code - * *return_value - driver's return code - */ + rtems_device_driver_entry callout; + + if ( major >= _IO_Number_of_drivers ) + return RTEMS_INVALID_NUMBER; -rtems_status_code _IO_Handler_routine( - IO_operations operation, - rtems_device_major_number major, - rtems_device_minor_number minor, - void *argument, - unsigned32 *return_value -) -{ - rtems_device_driver_entry io_callout; - - /* - * NOTE: There is no range checking as in Ada because: - * + arrays in Ada are not always zero based. - * + with zero based arrays, a comparison of an unsigned - * number being less than zero would be necessary to - * check it as a range. This would cause a warning for - * checking an unsigned number for being negative. - */ - - if ( major >= _IO_Number_of_drivers ) - return ( RTEMS_INVALID_NUMBER ); - - switch ( operation ) { - case IO_INITIALIZE_OPERATION: - io_callout = _IO_Driver_address_table[ major ].initialization; - break; - case IO_OPEN_OPERATION: - io_callout = _IO_Driver_address_table[ major ].open; - break; - case IO_CLOSE_OPERATION: - io_callout = _IO_Driver_address_table[ major ].close; - break; - case IO_READ_OPERATION: - io_callout = _IO_Driver_address_table[ major ].read; - break; - case IO_WRITE_OPERATION: - io_callout = _IO_Driver_address_table[ major ].write; - break; - case IO_CONTROL_OPERATION: - io_callout = _IO_Driver_address_table[ major ].control; - break; - default: /* unreached -- only to remove warnings */ - io_callout = NULL; - break; - } - - if ( io_callout != NULL ) - (*io_callout)( - major, - minor, - argument, - _Thread_Executing->Object.id, - return_value - ); - else - *return_value = 0; - - return( RTEMS_SUCCESSFUL ); + callout = _IO_Driver_address_table[major].control; + return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL; } + diff --git a/c/src/exec/score/headers/object.h b/c/src/exec/score/headers/object.h index 50eede9fd7..0553fe901d 100644 --- a/c/src/exec/score/headers/object.h +++ b/c/src/exec/score/headers/object.h @@ -100,6 +100,18 @@ EXTERN unsigned32 _Objects_Local_node; #define RTEMS_WHO_AM_I 0 /* + * Parameters and return id's for _Objects_Get_next + */ + +#define RTEMS_OBJECT_ID_INITIAL_INDEX (0) +#define RTEMS_OBJECT_ID_FINAL_INDEX (0xffff) + +#define RTEMS_OBJECT_ID_INITIAL(node) (_Objects_Build_id( \ + node, \ + RTEMS_OBJECT_ID_INITIAL_INDEX)) +#define RTEMS_OBJECT_ID_FINAL ((Objects_Id) ~0) + +/* * _Objects_Handler_initialization * * DESCRIPTION: @@ -179,6 +191,22 @@ Objects_Control *_Objects_Get ( ); /* + * _Objects_Get_next + * + * DESCRIPTION: + * + * Like _Objects_Get, but is used to find "next" open object. + * + */ + +Objects_Control *_Objects_Get_next( + Objects_Information *information, + Objects_Id id, + unsigned32 *location_p, + Objects_Id *next_id_p +); + +/* * _Objects_Is_name_valid * * DESCRIPTION: diff --git a/c/src/exec/score/headers/system.h b/c/src/exec/score/headers/system.h index 3ff3772d11..96b0abfff8 100644 --- a/c/src/exec/score/headers/system.h +++ b/c/src/exec/score/headers/system.h @@ -78,6 +78,7 @@ typedef void * proc_ptr; #include <rtems/cpu.h> /* processor specific information */ #include <rtems/status.h> /* RTEMS status codes */ +#include <rtems/directives.h> /* * Define NULL @@ -103,6 +104,9 @@ typedef void * proc_ptr; #define stringify( _x ) # _x +#define RTEMS_offsetof(type, field) \ + ((unsigned32) &(((type *) 0)->field)) + /* * The following is the extern for the RTEMS version string. * The contents of this string are CPU specific. @@ -115,8 +119,7 @@ extern const char _Copyright_Notice[]; /* RTEMS copyright string */ * The jump table of entry points into RTEMS directives. */ -#define NUMBER_OF_ENTRY_POINTS 79 -extern const void * _Entry_points[ NUMBER_OF_ENTRY_POINTS + 1 ]; +extern const void * _Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ]; /* * The following defines the CPU dependent information table. diff --git a/c/src/exec/score/headers/thread.h b/c/src/exec/score/headers/thread.h index 4a417828a3..953e19ba95 100644 --- a/c/src/exec/score/headers/thread.h +++ b/c/src/exec/score/headers/thread.h @@ -115,6 +115,7 @@ typedef struct { union { unsigned32 segment_size; /* size of segment requested */ rtems_event_set event_condition; + unsigned32 *message_size_p; /* ptr for return size of message */ } Extra; void *return_argument; /* address of user return param */ rtems_status_code return_code; /* status for thread awakened */ diff --git a/c/src/exec/score/include/rtems/score/object.h b/c/src/exec/score/include/rtems/score/object.h index 50eede9fd7..0553fe901d 100644 --- a/c/src/exec/score/include/rtems/score/object.h +++ b/c/src/exec/score/include/rtems/score/object.h @@ -100,6 +100,18 @@ EXTERN unsigned32 _Objects_Local_node; #define RTEMS_WHO_AM_I 0 /* + * Parameters and return id's for _Objects_Get_next + */ + +#define RTEMS_OBJECT_ID_INITIAL_INDEX (0) +#define RTEMS_OBJECT_ID_FINAL_INDEX (0xffff) + +#define RTEMS_OBJECT_ID_INITIAL(node) (_Objects_Build_id( \ + node, \ + RTEMS_OBJECT_ID_INITIAL_INDEX)) +#define RTEMS_OBJECT_ID_FINAL ((Objects_Id) ~0) + +/* * _Objects_Handler_initialization * * DESCRIPTION: @@ -179,6 +191,22 @@ Objects_Control *_Objects_Get ( ); /* + * _Objects_Get_next + * + * DESCRIPTION: + * + * Like _Objects_Get, but is used to find "next" open object. + * + */ + +Objects_Control *_Objects_Get_next( + Objects_Information *information, + Objects_Id id, + unsigned32 *location_p, + Objects_Id *next_id_p +); + +/* * _Objects_Is_name_valid * * DESCRIPTION: diff --git a/c/src/exec/score/include/rtems/score/thread.h b/c/src/exec/score/include/rtems/score/thread.h index 4a417828a3..953e19ba95 100644 --- a/c/src/exec/score/include/rtems/score/thread.h +++ b/c/src/exec/score/include/rtems/score/thread.h @@ -115,6 +115,7 @@ typedef struct { union { unsigned32 segment_size; /* size of segment requested */ rtems_event_set event_condition; + unsigned32 *message_size_p; /* ptr for return size of message */ } Extra; void *return_argument; /* address of user return param */ rtems_status_code return_code; /* status for thread awakened */ diff --git a/c/src/exec/score/include/rtems/system.h b/c/src/exec/score/include/rtems/system.h index 3ff3772d11..96b0abfff8 100644 --- a/c/src/exec/score/include/rtems/system.h +++ b/c/src/exec/score/include/rtems/system.h @@ -78,6 +78,7 @@ typedef void * proc_ptr; #include <rtems/cpu.h> /* processor specific information */ #include <rtems/status.h> /* RTEMS status codes */ +#include <rtems/directives.h> /* * Define NULL @@ -103,6 +104,9 @@ typedef void * proc_ptr; #define stringify( _x ) # _x +#define RTEMS_offsetof(type, field) \ + ((unsigned32) &(((type *) 0)->field)) + /* * The following is the extern for the RTEMS version string. * The contents of this string are CPU specific. @@ -115,8 +119,7 @@ extern const char _Copyright_Notice[]; /* RTEMS copyright string */ * The jump table of entry points into RTEMS directives. */ -#define NUMBER_OF_ENTRY_POINTS 79 -extern const void * _Entry_points[ NUMBER_OF_ENTRY_POINTS + 1 ]; +extern const void * _Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ]; /* * The following defines the CPU dependent information table. diff --git a/c/src/exec/score/src/object.c b/c/src/exec/score/src/object.c index 71c365fa1e..29450d4171 100644 --- a/c/src/exec/score/src/object.c +++ b/c/src/exec/score/src/object.c @@ -12,6 +12,7 @@ * * $Id$ */ + #include <rtems/system.h> #include <rtems/chain.h> #include <rtems/config.h> @@ -226,3 +227,69 @@ Objects_Control *_Objects_Get( _Objects_MP_Is_remote( information, id, location, &the_object ); return the_object; } + + +/*PAGE + * + * _Objects_Get_next + * + * Like _Objects_Get, but considers the 'id' as a "hint" and + * finds next valid one after that point. + * Mostly used for monitor and debug traversal of an object. + * + * Input parameters: + * information - pointer to entry in table for this class + * id - object id to search for + * location - address of where to store the location + * next_id - address to store next id to try + * + * Output parameters: + * returns - address of object if local + * location - one of the following: + * OBJECTS_ERROR - invalid object ID + * OBJECTS_REMOTE - remote object + * OBJECTS_LOCAL - local object + * next_id - will contain a reasonable "next" id to continue traversal + * + * NOTE: + * assumes can add '1' to an id to get to next index. + */ + +Objects_Control * +_Objects_Get_next( + Objects_Information *information, + Objects_Id id, + unsigned32 *location_p, + Objects_Id *next_id_p +) +{ + Objects_Control *object; + Objects_Id next_id; + + if (rtems_get_index(id) == RTEMS_OBJECT_ID_INITIAL_INDEX) + next_id = information->minimum_id; + else + next_id = id; + + do { + /* walked off end of list? */ + if (next_id > information->maximum_id) + { + *location_p = OBJECTS_ERROR; + goto final; + } + + /* try to grab one */ + object = _Objects_Get(information, next_id, location_p); + + next_id++; + + } while (*location_p != OBJECTS_LOCAL); + + *next_id_p = next_id; + return object; + +final: + *next_id_p = RTEMS_OBJECT_ID_FINAL; + return 0; +} |