summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1995-09-11 19:35:39 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1995-09-11 19:35:39 +0000
commit3a4ae6c210bcc37754767966f1128ae23c77b6af (patch)
tree8804983e5b92bec788d548df13db7513118d351d /cpukit
parentnew file -- split from inlines (diff)
downloadrtems-3a4ae6c210bcc37754767966f1128ae23c77b6af.tar.bz2
The word "RTEMS" almost completely removed from the core.
Configuration Table Template file added and all tests modified to use this. All gvar.h and conftbl.h files removed from test directories. Configuration parameter maximum_devices added. Core semaphore and mutex handlers added and RTEMS API Semaphore Manager updated to reflect this. Initialization sequence changed to invoke API specific initialization routines. Initialization tasks table now owned by RTEMS Tasks Manager. Added user extension for post-switch. Utilized user extensions to implement API specific functionality like signal dispatching. Added extensions to the System Initialization Thread so that an API can register a function to be invoked while the system is being initialized. These are largely equivalent to the pre-driver and post-driver hooks. Added the Modules file oar-go32_p5, modified oar-go32, and modified the file make/custom/go32.cfg to look at an environment varable which determines what CPU model is being used. All BSPs updated to reflect named devices and clock driver's IOCTL used by the Shared Memory Driver. Also merged clock isr into main file and removed ckisr.c where possible. Updated spsize to reflect new and moved variables. Makefiles for the executive source and include files updated to show break down of files into Core, RTEMS API, and Neither. Header and inline files installed into subdirectory based on whether logically in the Core or a part of the RTEMS API.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/libcsupport/include/console.h37
-rw-r--r--cpukit/libcsupport/src/error.c4
-rw-r--r--cpukit/libcsupport/src/libio.c3
-rw-r--r--cpukit/libcsupport/src/newlibc.c11
-rw-r--r--cpukit/libmisc/monitor/mon-dname.c3
-rw-r--r--cpukit/libmisc/monitor/mon-extension.c14
-rw-r--r--cpukit/libmisc/monitor/mon-object.c5
-rw-r--r--cpukit/libmisc/monitor/mon-server.c2
-rw-r--r--cpukit/libmisc/monitor/mon-task.c18
-rw-r--r--cpukit/libmisc/stackchk/check.c51
-rw-r--r--cpukit/libmisc/stackchk/internal.h2
-rw-r--r--cpukit/rtems/include/rtems.h84
-rw-r--r--cpukit/rtems/include/rtems/rtems/asr.h5
-rw-r--r--cpukit/rtems/include/rtems/rtems/attr.h19
-rw-r--r--cpukit/rtems/include/rtems/rtems/clock.h3
-rw-r--r--cpukit/rtems/include/rtems/rtems/dpmem.h5
-rw-r--r--cpukit/rtems/include/rtems/rtems/event.h22
-rw-r--r--cpukit/rtems/include/rtems/rtems/eventmp.h10
-rw-r--r--cpukit/rtems/include/rtems/rtems/eventset.h2
-rw-r--r--cpukit/rtems/include/rtems/rtems/intr.h23
-rw-r--r--cpukit/rtems/include/rtems/rtems/message.h13
-rw-r--r--cpukit/rtems/include/rtems/rtems/modes.h4
-rw-r--r--cpukit/rtems/include/rtems/rtems/mp.h14
-rw-r--r--cpukit/rtems/include/rtems/rtems/msgmp.h14
-rw-r--r--cpukit/rtems/include/rtems/rtems/options.h2
-rw-r--r--cpukit/rtems/include/rtems/rtems/part.h12
-rw-r--r--cpukit/rtems/include/rtems/rtems/partmp.h11
-rw-r--r--cpukit/rtems/include/rtems/rtems/ratemon.h15
-rw-r--r--cpukit/rtems/include/rtems/rtems/region.h17
-rw-r--r--cpukit/rtems/include/rtems/rtems/regionmp.h15
-rw-r--r--cpukit/rtems/include/rtems/rtems/rtemsapi.h34
-rw-r--r--cpukit/rtems/include/rtems/rtems/sem.h109
-rw-r--r--cpukit/rtems/include/rtems/rtems/semmp.h16
-rw-r--r--cpukit/rtems/include/rtems/rtems/signal.h22
-rw-r--r--cpukit/rtems/include/rtems/rtems/signalmp.h10
-rw-r--r--cpukit/rtems/include/rtems/rtems/status.h28
-rw-r--r--cpukit/rtems/include/rtems/rtems/support.h49
-rw-r--r--cpukit/rtems/include/rtems/rtems/taskmp.h12
-rw-r--r--cpukit/rtems/include/rtems/rtems/tasks.h170
-rw-r--r--cpukit/rtems/include/rtems/rtems/timer.h36
-rw-r--r--cpukit/rtems/include/rtems/rtems/types.h31
-rw-r--r--cpukit/rtems/inline/rtems/rtems/asr.inl5
-rw-r--r--cpukit/rtems/inline/rtems/rtems/attr.inl13
-rw-r--r--cpukit/rtems/inline/rtems/rtems/event.inl6
-rw-r--r--cpukit/rtems/inline/rtems/rtems/message.inl2
-rw-r--r--cpukit/rtems/inline/rtems/rtems/modes.inl7
-rw-r--r--cpukit/rtems/inline/rtems/rtems/status.inl12
-rw-r--r--cpukit/rtems/inline/rtems/rtems/tasks.inl59
-rw-r--r--cpukit/rtems/macros/rtems/rtems/asr.inl3
-rw-r--r--cpukit/rtems/macros/rtems/rtems/attr.inl9
-rw-r--r--cpukit/rtems/macros/rtems/rtems/event.inl14
-rw-r--r--cpukit/rtems/macros/rtems/rtems/modes.inl5
-rw-r--r--cpukit/rtems/macros/rtems/rtems/status.inl8
-rw-r--r--cpukit/rtems/macros/rtems/rtems/tasks.inl57
-rw-r--r--cpukit/rtems/src/dpmem.c60
-rw-r--r--cpukit/rtems/src/event.c35
-rw-r--r--cpukit/rtems/src/eventmp.c18
-rw-r--r--cpukit/rtems/src/intr.c32
-rw-r--r--cpukit/rtems/src/mp.c87
-rw-r--r--cpukit/rtems/src/msg.c108
-rw-r--r--cpukit/rtems/src/msgmp.c41
-rw-r--r--cpukit/rtems/src/part.c72
-rw-r--r--cpukit/rtems/src/partmp.c18
-rw-r--r--cpukit/rtems/src/ratemon.c63
-rw-r--r--cpukit/rtems/src/region.c119
-rw-r--r--cpukit/rtems/src/regionmp.c22
-rw-r--r--cpukit/rtems/src/rtclock.c44
-rw-r--r--cpukit/rtems/src/rtemstimer.c101
-rw-r--r--cpukit/rtems/src/sem.c451
-rw-r--r--cpukit/rtems/src/semmp.c26
-rw-r--r--cpukit/rtems/src/signal.c75
-rw-r--r--cpukit/rtems/src/signalmp.c20
-rw-r--r--cpukit/rtems/src/taskmp.c22
-rw-r--r--cpukit/rtems/src/tasks.c504
-rw-r--r--cpukit/sapi/include/rtems/config.h265
-rw-r--r--cpukit/sapi/include/rtems/extension.h29
-rw-r--r--cpukit/sapi/include/rtems/init.h12
-rw-r--r--cpukit/sapi/include/rtems/io.h56
-rw-r--r--cpukit/sapi/src/exinit.c140
-rw-r--r--cpukit/sapi/src/extension.c30
-rw-r--r--cpukit/sapi/src/fatal.c24
-rw-r--r--cpukit/sapi/src/io.c29
-rw-r--r--cpukit/sapi/src/rtemsapi.c89
-rw-r--r--cpukit/score/cpu/hppa1.1/cpu.c14
-rw-r--r--cpukit/score/cpu/i386/asm.h2
-rw-r--r--cpukit/score/cpu/i386/cpu.c21
-rw-r--r--cpukit/score/cpu/i386/rtems/asm.h2
-rw-r--r--cpukit/score/cpu/i960/asm.h2
-rw-r--r--cpukit/score/cpu/i960/cpu.c19
-rw-r--r--cpukit/score/cpu/m68k/asm.h2
-rw-r--r--cpukit/score/cpu/m68k/cpu.c19
-rw-r--r--cpukit/score/cpu/m68k/rtems/asm.h2
-rw-r--r--cpukit/score/cpu/no_cpu/asm.h2
-rw-r--r--cpukit/score/cpu/no_cpu/cpu.c19
-rw-r--r--cpukit/score/cpu/no_cpu/cpu_asm.c2
-rw-r--r--cpukit/score/cpu/no_cpu/rtems/asm.h2
-rw-r--r--cpukit/score/cpu/unix/cpu.c29
-rw-r--r--cpukit/score/include/rtems/score/address.h17
-rw-r--r--cpukit/score/include/rtems/score/chain.h4
-rw-r--r--cpukit/score/include/rtems/score/context.h2
-rw-r--r--cpukit/score/include/rtems/score/coremutex.h247
-rw-r--r--cpukit/score/include/rtems/score/coresem.h179
-rw-r--r--cpukit/score/include/rtems/score/heap.h2
-rw-r--r--cpukit/score/include/rtems/score/interr.h93
-rw-r--r--cpukit/score/include/rtems/score/isr.h40
-rw-r--r--cpukit/score/include/rtems/score/mpci.h152
-rw-r--r--cpukit/score/include/rtems/score/mppkt.h65
-rw-r--r--cpukit/score/include/rtems/score/object.h60
-rw-r--r--cpukit/score/include/rtems/score/objectmp.h5
-rw-r--r--cpukit/score/include/rtems/score/priority.h18
-rw-r--r--cpukit/score/include/rtems/score/stack.h8
-rw-r--r--cpukit/score/include/rtems/score/states.h25
-rw-r--r--cpukit/score/include/rtems/score/sysstate.h19
-rw-r--r--cpukit/score/include/rtems/score/thread.h225
-rw-r--r--cpukit/score/include/rtems/score/threadmp.h2
-rw-r--r--cpukit/score/include/rtems/score/threadq.h26
-rw-r--r--cpukit/score/include/rtems/score/tod.h46
-rw-r--r--cpukit/score/include/rtems/score/tqdata.h17
-rw-r--r--cpukit/score/include/rtems/score/userext.h160
-rw-r--r--cpukit/score/include/rtems/score/watchdog.h36
-rw-r--r--cpukit/score/include/rtems/score/wkspace.h20
-rw-r--r--cpukit/score/include/rtems/system.h10
-rw-r--r--cpukit/score/inline/rtems/score/address.inl20
-rw-r--r--cpukit/score/inline/rtems/score/coremutex.inl104
-rw-r--r--cpukit/score/inline/rtems/score/coresem.inl47
-rw-r--r--cpukit/score/inline/rtems/score/heap.inl2
-rw-r--r--cpukit/score/inline/rtems/score/isr.inl12
-rw-r--r--cpukit/score/inline/rtems/score/mppkt.inl4
-rw-r--r--cpukit/score/inline/rtems/score/object.inl18
-rw-r--r--cpukit/score/inline/rtems/score/priority.inl10
-rw-r--r--cpukit/score/inline/rtems/score/stack.inl2
-rw-r--r--cpukit/score/inline/rtems/score/states.inl15
-rw-r--r--cpukit/score/inline/rtems/score/sysstate.inl13
-rw-r--r--cpukit/score/inline/rtems/score/thread.inl14
-rw-r--r--cpukit/score/inline/rtems/score/tod.inl2
-rw-r--r--cpukit/score/inline/rtems/score/userext.inl189
-rw-r--r--cpukit/score/inline/rtems/score/watchdog.inl16
-rw-r--r--cpukit/score/inline/rtems/score/wkspace.inl17
-rw-r--r--cpukit/score/macros/rtems/score/address.inl15
-rw-r--r--cpukit/score/macros/rtems/score/coremutex.inl77
-rw-r--r--cpukit/score/macros/rtems/score/coresem.inl40
-rw-r--r--cpukit/score/macros/rtems/score/heap.inl2
-rw-r--r--cpukit/score/macros/rtems/score/isr.inl12
-rw-r--r--cpukit/score/macros/rtems/score/object.inl18
-rw-r--r--cpukit/score/macros/rtems/score/priority.inl10
-rw-r--r--cpukit/score/macros/rtems/score/stack.inl2
-rw-r--r--cpukit/score/macros/rtems/score/states.inl11
-rw-r--r--cpukit/score/macros/rtems/score/sysstate.inl15
-rw-r--r--cpukit/score/macros/rtems/score/thread.inl8
-rw-r--r--cpukit/score/macros/rtems/score/userext.inl83
-rw-r--r--cpukit/score/macros/rtems/score/watchdog.inl2
-rw-r--r--cpukit/score/macros/rtems/score/wkspace.inl21
-rw-r--r--cpukit/score/src/chain.c6
-rw-r--r--cpukit/score/src/coremutex.c269
-rw-r--r--cpukit/score/src/coresem.c185
-rw-r--r--cpukit/score/src/coretod.c30
-rw-r--r--cpukit/score/src/heap.c4
-rw-r--r--cpukit/score/src/interr.c61
-rw-r--r--cpukit/score/src/isr.c60
-rw-r--r--cpukit/score/src/mpci.c181
-rw-r--r--cpukit/score/src/object.c62
-rw-r--r--cpukit/score/src/objectmp.c53
-rw-r--r--cpukit/score/src/thread.c237
-rw-r--r--cpukit/score/src/threadmp.c15
-rw-r--r--cpukit/score/src/threadq.c72
-rw-r--r--cpukit/score/src/userext.c56
-rw-r--r--cpukit/score/src/watchdog.c14
-rw-r--r--cpukit/score/src/wkspace.c10
168 files changed, 4848 insertions, 2632 deletions
diff --git a/cpukit/libcsupport/include/console.h b/cpukit/libcsupport/include/console.h
index d102c6a1b1..02196de7a9 100644
--- a/cpukit/libcsupport/include/console.h
+++ b/cpukit/libcsupport/include/console.h
@@ -22,14 +22,43 @@ extern "C" {
#endif
#define CONSOLE_DRIVER_TABLE_ENTRY \
- { console_initialize, NULL, NULL, NULL, NULL, NULL }
+ { console_initialize, console_open, console_close, \
+ console_read, console_write, console_control }
rtems_device_driver console_initialize(
rtems_device_major_number,
rtems_device_minor_number,
- void *,
- rtems_id,
- rtems_unsigned32 *
+ void *
+);
+
+rtems_device_driver console_open(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver console_close(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver console_read(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver console_write(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver console_control(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
);
#ifdef __cplusplus
diff --git a/cpukit/libcsupport/src/error.c b/cpukit/libcsupport/src/error.c
index 8cf46f0565..cfe1858e08 100644
--- a/cpukit/libcsupport/src/error.c
+++ b/cpukit/libcsupport/src/error.c
@@ -91,8 +91,8 @@ rtems_assoc_t rtems_status_assoc[] = {
{ "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, },
+ { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
{ 0, 0, 0 },
};
@@ -134,7 +134,7 @@ static int rtems_verror(
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
local_errno = errno;
- if (_Configuration_Is_multiprocessing())
+ if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
if (rtems_progname && *rtems_progname)
diff --git a/cpukit/libcsupport/src/libio.c b/cpukit/libcsupport/src/libio.c
index f2046501ce..38e0f83bac 100644
--- a/cpukit/libcsupport/src/libio.c
+++ b/cpukit/libcsupport/src/libio.c
@@ -14,8 +14,11 @@
#include <rtems/assoc.h> /* assoc.h not included by rtems.h */
#include <fcntl.h> /* O_RDONLY, et.al. */
+#include <sys/fcntl.h> /* O_RDONLY, et.al. */
#if defined(solaris2)
#define O_NDELAY O_NONBLOCK
+#elif defined(RTEMS_NEWLIB)
+#define O_NDELAY _FNBIO
#endif
#include <errno.h>
#include <string.h> /* strcmp */
diff --git a/cpukit/libcsupport/src/newlibc.c b/cpukit/libcsupport/src/newlibc.c
index 4493b473da..e041668375 100644
--- a/cpukit/libcsupport/src/newlibc.c
+++ b/cpukit/libcsupport/src/newlibc.c
@@ -80,11 +80,12 @@ libc_wrapup(void)
}
-rtems_extension
+rtems_boolean
libc_create_hook(rtems_tcb *current_task,
rtems_tcb *creating_task)
{
MY_task_set_note(creating_task, LIBC_NOTEPAD, 0);
+ return TRUE;
}
/*
@@ -231,10 +232,10 @@ libc_init(int reentrant)
{
memset(&libc_extension, 0, sizeof(libc_extension));
- libc_extension.rtems_task_create = libc_create_hook;
- libc_extension.rtems_task_start = libc_start_hook;
- libc_extension.task_switch = libc_switch_hook;
- libc_extension.rtems_task_delete = libc_delete_hook;
+ libc_extension.thread_create = libc_create_hook;
+ libc_extension.thread_start = libc_start_hook;
+ libc_extension.thread_switch = libc_switch_hook;
+ libc_extension.thread_delete = libc_delete_hook;
rc = rtems_extension_create(rtems_build_name('L', 'I', 'B', 'C'),
&libc_extension, &extension_id);
diff --git a/cpukit/libmisc/monitor/mon-dname.c b/cpukit/libmisc/monitor/mon-dname.c
index fd10f3e333..b9907eb42b 100644
--- a/cpukit/libmisc/monitor/mon-dname.c
+++ b/cpukit/libmisc/monitor/mon-dname.c
@@ -57,7 +57,8 @@ rtems_monitor_dname_next(
rtems_driver_name_t *table = object_information;
rtems_driver_name_t *np = 0;
- for (np = table + n ; n<RTEMS_MAX_DRIVER_NAMES; n++, np++)
+/* XXX should we be using _IO_Number_of_devices */
+ for (np = table + n ; n<_IO_Number_of_devices; n++, np++)
if (np->device_name)
goto done;
diff --git a/cpukit/libmisc/monitor/mon-extension.c b/cpukit/libmisc/monitor/mon-extension.c
index 48dfb96a2d..230fab9ddf 100644
--- a/cpukit/libmisc/monitor/mon-extension.c
+++ b/cpukit/libmisc/monitor/mon-extension.c
@@ -22,20 +22,20 @@ rtems_monitor_extension_canonical(
rtems_extensions_table *e = &rtems_extension->Extension.Callouts;
rtems_monitor_symbol_canonical_by_value(&canonical_extension->create,
- e->rtems_task_create);
+ e->thread_create);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->start,
- e->rtems_task_start);
+ e->thread_start);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->restart,
- e->rtems_task_restart);
+ e->thread_restart);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->delete,
- e->rtems_task_delete);
+ e->thread_delete);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->tswitch,
- e->task_switch);
+ e->thread_switch);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->begin,
- e->task_begin);
+ e->thread_begin);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->exitted,
- e->task_exitted);
+ e->thread_exitted);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->fatal,
e->fatal);
}
diff --git a/cpukit/libmisc/monitor/mon-object.c b/cpukit/libmisc/monitor/mon-object.c
index 619ae5cf79..2f92845586 100644
--- a/cpukit/libmisc/monitor/mon-object.c
+++ b/cpukit/libmisc/monitor/mon-object.c
@@ -92,7 +92,10 @@ rtems_monitor_object_info_t rtems_monitor_object_info[] =
(rtems_monitor_object_dump_fn) rtems_monitor_driver_dump,
},
{ RTEMS_OBJECT_DNAME,
- (void *) &rtems_driver_name_table[0],
+ /* XXX now that the driver name table is allocated from the */
+ /* XXX Workspace, this does not work */
+ (void *) 0,
+ /* (void *) _IO_Driver_name_table, */
sizeof(rtems_monitor_dname_t),
(rtems_monitor_object_next_fn) rtems_monitor_dname_next,
(rtems_monitor_object_canonical_fn) rtems_monitor_dname_canonical,
diff --git a/cpukit/libmisc/monitor/mon-server.c b/cpukit/libmisc/monitor/mon-server.c
index e3e2da5069..5ff5688c9c 100644
--- a/cpukit/libmisc/monitor/mon-server.c
+++ b/cpukit/libmisc/monitor/mon-server.c
@@ -219,7 +219,7 @@ rtems_monitor_server_init(
{
rtems_status_code status;
- if (_Configuration_Is_multiprocessing() &&
+ if (_System_state_Is_multiprocessing &&
(_Configuration_MP_table->maximum_nodes > 1))
{
unsigned32 maximum_nodes = _Configuration_MP_table->maximum_nodes;
diff --git a/cpukit/libmisc/monitor/mon-task.c b/cpukit/libmisc/monitor/mon-task.c
index 1f4dee7dee..95b650d429 100644
--- a/cpukit/libmisc/monitor/mon-task.c
+++ b/cpukit/libmisc/monitor/mon-task.c
@@ -19,6 +19,9 @@ rtems_monitor_task_canonical(
)
{
Thread_Control *rtems_thread = (Thread_Control *) thread_void;
+ RTEMS_API_Control *api;
+
+ api = rtems_thread->API_Extensions[ THREAD_API_RTEMS ];
canonical_task->entry = rtems_thread->Start.entry_point;
canonical_task->argument = rtems_thread->Start.numeric_argument;
@@ -27,11 +30,18 @@ rtems_monitor_task_canonical(
canonical_task->priority = rtems_thread->current_priority;
canonical_task->state = rtems_thread->current_state;
canonical_task->wait_id = rtems_thread->Wait.id;
- canonical_task->events = rtems_thread->RTEMS_API->pending_events;
- canonical_task->modes = rtems_thread->current_modes;
- canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->RTEMS_API->attribute_set */;
- (void) memcpy(canonical_task->notepad, rtems_thread->RTEMS_API->Notepads, sizeof(canonical_task->notepad));
+ canonical_task->events = api->pending_events;
+
+/* XXX modes and attributes only exist in the RTEMS API .. */
+/* XXX not directly in the core thread.. they will have to be derived */
+/* XXX if they are important enough to include anymore. */
+ canonical_task->modes = 0; /* XXX FIX ME.... rtems_thread->current_modes; */
+ canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->API_Extensions[ THREAD_API_RTEMS ]->attribute_set */;
+ (void) memcpy(canonical_task->notepad, api ->Notepads, sizeof(canonical_task->notepad));
+/* XXX more to fix */
+/*
(void) memcpy(&canonical_task->wait_args, &rtems_thread->Wait.Extra, sizeof(canonical_task->wait_args));
+*/
}
diff --git a/cpukit/libmisc/stackchk/check.c b/cpukit/libmisc/stackchk/check.c
index f9f32c5204..c2ee9a0a10 100644
--- a/cpukit/libmisc/stackchk/check.c
+++ b/cpukit/libmisc/stackchk/check.c
@@ -18,18 +18,9 @@
*
*/
-#include <rtems/system.h>
-#include <rtems/extension.h>
-#include <rtems/fatal.h>
-#include <rtems/heap.h>
-#include <rtems/stack.h>
-#include <rtems/thread.h>
-#ifdef XXX_RTEMS_H_FIXED
-#include <bsp.h>
-#else
-#include <rtems/config.h>
+#include <rtems.h>
+
extern rtems_configuration_table BSP_Configuration;
-#endif
#include <assert.h>
#include <stdio.h>
@@ -56,6 +47,7 @@ rtems_extensions_table Stack_check_Extension_table = {
0, /* rtems_task_restart */
0, /* rtems_task_delete */
Stack_check_Switch_extension, /* task_switch */
+ 0, /* task_post_switch */
Stack_check_Begin_extension, /* task_begin */
0, /* task_exitted */
Stack_check_Fatal_extension, /* fatal */
@@ -133,9 +125,13 @@ unsigned32 stack_check_initialized = 0;
void Stack_check_Initialize( void )
{
- rtems_status_code status;
- Objects_Id id_ignored;
- unsigned32 *p;
+ rtems_status_code status;
+ Objects_Id id_ignored;
+ unsigned32 *p;
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
if (stack_check_initialized)
return;
@@ -171,10 +167,31 @@ void Stack_check_Initialize( void )
* So pretend here that we actually ran create and begin extensions.
*/
+ /* XXX
+ *
+ * Technically this has not been done for any task created before this
+ * happened. So just run through them and fix the situation.
+ */
+#if 0
if (_Thread_Executing)
{
Stack_check_Create_extension(_Thread_Executing, _Thread_Executing);
}
+#endif
+
+#if 0
+ for ( class_index = OBJECTS_CLASSES_FIRST ;
+ class_index <= OBJECTS_CLASSES_LAST ;
+ class_index++ ) {
+ information = _Objects_Information_table[ class_index ];
+ if ( information && information->is_thread ) {
+ for ( i=1 ; i <= information->maximum ; i++ ) {
+ the_thread = (Thread_Control *)information->local_table[ i ];
+ Stack_check_Create_extension( the_thread, the_thread );
+ }
+ }
+ }
+#endif
/*
* If appropriate, setup the interrupt stack for high water testing
@@ -197,13 +214,15 @@ void Stack_check_Initialize( void )
* Stack_check_Create_extension
*/
-void Stack_check_Create_extension(
+boolean Stack_check_Create_extension(
Thread_Control *running,
Thread_Control *the_thread
)
{
- if (the_thread && (the_thread != _Thread_Executing))
+ if (the_thread /* XXX && (the_thread != _Thread_Executing) */ )
stack_check_dope_stack(&the_thread->Start.Initial_stack);
+
+ return TRUE;
}
/*PAGE
diff --git a/cpukit/libmisc/stackchk/internal.h b/cpukit/libmisc/stackchk/internal.h
index 19c9f5e267..7cecbd6e1a 100644
--- a/cpukit/libmisc/stackchk/internal.h
+++ b/cpukit/libmisc/stackchk/internal.h
@@ -50,7 +50,7 @@ typedef struct {
* Stack_check_Create_extension
*/
-void Stack_check_Create_extension(
+boolean Stack_check_Create_extension(
Thread_Control *running,
Thread_Control *the_thread
);
diff --git a/cpukit/rtems/include/rtems.h b/cpukit/rtems/include/rtems.h
index d1e1e6b406..519d9416d2 100644
--- a/cpukit/rtems/include/rtems.h
+++ b/cpukit/rtems/include/rtems.h
@@ -24,31 +24,83 @@ extern "C" {
#endif
#include <rtems/system.h>
-#include <rtems/types.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+#include <rtems/config.h>
#include <rtems/init.h>
-#include <rtems/tasks.h>
-#include <rtems/intr.h>
-#include <rtems/clock.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/rtems/clock.h>
#include <rtems/extension.h>
-#include <rtems/timer.h>
-#include <rtems/sem.h>
-#include <rtems/message.h>
-#include <rtems/event.h>
-#include <rtems/signal.h>
-#include <rtems/event.h>
-#include <rtems/part.h>
-#include <rtems/region.h>
-#include <rtems/dpmem.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/rtems/message.h>
+#include <rtems/rtems/event.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/rtems/event.h>
+#include <rtems/rtems/part.h>
+#include <rtems/rtems/region.h>
+#include <rtems/rtems/dpmem.h>
#include <rtems/io.h>
#include <rtems/fatal.h>
-#include <rtems/ratemon.h>
-#include <rtems/mp.h>
+#include <rtems/rtems/ratemon.h>
+#include <rtems/rtems/mp.h>
-#include <rtems/support.h>
+#include <rtems/rtems/support.h>
+#include <rtems/sysstate.h>
#define RTEMS_HAS_HARDWARE_FP CPU_HARDWARE_FP
+/*
+ * The following define the constants which may be used in name searches.
+ */
+
+#define RTEMS_SEARCH_ALL_NODES OBJECTS_SEARCH_ALL_NODES
+#define RTEMS_SEARCH_OTHER_NODES OBJECTS_SEARCH_OTHER_NODES
+#define RTEMS_SEARCH_LOCAL_NODE OBJECTS_SEARCH_LOCAL_NODE
+#define RTEMS_WHO_AM_I OBJECTS_WHO_AM_I
+
+/*
+ * Parameters and return id's for _Objects_Get_next
+ */
+
+#define RTEMS_OBJECT_ID_INITIAL_INDEX OBJECTS_ID_INITIAL_INDEX
+#define RTEMS_OBJECT_ID_FINAL_INDEX OBJECTS_ID_FINAL_INDEX
+
+#define RTEMS_OBJECT_ID_INITIAL(node) OBJECTS_ID_INITIAL(node)
+#define RTEMS_OBJECT_ID_FINAL OBJECTS_ID_FINAL
+
+/*
+ * The following constant defines the minimum stack size which every
+ * thread must exceed.
+ */
+
+#define RTEMS_MINIMUM_STACK_SIZE STACK_MINIMUM_SIZE
+
+/*
+ * Constant for indefinite wait. (actually an illegal interval)
+ */
+
+#define RTEMS_NO_TIMEOUT WATCHDOG_NO_TIMEOUT
+
+/*
+ * An MPCI must support packets of at least this size.
+ */
+
+#define RTEMS_MINIMUM_PACKET_SIZE MP_PACKET_MINIMUM_PACKET_SIZE
+
+/*
+ * The following constant defines the number of unsigned32's
+ * in a packet which must be converted to native format in a
+ * heterogeneous system. In packets longer than
+ * MP_PACKET_MINIMUN_HETERO_CONVERSION unsigned32's, some of the "extra" data
+ * may a user message buffer which is not automatically endian swapped.
+ */
+
+#define RTEMS_MINIMUN_HETERO_CONVERSION MP_PACKET_MINIMUN_HETERO_CONVERSION
+
+
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/rtems/include/rtems/rtems/asr.h b/cpukit/rtems/include/rtems/rtems/asr.h
index b2147f8df4..55eed78ec2 100644
--- a/cpukit/rtems/include/rtems/rtems/asr.h
+++ b/cpukit/rtems/include/rtems/rtems/asr.h
@@ -22,7 +22,7 @@
extern "C" {
#endif
-#include <rtems/modes.h>
+#include <rtems/rtems/modes.h>
/*
*
@@ -54,6 +54,7 @@ typedef rtems_asr ( *rtems_asr_entry )(
*/
typedef struct {
+ boolean is_enabled; /* are ASRs enabled currently? */
rtems_asr_entry handler; /* address of RTEMS_ASR */
Modes_Control mode_set; /* RTEMS_ASR mode */
rtems_signal_set signals_posted; /* signal set */
@@ -167,7 +168,7 @@ STATIC INLINE void _ASR_Post_signals(
rtems_signal_set *signal_set
);
-#include <rtems/asr.inl>
+#include <rtems/rtems/asr.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/attr.h b/cpukit/rtems/include/rtems/rtems/attr.h
index 950d77f73d..2d34dfe380 100644
--- a/cpukit/rtems/include/rtems/rtems/attr.h
+++ b/cpukit/rtems/include/rtems/rtems/attr.h
@@ -44,6 +44,9 @@ typedef unsigned32 rtems_attribute;
#define RTEMS_NO_INHERIT_PRIORITY 0x00000000
#define RTEMS_INHERIT_PRIORITY 0x00000020
+#define RTEMS_NO_PRIORITY_CEILING 0x00000000
+#define RTEMS_PRIORITY_CEILING 0x00000040
+
#if ( CPU_HARDWARE_FP == TRUE )
#define ATTRIBUTES_NOT_SUPPORTED 0
#else
@@ -177,7 +180,21 @@ STATIC INLINE boolean _Attributes_Is_inherit_priority(
rtems_attribute attribute_set
);
-#include <rtems/attr.inl>
+/*
+ * _Attributes_Is_priority_ceiling
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority ceiling attribute
+ * is enabled in the attribute_set and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Attributes_Is_priority_ceiling(
+ rtems_attribute attribute_set
+);
+
+
+#include <rtems/rtems/attr.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/clock.h b/cpukit/rtems/include/rtems/rtems/clock.h
index e849ab4f40..595dfcdbaf 100644
--- a/cpukit/rtems/include/rtems/rtems/clock.h
+++ b/cpukit/rtems/include/rtems/rtems/clock.h
@@ -29,7 +29,8 @@
extern "C" {
#endif
-#include <rtems/tod.h>
+#include <rtems/core/tod.h>
+#include <rtems/rtems/types.h>
/*
* List of things which can be returned by the rtems_clock_get directive.
diff --git a/cpukit/rtems/include/rtems/rtems/dpmem.h b/cpukit/rtems/include/rtems/rtems/dpmem.h
index 2b6016a842..801d5f3864 100644
--- a/cpukit/rtems/include/rtems/rtems/dpmem.h
+++ b/cpukit/rtems/include/rtems/rtems/dpmem.h
@@ -32,8 +32,7 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/object.h>
+#include <rtems/core/object.h>
/*
* The following structure defines the port control block. Each port
@@ -201,7 +200,7 @@ STATIC INLINE boolean _Dual_ported_memory_Is_null(
Dual_ported_memory_Control *the_port
);
-#include <rtems/dpmem.inl>
+#include <rtems/rtems/dpmem.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/event.h b/cpukit/rtems/include/rtems/rtems/event.h
index aeb71b2abd..05020b9926 100644
--- a/cpukit/rtems/include/rtems/rtems/event.h
+++ b/cpukit/rtems/include/rtems/rtems/event.h
@@ -28,11 +28,12 @@
extern "C" {
#endif
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
-#include <rtems/eventset.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/rtems/eventset.h>
/*
* This constant is passed as the event_in to the
@@ -104,9 +105,10 @@ rtems_status_code rtems_event_receive (
*/
void _Event_Seize (
- rtems_event_set event_in,
- rtems_option option_set,
- rtems_interval ticks
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
);
/*
@@ -147,8 +149,8 @@ void _Event_Timeout (
EXTERN boolean _Event_Sync; /* event manager sync flag */
-#include <rtems/event.inl>
-#include <rtems/eventmp.h>
+#include <rtems/rtems/eventmp.h>
+#include <rtems/rtems/event.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/eventmp.h b/cpukit/rtems/include/rtems/rtems/eventmp.h
index 4b42cf791e..86587adc4a 100644
--- a/cpukit/rtems/include/rtems/rtems/eventmp.h
+++ b/cpukit/rtems/include/rtems/rtems/eventmp.h
@@ -21,11 +21,11 @@
extern "C" {
#endif
-#include <rtems/event.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/event.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
/*
* The following enumerated type defines the list of
diff --git a/cpukit/rtems/include/rtems/rtems/eventset.h b/cpukit/rtems/include/rtems/rtems/eventset.h
index a25dabe58b..770f607075 100644
--- a/cpukit/rtems/include/rtems/rtems/eventset.h
+++ b/cpukit/rtems/include/rtems/rtems/eventset.h
@@ -132,7 +132,7 @@ STATIC INLINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_mask
);
-#include <rtems/eventset.inl>
+#include <rtems/rtems/eventset.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/intr.h b/cpukit/rtems/include/rtems/rtems/intr.h
index 3669af1ccc..08c249d085 100644
--- a/cpukit/rtems/include/rtems/rtems/intr.h
+++ b/cpukit/rtems/include/rtems/rtems/intr.h
@@ -21,7 +21,7 @@
extern "C" {
#endif
-#include <rtems/isr.h>
+#include <rtems/core/isr.h>
/*
* Interrupt level type
@@ -30,6 +30,27 @@ extern "C" {
typedef ISR_Level rtems_interrupt_level;
/*
+ * The following type defines the control block used to manage
+ * the vectors.
+ */
+
+typedef ISR_Vector_number rtems_vector_number;
+
+/*
+ * Return type for ISR Handler
+ */
+
+typedef void rtems_isr;
+
+/*
+ * Pointer to an ISR Handler
+ */
+
+typedef rtems_isr ( *rtems_isr_entry )(
+ rtems_vector_number
+ );
+
+/*
* _Interrupt_Manager_initialization
*
* DESCRIPTION:
diff --git a/cpukit/rtems/include/rtems/rtems/message.h b/cpukit/rtems/include/rtems/rtems/message.h
index 25188044be..2ee910ac05 100644
--- a/cpukit/rtems/include/rtems/rtems/message.h
+++ b/cpukit/rtems/include/rtems/rtems/message.h
@@ -34,10 +34,11 @@
extern "C" {
#endif
-#include <rtems/types.h>
-#include <rtems/chain.h>
-#include <rtems/object.h>
-#include <rtems/threadq.h>
+#include <rtems/rtems/types.h>
+#include <rtems/core/chain.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/core/threadq.h>
/*
* The following defines the data types needed to manipulate
@@ -468,8 +469,8 @@ STATIC INLINE Message_queue_Control *_Message_queue_Get (
Objects_Locations *location
);
-#include <rtems/message.inl>
-#include <rtems/msgmp.h>
+#include <rtems/rtems/message.inl>
+#include <rtems/rtems/msgmp.h>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/modes.h b/cpukit/rtems/include/rtems/rtems/modes.h
index b3b05b3f85..115898e503 100644
--- a/cpukit/rtems/include/rtems/rtems/modes.h
+++ b/cpukit/rtems/include/rtems/rtems/modes.h
@@ -21,7 +21,7 @@
extern "C" {
#endif
-#include <rtems/isr.h>
+#include <rtems/core/isr.h>
/*
* The following type defines the control block used to manage
@@ -173,7 +173,7 @@ STATIC INLINE void _Modes_Change (
Modes_Control *changed
);
-#include <rtems/modes.inl>
+#include <rtems/rtems/modes.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/mp.h b/cpukit/rtems/include/rtems/rtems/mp.h
index 96147d3b44..079f55b093 100644
--- a/cpukit/rtems/include/rtems/rtems/mp.h
+++ b/cpukit/rtems/include/rtems/rtems/mp.h
@@ -45,20 +45,6 @@ void _Multiprocessing_Manager_initialization ( void );
void rtems_multiprocessing_announce ( void );
-/*
- *
- * _Multiprocessing_Receive_server
- *
- * DESCRIPTION:
- *
- * This routine is a server thread which processes remote requests
- * from other nodes.
- */
-
-Thread _Multiprocessing_Receive_server (
- Thread_Argument ignored
-);
-
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/rtems/include/rtems/rtems/msgmp.h b/cpukit/rtems/include/rtems/rtems/msgmp.h
index ff84e83ed3..592328678b 100644
--- a/cpukit/rtems/include/rtems/rtems/msgmp.h
+++ b/cpukit/rtems/include/rtems/rtems/msgmp.h
@@ -21,12 +21,12 @@
extern "C" {
#endif
-#include <rtems/message.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/message.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
/*
* The following enumerated type defines the list of
@@ -97,7 +97,7 @@ rtems_status_code _Message_queue_MP_Send_request_packet (
void *buffer,
unsigned32 *size_p,
rtems_option option_set,
- rtems_interval timeout
+ Watchdog_Interval timeout
);
/*
diff --git a/cpukit/rtems/include/rtems/rtems/options.h b/cpukit/rtems/include/rtems/rtems/options.h
index b318aad8c9..d8da2f9e86 100644
--- a/cpukit/rtems/include/rtems/rtems/options.h
+++ b/cpukit/rtems/include/rtems/rtems/options.h
@@ -69,7 +69,7 @@ STATIC INLINE boolean _Options_Is_any (
rtems_option option_set
);
-#include <rtems/options.inl>
+#include <rtems/rtems/options.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/part.h b/cpukit/rtems/include/rtems/rtems/part.h
index 230cf029f7..da163c6beb 100644
--- a/cpukit/rtems/include/rtems/rtems/part.h
+++ b/cpukit/rtems/include/rtems/rtems/part.h
@@ -31,10 +31,10 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/address.h>
-#include <rtems/attr.h>
-#include <rtems/object.h>
+#include <rtems/core/address.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/types.h>
/*
* The following defines the control block used to manage each partition.
@@ -280,8 +280,8 @@ STATIC INLINE boolean _Partition_Is_null (
Partition_Control *the_partition
);
-#include <rtems/part.inl>
-#include <rtems/partmp.h>
+#include <rtems/rtems/part.inl>
+#include <rtems/rtems/partmp.h>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/partmp.h b/cpukit/rtems/include/rtems/rtems/partmp.h
index 4b3bf876ff..980eaea853 100644
--- a/cpukit/rtems/include/rtems/rtems/partmp.h
+++ b/cpukit/rtems/include/rtems/rtems/partmp.h
@@ -21,11 +21,12 @@
extern "C" {
#endif
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/part.h>
-#include <rtems/thread.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/thread.h>
+
+#include <rtems/rtems/part.h>
/*
* The following enumerated type defines the list of
diff --git a/cpukit/rtems/include/rtems/rtems/ratemon.h b/cpukit/rtems/include/rtems/rtems/ratemon.h
index 75a9963888..6b401ba5b0 100644
--- a/cpukit/rtems/include/rtems/rtems/ratemon.h
+++ b/cpukit/rtems/include/rtems/rtems/ratemon.h
@@ -29,10 +29,9 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
/*
* The following enumerated type defines the states in which a
@@ -50,7 +49,7 @@ typedef enum {
* directive to obtain status information.
*/
-#define RTEMS_PERIOD_STATUS RTEMS_NO_TIMEOUT
+#define RTEMS_PERIOD_STATUS WATCHDOG_NO_TIMEOUT
/*
* The following structure defines the control block used to manage
@@ -148,8 +147,8 @@ rtems_status_code rtems_rate_monotonic_delete(
*/
rtems_status_code rtems_rate_monotonic_period(
- Objects_Id id,
- rtems_interval length
+ Objects_Id id,
+ rtems_interval length
);
/*
@@ -276,7 +275,7 @@ STATIC INLINE boolean _Rate_monotonic_Is_null (
Rate_monotonic_Control *the_period
);
-#include <rtems/ratemon.inl>
+#include <rtems/rtems/ratemon.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/region.h b/cpukit/rtems/include/rtems/rtems/region.h
index a5f6aa761c..077d2b76e7 100644
--- a/cpukit/rtems/include/rtems/rtems/region.h
+++ b/cpukit/rtems/include/rtems/rtems/region.h
@@ -30,11 +30,12 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/object.h>
-#include <rtems/threadq.h>
-#include <rtems/heap.h>
+#include <rtems/core/object.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/heap.h>
#include <rtems/debug.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/types.h>
/*
* The following records define the control block used to manage
@@ -158,8 +159,8 @@ rtems_status_code rtems_region_delete(
rtems_status_code rtems_region_get_segment(
Objects_Id id,
unsigned32 size,
- rtems_option option_set,
- rtems_interval timeout,
+ rtems_option option_set,
+ rtems_interval timeout,
void **segment
);
@@ -278,8 +279,8 @@ STATIC INLINE boolean _Region_Is_null (
Region_Control *the_region
);
-#include <rtems/region.inl>
-#include <rtems/regionmp.h>
+#include <rtems/rtems/region.inl>
+#include <rtems/rtems/regionmp.h>
/*
* _Region_Debug_Walk
diff --git a/cpukit/rtems/include/rtems/rtems/regionmp.h b/cpukit/rtems/include/rtems/rtems/regionmp.h
index 9756103a60..91ac5227f2 100644
--- a/cpukit/rtems/include/rtems/rtems/regionmp.h
+++ b/cpukit/rtems/include/rtems/rtems/regionmp.h
@@ -21,11 +21,12 @@
extern "C" {
#endif
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/region.h>
-#include <rtems/thread.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
/*
* The following enumerated type defines the list of
@@ -87,8 +88,8 @@ rtems_status_code _Region_MP_Send_request_packet (
Objects_Id region_id,
void *segment,
unsigned32 size,
- rtems_option option_set,
- rtems_interval timeout
+ rtems_option option_set,
+ rtems_interval timeout
);
/*
diff --git a/cpukit/rtems/include/rtems/rtems/rtemsapi.h b/cpukit/rtems/include/rtems/rtems/rtemsapi.h
new file mode 100644
index 0000000000..e43de773fd
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/rtemsapi.h
@@ -0,0 +1,34 @@
+/*
+ * RTEMS API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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_API_h
+#define __RTEMS_API_h
+
+#include <rtems/config.h>
+
+/*PAGE
+ *
+ * _RTEMS_API_Initialize
+ *
+ * XXX
+ */
+
+void _RTEMS_API_Initialize(
+ rtems_configuration_table *configuration_table
+);
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/sem.h b/cpukit/rtems/include/rtems/rtems/sem.h
index ff8abbc773..1faf3b13e9 100644
--- a/cpukit/rtems/include/rtems/rtems/sem.h
+++ b/cpukit/rtems/include/rtems/rtems/sem.h
@@ -31,23 +31,26 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/attr.h>
-#include <rtems/object.h>
-#include <rtems/threadq.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/core/coremutex.h>
+#include <rtems/core/object.h>
+#include <rtems/core/coresem.h>
+#include <rtems/core/threadq.h>
/*
* The following defines the control block used to manage each semaphore.
*/
typedef struct {
- Objects_Control Object;
- Thread_queue_Control Wait_queue;
- rtems_attribute attribute_set;
- unsigned32 count;
- unsigned32 nest_count;
- Thread_Control *holder;
- Objects_Id holder_id;
+ Objects_Control Object;
+ rtems_attribute attribute_set;
+ union {
+ CORE_mutex_Control mutex;
+ CORE_semaphore_Control semaphore;
+ } Core_control;
} Semaphore_Control;
/*
@@ -82,11 +85,11 @@ void _Semaphore_Manager_initialization(
*/
rtems_status_code rtems_semaphore_create(
- rtems_name name,
- unsigned32 count,
- rtems_attribute attribute_set,
- rtems_task_priority priority_ceiling,
- Objects_Id *id
+ rtems_name name,
+ unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ rtems_id *id
);
/*
@@ -106,7 +109,7 @@ rtems_status_code rtems_semaphore_create(
rtems_status_code rtems_semaphore_ident(
rtems_name name,
unsigned32 node,
- Objects_Id *id
+ rtems_id *id
);
/*
@@ -119,7 +122,7 @@ rtems_status_code rtems_semaphore_ident(
*/
rtems_status_code rtems_semaphore_delete(
- Objects_Id id
+ rtems_id id
);
/*
@@ -137,8 +140,8 @@ rtems_status_code rtems_semaphore_delete(
*/
rtems_status_code rtems_semaphore_obtain(
- Objects_Id id,
- unsigned32 option_set,
+ rtems_id id,
+ unsigned32 option_set,
rtems_interval timeout
);
@@ -155,7 +158,7 @@ rtems_status_code rtems_semaphore_obtain(
*/
rtems_status_code rtems_semaphore_release(
- Objects_Id id
+ rtems_id id
);
/*
@@ -213,7 +216,7 @@ STATIC INLINE void _Semaphore_Free (
*/
STATIC INLINE Semaphore_Control *_Semaphore_Get (
- Objects_Id id,
+ rtems_id id,
Objects_Locations *location
);
@@ -229,8 +232,66 @@ STATIC INLINE boolean _Semaphore_Is_null (
Semaphore_Control *the_semaphore
);
-#include <rtems/sem.inl>
-#include <rtems/semmp.h>
+/*
+ * _Semaphore_Translate_core_mutex_return_code
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a RTEMS status code based on the mutex
+ * status code specified.
+ */
+
+rtems_status_code _Semaphore_Translate_core_mutex_return_code (
+ unsigned32 the_mutex_status
+);
+
+/*
+ * _Semaphore_Translate_core_semaphore_return_code
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a RTEMS status code based on the semaphore
+ * status code specified.
+ */
+
+rtems_status_code _Semaphore_Translate_core_semaphore_return_code (
+ unsigned32 the_mutex_status
+);
+
+/*PAGE
+ *
+ * _Semaphore_Core_mutex_mp_support
+ *
+ * DESCRIPTION:
+ *
+ * This function processes the global actions necessary for remote
+ * accesses to a global semaphore based on a core mutex. This function
+ * is called by the core.
+ */
+
+void _Semaphore_Core_mutex_mp_support (
+ Thread_Control *the_thread,
+ rtems_id id
+);
+
+/*PAGE
+ *
+ * _Semaphore_Core_mp_support
+ *
+ * DESCRIPTION:
+ *
+ * This function processes the global actions necessary for remote
+ * accesses to a global semaphore based on a core semaphore. This function
+ * is called by the core.
+ */
+
+void _Semaphore_Core_semaphore_mp_support (
+ Thread_Control *the_thread,
+ rtems_id id
+);
+
+#include <rtems/rtems/sem.inl>
+#include <rtems/rtems/semmp.h>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/semmp.h b/cpukit/rtems/include/rtems/rtems/semmp.h
index 915e18164c..a796f6ad6b 100644
--- a/cpukit/rtems/include/rtems/rtems/semmp.h
+++ b/cpukit/rtems/include/rtems/rtems/semmp.h
@@ -21,12 +21,12 @@
extern "C" {
#endif
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/sem.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
/*
* The following enumerated type defines the list of
@@ -84,8 +84,8 @@ void _Semaphore_MP_Send_process_packet (
rtems_status_code _Semaphore_MP_Send_request_packet (
Semaphore_MP_Remote_operations operation,
Objects_Id semaphore_id,
- rtems_option option_set,
- rtems_interval timeout
+ rtems_option option_set,
+ rtems_interval timeout
);
/*
diff --git a/cpukit/rtems/include/rtems/rtems/signal.h b/cpukit/rtems/include/rtems/rtems/signal.h
index 74ff4a57fb..3dcb84513b 100644
--- a/cpukit/rtems/include/rtems/rtems/signal.h
+++ b/cpukit/rtems/include/rtems/rtems/signal.h
@@ -27,11 +27,21 @@
extern "C" {
#endif
-#include <rtems/asr.h>
-#include <rtems/modes.h>
-#include <rtems/object.h>
-#include <rtems/status.h>
-#include <rtems/types.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+
+/*
+ * _Signal_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Signal_Manager_initialization( void );
/*
* rtems_signal_catch
@@ -63,7 +73,7 @@ rtems_status_code rtems_signal_send(
rtems_signal_set signal_set
);
-#include <rtems/signalmp.h>
+#include <rtems/rtems/signalmp.h>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/signalmp.h b/cpukit/rtems/include/rtems/rtems/signalmp.h
index b72f476bee..fb25c5a62f 100644
--- a/cpukit/rtems/include/rtems/rtems/signalmp.h
+++ b/cpukit/rtems/include/rtems/rtems/signalmp.h
@@ -21,11 +21,11 @@
extern "C" {
#endif
-#include <rtems/asr.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
/*
* The following enumerated type defines the list of
diff --git a/cpukit/rtems/include/rtems/rtems/status.h b/cpukit/rtems/include/rtems/rtems/status.h
index 42b8754780..1c00d47bbf 100644
--- a/cpukit/rtems/include/rtems/rtems/status.h
+++ b/cpukit/rtems/include/rtems/rtems/status.h
@@ -52,13 +52,22 @@ typedef enum {
RTEMS_NOT_OWNER_OF_RESOURCE = 23, /* not owner of resource */
RTEMS_NOT_IMPLEMENTED = 24, /* directive not implemented */
RTEMS_INTERNAL_ERROR = 25, /* RTEMS inconsistency detected */
- RTEMS_PROXY_BLOCKING = 26, /* internal multiprocessing only */
- RTEMS_NO_MEMORY = 27 /* could not get enough memory */
+ RTEMS_NO_MEMORY = 26 /* could not get enough memory */
} rtems_status_code;
#define RTEMS_STATUS_CODES_FIRST RTEMS_SUCCESSFUL
#define RTEMS_STATUS_CODES_LAST RTEMS_NO_MEMORY
+extern rtems_status_code _Status_Object_name_errors_to_status[];
+
+#ifdef INIT
+rtems_status_code _Status_Object_name_errors_to_status[] = {
+ RTEMS_SUCCESSFUL, /* OBJECTS_SUCCESSFUL */
+ RTEMS_INVALID_NAME, /* OBJECTS_INVALID_NAME */
+ RTEMS_INVALID_NODE /* OBJECTS_INVALID_NODE */
+};
+#endif
+
/*
* rtems_is_status_successful
*
@@ -86,20 +95,7 @@ STATIC INLINE boolean rtems_are_statuses_equal (
rtems_status_code code2
);
-/*
- * _Status_Is_proxy_blocking
- *
- * DESCRIPTION:
- *
- * This function returns TRUE if the status code is equal to the
- * status which indicates that a proxy is blocking, and FALSE otherwise.
- */
-
-STATIC INLINE boolean _Status_Is_proxy_blocking (
- rtems_status_code code
-);
-
-#include <rtems/status.inl>
+#include <rtems/rtems/status.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/support.h b/cpukit/rtems/include/rtems/rtems/support.h
index c6452e0847..3cf7eb6840 100644
--- a/cpukit/rtems/include/rtems/rtems/support.h
+++ b/cpukit/rtems/include/rtems/rtems/support.h
@@ -21,7 +21,7 @@
extern "C" {
#endif
-#include <rtems/types.h>
+#include <rtems/rtems/types.h>
/*
* rtems_is_name_valid
@@ -70,7 +70,52 @@ STATIC INLINE void rtems_name_to_characters(
char *c4
);
-#include <rtems/support.inl>
+/*
+ * rtems_get_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the class portion of the ID.
+ *
+ */
+
+#define rtems_get_class( _id ) \
+ _Objects_Get_class( _id )
+
+/*
+ * rtems_get_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the node portion of the ID.
+ *
+ */
+
+#define rtems_get_node( _id ) \
+ _Objects_Get_node( _id )
+
+/*
+ * rtems_get_index
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the index portion of the ID.
+ *
+ */
+
+#define rtems_get_index( _id ) \
+ _Objects_Get_index( _id )
+
+/*
+ * Time related
+ */
+
+#define RTEMS_MILLISECONDS_TO_MICROSECONDS(_ms) \
+ TOD_MILLISECONDS_TO_MICROSECONDS(_ms)
+#define RTEMS_MILLISECONDS_TO_TICKS(_ms) \
+ TOD_MILLISECONDS_TO_TICKS(_ms)
+
+#include <rtems/rtems/support.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/taskmp.h b/cpukit/rtems/include/rtems/rtems/taskmp.h
index d05277a69c..2010485aba 100644
--- a/cpukit/rtems/include/rtems/rtems/taskmp.h
+++ b/cpukit/rtems/include/rtems/rtems/taskmp.h
@@ -21,12 +21,12 @@
extern "C" {
#endif
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/priority.h>
-#include <rtems/tasks.h>
-#include <rtems/thread.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/priority.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/core/thread.h>
/*
* The following enumerated type defines the list of
diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
index df623fe175..f3abd875fc 100644
--- a/cpukit/rtems/include/rtems/rtems/tasks.h
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -38,16 +38,13 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/message.h>
-#include <rtems/object.h>
-#include <rtems/part.h>
-#include <rtems/region.h>
-#include <rtems/sem.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
-#include <rtems/threadq.h>
-#include <rtems/types.h>
+#include <rtems/core/object.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/eventset.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/attr.h>
/*
* Constant to be used as the ID of current task
@@ -60,7 +57,106 @@ extern "C" {
* interval when a task wishes to yield the CPU.
*/
-#define RTEMS_YIELD_PROCESSOR RTEMS_NO_TIMEOUT
+#define RTEMS_YIELD_PROCESSOR WATCHDOG_NO_TIMEOUT
+
+/*
+ * Define the type for an RTEMS API task priority.
+ */
+
+typedef Priority_Control rtems_task_priority;
+
+#define RTEMS_NO_PRIORITY RTEMS_CURRENT_PRIORITY
+
+#define RTEMS_MINIMUM_PRIORITY (PRIORITY_MINIMUM + 1)
+#define RTEMS_MAXIMUM_PRIORITY PRIORITY_MAXIMUM
+
+/*
+ * The following constant is passed to rtems_task_set_priority when the
+ * caller wants to obtain the current priority.
+ */
+
+#define RTEMS_CURRENT_PRIORITY PRIORITY_MINIMUM
+
+/*
+ * Notepads constants (indices into notepad array)
+ */
+
+#define RTEMS_NOTEPAD_FIRST 0 /* lowest numbered notepad */
+#define RTEMS_NOTEPAD_0 0 /* notepad location 0 */
+#define RTEMS_NOTEPAD_1 1 /* notepad location 1 */
+#define RTEMS_NOTEPAD_2 2 /* notepad location 2 */
+#define RTEMS_NOTEPAD_3 3 /* notepad location 3 */
+#define RTEMS_NOTEPAD_4 4 /* notepad location 4 */
+#define RTEMS_NOTEPAD_5 5 /* notepad location 5 */
+#define RTEMS_NOTEPAD_6 6 /* notepad location 6 */
+#define RTEMS_NOTEPAD_7 7 /* notepad location 7 */
+#define RTEMS_NOTEPAD_8 8 /* notepad location 8 */
+#define RTEMS_NOTEPAD_9 9 /* notepad location 9 */
+#define RTEMS_NOTEPAD_10 10 /* notepad location 10 */
+#define RTEMS_NOTEPAD_11 11 /* notepad location 11 */
+#define RTEMS_NOTEPAD_12 12 /* notepad location 12 */
+#define RTEMS_NOTEPAD_13 13 /* notepad location 13 */
+#define RTEMS_NOTEPAD_14 14 /* notepad location 14 */
+#define RTEMS_NOTEPAD_15 15 /* notepad location 15 */
+#define RTEMS_NOTEPAD_LAST RTEMS_NOTEPAD_15 /* highest numbered notepad */
+
+#define RTEMS_NUMBER_NOTEPADS (RTEMS_NOTEPAD_LAST+1)
+
+/*
+ * External API name for Thread_Control
+ */
+
+typedef Thread_Control rtems_tcb;
+
+/*
+ * The following defines the "return type" of an RTEMS task.
+ */
+
+typedef void rtems_task;
+
+/*
+ * The following defines the argument to an RTEMS task.
+ */
+
+typedef unsigned32 rtems_task_argument;
+
+/*
+ * The following defines the type for the entry point of an RTEMS task.
+ */
+
+typedef rtems_task ( *rtems_task_entry )(
+ rtems_task_argument
+ );
+
+/*
+ * The following records define the Initialization Tasks Table.
+ * Each entry contains the information required by RTEMS to
+ * create and start a user task automatically at executive
+ * initialization time.
+ */
+
+typedef struct {
+ rtems_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;
+
+/*
+ * This is the API specific information required by each thread for
+ * the RTEMS API to function correctly.
+ */
+
+
+typedef struct {
+ unsigned32 Notepads[ RTEMS_NUMBER_NOTEPADS ];
+ rtems_event_set pending_events;
+ rtems_event_set event_condition;
+ ASR_Information Signal;
+} RTEMS_API_Control;
/*
* The following defines the information control block used to
@@ -70,6 +166,13 @@ extern "C" {
EXTERN Objects_Information _RTEMS_tasks_Information;
/*
+ * These are used to manage the user initialization tasks.
+ */
+
+EXTERN rtems_initialization_tasks_table *_RTEMS_tasks_User_initialization_tasks;
+EXTERN unsigned32 _RTEMS_tasks_Number_of_initialization_tasks;
+
+/*
* _RTEMS_tasks_Manager_initialization
*
* DESCRIPTION:
@@ -78,7 +181,9 @@ EXTERN Objects_Information _RTEMS_tasks_Information;
*/
void _RTEMS_tasks_Manager_initialization(
- unsigned32 maximum_tasks
+ unsigned32 maximum_tasks,
+ unsigned32 number_of_initialization_tasks,
+ rtems_initialization_tasks_table *user_tasks
);
/*
@@ -284,7 +389,7 @@ rtems_status_code rtems_task_wake_when(
*/
rtems_status_code rtems_task_wake_after(
- rtems_interval ticks
+ rtems_interval ticks
);
/*
@@ -313,32 +418,43 @@ STATIC INLINE void _RTEMS_tasks_Free (
);
/*
- * _RTEMS_tasks_Cancel_wait
+ * _RTEMS_tasks_Priority_to_Core
*
* DESCRIPTION:
*
- * This routine unblocks the_thread and cancels any timers
- * which the_thread has active.
+ * This function converts an RTEMS API priority into a core priority.
*/
-
-STATIC INLINE void _RTEMS_tasks_Cancel_wait(
- Thread_Control *the_thread
+
+STATIC INLINE Priority_Control _RTEMS_tasks_Priority_to_Core(
+ rtems_task_priority priority
);
-/*
- * _RTEMS_Tasks_Priority_to_Core
+/*PAGE
*
- * DESCRIPTION:
+ * _RTEMS_tasks_Initialize_user_tasks
*
- * This function converts an RTEMS API priority into a core priority.
+ * This routine creates and starts all configured user
+ * initialzation threads.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
*/
-STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core(
- rtems_task_priority priority
+void _RTEMS_tasks_Initialize_user_tasks( void );
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_is_valid
+ *
+ */
+
+STATIC INLINE boolean _RTEMS_tasks_Priority_is_valid (
+ rtems_task_priority the_priority
);
-#include <rtems/tasks.inl>
-#include <rtems/taskmp.h>
+#include <rtems/rtems/tasks.inl>
+#include <rtems/rtems/taskmp.h>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/timer.h b/cpukit/rtems/include/rtems/rtems/timer.h
index bab05378c7..21e88a4baf 100644
--- a/cpukit/rtems/include/rtems/rtems/timer.h
+++ b/cpukit/rtems/include/rtems/rtems/timer.h
@@ -33,10 +33,9 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/object.h>
-#include <rtems/tod.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/object.h>
+#include <rtems/core/tod.h>
+#include <rtems/core/watchdog.h>
/*
* The following enumerated type details the classes to which a timer
@@ -50,10 +49,15 @@ typedef enum {
} Timer_Classes;
/*
- * The following defines the type of a Timer Service Routine.
+ * The following types define a pointer to a timer service routine.
*/
-
-typedef rtems_timer_service_routine_entry Timer_Service;
+
+typedef void rtems_timer_service_routine;
+
+typedef rtems_timer_service_routine ( *rtems_timer_service_routine_entry )(
+ rtems_id,
+ void *
+ );
/*
* The following defines the information control block used to manage
@@ -153,10 +157,10 @@ rtems_status_code rtems_timer_delete(
*/
rtems_status_code rtems_timer_fire_after(
- Objects_Id id,
- rtems_interval ticks,
- Timer_Service routine,
- void *user_data
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
);
/*
@@ -170,10 +174,10 @@ rtems_status_code rtems_timer_fire_after(
*/
rtems_status_code rtems_timer_fire_when(
- Objects_Id id,
- rtems_time_of_day *wall_time,
- Timer_Service routine,
- void *user_data
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
);
/*
@@ -283,7 +287,7 @@ STATIC INLINE boolean _Timer_Is_null (
Timer_Control *the_timer
);
-#include <rtems/timer.inl>
+#include <rtems/rtems/timer.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/rtems/include/rtems/rtems/types.h b/cpukit/rtems/include/rtems/rtems/types.h
index e4d7c11065..3b7a4a5e12 100644
--- a/cpukit/rtems/include/rtems/rtems/types.h
+++ b/cpukit/rtems/include/rtems/rtems/types.h
@@ -20,9 +20,11 @@
extern "C" {
#endif
-#include <rtems/object.h>
-#include <rtems/priority.h>
-#include <rtems/modes.h>
+#include <rtems/core/object.h>
+#include <rtems/core/priority.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
/*
* RTEMS basic type definitions
@@ -51,18 +53,35 @@ typedef Context_Control_fp rtems_context_fp;
typedef CPU_Interrupt_frame rtems_interrupt_frame;
/*
- * Define the type for an RTEMS API task priority.
+ * Time related
*/
-typedef Priority_Control rtems_task_priority;
+typedef Watchdog_Interval rtems_interval;
+typedef TOD_Control rtems_time_of_day;
-#define RTEMS_NO_PRIORITY RTEMS_CURRENT_PRIORITY
/*
* Define the type for an RTEMS API task mode.
*/
typedef Modes_Control rtems_mode;
+/*
+ * MPCI related entries
+ */
+
+typedef MP_packet_Classes rtems_mp_packet_classes;
+typedef MP_packet_Prefix rtems_packet_prefix;
+
+typedef MPCI_initialization_entry rtems_mpci_initialization_entry;
+typedef MPCI_get_packet_entry rtems_mpci_get_packet_entry;
+typedef MPCI_return_packet_entry rtems_mpci_return_packet_entry;
+typedef MPCI_send_entry rtems_mpci_send_packet_entry;
+typedef MPCI_receive_entry rtems_mpci_receive_packet_entry;
+
+typedef MPCI_Entry rtems_mpci_entry;
+
+typedef MPCI_Control rtems_mpci_table;
+
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/rtems/inline/rtems/rtems/asr.inl b/cpukit/rtems/inline/rtems/rtems/asr.inl
index a2da1ae311..fb1d7a8efc 100644
--- a/cpukit/rtems/inline/rtems/rtems/asr.inl
+++ b/cpukit/rtems/inline/rtems/rtems/asr.inl
@@ -17,7 +17,7 @@
#ifndef __INLINE_ASR_inl
#define __INLINE_ASR_inl
-#include <rtems/isr.h>
+#include <rtems/core/isr.h>
/*PAGE
*
@@ -29,6 +29,7 @@ STATIC INLINE void _ASR_Initialize (
ASR_Information *information
)
{
+ information->is_enabled = TRUE;
information->handler = NULL;
information->mode_set = RTEMS_DEFAULT_MODES;
information->signals_posted = 0;
@@ -47,7 +48,7 @@ STATIC INLINE void _ASR_Swap_signals (
)
{
rtems_signal_set _signals;
- ISR_Level _level;
+ ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
diff --git a/cpukit/rtems/inline/rtems/rtems/attr.inl b/cpukit/rtems/inline/rtems/rtems/attr.inl
index 15a9296b7e..0f1190fe93 100644
--- a/cpukit/rtems/inline/rtems/rtems/attr.inl
+++ b/cpukit/rtems/inline/rtems/rtems/attr.inl
@@ -108,5 +108,18 @@ STATIC INLINE boolean _Attributes_Is_inherit_priority(
return ( attribute_set & RTEMS_INHERIT_PRIORITY );
}
+/*PAGE
+ *
+ * _Attributes_Is_priority_ceiling
+ *
+ */
+
+STATIC INLINE boolean _Attributes_Is_priority_ceiling(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_PRIORITY_CEILING );
+}
+
#endif
/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/event.inl b/cpukit/rtems/inline/rtems/rtems/event.inl
index 2f2f480001..5377144f98 100644
--- a/cpukit/rtems/inline/rtems/rtems/event.inl
+++ b/cpukit/rtems/inline/rtems/rtems/event.inl
@@ -24,6 +24,12 @@
STATIC INLINE void _Event_Manager_initialization( void )
{
_Event_Sync = FALSE;
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor( MP_PACKET_EVENT, _Event_MP_Process_packet );
}
#endif
diff --git a/cpukit/rtems/inline/rtems/rtems/message.inl b/cpukit/rtems/inline/rtems/rtems/message.inl
index 8837159580..5b34ce5a83 100644
--- a/cpukit/rtems/inline/rtems/rtems/message.inl
+++ b/cpukit/rtems/inline/rtems/rtems/message.inl
@@ -17,7 +17,7 @@
#ifndef __MESSAGE_QUEUE_inl
#define __MESSAGE_QUEUE_inl
-#include <rtems/wkspace.h>
+#include <rtems/core/wkspace.h>
/*PAGE
*
diff --git a/cpukit/rtems/inline/rtems/rtems/modes.inl b/cpukit/rtems/inline/rtems/rtems/modes.inl
index 8fe964e8d8..6d4b6d06d0 100644
--- a/cpukit/rtems/inline/rtems/rtems/modes.inl
+++ b/cpukit/rtems/inline/rtems/rtems/modes.inl
@@ -53,7 +53,7 @@ STATIC INLINE boolean _Modes_Is_asr_disabled (
Modes_Control mode_set
)
{
- return ( mode_set & RTEMS_ASR_MASK );
+ return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR;
}
/*PAGE
@@ -66,7 +66,7 @@ STATIC INLINE boolean _Modes_Is_preempt (
Modes_Control mode_set
)
{
- return ( ( mode_set & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT );
+ return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
}
/*PAGE
@@ -79,8 +79,7 @@ STATIC INLINE boolean _Modes_Is_timeslice (
Modes_Control mode_set
)
{
- return ((mode_set & (RTEMS_TIMESLICE_MASK|RTEMS_PREEMPT_MASK)) ==
- (RTEMS_TIMESLICE|RTEMS_PREEMPT) );
+ return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE;
}
/*PAGE
diff --git a/cpukit/rtems/inline/rtems/rtems/status.inl b/cpukit/rtems/inline/rtems/rtems/status.inl
index bd158e535b..1db5a1e89f 100644
--- a/cpukit/rtems/inline/rtems/rtems/status.inl
+++ b/cpukit/rtems/inline/rtems/rtems/status.inl
@@ -44,17 +44,5 @@ STATIC INLINE boolean rtems_are_statuses_equal(
return (code1 == code2);
}
-/*
- * _Status_Is_proxy_blocking
- *
- */
-
-STATIC INLINE boolean _Status_Is_proxy_blocking (
- rtems_status_code code
-)
-{
- return (code == RTEMS_PROXY_BLOCKING);
-}
-
#endif
/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/tasks.inl b/cpukit/rtems/inline/rtems/rtems/tasks.inl
index 2aec654571..ccd2de2613 100644
--- a/cpukit/rtems/inline/rtems/rtems/tasks.inl
+++ b/cpukit/rtems/inline/rtems/rtems/tasks.inl
@@ -17,11 +17,6 @@
#ifndef __RTEMS_TASKS_inl
#define __RTEMS_TASKS_inl
-#include <rtems/msgmp.h>
-#include <rtems/partmp.h>
-#include <rtems/regionmp.h>
-#include <rtems/semmp.h>
-
/*PAGE
*
* _RTEMS_tasks_Allocate
@@ -51,60 +46,28 @@ STATIC INLINE void _RTEMS_tasks_Free (
/*PAGE
*
- * _RTEMS_tasks_Cancel_wait
- *
+ * _RTEMS_tasks_Priority_to_Core
*/
-
-STATIC INLINE void _RTEMS_tasks_Cancel_wait(
- Thread_Control *the_thread
+
+STATIC INLINE Priority_Control _RTEMS_tasks_Priority_to_Core(
+ rtems_task_priority priority
)
{
- States_Control state;
- States_Control remote_state;
-
- state = the_thread->current_state;
-
-/* XXX do this with the object class */
- if ( _States_Is_waiting_on_thread_queue( state ) ) {
- if ( _States_Is_waiting_for_rpc_reply( state ) &&
- _States_Is_locally_blocked( state ) ) {
- remote_state = _States_Clear(
- STATES_WAITING_FOR_RPC_REPLY | STATES_TRANSIENT,
- state
- );
-
- switch ( remote_state ) {
-
- case STATES_WAITING_FOR_BUFFER:
- _Partition_MP_Send_extract_proxy( the_thread );
- break;
- case STATES_WAITING_FOR_SEGMENT:
- _Region_MP_Send_extract_proxy( the_thread );
- break;
- case STATES_WAITING_FOR_SEMAPHORE:
- _Semaphore_MP_Send_extract_proxy( the_thread );
- break;
- case STATES_WAITING_FOR_MESSAGE:
- _Message_queue_MP_Send_extract_proxy( the_thread );
- break;
- }
- }
- _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
- }
- else if ( _Watchdog_Is_active( &the_thread->Timer ) )
- (void) _Watchdog_Remove( &the_thread->Timer );
+ return (Priority_Control) priority;
}
/*PAGE
*
- * _RTEMS_Tasks_Priority_to_Core
+ * _RTEMS_tasks_Priority_is_valid
+ *
*/
-STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core(
- rtems_task_priority priority
+STATIC INLINE boolean _RTEMS_tasks_Priority_is_valid (
+ rtems_task_priority the_priority
)
{
- return (Priority_Control) priority;
+ return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
+ ( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
}
#endif
diff --git a/cpukit/rtems/macros/rtems/rtems/asr.inl b/cpukit/rtems/macros/rtems/rtems/asr.inl
index 421755879b..6610feea2a 100644
--- a/cpukit/rtems/macros/rtems/rtems/asr.inl
+++ b/cpukit/rtems/macros/rtems/rtems/asr.inl
@@ -17,7 +17,7 @@
#ifndef __INLINE_ASR_h
#define __INLINE_ASR_h
-#include <rtems/isr.h>
+#include <rtems/core/isr.h>
/*PAGE
*
@@ -27,6 +27,7 @@
#define _ASR_Initialize( _information ) \
{ \
+ (_information)->is_enabled = TRUE; \
(_information)->handler = NULL; \
(_information)->mode_set = RTEMS_DEFAULT_MODES; \
(_information)->signals_posted = 0; \
diff --git a/cpukit/rtems/macros/rtems/rtems/attr.inl b/cpukit/rtems/macros/rtems/rtems/attr.inl
index 97d3463d53..27231871ba 100644
--- a/cpukit/rtems/macros/rtems/rtems/attr.inl
+++ b/cpukit/rtems/macros/rtems/rtems/attr.inl
@@ -78,5 +78,14 @@
#define _Attributes_Is_inherit_priority( _attribute_set ) \
( (_attribute_set) & RTEMS_INHERIT_PRIORITY )
+/*PAGE
+ *
+ * _Attributes_Is_priority_ceiling
+ *
+ */
+
+#define _Attributes_Is_priority_ceiling( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_PRIORITY_CEILING )
+
#endif
/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/event.inl b/cpukit/rtems/macros/rtems/rtems/event.inl
index 1d4cb78237..0d2f2e47c7 100644
--- a/cpukit/rtems/macros/rtems/rtems/event.inl
+++ b/cpukit/rtems/macros/rtems/rtems/event.inl
@@ -22,7 +22,19 @@
*/
#define _Event_Manager_initialization() \
- _Event_Sync = FALSE
+ do { \
+ \
+ _Event_Sync = FALSE; \
+ \
+ /* \
+ * Register the MP Process Packet routine. \
+ */ \
+ \
+ _MPCI_Register_packet_processor( \
+ MP_PACKET_EVENT, \
+ _Event_MP_Process_packet \
+ ); \
+ } while ( 0 )
#endif
/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/modes.inl b/cpukit/rtems/macros/rtems/rtems/modes.inl
index 4c8b35a1e8..5f71796c07 100644
--- a/cpukit/rtems/macros/rtems/rtems/modes.inl
+++ b/cpukit/rtems/macros/rtems/rtems/modes.inl
@@ -41,7 +41,7 @@
*/
#define _Modes_Is_asr_disabled( _mode_set ) \
- ( (_mode_set) & RTEMS_ASR_MASK )
+ (((_mode_set) & RTEMS_ASR_MASK) == RTEMS_NO_ASR)
/*PAGE
*
@@ -59,8 +59,7 @@
*/
#define _Modes_Is_timeslice( _mode_set ) \
- (((_mode_set) & (RTEMS_TIMESLICE_MASK|RTEMS_PREEMPT_MASK)) == \
- (RTEMS_TIMESLICE|RTEMS_PREEMPT) )
+ (((_mode_set) & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE)
/*PAGE
*
diff --git a/cpukit/rtems/macros/rtems/rtems/status.inl b/cpukit/rtems/macros/rtems/rtems/status.inl
index c4f8a523df..408cb816d1 100644
--- a/cpukit/rtems/macros/rtems/rtems/status.inl
+++ b/cpukit/rtems/macros/rtems/rtems/status.inl
@@ -35,13 +35,5 @@
#define rtems_are_statuses_equal( _code1, _code2 ) \
((_code1) == (_code2))
-/*
- * _Status_Is_proxy_blocking
- *
- */
-
-#define _Status_Is_proxy_blocking( _code ) \
- ( (_code) == RTEMS_PROXY_BLOCKING )
-
#endif
/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/tasks.inl b/cpukit/rtems/macros/rtems/rtems/tasks.inl
index 243d0addc7..8dd6ff351b 100644
--- a/cpukit/rtems/macros/rtems/rtems/tasks.inl
+++ b/cpukit/rtems/macros/rtems/rtems/tasks.inl
@@ -17,11 +17,6 @@
#ifndef __RTEMS_TASKS_inl
#define __RTEMS_TASKS_inl
-#include <rtems/msgmp.h>
-#include <rtems/partmp.h>
-#include <rtems/regionmp.h>
-#include <rtems/semmp.h>
-
/*PAGE
*
* _RTEMS_tasks_Allocate
@@ -42,54 +37,22 @@
/*PAGE
*
- * _RTEMS_tasks_Cancel_wait
- *
+ * _RTEMS_tasks_Priority_to_Core
*/
-
-#define _RTEMS_tasks_Cancel_wait( _the_thread ) \
- { \
- States_Control _state; \
- States_Control _remote_state; \
- \
- _state = (_the_thread)->current_state; \
- \
- if ( _States_Is_waiting_on_thread_queue( _state ) ) { \
- if ( _States_Is_waiting_for_rpc_reply( _state ) && \
- _States_Is_locally_blocked( _state ) ) { \
- _remote_state = _States_Clear( \
- STATES_WAITING_FOR_RPC_REPLY + STATES_TRANSIENT, \
- _state \
- ); \
- \
- switch ( _remote_state ) { \
- \
- case STATES_WAITING_FOR_BUFFER: \
- _Partition_MP_Send_extract_proxy( (_the_thread) ); \
- break; \
- case STATES_WAITING_FOR_SEGMENT: \
- _Region_MP_Send_extract_proxy( (_the_thread) ); \
- break; \
- case STATES_WAITING_FOR_SEMAPHORE: \
- _Semaphore_MP_Send_extract_proxy( (_the_thread) ); \
- break; \
- case STATES_WAITING_FOR_MESSAGE: \
- _Message_queue_MP_Send_extract_proxy( (_the_thread) ); \
- break; \
- } \
- } \
- _Thread_queue_Extract( (_the_thread)->Wait.queue, (_the_thread) ); \
- } \
- else if ( _Watchdog_Is_active( &(_the_thread)->Timer ) ) \
- (void) _Watchdog_Remove( &(_the_thread)->Timer ); \
- }
+
+#define _RTEMS_tasks_Priority_to_Core( _priority ) \
+ ((Priority_Control) (_priority))
/*PAGE
*
- * _RTEMS_Tasks_Priority_to_Core
+ * _RTEMS_tasks_Priority_is_valid
+ *
*/
-#define _RTEMS_Tasks_Priority_to_Core( _priority ) \
- ((Priority_Control) (_priority))
+#define _RTEMS_tasks_Priority_is_valid( _the_priority ) \
+ ( ((_the_priority) >= RTEMS_MINIMUM_PRIORITY) && \
+ ((_the_priority) <= RTEMS_MAXIMUM_PRIORITY) )
+
#endif
/* end of include file */
diff --git a/cpukit/rtems/src/dpmem.c b/cpukit/rtems/src/dpmem.c
index 522c14866b..ee41eec142 100644
--- a/cpukit/rtems/src/dpmem.c
+++ b/cpukit/rtems/src/dpmem.c
@@ -13,11 +13,13 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/address.h>
-#include <rtems/dpmem.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/core/address.h>
+#include <rtems/rtems/dpmem.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/dpmem.h>
/*PAGE
*
@@ -78,11 +80,11 @@ rtems_status_code rtems_port_create(
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name) )
- return ( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
if ( !_Addresses_Is_aligned( internal_start ) ||
!_Addresses_Is_aligned( external_start ) )
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
_Thread_Disable_dispatch(); /* to prevent deletion */
@@ -90,7 +92,7 @@ rtems_status_code rtems_port_create(
if ( !the_port ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
the_port->internal_base = internal_start;
@@ -105,7 +107,7 @@ rtems_status_code rtems_port_create(
*id = the_port->Object.id;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -130,14 +132,16 @@ rtems_status_code rtems_port_ident(
Objects_Id *id
)
{
- return(
- _Objects_Name_to_id(
- &_Dual_ported_memory_Information,
- &name,
- RTEMS_SEARCH_ALL_NODES,
- id
- )
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Dual_ported_memory_Information,
+ &name,
+ OBJECTS_SEARCH_ALL_NODES,
+ id
);
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -165,17 +169,17 @@ rtems_status_code rtems_port_delete(
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
_Objects_Close( &_Dual_ported_memory_Information, &the_port->Object );
_Dual_ported_memory_Free( the_port );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -210,9 +214,9 @@ rtems_status_code rtems_port_internal_to_external(
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( internal, the_port->internal_base );
if ( ending > the_port->length )
@@ -221,10 +225,10 @@ rtems_status_code rtems_port_internal_to_external(
*external = _Addresses_Add_offset( the_port->external_base,
ending );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -259,9 +263,9 @@ rtems_status_code rtems_port_external_to_internal(
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( external, the_port->external_base );
if ( ending > the_port->length )
@@ -270,8 +274,8 @@ rtems_status_code rtems_port_external_to_internal(
*internal = _Addresses_Add_offset( the_port->internal_base,
ending );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
diff --git a/cpukit/rtems/src/event.c b/cpukit/rtems/src/event.c
index ec14c2aaa9..833358bca8 100644
--- a/cpukit/rtems/src/event.c
+++ b/cpukit/rtems/src/event.c
@@ -13,12 +13,14 @@
*/
#include <rtems/system.h>
-#include <rtems/event.h>
-#include <rtems/isr.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/tasks.h>
/*PAGE
*
@@ -42,11 +44,12 @@ rtems_status_code rtems_event_send(
{
register Thread_Control *the_thread;
Objects_Locations location;
+ RTEMS_API_Control *api;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
return(
_Event_MP_Send_request_packet(
@@ -56,13 +59,14 @@ rtems_status_code rtems_event_send(
)
);
case OBJECTS_LOCAL:
- _Event_sets_Post( event_in, &the_thread->RTEMS_API->pending_events );
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ _Event_sets_Post( event_in, &api->pending_events );
_Event_Surrender( the_thread );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -90,14 +94,17 @@ rtems_status_code rtems_event_receive(
rtems_event_set *event_out
)
{
+ RTEMS_API_Control *api;
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
+
if ( _Event_sets_Is_empty( event_in ) ) {
- *event_out = _Thread_Executing->RTEMS_API->pending_events;
- return( RTEMS_SUCCESSFUL );
+ *event_out = api->pending_events;
+ return RTEMS_SUCCESSFUL;
}
_Thread_Disable_dispatch();
- _Event_Seize( event_in, option_set, ticks );
+ _Event_Seize( event_in, option_set, ticks, event_out );
_Thread_Enable_dispatch();
- *event_out = _Thread_Executing->RTEMS_API->events_out;
return( _Thread_Executing->Wait.return_code );
}
diff --git a/cpukit/rtems/src/eventmp.c b/cpukit/rtems/src/eventmp.c
index 4bc5925c2a..e477c9d3b5 100644
--- a/cpukit/rtems/src/eventmp.c
+++ b/cpukit/rtems/src/eventmp.c
@@ -13,13 +13,15 @@
*/
#include <rtems/system.h>
-#include <rtems/event.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -49,7 +51,7 @@ rtems_status_code _Event_MP_Send_request_packet (
case EVENT_MP_SEND_REQUEST:
the_packet = _Event_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_EVENT;
+ the_packet->Prefix.the_class = MP_PACKET_EVENT;
the_packet->Prefix.length = sizeof ( Event_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Event_MP_Packet );
the_packet->operation = operation;
diff --git a/cpukit/rtems/src/intr.c b/cpukit/rtems/src/intr.c
index 25f5176967..dbcc23434c 100644
--- a/cpukit/rtems/src/intr.c
+++ b/cpukit/rtems/src/intr.c
@@ -14,10 +14,9 @@
*/
#include <rtems/system.h>
-#include <rtems/isr.h>
-#include <rtems/stack.h>
-#include <rtems/intr.h>
-#include <rtems/wkspace.h>
+#include <rtems/rtems/status.h>
+#include <rtems/core/isr.h>
+#include <rtems/rtems/intr.h>
/* _Interrupt_Manager_initialization
*
@@ -30,25 +29,6 @@
void _Interrupt_Manager_initialization( void )
{
-#if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
-
- if ( _CPU_Table.interrupt_stack_size < RTEMS_MINIMUM_STACK_SIZE )
- rtems_fatal_error_occurred( RTEMS_INVALID_SIZE );
-
- _CPU_Interrupt_stack_low =
- _Workspace_Allocate_or_fatal_error( _CPU_Table.interrupt_stack_size );
-
- _CPU_Interrupt_stack_high = _Addresses_Add_offset(
- _CPU_Interrupt_stack_low,
- _CPU_Table.interrupt_stack_size
- );
-
-#endif
-
-#if ( CPU_HAS_HARDWARE_INTERRUPT_STACK == TRUE )
- _CPU_Install_interrupt_stack();
-#endif
-
}
/* rtems_interrupt_catch
@@ -73,13 +53,13 @@ rtems_status_code rtems_interrupt_catch(
)
{
if ( !_ISR_Is_vector_number_valid( vector ) )
- return( RTEMS_INVALID_NUMBER );
+ return RTEMS_INVALID_NUMBER;
if ( !_ISR_Is_valid_user_handler( new_isr_handler ) )
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
_ISR_Install_vector(
vector, (proc_ptr)new_isr_handler, (proc_ptr *)old_isr_handler );
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/rtems/src/mp.c b/cpukit/rtems/src/mp.c
index c555ffb3f1..f17d3b13e6 100644
--- a/cpukit/rtems/src/mp.c
+++ b/cpukit/rtems/src/mp.c
@@ -14,23 +14,9 @@
*/
#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/cpu.h>
-#include <rtems/event.h>
-#include <rtems/fatal.h>
-#include <rtems/intthrd.h>
-#include <rtems/message.h>
-#include <rtems/mp.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/part.h>
-#include <rtems/sem.h>
-#include <rtems/signal.h>
-#include <rtems/states.h>
-#include <rtems/tasks.h>
-#include <rtems/thread.h>
-#include <rtems/threadq.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/core/mpci.h>
/*PAGE
*
@@ -40,11 +26,6 @@
void _Multiprocessing_Manager_initialization ( void )
{
- if ( _Configuration_MP_table->node < 1 ||
- _Configuration_MP_table->node > _Configuration_MP_table->maximum_nodes )
- rtems_fatal_error_occurred( RTEMS_INVALID_NODE );
-
- _Internal_threads_Set_MP_receive_server( _Multiprocessing_Receive_server );
}
/*PAGE
@@ -55,67 +36,7 @@ void _Multiprocessing_Manager_initialization ( void )
void rtems_multiprocessing_announce ( void )
{
- _Thread_Disable_dispatch();
- _Event_sets_Post(
- RTEMS_EVENT_0,
- &_Internal_threads_System_initialization_thread->RTEMS_API->pending_events
- );
- _Event_Surrender( _Internal_threads_System_initialization_thread );
- _Thread_Enable_dispatch();
-}
-
-/*PAGE
- *
- * _Multiprocessing_Receive_server
- *
- */
-
-typedef void (*packet_processor)( rtems_packet_prefix * );
-
-packet_processor _Multiprocessor_Packet_processors[] = {
- _Internal_threads_MP_Process_packet, /* RTEMS_MP_PACKET_INTERNAL_THREADS */
- _RTEMS_tasks_MP_Process_packet, /* RTEMS_MP_PACKET_TASKS */
- _Message_queue_MP_Process_packet, /* RTEMS_MP_PACKET_MESSAGE_QUEUE */
- _Semaphore_MP_Process_packet, /* RTEMS_MP_PACKET_SEMAPHORE */
- _Partition_MP_Process_packet, /* RTEMS_MP_PACKET_PARTITION */
- 0, /* RTEMS_MP_PACKET_REGION */
- _Event_MP_Process_packet, /* RTEMS_MP_PACKET_EVENT */
- _Signal_MP_Process_packet /* RTEMS_MP_PACKET_SIGNAL */
-};
-
-Thread _Multiprocessing_Receive_server (
- Thread_Argument ignored
-)
-{
-
- rtems_packet_prefix *the_packet;
- packet_processor the_function;
-
- for ( ; ; ) {
-
- _Thread_Disable_dispatch();
- _Event_Seize( RTEMS_EVENT_0, RTEMS_DEFAULT_OPTIONS, RTEMS_NO_TIMEOUT );
- _Thread_Enable_dispatch();
-
- for ( ; ; ) {
- the_packet = _MPCI_Receive_packet();
-
- if ( !the_packet )
- break;
-
- _Thread_Executing->receive_packet = the_packet;
-
- if ( !_Mp_packet_Is_valid_packet_class ( the_packet->the_class ) )
- break;
-
- the_function = _Multiprocessor_Packet_processors[ the_packet->the_class ];
-
- if ( !the_function )
- break;
-
- (*the_function)( the_packet );
- }
- }
+ _MPCI_Announce();
}
/* end of file */
diff --git a/cpukit/rtems/src/msg.c b/cpukit/rtems/src/msg.c
index ff4683f880..a69ae777c6 100644
--- a/cpukit/rtems/src/msg.c
+++ b/cpukit/rtems/src/msg.c
@@ -14,18 +14,19 @@
*/
#include <rtems/system.h>
-#include <rtems/attr.h>
-#include <rtems/chain.h>
-#include <rtems/config.h>
-#include <rtems/isr.h>
-#include <rtems/message.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/states.h>
-#include <rtems/support.h>
-#include <rtems/thread.h>
-#include <rtems/wkspace.h>
-#include <rtems/mpci.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/core/chain.h>
+#include <rtems/core/isr.h>
+#include <rtems/rtems/message.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/states.h>
+#include <rtems/rtems/support.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/wkspace.h>
+#include <rtems/core/mpci.h>
+#include <rtems/sysstate.h>
/*PAGE
*
@@ -54,6 +55,16 @@ void _Message_queue_Manager_initialization(
RTEMS_MAXIMUM_NAME_LENGTH,
FALSE
);
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_MESSAGE_QUEUE,
+ _Message_queue_MP_Process_packet
+ );
+
}
/*PAGE
@@ -72,7 +83,7 @@ Message_queue_Control *_Message_queue_Allocate (
unsigned32 message_buffering_required;
unsigned32 allocated_message_size;
- mq = \
+ mq =
(Message_queue_Control *)_Objects_Allocate(&_Message_queue_Information);
if (mq == 0)
@@ -144,11 +155,11 @@ rtems_status_code rtems_message_queue_create(
register Message_queue_Control *the_message_queue;
if ( !rtems_is_name_valid( name ) )
- return ( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
- if ( _Attributes_Is_global( attribute_set ) &&
- !_Configuration_Is_multiprocessing() )
- return( RTEMS_MP_NOT_CONFIGURED );
+ if ( _Attributes_Is_global( attribute_set ) &&
+ !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
if (count == 0)
return RTEMS_INVALID_NUMBER;
@@ -164,8 +175,7 @@ rtems_status_code rtems_message_queue_create(
*/
if ( _Attributes_Is_global( attribute_set ) &&
- _Configuration_MPCI_table &&
- (_Configuration_MPCI_table->maximum_packet_size < max_message_size))
+ (_MPCI_table->maximum_packet_size < max_message_size))
{
return RTEMS_INVALID_SIZE;
}
@@ -177,7 +187,7 @@ rtems_status_code rtems_message_queue_create(
if ( !the_message_queue ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
if ( _Attributes_Is_global( attribute_set ) &&
@@ -201,7 +211,8 @@ rtems_status_code rtems_message_queue_create(
_Attributes_Is_priority( attribute_set ) ?
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
- _Message_queue_MP_Send_extract_proxy
+ _Message_queue_MP_Send_extract_proxy,
+ RTEMS_TIMEOUT
);
_Objects_Open(
@@ -221,7 +232,7 @@ rtems_status_code rtems_message_queue_create(
);
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -248,12 +259,16 @@ rtems_status_code rtems_message_queue_ident(
Objects_Id *id
)
{
- return _Objects_Name_to_id(
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
&_Message_queue_Information,
&name,
node,
id
);
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -281,10 +296,10 @@ rtems_status_code rtems_message_queue_delete(
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Dispatch();
- return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
case OBJECTS_LOCAL:
_Objects_Close( &_Message_queue_Information,
&the_message_queue->Object );
@@ -294,7 +309,8 @@ rtems_status_code rtems_message_queue_delete(
else
_Thread_queue_Flush(
&the_message_queue->Wait_queue,
- _Message_queue_MP_Send_object_was_deleted
+ _Message_queue_MP_Send_object_was_deleted,
+ RTEMS_OBJECT_WAS_DELETED
);
_Message_queue_Free( the_message_queue );
@@ -314,10 +330,10 @@ rtems_status_code rtems_message_queue_delete(
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -403,7 +419,7 @@ rtems_status_code rtems_message_queue_broadcast(
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Executing->Wait.return_argument = count;
@@ -436,7 +452,7 @@ rtems_status_code rtems_message_queue_broadcast(
waitp->return_argument,
constrained_size);
- *waitp->Extra.message_size_p = constrained_size;
+ *(rtems_unsigned32 *)the_thread->Wait.return_argument_1 = size;
if ( !_Objects_Is_local_id( the_thread->Object.id ) ) {
the_thread->receive_packet->return_code = RTEMS_SUCCESSFUL;
@@ -450,7 +466,7 @@ rtems_status_code rtems_message_queue_broadcast(
}
_Thread_Enable_dispatch();
*count = number_broadcasted;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
default:
@@ -491,11 +507,9 @@ rtems_status_code rtems_message_queue_receive(
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
- _Thread_Executing->Wait.return_argument = buffer;
-
return _Message_queue_MP_Send_request_packet(
MESSAGE_QUEUE_MP_RECEIVE_REQUEST,
id,
@@ -517,7 +531,7 @@ rtems_status_code rtems_message_queue_receive(
return _Thread_Executing->Wait.return_code;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -549,7 +563,7 @@ rtems_status_code rtems_message_queue_flush(
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Executing->Wait.return_argument = count;
@@ -569,10 +583,10 @@ rtems_status_code rtems_message_queue_flush(
else
*count = 0;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -633,9 +647,9 @@ boolean _Message_queue_Seize(
the_message_queue->Wait_queue.sync = TRUE;
executing->Wait.queue = &the_message_queue->Wait_queue;
executing->Wait.id = the_message_queue->Object.id;
- executing->Wait.option_set = option_set;
- executing->Wait.return_argument = (unsigned32 *)buffer;
- executing->Wait.Extra.message_size_p = size_p;
+ executing->Wait.option = option_set;
+ executing->Wait.return_argument = (void *)buffer;
+ executing->Wait.return_argument_1 = (void *)size_p;
_ISR_Enable( level );
return FALSE;
}
@@ -724,7 +738,7 @@ rtems_status_code _Message_queue_Submit(
switch ( location )
{
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
switch ( submit_type ) {
@@ -770,7 +784,7 @@ rtems_status_code _Message_queue_Submit(
the_thread->Wait.return_argument,
size
);
- *the_thread->Wait.Extra.message_size_p = size;
+ *(rtems_unsigned32 *)the_thread->Wait.return_argument_1 = size;
if ( !_Objects_Is_local_id( the_thread->Object.id ) ) {
the_thread->receive_packet->return_code = RTEMS_SUCCESSFUL;
@@ -783,7 +797,7 @@ rtems_status_code _Message_queue_Submit(
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*
@@ -794,13 +808,13 @@ rtems_status_code _Message_queue_Submit(
if ( the_message_queue->number_of_pending_messages ==
the_message_queue->maximum_pending_messages ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
the_message = _Message_queue_Allocate_message_buffer(the_message_queue);
if ( the_message == 0) {
_Thread_Enable_dispatch();
- return( RTEMS_UNSATISFIED );
+ return RTEMS_UNSATISFIED;
}
_Message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size );
@@ -818,7 +832,7 @@ rtems_status_code _Message_queue_Submit(
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
default:
return RTEMS_INTERNAL_ERROR; /* And they were such nice boys, too! */
diff --git a/cpukit/rtems/src/msgmp.c b/cpukit/rtems/src/msgmp.c
index 48e572c43b..06afd4eedc 100644
--- a/cpukit/rtems/src/msgmp.c
+++ b/cpukit/rtems/src/msgmp.c
@@ -14,14 +14,15 @@
*/
#include <rtems/system.h>
-#include <rtems/message.h>
-#include <rtems/mpci.h>
-#include <rtems/msgmp.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
-#include <rtems/config.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/message.h>
+#include <rtems/core/mpci.h>
+#include <rtems/rtems/msgmp.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -46,7 +47,7 @@ void _Message_queue_MP_Send_process_packet (
case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
the_packet = _Message_queue_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_MESSAGE_QUEUE;
+ the_packet->Prefix.the_class = MP_PACKET_MESSAGE_QUEUE;
the_packet->Prefix.length = sizeof ( Message_queue_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Message_queue_MP_Packet );
the_packet->operation = operation;
@@ -102,10 +103,10 @@ rtems_status_code _Message_queue_MP_Send_request_packet (
case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
the_packet = _Message_queue_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_MESSAGE_QUEUE;
+ the_packet->Prefix.the_class = MP_PACKET_MESSAGE_QUEUE;
the_packet->Prefix.length = sizeof(Message_queue_MP_Packet);
if ( size_p )
- the_packet->Prefix.length += *size_p;
+ the_packet->Prefix.length += *size_p;
the_packet->Prefix.to_convert = sizeof(Message_queue_MP_Packet);
/*
@@ -114,9 +115,7 @@ rtems_status_code _Message_queue_MP_Send_request_packet (
* we are about to slam in the payload
*/
- if (the_packet->Prefix.length >
- _Configuration_MPCI_table->maximum_packet_size)
- {
+ if (the_packet->Prefix.length > _MPCI_table->maximum_packet_size) {
_Thread_Enable_dispatch();
return RTEMS_INVALID_SIZE;
}
@@ -132,8 +131,7 @@ rtems_status_code _Message_queue_MP_Send_request_packet (
* Copy the data into place if needed
*/
- if (buffer)
- {
+ if (buffer) {
the_packet->Buffer.size = *size_p;
_Message_queue_Copy_buffer(buffer,
the_packet->Buffer.buffer,
@@ -148,7 +146,7 @@ rtems_status_code _Message_queue_MP_Send_request_packet (
case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
the_packet = _Message_queue_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_MESSAGE_QUEUE;
+ the_packet->Prefix.the_class = MP_PACKET_MESSAGE_QUEUE;
the_packet->Prefix.length = sizeof(Message_queue_MP_Packet);
the_packet->Prefix.to_convert = sizeof(Message_queue_MP_Packet);
@@ -160,8 +158,8 @@ rtems_status_code _Message_queue_MP_Send_request_packet (
the_packet->option_set = option_set;
the_packet->size = 0; /* just in case of an error */
- _Thread_Executing->Wait.return_argument = (unsigned32 *)buffer;
- _Thread_Executing->Wait.Extra.message_size_p = size_p;
+ _Thread_Executing->Wait.return_argument = (unsigned32 *)buffer;
+ _Thread_Executing->Wait.return_argument_1 = size_p;
return _MPCI_Send_request_packet(rtems_get_node(message_queue_id),
&the_packet->Prefix,
@@ -296,7 +294,7 @@ void _Message_queue_MP_Process_packet (
the_packet->Prefix.timeout
);
- if ( ! _Status_Is_proxy_blocking( the_packet->Prefix.return_code ) )
+ if ( ! _Thread_Is_proxy_blocking( the_packet->Prefix.return_code ) )
_Message_queue_MP_Send_response_packet(
MESSAGE_QUEUE_MP_RECEIVE_RESPONSE,
the_packet->Prefix.id,
@@ -309,7 +307,8 @@ void _Message_queue_MP_Process_packet (
the_thread = _MPCI_Process_response( the_packet_prefix );
if (the_packet->Prefix.return_code == RTEMS_SUCCESSFUL) {
- *the_thread->Wait.Extra.message_size_p = the_packet->size;
+ *(rtems_unsigned32 *)the_thread->Wait.return_argument_1 =
+ the_packet->size;
_Message_queue_Copy_buffer(
the_packet->Buffer.buffer,
diff --git a/cpukit/rtems/src/part.c b/cpukit/rtems/src/part.c
index 3d21eed416..ee714f64c1 100644
--- a/cpukit/rtems/src/part.c
+++ b/cpukit/rtems/src/part.c
@@ -14,12 +14,13 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/address.h>
-#include <rtems/config.h>
-#include <rtems/object.h>
-#include <rtems/part.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/core/address.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/part.h>
+#include <rtems/core/thread.h>
+#include <rtems/sysstate.h>
/*PAGE
*
@@ -49,6 +50,15 @@ void _Partition_Manager_initialization(
FALSE
);
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_PARTITION,
+ _Partition_MP_Process_packet
+ );
+
}
/*PAGE
@@ -84,18 +94,18 @@ rtems_status_code rtems_partition_create(
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
- return ( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
- return ( RTEMS_INVALID_SIZE );
+ return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
- if ( _Attributes_Is_global( attribute_set ) &&
- !_Configuration_Is_multiprocessing() )
- return( RTEMS_MP_NOT_CONFIGURED );
+ if ( _Attributes_Is_global( attribute_set ) &&
+ !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
_Thread_Disable_dispatch(); /* prevents deletion */
@@ -103,7 +113,7 @@ rtems_status_code rtems_partition_create(
if ( !the_partition ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
if ( _Attributes_Is_global( attribute_set ) &&
@@ -111,7 +121,7 @@ rtems_status_code rtems_partition_create(
the_partition->Object.id, FALSE ) ) ) {
_Partition_Free( the_partition );
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
the_partition->starting_address = starting_address;
the_partition->length = length;
@@ -134,7 +144,7 @@ rtems_status_code rtems_partition_create(
);
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -161,7 +171,11 @@ rtems_status_code rtems_partition_ident(
Objects_Id *id
)
{
- return _Objects_Name_to_id( &_Partition_Information, &name, node, id );
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id( &_Partition_Information, &name, node, id );
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -190,10 +204,10 @@ rtems_status_code rtems_partition_delete(
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Dispatch();
- return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
case OBJECTS_LOCAL:
if ( the_partition->number_of_used_blocks == 0 ) {
_Objects_Close( &_Partition_Information, &the_partition->Object );
@@ -214,13 +228,13 @@ rtems_status_code rtems_partition_delete(
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_RESOURCE_IN_USE );
+ return RTEMS_RESOURCE_IN_USE;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -251,7 +265,7 @@ rtems_status_code rtems_partition_get_buffer(
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Executing->Wait.return_argument = buffer;
return(
@@ -267,13 +281,13 @@ rtems_status_code rtems_partition_get_buffer(
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_UNSATISFIED );
+ return RTEMS_UNSATISFIED;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -303,7 +317,7 @@ rtems_status_code rtems_partition_return_buffer(
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
return(
_Partition_MP_Send_request_packet(
@@ -317,11 +331,11 @@ rtems_status_code rtems_partition_return_buffer(
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
diff --git a/cpukit/rtems/src/partmp.c b/cpukit/rtems/src/partmp.c
index 0097844183..8fc36c6a04 100644
--- a/cpukit/rtems/src/partmp.c
+++ b/cpukit/rtems/src/partmp.c
@@ -14,12 +14,14 @@
*/
#include <rtems/system.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/part.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/part.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -44,7 +46,7 @@ void _Partition_MP_Send_process_packet (
case PARTITION_MP_EXTRACT_PROXY:
the_packet = _Partition_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_PARTITION;
+ the_packet->Prefix.the_class = MP_PACKET_PARTITION;
the_packet->Prefix.length = sizeof ( Partition_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Partition_MP_Packet );
the_packet->operation = operation;
@@ -88,7 +90,7 @@ rtems_status_code _Partition_MP_Send_request_packet (
case PARTITION_MP_RETURN_BUFFER_REQUEST:
the_packet = _Partition_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_PARTITION;
+ the_packet->Prefix.the_class = MP_PACKET_PARTITION;
the_packet->Prefix.length = sizeof ( Partition_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Partition_MP_Packet );
the_packet->operation = operation;
diff --git a/cpukit/rtems/src/ratemon.c b/cpukit/rtems/src/ratemon.c
index c98de762af..a94ba66ea0 100644
--- a/cpukit/rtems/src/ratemon.c
+++ b/cpukit/rtems/src/ratemon.c
@@ -14,11 +14,12 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/isr.h>
-#include <rtems/object.h>
-#include <rtems/ratemon.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/ratemon.h>
+#include <rtems/core/thread.h>
/*PAGE
*
@@ -77,7 +78,7 @@ rtems_status_code rtems_rate_monotonic_create(
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
- return( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
_Thread_Disable_dispatch(); /* to prevent deletion */
@@ -85,7 +86,7 @@ rtems_status_code rtems_rate_monotonic_create(
if ( !the_period ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
the_period->owner = _Thread_Executing;
@@ -95,7 +96,7 @@ rtems_status_code rtems_rate_monotonic_create(
*id = the_period->Object.id;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -120,12 +121,16 @@ rtems_status_code rtems_rate_monotonic_ident(
Objects_Id *id
)
{
- return _Objects_Name_to_id(
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
&_Rate_monotonic_Information,
&name,
- RTEMS_SEARCH_LOCAL_NODE,
+ OBJECTS_SEARCH_LOCAL_NODE,
id
);
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -152,21 +157,21 @@ rtems_status_code rtems_rate_monotonic_cancel(
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
- case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return RTEMS_INTERNAL_ERROR; /* should never return this */
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
- return( RTEMS_NOT_OWNER_OF_RESOURCE );
+ return RTEMS_NOT_OWNER_OF_RESOURCE;
}
(void) _Watchdog_Remove( &the_period->Timer );
the_period->state = RATE_MONOTONIC_INACTIVE;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -193,19 +198,19 @@ rtems_status_code rtems_rate_monotonic_delete(
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
_Objects_Close( &_Rate_monotonic_Information, &the_period->Object );
(void) _Watchdog_Remove( &the_period->Timer );
the_period->state = RATE_MONOTONIC_INACTIVE;
_Rate_monotonic_Free( the_period );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -225,23 +230,23 @@ rtems_status_code rtems_rate_monotonic_delete(
rtems_status_code rtems_rate_monotonic_period(
Objects_Id id,
- rtems_interval length
+ rtems_interval length
)
{
Rate_monotonic_Control *the_period;
Objects_Locations location;
- rtems_status_code return_value;
+ rtems_status_code return_value;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
- return( RTEMS_NOT_OWNER_OF_RESOURCE );
+ return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
@@ -275,14 +280,14 @@ rtems_status_code rtems_rate_monotonic_period(
_Watchdog_Insert_ticks(
&the_period->Timer, length, WATCHDOG_ACTIVATE_NOW );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
case RATE_MONOTONIC_ACTIVE:
/* following is and could be a critical section problem */
_Thread_Executing->Wait.id = the_period->Object.id;
if ( _Rate_monotonic_Set_state( the_period ) ) {
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/* has expired -- fall into next case */
case RATE_MONOTONIC_EXPIRED:
@@ -290,11 +295,11 @@ rtems_status_code rtems_rate_monotonic_period(
_Watchdog_Insert_ticks(
&the_period->Timer, length, WATCHDOG_ACTIVATE_NOW );
_Thread_Enable_dispatch();
- return( RTEMS_TIMEOUT );
+ return RTEMS_TIMEOUT;
}
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
diff --git a/cpukit/rtems/src/region.c b/cpukit/rtems/src/region.c
index 25aca9cda7..b5d55afdc3 100644
--- a/cpukit/rtems/src/region.c
+++ b/cpukit/rtems/src/region.c
@@ -14,13 +14,13 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/config.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/region.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
/*PAGE
*
@@ -48,6 +48,16 @@ void _Region_Manager_initialization(
RTEMS_MAXIMUM_NAME_LENGTH,
FALSE
);
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_REGION,
+ 0 /* XXX _Region_MP_Process_packet */
+ );
+
}
/*PAGE
@@ -83,10 +93,10 @@ rtems_status_code rtems_region_create(
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
- return ( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
if ( !_Addresses_Is_aligned( starting_address ) )
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
_Thread_Disable_dispatch(); /* to prevent deletion */
@@ -94,7 +104,7 @@ rtems_status_code rtems_region_create(
if ( !the_region ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
the_region->maximum_segment_size =
@@ -103,7 +113,7 @@ rtems_status_code rtems_region_create(
if ( !the_region->maximum_segment_size ) {
_Region_Free( the_region );
_Thread_Enable_dispatch();
- return( RTEMS_INVALID_SIZE );
+ return RTEMS_INVALID_SIZE;
}
the_region->starting_address = starting_address;
@@ -118,14 +128,15 @@ rtems_status_code rtems_region_create(
_Attributes_Is_priority( attribute_set ) ?
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_SEGMENT,
- _Region_MP_Send_extract_proxy
+ _Region_MP_Send_extract_proxy,
+ RTEMS_TIMEOUT
);
_Objects_Open( &_Region_Information, &the_region->Object, &name );
*id = the_region->Object.id;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -150,12 +161,16 @@ rtems_status_code rtems_region_ident(
Objects_Id *id
)
{
- return _Objects_Name_to_id(
- &_Region_Information,
- &name,
- RTEMS_SEARCH_LOCAL_NODE,
- id
- );
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Region_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -184,22 +199,22 @@ rtems_status_code rtems_region_delete(
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 5 );
if ( the_region->number_of_used_blocks == 0 ) {
_Objects_Close( &_Region_Information, &the_region->Object );
_Region_Free( the_region );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_RESOURCE_IN_USE );
+ return RTEMS_RESOURCE_IN_USE;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -236,9 +251,9 @@ rtems_status_code rtems_region_extend(
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
heap_status = _Heap_Extend(
@@ -264,7 +279,7 @@ rtems_status_code rtems_region_extend(
return( status );
}
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -289,8 +304,8 @@ rtems_status_code rtems_region_extend(
rtems_status_code rtems_region_get_segment(
Objects_Id id,
unsigned32 size,
- rtems_option option_set,
- rtems_interval timeout,
+ rtems_option option_set,
+ rtems_interval timeout,
void **segment
)
{
@@ -300,19 +315,19 @@ rtems_status_code rtems_region_get_segment(
void *the_segment;
if ( size == 0 )
- return( RTEMS_INVALID_SIZE );
+ return RTEMS_INVALID_SIZE;
executing = _Thread_Executing;
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
if ( size > the_region->maximum_segment_size ) {
_Thread_Enable_dispatch();
- return( RTEMS_INVALID_SIZE );
+ return RTEMS_INVALID_SIZE;
}
_Region_Debug_Walk( the_region, 1 );
@@ -325,18 +340,18 @@ rtems_status_code rtems_region_get_segment(
the_region->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*segment = the_segment;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
if ( _Options_Is_no_wait( option_set ) ) {
_Thread_Enable_dispatch();
- return( RTEMS_UNSATISFIED );
+ return RTEMS_UNSATISFIED;
}
- executing->Wait.queue = &the_region->Wait_queue;
- executing->Wait.id = id;
- executing->Wait.Extra.segment_size = size;
- executing->Wait.return_argument = (unsigned32 *) segment;
+ executing->Wait.queue = &the_region->Wait_queue;
+ executing->Wait.id = id;
+ executing->Wait.count = size;
+ executing->Wait.return_argument = (unsigned32 *) segment;
the_region->Wait_queue.sync = TRUE;
@@ -346,7 +361,7 @@ rtems_status_code rtems_region_get_segment(
return( executing->Wait.return_code );
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
*
@@ -379,20 +394,20 @@ rtems_status_code rtems_region_get_segment_size(
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
if ( _Heap_Size_of_user_area( &the_region->Memory, segment, size ) ) {
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -424,9 +439,9 @@ rtems_status_code rtems_region_return_segment(
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* this error cannot be returned */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 3 );
@@ -437,7 +452,7 @@ rtems_status_code rtems_region_return_segment(
if ( !status ) {
_Thread_Enable_dispatch();
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
}
the_region->number_of_used_blocks -= 1;
@@ -448,7 +463,9 @@ rtems_status_code rtems_region_return_segment(
break;
the_segment = _Region_Allocate_segment(
- the_region, the_thread->Wait.Extra.segment_size );
+ the_region,
+ the_thread->Wait.count
+ );
if ( the_segment == NULL )
break;
@@ -460,8 +477,8 @@ rtems_status_code rtems_region_return_segment(
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
diff --git a/cpukit/rtems/src/regionmp.c b/cpukit/rtems/src/regionmp.c
index b460e554fe..89b9d851c5 100644
--- a/cpukit/rtems/src/regionmp.c
+++ b/cpukit/rtems/src/regionmp.c
@@ -14,12 +14,14 @@
*/
#include <rtems/system.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/region.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -44,7 +46,7 @@ void _Region_MP_Send_process_packet (
case REGION_MP_EXTRACT_PROXY:
the_packet = _Region_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_REGION;
+ the_packet->Prefix.the_class = MP_PACKET_REGION;
the_packet->Prefix.length = sizeof ( Region_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Region_MP_Packet );
the_packet->operation = operation;
@@ -79,8 +81,8 @@ rtems_status_code _Region_MP_Send_request_packet (
Objects_Id region_id,
void *segment,
unsigned32 size,
- rtems_option option_set,
- rtems_interval timeout
+ rtems_option option_set,
+ rtems_interval timeout
)
{
Region_MP_Packet *the_packet;
@@ -91,7 +93,7 @@ rtems_status_code _Region_MP_Send_request_packet (
case REGION_MP_RETURN_SEGMENT_REQUEST:
the_packet = _Region_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_REGION;
+ the_packet->Prefix.the_class = MP_PACKET_REGION;
the_packet->Prefix.length = sizeof ( Region_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Region_MP_Packet );
if ( ! _Options_Is_no_wait(option_set))
diff --git a/cpukit/rtems/src/rtclock.c b/cpukit/rtems/src/rtclock.c
index f82baa6337..01f61374cf 100644
--- a/cpukit/rtems/src/rtclock.c
+++ b/cpukit/rtems/src/rtclock.c
@@ -13,12 +13,12 @@
*/
#include <rtems/system.h>
-#include <rtems/clock.h>
-#include <rtems/config.h>
-#include <rtems/isr.h>
-#include <rtems/thread.h>
-#include <rtems/tod.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/tod.h>
+#include <rtems/core/watchdog.h>
/*PAGE
*
@@ -49,29 +49,29 @@ rtems_status_code rtems_clock_get(
switch ( option ) {
case RTEMS_CLOCK_GET_TOD:
if ( !_TOD_Is_set() )
- return( RTEMS_NOT_DEFINED );
+ return RTEMS_NOT_DEFINED;
*(rtems_time_of_day *)time_buffer = _TOD_Current;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH:
if ( !_TOD_Is_set() )
- return( RTEMS_NOT_DEFINED );
+ return RTEMS_NOT_DEFINED;
*(rtems_interval *)time_buffer = _TOD_Seconds_since_epoch;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT:
*(rtems_interval *)time_buffer = _TOD_Ticks_since_boot;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
case RTEMS_CLOCK_GET_TICKS_PER_SECOND:
*(rtems_interval *)time_buffer = _TOD_Ticks_per_second;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
case RTEMS_CLOCK_GET_TIME_VALUE:
if ( !_TOD_Is_set() )
- return( RTEMS_NOT_DEFINED );
+ return RTEMS_NOT_DEFINED;
_ISR_Disable( level );
((rtems_clock_time_value *)time_buffer)->seconds =
@@ -79,13 +79,13 @@ rtems_status_code rtems_clock_get(
tmp = _TOD_Current.ticks;
_ISR_Enable( level );
- tmp *= _Configuration_Table->microseconds_per_tick;
+ tmp *= _TOD_Microseconds_per_tick;
((rtems_clock_time_value *)time_buffer)->microseconds = tmp;
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_SUCCESSFUL ); /* should never get here */
+ return RTEMS_INTERNAL_ERROR; /* should never get here */
}
@@ -107,18 +107,16 @@ rtems_status_code rtems_clock_set(
rtems_time_of_day *time_buffer
)
{
- rtems_status_code local_result;
- rtems_interval seconds;
+ rtems_interval seconds;
- local_result = _TOD_Validate( time_buffer );
- if ( rtems_is_status_successful( local_result ) ) {
+ if ( _TOD_Validate( time_buffer ) ) {
seconds = _TOD_To_seconds( time_buffer );
_Thread_Disable_dispatch();
_TOD_Set( time_buffer, seconds );
_Thread_Enable_dispatch();
-
+ return RTEMS_SUCCESSFUL;
}
- return( local_result );
+ return RTEMS_INVALID_CLOCK;
}
/*PAGE
@@ -149,5 +147,5 @@ rtems_status_code rtems_clock_tick( void )
_Thread_Is_dispatching_enabled() )
_Thread_Dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/rtems/src/rtemstimer.c b/cpukit/rtems/src/rtemstimer.c
index 68d9e4591b..c59e137d0c 100644
--- a/cpukit/rtems/src/rtemstimer.c
+++ b/cpukit/rtems/src/rtemstimer.c
@@ -14,12 +14,13 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
-#include <rtems/timer.h>
-#include <rtems/tod.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/core/tod.h>
+#include <rtems/core/watchdog.h>
/*PAGE
*
@@ -73,7 +74,7 @@ rtems_status_code rtems_timer_create(
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
- return ( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
_Thread_Disable_dispatch(); /* to prevent deletion */
@@ -81,7 +82,7 @@ rtems_status_code rtems_timer_create(
if ( !the_timer ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
the_timer->the_class = TIMER_DORMANT;
@@ -90,7 +91,7 @@ rtems_status_code rtems_timer_create(
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -115,12 +116,16 @@ rtems_status_code rtems_timer_ident(
Objects_Id *id
)
{
- return _Objects_Name_to_id(
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
&_Timer_Information,
&name,
- RTEMS_SEARCH_LOCAL_NODE,
+ OBJECTS_SEARCH_LOCAL_NODE,
id
);
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -147,17 +152,17 @@ rtems_status_code rtems_timer_cancel(
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
(void) _Watchdog_Remove( &the_timer->Ticker );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -184,18 +189,18 @@ rtems_status_code rtems_timer_delete(
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
_Objects_Close( &_Timer_Information, &the_timer->Object );
(void) _Watchdog_Remove( &the_timer->Ticker );
_Timer_Free( the_timer );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -215,24 +220,24 @@ rtems_status_code rtems_timer_delete(
*/
rtems_status_code rtems_timer_fire_after(
- Objects_Id id,
- rtems_interval ticks,
- Timer_Service routine,
- void *user_data
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
)
{
Timer_Control *the_timer;
Objects_Locations location;
if ( ticks == 0 )
- return( RTEMS_INVALID_NUMBER );
+ return RTEMS_INVALID_NUMBER;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_INTERVAL;
@@ -240,10 +245,10 @@ rtems_status_code rtems_timer_fire_after(
_Watchdog_Insert_ticks( &the_timer->Ticker,
ticks, WATCHDOG_ACTIVATE_NOW );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -263,34 +268,32 @@ rtems_status_code rtems_timer_fire_after(
*/
rtems_status_code rtems_timer_fire_when(
- Objects_Id id,
- rtems_time_of_day *wall_time,
- Timer_Service routine,
- void *user_data
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
)
{
- Timer_Control *the_timer;
- Objects_Locations location;
- rtems_status_code validate_status;
+ Timer_Control *the_timer;
+ Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set() )
- return( RTEMS_NOT_DEFINED );
+ return RTEMS_NOT_DEFINED;
- validate_status = _TOD_Validate( wall_time );
- if ( !rtems_is_status_successful( validate_status ) )
- return( validate_status );
+ if ( !_TOD_Validate( wall_time ) )
+ return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch )
- return( RTEMS_INVALID_CLOCK );
+ return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY;
@@ -298,10 +301,10 @@ rtems_status_code rtems_timer_fire_when(
_Watchdog_Insert_seconds( &the_timer->Ticker,
seconds - _TOD_Seconds_since_epoch, WATCHDOG_ACTIVATE_NOW );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -328,18 +331,18 @@ rtems_status_code rtems_timer_reset(
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INTERNAL_ERROR );
+ return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
if ( _Timer_Is_interval_class( the_timer->the_class ) ) {
_Watchdog_Reset( &the_timer->Ticker );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_NOT_DEFINED );
+ return RTEMS_NOT_DEFINED;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
diff --git a/cpukit/rtems/src/sem.c b/cpukit/rtems/src/sem.c
index 9e87550c31..9ba1634164 100644
--- a/cpukit/rtems/src/sem.c
+++ b/cpukit/rtems/src/sem.c
@@ -27,17 +27,22 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/attr.h>
-#include <rtems/config.h>
-#include <rtems/isr.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/sem.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
-#include <rtems/threadq.h>
-#include <rtems/mpci.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/core/coremutex.h>
+#include <rtems/core/coresem.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/mpci.h>
+#include <rtems/sysstate.h>
+
+#include <rtems/core/interr.h>
/*PAGE
*
@@ -65,6 +70,16 @@ void _Semaphore_Manager_initialization(
RTEMS_MAXIMUM_NAME_LENGTH,
FALSE
);
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_SEMAPHORE,
+ _Semaphore_MP_Process_packet
+ );
+
}
/*PAGE
@@ -75,10 +90,11 @@ void _Semaphore_Manager_initialization(
* on the given count. A semaphore id is returned.
*
* Input parameters:
- * name - user defined semaphore name
- * count - initial count of semaphore
- * attribute_set - semaphore attributes
- * id - pointer to semaphore id
+ * name - user defined semaphore name
+ * count - initial count of semaphore
+ * attribute_set - semaphore attributes
+ * priority_ceiling - semaphore's ceiling priority
+ * id - pointer to semaphore id
*
* Output parameters:
* id - semaphore id
@@ -87,21 +103,24 @@ void _Semaphore_Manager_initialization(
*/
rtems_status_code rtems_semaphore_create(
- rtems_name name,
- unsigned32 count,
- rtems_attribute attribute_set,
- rtems_task_priority priority_ceiling,
- Objects_Id *id
+ rtems_name name,
+ unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ Objects_Id *id
)
{
register Semaphore_Control *the_semaphore;
+ CORE_mutex_Attributes the_mutex_attributes;
+ CORE_semaphore_Attributes the_semaphore_attributes;
+ unsigned32 lock;
if ( !rtems_is_name_valid( name ) )
return ( RTEMS_INVALID_NAME );
if ( _Attributes_Is_global( attribute_set ) ) {
- if ( !_Configuration_Is_multiprocessing() )
+ if ( !_System_state_Is_multiprocessing )
return( RTEMS_MP_NOT_CONFIGURED );
if ( _Attributes_Is_inherit_priority( attribute_set ) )
@@ -128,7 +147,7 @@ rtems_status_code rtems_semaphore_create(
}
if ( _Attributes_Is_global( attribute_set ) &&
- !( _Objects_MP_Allocate_and_open( &_Semaphore_Information, name,
+ ! ( _Objects_MP_Allocate_and_open( &_Semaphore_Information, name,
the_semaphore->Object.id, FALSE ) ) ) {
_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
@@ -136,27 +155,48 @@ rtems_status_code rtems_semaphore_create(
}
the_semaphore->attribute_set = attribute_set;
- the_semaphore->count = count;
-
- if ( _Attributes_Is_binary_semaphore( attribute_set ) && count == 0 ) {
- the_semaphore->nest_count = 1;
- the_semaphore->holder = _Thread_Executing;
- the_semaphore->holder_id = _Thread_Executing->Object.id;
- _Thread_Executing->resource_count++;
- } else {
- the_semaphore->nest_count = 0;
- the_semaphore->holder = NULL;
- the_semaphore->holder_id = 0;
- }
- _Thread_queue_Initialize(
- &the_semaphore->Wait_queue,
- OBJECTS_RTEMS_SEMAPHORES,
- _Attributes_Is_priority( attribute_set ) ?
- THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
- STATES_WAITING_FOR_SEMAPHORE,
- _Semaphore_MP_Send_extract_proxy
- );
+ if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
+ if ( _Attributes_Is_inherit_priority( attribute_set ) )
+ the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
+ else if (_Attributes_Is_priority_ceiling( attribute_set ) )
+ the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
+ else if (_Attributes_Is_priority( attribute_set ) )
+ the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
+ else
+ the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
+
+ the_mutex_attributes.allow_nesting = TRUE;
+
+ /* Add priority ceiling code here ????? */
+
+ if ( count == 1 )
+ lock = CORE_MUTEX_UNLOCKED;
+ else
+ lock = CORE_MUTEX_LOCKED;
+
+ _CORE_mutex_Initialize(
+ &the_semaphore->Core_control.mutex,
+ OBJECTS_RTEMS_SEMAPHORES,
+ &the_mutex_attributes,
+ lock,
+ _Semaphore_MP_Send_extract_proxy
+ );
+ }
+ else {
+ if ( _Attributes_Is_priority( attribute_set ) )
+ the_semaphore_attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
+ else
+ the_semaphore_attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
+
+ _CORE_semaphore_Initialize(
+ &the_semaphore->Core_control.semaphore,
+ OBJECTS_RTEMS_SEMAPHORES,
+ &the_semaphore_attributes,
+ count,
+ _Semaphore_MP_Send_extract_proxy
+ );
+ }
_Objects_Open( &_Semaphore_Information, &the_semaphore->Object, &name );
@@ -192,12 +232,16 @@ rtems_status_code rtems_semaphore_create(
*/
rtems_status_code rtems_semaphore_ident(
- rtems_name name,
- unsigned32 node,
- Objects_Id *id
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
)
{
- return( _Objects_Name_to_id( &_Semaphore_Information, &name, node, id ) );
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id( &_Semaphore_Information, &name, node, id );
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -231,19 +275,27 @@ rtems_status_code rtems_semaphore_delete(
_Thread_Dispatch();
return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
case OBJECTS_LOCAL:
- if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set) &&
- ( the_semaphore->count == 0 ) ) {
- _Thread_Enable_dispatch();
- return( RTEMS_RESOURCE_IN_USE );
+ if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set) ) {
+ if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) ) {
+ _Thread_Enable_dispatch();
+ return( RTEMS_RESOURCE_IN_USE );
+ }
+ else
+ _CORE_mutex_Flush(
+ &the_semaphore->Core_control.mutex,
+ _Semaphore_MP_Send_object_was_deleted,
+ CORE_MUTEX_WAS_DELETED
+ );
}
+ else
+ _CORE_semaphore_Flush(
+ &the_semaphore->Core_control.semaphore,
+ _Semaphore_MP_Send_object_was_deleted,
+ CORE_SEMAPHORE_WAS_DELETED
+ );
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
- _Thread_queue_Flush(
- &the_semaphore->Wait_queue,
- _Semaphore_MP_Send_object_was_deleted
- );
-
_Semaphore_Free( the_semaphore );
if ( _Attributes_Is_global( the_semaphore->attribute_set ) ) {
@@ -281,13 +333,14 @@ rtems_status_code rtems_semaphore_delete(
*/
rtems_status_code rtems_semaphore_obtain(
- Objects_Id id,
- unsigned32 option_set,
- rtems_interval timeout
+ Objects_Id id,
+ unsigned32 option_set,
+ rtems_interval timeout
)
{
register Semaphore_Control *the_semaphore;
Objects_Locations location;
+ boolean wait;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
@@ -301,17 +354,32 @@ rtems_status_code rtems_semaphore_obtain(
timeout
);
case OBJECTS_LOCAL:
- if ( !_Semaphore_Seize( the_semaphore, option_set ) ) {
- if ( _Attributes_Is_inherit_priority( the_semaphore->attribute_set ) &&
- the_semaphore->holder->current_priority >
- _Thread_Executing->current_priority ) {
- _Thread_Change_priority(
- the_semaphore->holder, _Thread_Executing->current_priority );
- }
- _Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
+ if ( _Options_Is_no_wait( option_set ) )
+ wait = FALSE;
+ else
+ wait = TRUE;
+
+ if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set ) ) {
+ _CORE_mutex_Seize(
+ &the_semaphore->Core_control.mutex,
+ id,
+ wait,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return( _Semaphore_Translate_core_mutex_return_code(
+ _Thread_Executing->Wait.return_code ) );
+ } else {
+ _CORE_semaphore_Seize(
+ &the_semaphore->Core_control.semaphore,
+ id,
+ wait,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return( _Semaphore_Translate_core_semaphore_return_code(
+ _Thread_Executing->Wait.return_code ) );
}
- _Thread_Enable_dispatch();
- return( _Thread_Executing->Wait.return_code );
}
return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
@@ -337,7 +405,8 @@ rtems_status_code rtems_semaphore_release(
{
register Semaphore_Control *the_semaphore;
Objects_Locations location;
- Thread_Control *the_thread;
+ CORE_mutex_Status mutex_status;
+ CORE_semaphore_Status semaphore_status;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
@@ -353,143 +422,153 @@ rtems_status_code rtems_semaphore_release(
)
);
case OBJECTS_LOCAL:
- if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set)) {
-
- if ( !_Objects_Are_ids_equal(
- _Thread_Executing->Object.id, the_semaphore->holder_id ) ) {
- _Thread_Enable_dispatch();
- return( RTEMS_NOT_OWNER_OF_RESOURCE );
- }
-
- the_semaphore->nest_count--;
-
- if ( the_semaphore->nest_count != 0 ) {
- _Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
- }
-
- _Thread_Executing->resource_count--;
- the_semaphore->holder = NULL;
- the_semaphore->holder_id = 0;
-
- /*
- * Whether or not someone is waiting for the semaphore, an
- * inherited priority must be lowered if this is the last
- * semaphore (i.e. resource) this task has.
- */
-
- if ( _Attributes_Is_inherit_priority(the_semaphore->attribute_set) &&
- _Thread_Executing->resource_count == 0 &&
- _Thread_Executing->real_priority !=
- _Thread_Executing->current_priority ) {
- _Thread_Change_priority(
- _Thread_Executing, _Thread_Executing->real_priority );
- }
-
+ if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set ) ) {
+ mutex_status = _CORE_mutex_Surrender(
+ &the_semaphore->Core_control.mutex,
+ id,
+ _Semaphore_Core_mutex_mp_support
+ );
+ _Thread_Enable_dispatch();
+ return( _Semaphore_Translate_core_mutex_return_code( mutex_status ) );
}
+ else
+ semaphore_status = _CORE_semaphore_Surrender(
+ &the_semaphore->Core_control.semaphore,
+ id,
+ _Semaphore_Core_semaphore_mp_support
+ );
+ _Thread_Enable_dispatch();
+ return(
+ _Semaphore_Translate_core_semaphore_return_code( semaphore_status ) );
+ }
- if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
-
- if ( !_Objects_Is_local_id( the_thread->Object.id ) ) {
- the_thread->receive_packet->return_code = RTEMS_SUCCESSFUL;
-
- if ( _Attributes_Is_binary_semaphore(the_semaphore->attribute_set) ) {
- the_semaphore->holder = NULL;
- the_semaphore->holder_id = the_thread->Object.id;
- the_semaphore->nest_count = 1;
- }
-
- _Semaphore_MP_Send_response_packet(
- SEMAPHORE_MP_OBTAIN_RESPONSE,
- id,
- the_thread
- );
- } else {
-
- if ( _Attributes_Is_binary_semaphore(the_semaphore->attribute_set) ) {
- the_semaphore->holder = the_thread;
- the_semaphore->holder_id = the_thread->Object.id;
- the_thread->resource_count++;
- the_semaphore->nest_count = 1;
- }
-
- /*
- * No special action for priority inheritance because the_thread
- * is guaranteed to be the highest priority thread waiting for
- * the semaphore.
- */
- }
- } else
- the_semaphore->count += 1;
+ return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+}
- _Thread_Enable_dispatch();
+/*PAGE
+ *
+ * _Semaphore_Translate_core_mutex_return_code
+ *
+ * Input parameters:
+ * the_mutex_status - mutex status code to translate
+ *
+ * Output parameters:
+ * rtems status code - translated RTEMS status code
+ *
+ */
+
+rtems_status_code _Semaphore_Translate_core_mutex_return_code (
+ unsigned32 the_mutex_status
+)
+{
+ switch ( the_mutex_status ) {
+ case CORE_MUTEX_STATUS_SUCCESSFUL:
return( RTEMS_SUCCESSFUL );
+ case CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT:
+ return( RTEMS_UNSATISFIED );
+ case CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED:
+ return( RTEMS_INTERNAL_ERROR );
+ case CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE:
+ return( RTEMS_NOT_OWNER_OF_RESOURCE );
+ case CORE_MUTEX_WAS_DELETED:
+ return( RTEMS_OBJECT_WAS_DELETED );
+ case CORE_MUTEX_TIMEOUT:
+ return( RTEMS_TIMEOUT );
+ case THREAD_STATUS_PROXY_BLOCKING:
+ return( THREAD_STATUS_PROXY_BLOCKING );
}
-
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ TRUE,
+ the_mutex_status
+ );
return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
}
/*PAGE
*
- * _Semaphore_Seize
- *
- * This routine attempts to allocate a semaphore to the calling thread.
+ * _Semaphore_Translate_core_semaphore_return_code
*
* Input parameters:
- * the_semaphore - pointer to semaphore control block
- * option_set - acquire semaphore options
+ * the_semaphore_status - semaphore status code to translate
*
* Output parameters:
- * TRUE - if semaphore allocated
- * FALSE - if semaphore NOT allocated
+ * rtems status code - translated RTEMS status code
*
- * INTERRUPT LATENCY:
- * available
- * wait
*/
-
-boolean _Semaphore_Seize(
- Semaphore_Control *the_semaphore,
- rtems_option option_set
+
+rtems_status_code _Semaphore_Translate_core_semaphore_return_code (
+ unsigned32 the_semaphore_status
)
{
- Thread_Control *executing;
- ISR_Level level;
-
- executing = _Thread_Executing;
- executing->Wait.return_code = RTEMS_SUCCESSFUL;
- _ISR_Disable( level );
- if ( the_semaphore->count != 0 ) {
- the_semaphore->count -= 1;
- if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set ) ) {
- the_semaphore->holder = executing;
- the_semaphore->holder_id = executing->Object.id;
- the_semaphore->nest_count = 1;
- executing->resource_count++;
- }
- _ISR_Enable( level );
- return( TRUE );
+ switch ( the_semaphore_status ) {
+ case CORE_SEMAPHORE_STATUS_SUCCESSFUL:
+ return( RTEMS_SUCCESSFUL );
+ case CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT:
+ return( RTEMS_UNSATISFIED );
+ case CORE_SEMAPHORE_WAS_DELETED:
+ return( RTEMS_OBJECT_WAS_DELETED );
+ case CORE_SEMAPHORE_TIMEOUT:
+ return( RTEMS_TIMEOUT );
+ case THREAD_STATUS_PROXY_BLOCKING:
+ return( THREAD_STATUS_PROXY_BLOCKING );
}
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ TRUE,
+ the_semaphore_status
+ );
+ return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+}
- if ( _Options_Is_no_wait( option_set ) ) {
- _ISR_Enable( level );
- executing->Wait.return_code = RTEMS_UNSATISFIED;
- return( TRUE );
- }
+/*PAGE
+ *
+ * _Semaphore_Core_mutex_mp_support
+ *
+ * Input parameters:
+ * the_thread - the remote thread the semaphore was surrendered to
+ * id - id of the surrendered semaphore
+ *
+ * Output parameters: NONE
+ */
+
+void _Semaphore_Core_mutex_mp_support (
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ the_thread->receive_packet->return_code = RTEMS_SUCCESSFUL;
+
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_OBTAIN_RESPONSE,
+ id,
+ the_thread
+ );
+}
- if ( _Attributes_Is_binary_semaphore( the_semaphore->attribute_set ) ) {
- if ( _Objects_Are_ids_equal(
- _Thread_Executing->Object.id, the_semaphore->holder_id ) ) {
- the_semaphore->nest_count++;
- _ISR_Enable( level );
- return( TRUE );
- }
- }
- the_semaphore->Wait_queue.sync = TRUE;
- executing->Wait.queue = &the_semaphore->Wait_queue;
- executing->Wait.id = the_semaphore->Object.id;
- executing->Wait.option_set = option_set;
- _ISR_Enable( level );
- return( FALSE );
+/*PAGE
+ *
+ * _Semaphore_Core_semaphore_mp_support
+ *
+ * Input parameters:
+ * the_thread - the remote thread the semaphore was surrendered to
+ * id - id of the surrendered semaphore
+ *
+ * Output parameters: NONE
+ */
+
+void _Semaphore_Core_semaphore_mp_support (
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ the_thread->receive_packet->return_code = RTEMS_SUCCESSFUL;
+
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_OBTAIN_RESPONSE,
+ id,
+ the_thread
+ );
}
diff --git a/cpukit/rtems/src/semmp.c b/cpukit/rtems/src/semmp.c
index 03ca51a228..c0a43f3f53 100644
--- a/cpukit/rtems/src/semmp.c
+++ b/cpukit/rtems/src/semmp.c
@@ -14,13 +14,15 @@
*/
#include <rtems/system.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/sem.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/status.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -45,7 +47,7 @@ void _Semaphore_MP_Send_process_packet (
case SEMAPHORE_MP_EXTRACT_PROXY:
the_packet = _Semaphore_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_SEMAPHORE;
+ the_packet->Prefix.the_class = MP_PACKET_SEMAPHORE;
the_packet->Prefix.length = sizeof ( Semaphore_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Semaphore_MP_Packet );
the_packet->operation = operation;
@@ -78,8 +80,8 @@ void _Semaphore_MP_Send_process_packet (
rtems_status_code _Semaphore_MP_Send_request_packet (
Semaphore_MP_Remote_operations operation,
Objects_Id semaphore_id,
- rtems_option option_set,
- rtems_interval timeout
+ rtems_option option_set,
+ rtems_interval timeout
)
{
Semaphore_MP_Packet *the_packet;
@@ -90,7 +92,7 @@ rtems_status_code _Semaphore_MP_Send_request_packet (
case SEMAPHORE_MP_RELEASE_REQUEST:
the_packet = _Semaphore_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_SEMAPHORE;
+ the_packet->Prefix.the_class = MP_PACKET_SEMAPHORE;
the_packet->Prefix.length = sizeof ( Semaphore_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Semaphore_MP_Packet );
if ( ! _Options_Is_no_wait(option_set))
@@ -222,7 +224,7 @@ void _Semaphore_MP_Process_packet (
the_packet->Prefix.timeout
);
- if ( ! _Status_Is_proxy_blocking( the_packet->Prefix.return_code ) )
+ if ( ! _Thread_Is_proxy_blocking( the_packet->Prefix.return_code ) )
_Semaphore_MP_Send_response_packet(
SEMAPHORE_MP_OBTAIN_RESPONSE,
the_packet->Prefix.id,
diff --git a/cpukit/rtems/src/signal.c b/cpukit/rtems/src/signal.c
index 8a300d2969..f43107fe12 100644
--- a/cpukit/rtems/src/signal.c
+++ b/cpukit/rtems/src/signal.c
@@ -14,14 +14,39 @@
*/
#include <rtems/system.h>
-#include <rtems/asr.h>
-#include <rtems/isr.h>
-#include <rtems/modes.h>
-#include <rtems/signal.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/core/isr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/core/thread.h>
+#include <rtems/rtems/tasks.h>
/*PAGE
*
+ * _Signal_Manager_initialization
+ *
+ * This routine initializes all signal manager related data structures.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Signal_Manager_initialization( void )
+{
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_SIGNAL,
+ _Signal_MP_Process_packet
+ );
+}
+
+/*PAGE
+ *
* rtems_signal_catch
*
* This directive allows a thread to specify what action to take when
@@ -41,21 +66,26 @@ rtems_status_code rtems_signal_catch(
rtems_mode mode_set
)
{
- Thread_Control *executing;
+ Thread_Control *executing;
+ RTEMS_API_Control *api;
+ ASR_Information *asr;
/* XXX normalize mode */
executing = _Thread_Executing;
+ api = executing->API_Extensions[ THREAD_API_RTEMS ];
+ asr = &api->Signal;
+
_Thread_Disable_dispatch(); /* cannot reschedule while */
/* the thread is inconsistent */
if ( !_ASR_Is_null_handler( asr_handler ) ) {
- executing->RTEMS_API->Signal.mode_set = mode_set;
- executing->RTEMS_API->Signal.handler = asr_handler;
+ asr->mode_set = mode_set;
+ asr->handler = asr_handler;
}
else
- _ASR_Initialize( &executing->RTEMS_API->Signal );
+ _ASR_Initialize( asr );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -80,11 +110,13 @@ rtems_status_code rtems_signal_send(
{
register Thread_Control *the_thread;
Objects_Locations location;
+ RTEMS_API_Control *api;
+ ASR_Information *asr;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
return _Signal_MP_Send_request_packet(
SIGNAL_MP_SEND_REQUEST,
@@ -92,22 +124,23 @@ rtems_status_code rtems_signal_send(
signal_set
);
case OBJECTS_LOCAL:
- if ( ! _ASR_Is_null_handler( the_thread->RTEMS_API->Signal.handler ) ) {
- if ( _Modes_Is_asr_disabled( the_thread->current_modes ) )
- _ASR_Post_signals(
- signal_set, &the_thread->RTEMS_API->Signal.signals_pending );
- else {
- _ASR_Post_signals(
- signal_set, &the_thread->RTEMS_API->Signal.signals_posted );
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ asr = &api->Signal;
+
+ if ( ! _ASR_Is_null_handler( asr->handler ) ) {
+ if ( asr->is_enabled ) {
+ _ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_ISR_Signals_to_thread_executing = TRUE;
+ } else {
+ _ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_NOT_DEFINED );
+ return RTEMS_NOT_DEFINED;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
diff --git a/cpukit/rtems/src/signalmp.c b/cpukit/rtems/src/signalmp.c
index 4ac8123766..3a38818c25 100644
--- a/cpukit/rtems/src/signalmp.c
+++ b/cpukit/rtems/src/signalmp.c
@@ -14,14 +14,16 @@
*/
#include <rtems/system.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/signal.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/status.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -51,7 +53,7 @@ rtems_status_code _Signal_MP_Send_request_packet (
case SIGNAL_MP_SEND_REQUEST:
the_packet = _Signal_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_SIGNAL;
+ the_packet->Prefix.the_class = MP_PACKET_SIGNAL;
the_packet->Prefix.length = sizeof ( Signal_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( Signal_MP_Packet );
the_packet->operation = operation;
diff --git a/cpukit/rtems/src/taskmp.c b/cpukit/rtems/src/taskmp.c
index 2b7fb214c6..98b0e9d3e5 100644
--- a/cpukit/rtems/src/taskmp.c
+++ b/cpukit/rtems/src/taskmp.c
@@ -14,13 +14,15 @@
*/
#include <rtems/system.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/tasks.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/rtems/status.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -42,7 +44,7 @@ void _RTEMS_tasks_MP_Send_process_packet (
case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
the_packet = _RTEMS_tasks_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_TASKS;
+ the_packet->Prefix.the_class = MP_PACKET_TASKS;
the_packet->Prefix.length = sizeof ( RTEMS_tasks_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( RTEMS_tasks_MP_Packet );
the_packet->operation = operation;
@@ -91,7 +93,7 @@ rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
the_packet = _RTEMS_tasks_MP_Get_packet();
- the_packet->Prefix.the_class = RTEMS_MP_PACKET_TASKS;
+ the_packet->Prefix.the_class = MP_PACKET_TASKS;
the_packet->Prefix.length = sizeof ( RTEMS_tasks_MP_Packet );
the_packet->Prefix.to_convert = sizeof ( RTEMS_tasks_MP_Packet );
the_packet->operation = operation;
@@ -332,7 +334,7 @@ void _RTEMS_tasks_MP_Process_packet (
RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void )
{
- return ( (RTEMS_tasks_MP_Packet *) _MPCI_Get_packet() );
+ return (RTEMS_tasks_MP_Packet *) _MPCI_Get_packet();
}
/* end of file */
diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c
index 62bc8c1995..70ec7d6928 100644
--- a/cpukit/rtems/src/tasks.c
+++ b/cpukit/rtems/src/tasks.c
@@ -14,17 +14,148 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/modes.h>
-#include <rtems/object.h>
-#include <rtems/stack.h>
-#include <rtems/states.h>
-#include <rtems/tasks.h>
-#include <rtems/thread.h>
-#include <rtems/threadq.h>
-#include <rtems/tod.h>
-#include <rtems/userext.h>
-#include <rtems/wkspace.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/core/object.h>
+#include <rtems/core/stack.h>
+#include <rtems/core/states.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/tod.h>
+#include <rtems/core/userext.h>
+#include <rtems/core/wkspace.h>
+#include <rtems/core/intthrd.h>
+#include <rtems/sysstate.h>
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Create_extension
+ *
+ * XXX
+ */
+
+boolean _RTEMS_tasks_Create_extension(
+ Thread_Control *executing,
+ Thread_Control *created
+)
+{
+ RTEMS_API_Control *api;
+
+ api = _Workspace_Allocate( sizeof( RTEMS_API_Control ) );
+
+ if ( !api )
+ return FALSE;
+
+ created->API_Extensions[ THREAD_API_RTEMS ] = api;
+
+ api->pending_events = EVENT_SETS_NONE_PENDING;
+ _ASR_Initialize( &api->Signal );
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Start_extension
+ *
+ * XXX
+ */
+
+User_extensions_routine _RTEMS_tasks_Start_extension(
+ Thread_Control *executing,
+ Thread_Control *started
+)
+{
+ RTEMS_API_Control *api;
+
+ api = started->API_Extensions[ THREAD_API_RTEMS ];
+
+ api->pending_events = EVENT_SETS_NONE_PENDING;
+
+ _ASR_Initialize( &api->Signal );
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Delete_extension
+ *
+ * XXX
+ */
+
+User_extensions_routine _RTEMS_tasks_Delete_extension(
+ Thread_Control *executing,
+ Thread_Control *deleted
+)
+{
+ (void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
+
+ deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Switch_extension
+ *
+ * XXX
+ */
+
+User_extensions_routine _RTEMS_tasks_Switch_extension(
+ Thread_Control *executing
+)
+{
+ ISR_Level level;
+ RTEMS_API_Control *api;
+ ASR_Information *asr;
+ rtems_signal_set signal_set;
+ Modes_Control prev_mode;
+
+ api = executing->API_Extensions[ THREAD_API_RTEMS ];
+ asr = &api->Signal;
+
+ _ISR_Disable( level );
+
+ signal_set = asr->signals_posted;
+
+ if ( signal_set ) {
+ /* if ( _ASR_Are_signals_pending( asr ) ) {
+
+ signal_set = asr->signals_posted; */
+ asr->signals_posted = 0;
+ _ISR_Enable( level );
+
+ asr->nest_level += 1;
+ rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
+
+ (*asr->handler)( signal_set );
+
+ asr->nest_level -= 1;
+ rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
+ }
+ else
+ _ISR_Enable( level );
+
+}
+
+Internal_threads_Extensions_control _RTEMS_tasks_Internal_thread_extensions = {
+ { NULL, NULL },
+ NULL, /* predriver */
+ _RTEMS_tasks_Initialize_user_tasks /* postdriver */
+};
+
+User_extensions_Control _RTEMS_tasks_API_extensions = {
+ { NULL, NULL },
+ { _RTEMS_tasks_Create_extension, /* create */
+ _RTEMS_tasks_Start_extension, /* start */
+ _RTEMS_tasks_Start_extension, /* restart */
+ _RTEMS_tasks_Delete_extension, /* delete */
+ NULL, /* switch */
+ _RTEMS_tasks_Switch_extension, /* post switch */
+ NULL, /* begin */
+ NULL, /* exitted */
+ NULL /* fatal */
+ }
+};
/*PAGE
*
@@ -39,9 +170,18 @@
*/
void _RTEMS_tasks_Manager_initialization(
- unsigned32 maximum_tasks
+ unsigned32 maximum_tasks,
+ unsigned32 number_of_initialization_tasks,
+ rtems_initialization_tasks_table *user_tasks
)
{
+
+ _RTEMS_tasks_Number_of_initialization_tasks = number_of_initialization_tasks;
+ _RTEMS_tasks_User_initialization_tasks = user_tasks;
+
+ if ( user_tasks == NULL || number_of_initialization_tasks == 0 )
+ _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, RTEMS_TOO_MANY );
+
_Objects_Initialize_information(
&_RTEMS_tasks_Information,
OBJECTS_RTEMS_TASKS,
@@ -52,6 +192,24 @@ void _RTEMS_tasks_Manager_initialization(
RTEMS_MAXIMUM_NAME_LENGTH,
TRUE
);
+
+ /*
+ * Add all the extensions for this API
+ */
+
+ _User_extensions_Add_API_set( &_RTEMS_tasks_API_extensions );
+
+ _Internal_threads_Add_extension( &_RTEMS_tasks_Internal_thread_extensions );
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_TASKS,
+ _RTEMS_tasks_MP_Process_packet
+ );
+
}
/*PAGE
@@ -89,12 +247,15 @@ rtems_status_code rtems_task_create(
Objects_MP_Control *the_global_object = NULL;
boolean is_fp;
boolean is_global;
+ boolean status;
rtems_attribute the_attribute_set;
Priority_Control core_priority;
+ RTEMS_API_Control *api;
+ ASR_Information *asr;
if ( !rtems_is_name_valid( name ) )
- return ( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
/*
* Core Thread Initialize insures we get the minimum amount of
@@ -103,17 +264,17 @@ rtems_status_code rtems_task_create(
#if 0
if ( !_Stack_Is_enough( stack_size ) )
- return( RTEMS_INVALID_SIZE );
+ return RTEMS_INVALID_SIZE;
#endif
/*
* Validate the RTEMS API priority and convert it to the core priority range.
*/
- if ( !_Priority_Is_valid( initial_priority ) )
- return( RTEMS_INVALID_PRIORITY );
+ if ( !_RTEMS_tasks_Priority_is_valid( initial_priority ) )
+ return RTEMS_INVALID_PRIORITY;
- core_priority = _RTEMS_Tasks_Priority_to_Core( initial_priority );
+ core_priority = _RTEMS_tasks_Priority_to_Core( initial_priority );
/*
* Fix the attribute set to match the attributes which
@@ -137,8 +298,8 @@ rtems_status_code rtems_task_create(
is_global = TRUE;
- if ( !_Configuration_Is_multiprocessing() )
- return( RTEMS_MP_NOT_CONFIGURED );
+ if ( !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
} else
is_global = FALSE;
@@ -167,7 +328,7 @@ rtems_status_code rtems_task_create(
if ( !the_thread ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
if ( is_global ) {
@@ -176,49 +337,45 @@ rtems_status_code rtems_task_create(
if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
_RTEMS_tasks_Free( the_thread );
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
}
-#if 0
- /*
- * Allocate and initialize the RTEMS API specific information
- */
-
- the_thread->RTEMS_API = _Workspace_Allocate( sizeof( RTEMS_API_Control ) );
-
- if ( !the_thread->RTEMS_API ) {
- _RTEMS_tasks_Free( the_thread );
- if ( is_global )
- _Objects_MP_Free_global_object( the_global_object );
- _Thread_Enable_dispatch();
- return( RTEMS_UNSATISFIED );
- }
-
- the_thread->RTEMS_API->pending_events = EVENT_SETS_NONE_PENDING;
- _ASR_Initialize( &the_thread->RTEMS_API->Signal );
-#endif
-
/*
* Initialize the core thread for this task.
*/
-/* XXX normalize mode */
+ status = _Thread_Initialize(
+ &_RTEMS_tasks_Information,
+ the_thread,
+ NULL,
+ stack_size,
+ is_fp,
+ core_priority,
+ _Modes_Is_preempt(initial_modes) ? TRUE : FALSE,
+ _Modes_Is_timeslice(initial_modes) ? TRUE : FALSE,
+ _Modes_Get_interrupt_level(initial_modes),
+ &name
+ );
- if ( !_Thread_Initialize( &_RTEMS_tasks_Information, the_thread,
- NULL, stack_size, is_fp, core_priority, initial_modes, &name ) ) {
+ if ( !status ) {
if ( is_global )
_Objects_MP_Free_global_object( the_global_object );
_RTEMS_tasks_Free( the_thread );
_Thread_Enable_dispatch();
- return( RTEMS_UNSATISFIED );
+ return RTEMS_UNSATISFIED;
}
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ asr = &api->Signal;
+
+ asr->is_enabled = _Modes_Is_asr_disabled(initial_modes) ? FALSE : TRUE;
+
*id = the_thread->Object.id;
if ( is_global ) {
- the_thread->RTEMS_API->is_global = TRUE;
+ the_thread->is_global = TRUE;
_Objects_MP_Open(
&_RTEMS_tasks_Information,
@@ -236,7 +393,7 @@ rtems_status_code rtems_task_create(
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -263,11 +420,16 @@ rtems_status_code rtems_task_ident(
Objects_Id *id
)
{
- if ( name != OBJECTS_ID_OF_SELF )
- return( _Objects_Name_to_id( &_RTEMS_tasks_Information, &name, node, id ) );
+ Objects_Name_to_id_errors status;
+
+ if ( name == OBJECTS_ID_OF_SELF ) {
+ *id = _Thread_Executing->Object.id;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ status = _Objects_Name_to_id( &_RTEMS_tasks_Information, &name, node, id );
- *id = _Thread_Executing->Object.id;
- return( RTEMS_SUCCESSFUL );
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -298,26 +460,26 @@ rtems_status_code rtems_task_start(
Objects_Locations location;
if ( entry_point == NULL )
- return( RTEMS_INVALID_ADDRESS );
+ return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Dispatch();
- return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_INCORRECT_STATE );
+ return RTEMS_INCORRECT_STATE;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -349,25 +511,20 @@ rtems_status_code rtems_task_restart(
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Dispatch();
- return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
case OBJECTS_LOCAL:
if ( _Thread_Restart( the_thread, NULL, argument ) ) {
-
- /* XXX until these are in an API extension they are too late. */
- _ASR_Initialize( &the_thread->RTEMS_API->Signal );
- the_thread->RTEMS_API->pending_events = EVENT_SETS_NONE_PENDING;
-
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_INCORRECT_STATE );
+ return RTEMS_INCORRECT_STATE;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -398,19 +555,16 @@ rtems_status_code rtems_task_delete(
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Dispatch();
- return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
case OBJECTS_LOCAL:
_Thread_Close( &_RTEMS_tasks_Information, the_thread );
- /* XXX */
- (void) _Workspace_Free( the_thread->RTEMS_API );
-
_RTEMS_tasks_Free( the_thread );
- if ( _Attributes_Is_global( the_thread->RTEMS_API->is_global ) ) {
+ if ( the_thread->is_global ) {
_Objects_MP_Close( &_RTEMS_tasks_Information, the_thread->Object.id );
@@ -422,10 +576,10 @@ rtems_status_code rtems_task_delete(
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -454,28 +608,26 @@ rtems_status_code rtems_task_suspend(
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
- return(
- _RTEMS_tasks_MP_Send_request_packet(
- RTEMS_TASKS_MP_SUSPEND_REQUEST,
- id,
- 0, /* Not used */
- 0, /* Not used */
- 0 /* Not used */
- )
+ return _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_SUSPEND_REQUEST,
+ id,
+ 0, /* Not used */
+ 0, /* Not used */
+ 0 /* Not used */
);
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
_Thread_Set_state( the_thread, STATES_SUSPENDED );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_ALREADY_SUSPENDED );
+ return RTEMS_ALREADY_SUSPENDED;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -503,7 +655,7 @@ rtems_status_code rtems_task_resume(
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
return(
_RTEMS_tasks_MP_Send_request_packet(
@@ -518,13 +670,13 @@ rtems_status_code rtems_task_resume(
if ( _States_Is_suspended( the_thread->current_state ) ) {
_Thread_Resume( the_thread );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
- return( RTEMS_INCORRECT_STATE );
+ return RTEMS_INCORRECT_STATE;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -556,13 +708,13 @@ rtems_status_code rtems_task_set_priority(
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
- !_Priority_Is_valid( new_priority ) )
- return( RTEMS_INVALID_PRIORITY );
+ !_RTEMS_tasks_Priority_is_valid( new_priority ) )
+ return RTEMS_INVALID_PRIORITY;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Executing->Wait.return_argument = old_priority;
return(
@@ -583,10 +735,10 @@ rtems_status_code rtems_task_set_priority(
_Thread_Change_priority( the_thread, new_priority );
}
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -603,7 +755,7 @@ rtems_status_code rtems_task_set_priority(
*
* Output:
* *previous_mode_set - previous mode set
- * always returns RTEMS_SUCCESSFUL
+ * always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
@@ -612,9 +764,62 @@ rtems_status_code rtems_task_mode(
rtems_mode *previous_mode_set
)
{
- if ( _Thread_Change_mode( mode_set, mask, previous_mode_set ) )
+ Thread_Control *executing;
+ RTEMS_API_Control *api;
+ ASR_Information *asr;
+ boolean is_asr_enabled = FALSE;
+ boolean needs_asr_dispatching = FALSE;
+ rtems_mode old_mode;
+
+ executing = _Thread_Executing;
+ api = executing->API_Extensions[ THREAD_API_RTEMS ];
+ asr = &api->Signal;
+
+ old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
+ old_mode |= (executing->is_timeslice) ? RTEMS_TIMESLICE : RTEMS_NO_TIMESLICE;
+ old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
+ old_mode |= _ISR_Get_level();
+
+ *previous_mode_set = old_mode;
+
+ /*
+ * These are generic thread scheduling characteristics.
+ */
+
+ if ( mask & RTEMS_PREEMPT_MASK )
+ executing->is_preemptible = _Modes_Is_preempt(mode_set) ? TRUE : FALSE;
+
+ if ( mask & RTEMS_TIMESLICE_MASK )
+ executing->is_timeslice = _Modes_Is_timeslice(mode_set) ? TRUE : FALSE;
+
+ /*
+ * Set the new interrupt level
+ */
+
+ if ( mask & RTEMS_INTERRUPT_MASK )
+ _Modes_Set_interrupt_level( mode_set );
+
+ /*
+ * This is specific to the RTEMS API
+ */
+
+ is_asr_enabled = FALSE;
+ needs_asr_dispatching = FALSE;
+
+ if ( mask & RTEMS_ASR_MASK ) {
+ is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? FALSE : TRUE;
+ if ( is_asr_enabled != asr->is_enabled ) {
+ asr->is_enabled = is_asr_enabled;
+ _ASR_Swap_signals( asr );
+ if ( _ASR_Are_signals_pending( asr ) )
+ needs_asr_dispatching = TRUE;
+ }
+ }
+
+ if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
_Thread_Dispatch();
- return( RTEMS_SUCCESSFUL );
+
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -643,6 +848,7 @@ rtems_status_code rtems_task_get_note(
{
register Thread_Control *the_thread;
Objects_Locations location;
+ RTEMS_API_Control *api;
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
@@ -650,7 +856,7 @@ rtems_status_code rtems_task_get_note(
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
- return( RTEMS_INVALID_NUMBER );
+ return RTEMS_INVALID_NUMBER;
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
@@ -658,14 +864,15 @@ rtems_status_code rtems_task_get_note(
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
- *note = _Thread_Executing->RTEMS_API->Notepads[ notepad ];
- return( RTEMS_SUCCESSFUL );
+ api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
+ *note = api->Notepads[ notepad ];
+ return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
_Thread_Executing->Wait.return_argument = note;
@@ -677,12 +884,13 @@ rtems_status_code rtems_task_get_note(
0 /* Not used */
);
case OBJECTS_LOCAL:
- *note= the_thread->RTEMS_API->Notepads[ notepad ];
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ *note = api->Notepads[ notepad ];
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -710,6 +918,7 @@ rtems_status_code rtems_task_set_note(
{
register Thread_Control *the_thread;
Objects_Locations location;
+ RTEMS_API_Control *api;
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
@@ -717,7 +926,7 @@ rtems_status_code rtems_task_set_note(
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
- return( RTEMS_INVALID_NUMBER );
+ return RTEMS_INVALID_NUMBER;
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
@@ -725,14 +934,15 @@ rtems_status_code rtems_task_set_note(
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
- _Thread_Executing->RTEMS_API->Notepads[ notepad ] = note;
- return( RTEMS_SUCCESSFUL );
+ api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
+ api->Notepads[ notepad ] = note;
+ return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_REMOTE:
return _RTEMS_tasks_MP_Send_request_packet(
RTEMS_TASKS_MP_SET_NOTE_REQUEST,
@@ -743,12 +953,13 @@ rtems_status_code rtems_task_set_note(
);
case OBJECTS_LOCAL:
- the_thread->RTEMS_API->Notepads[ notepad ] = note;
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ api->Notepads[ notepad ] = note;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
@@ -785,7 +996,7 @@ rtems_status_code rtems_task_wake_after(
ticks, WATCHDOG_ACTIVATE_NOW );
_Thread_Enable_dispatch();
}
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -807,23 +1018,20 @@ rtems_status_code rtems_task_wake_when(
rtems_time_of_day *time_buffer
)
{
- rtems_interval seconds;
- rtems_status_code local_result;
+ Watchdog_Interval seconds;
if ( !_TOD_Is_set() )
- return( RTEMS_NOT_DEFINED );
+ return RTEMS_NOT_DEFINED;
time_buffer->ticks = 0;
- local_result = _TOD_Validate( time_buffer );
-
- if ( !rtems_is_status_successful( local_result ) )
- return( local_result );
+ if ( !_TOD_Validate( time_buffer ) )
+ return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
if ( seconds <= _TOD_Seconds_since_epoch )
- return( RTEMS_INVALID_CLOCK );
+ return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
@@ -836,5 +1044,57 @@ rtems_time_of_day *time_buffer
_Watchdog_Insert_seconds( &_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch, WATCHDOG_ACTIVATE_NOW );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Initialize_user_tasks
+ *
+ * This routine creates and starts all configured user
+ * initialzation threads.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _RTEMS_tasks_Initialize_user_tasks( void )
+{
+ unsigned32 index;
+ unsigned32 maximum;
+ rtems_id id;
+ rtems_status_code return_value;
+ rtems_initialization_tasks_table *user_tasks;
+
+ /*
+ * NOTE: This is slightly different from the Ada implementation.
+ */
+
+ user_tasks = _RTEMS_tasks_User_initialization_tasks;
+ maximum = _RTEMS_tasks_Number_of_initialization_tasks;
+
+ for ( index=0 ; index < maximum ; index++ ) {
+ return_value = rtems_task_create(
+ user_tasks[ index ].name,
+ user_tasks[ index ].initial_priority,
+ user_tasks[ index ].stack_size,
+ user_tasks[ index ].mode_set,
+ user_tasks[ index ].attribute_set,
+ &id
+ );
+
+ if ( !rtems_is_status_successful( return_value ) )
+ _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, return_value );
+
+ return_value = rtems_task_start(
+ id,
+ user_tasks[ index ].entry_point,
+ user_tasks[ index ].argument
+ );
+
+ if ( !rtems_is_status_successful( return_value ) )
+ _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, return_value );
+ }
+}
+
diff --git a/cpukit/sapi/include/rtems/config.h b/cpukit/sapi/include/rtems/config.h
index 766ea4a4a8..31e8093387 100644
--- a/cpukit/sapi/include/rtems/config.h
+++ b/cpukit/sapi/include/rtems/config.h
@@ -21,164 +21,12 @@
extern "C" {
#endif
-#include <rtems/types.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
-
-/*
- * The following records define the Initialization Tasks Table.
- * Each entry contains the information required by RTEMS to
- * create and start a user task automatically at executive
- * initialization time.
- */
-
-typedef struct {
- rtems_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;
-
-/*
- *
- * The following defines the types for:
- *
- * + major and minor numbers
- * + the return type of a device driver entry
- * + a pointer to a device driver entry
- * + an entry in the the Device Driver Address Table. Each entry in this
- * table corresponds to an application provided device driver and
- * defines the entry points for that device driver.
- */
-
-typedef unsigned32 rtems_device_major_number;
-typedef unsigned32 rtems_device_minor_number;
-
-typedef rtems_status_code rtems_device_driver;
-
-typedef rtems_device_driver ( *rtems_device_driver_entry )(
- rtems_device_major_number,
- rtems_device_minor_number,
- void *
- );
-
-typedef struct {
- rtems_device_driver_entry initialization; /* initialization procedure */
- rtems_device_driver_entry open; /* open request procedure */
- rtems_device_driver_entry close; /* close request procedure */
- rtems_device_driver_entry read; /* read request procedure */
- rtems_device_driver_entry write; /* write request procedure */
- rtems_device_driver_entry control; /* special functions procedure */
-} rtems_driver_address_table;
-
-/*
- * The following records defines the User Extension Table.
- * This table defines the application dependent routines which
- * are invoked at critical points in the life of each task and
- * the system as a whole.
- */
-
-typedef void rtems_extension;
-
-typedef rtems_extension ( *rtems_task_create_extension )(
- rtems_tcb *,
- rtems_tcb *
- );
-
-typedef rtems_extension ( *rtems_task_delete_extension )(
- rtems_tcb *,
- rtems_tcb *
- );
-
-typedef rtems_extension ( *rtems_task_start_extension )(
- rtems_tcb *,
- rtems_tcb *
- );
-
-typedef rtems_extension ( *rtems_task_restart_extension )(
- rtems_tcb *,
- rtems_tcb *
- );
-
-typedef rtems_extension ( *rtems_task_switch_extension )(
- rtems_tcb *,
- rtems_tcb *
- );
-
-typedef rtems_extension ( *rtems_task_begin_extension )(
- rtems_tcb *
- );
-
-typedef rtems_extension ( *rtems_task_exitted_extension )(
- rtems_tcb *
- );
-
-typedef rtems_extension ( *rtems_fatal_extension )(
- unsigned32
- );
-
-typedef struct {
- rtems_task_create_extension rtems_task_create;
- rtems_task_start_extension rtems_task_start;
- rtems_task_restart_extension rtems_task_restart;
- rtems_task_delete_extension rtems_task_delete;
- rtems_task_switch_extension task_switch;
- rtems_task_begin_extension task_begin;
- rtems_task_exitted_extension task_exitted;
- rtems_fatal_extension fatal;
-} rtems_extensions_table;
-
-/*
- * The following records define the Multiprocessor Communications
- * Interface (MPCI) Table. This table defines the user-provided
- * MPCI which is a required part of a multiprocessor RTEMS system.
- *
- * For non-blocking local operations that become remote operations,
- * we need a timeout. This is a per-driver timeout: default_timeout
- */
-
-/* XXX FORWARD REFERENCES */
-
-typedef struct Configuration_Table rtems_configuration_table;
-typedef struct Configuration_Table_MP rtems_multiprocessing_table;
-
-typedef void rtems_mpci_entry;
-
-typedef rtems_mpci_entry ( *rtems_mpci_initialization_entry )(
- rtems_configuration_table *,
- rtems_cpu_table *,
- rtems_multiprocessing_table *
- );
-
-typedef rtems_mpci_entry ( *rtems_mpci_get_packet_entry )(
- rtems_packet_prefix **
- );
-
-typedef rtems_mpci_entry ( *rtems_mpci_return_packet_entry )(
- rtems_packet_prefix *
- );
-
-typedef rtems_mpci_entry ( *rtems_mpci_send_entry )(
- unsigned32,
- rtems_packet_prefix *
- );
-
-typedef rtems_mpci_entry ( *rtems_mpci_receive_entry )(
- rtems_packet_prefix **
- );
-
-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;
+#include <rtems/rtems/status.h>
+#include <rtems/extension.h>
+#include <rtems/io.h>
+#include <rtems/core/mpci.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/tasks.h>
/*
* The following records define the Multiprocessor Configuration
@@ -187,13 +35,13 @@ typedef struct {
* system.
*/
-struct Configuration_Table_MP {
- unsigned32 node; /* local node number */
- 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 */
-};
+typedef struct {
+ unsigned32 node; /* local node number */
+ unsigned32 maximum_nodes; /* maximum # nodes in system */
+ unsigned32 maximum_global_objects; /* maximum # global objects */
+ unsigned32 maximum_proxies; /* maximum # proxies */
+ MPCI_Control *User_mpci_table; /* pointer to MPCI table */
+} rtems_multiprocessing_table;
/*
* The following records define the Configuration Table. The
@@ -207,7 +55,7 @@ struct Configuration_Table_MP {
* + clock ticks per task timeslice
*/
-struct Configuration_Table {
+typedef struct {
void *work_space_start;
unsigned32 work_space_size;
unsigned32 maximum_tasks;
@@ -224,92 +72,19 @@ struct Configuration_Table {
unsigned32 number_of_initialization_tasks;
rtems_initialization_tasks_table *User_initialization_tasks_table;
unsigned32 number_of_device_drivers;
+ unsigned32 maximum_devices;
rtems_driver_address_table *Device_driver_table;
rtems_extensions_table *User_extension_table;
rtems_multiprocessing_table *User_multiprocessing_table;
-};
-
-/*
- * The following defines the default Multiprocessing Configuration
- * Table. This table is used in a single processor system.
- */
-
-extern const rtems_multiprocessing_table
- _Configuration_Default_multiprocessing_table;
-
-/*
- * The following define the internal pointers to the user's
- * configuration information.
- */
-
-EXTERN rtems_configuration_table *_Configuration_Table;
-EXTERN rtems_multiprocessing_table *_Configuration_MP_table;
-EXTERN rtems_mpci_table *_Configuration_MPCI_table;
-
-/*
- *
- * _Configuration_Handler_initialization
- *
- * DESCRIPTION:
- *
- * This routine performs the initialization necessary for this handler.
- */
-
-STATIC INLINE void _Configuration_Handler_initialization(
- rtems_configuration_table *configuration_table,
- rtems_multiprocessing_table *multiprocessing_table,
- rtems_mpci_table *users_mpci_table
-);
-
-/*
- * _Configuration_Is_multiprocessing
- *
- * DESCRIPTION:
- *
- * This function determines if a multiprocessing application has been
- * configured, if so, TRUE is returned, otherwise FALSE is returned.
- */
-
-STATIC INLINE boolean _Configuration_Is_multiprocessing( void );
-
-/*
- * _Configuration_Is_null_driver_address_table_pointer
- *
- * DESCRIPTION:
- *
- * This function returns TRUE if the_table is NULL and FALSE otherwise.
- */
-
-STATIC INLINE boolean _Configuration_Is_null_driver_address_table_pointer(
- rtems_driver_address_table *the_table
-);
-
-/*
- * _Configuration_Is_null_extension_table_pointer
- *
- * DESCRIPTION:
- *
- * This function returns TRUE if the_table is NULL and FALSE otherwise.
- */
-
-STATIC INLINE boolean _Configuration_Is_null_extension_table_pointer(
- rtems_extensions_table *the_table
-);
+} rtems_configuration_table;
/*
- * _Configuration_Is_null_initialization_tasks_table_pointer
- *
- * DESCRIPTION:
- *
- * This function returns TRUE if the_table is NULL and FALSE otherwise.
+ * The following are provided strictly for the convenience of
+ * the user. They are not used in RTEMS itself.
*/
-STATIC INLINE boolean
- _Configuration_Is_null_initialization_tasks_table_pointer(
- rtems_initialization_tasks_table *the_table
-);
-
-#include <rtems/config.inl>
+EXTERN rtems_configuration_table *_Configuration_Table;
+EXTERN rtems_multiprocessing_table *_Configuration_MP_table;
#ifdef __cplusplus
}
diff --git a/cpukit/sapi/include/rtems/extension.h b/cpukit/sapi/include/rtems/extension.h
index b447cc43fe..57c8a54271 100644
--- a/cpukit/sapi/include/rtems/extension.h
+++ b/cpukit/sapi/include/rtems/extension.h
@@ -28,9 +28,28 @@
extern "C" {
#endif
-#include <rtems.h>
-#include <rtems/object.h>
-#include <rtems/userext.h>
+#include <rtems/core/object.h>
+#include <rtems/core/userext.h>
+#include <rtems/rtems/status.h> /* XXX */
+#include <rtems/rtems/types.h> /* XXX */
+
+/*
+ * Extension related types
+ */
+
+typedef User_extensions_routine rtems_extension;
+typedef User_extensions_thread_create_extension rtems_task_create_extension;
+typedef User_extensions_thread_delete_extension rtems_task_delete_extension;
+typedef User_extensions_thread_start_extension rtems_task_start_extension;
+typedef User_extensions_thread_restart_extension rtems_task_restart_extension;
+typedef User_extensions_thread_switch_extension rtems_task_switch_extension;
+typedef User_extensions_thread_post_switch_extension
+ rtems_task_post_switch_extension;
+typedef User_extensions_thread_begin_extension rtems_task_begin_extension;
+typedef User_extensions_thread_exitted_extension rtems_task_exitted_extension;
+typedef User_extensions_fatal_extension rtems_fatal_extension;
+
+typedef User_extensions_Table rtems_extensions_table;
/*
* The following defines the information control block used to manage
@@ -73,9 +92,9 @@ void _Extension_Manager_initialization(
*/
rtems_status_code rtems_extension_create(
- rtems_name name,
+ rtems_name name,
rtems_extensions_table *extension_table,
- Objects_Id *id
+ Objects_Id *id
);
/*
diff --git a/cpukit/sapi/include/rtems/init.h b/cpukit/sapi/include/rtems/init.h
index 8c6e34d2c3..e008c45ebc 100644
--- a/cpukit/sapi/include/rtems/init.h
+++ b/cpukit/sapi/include/rtems/init.h
@@ -30,9 +30,17 @@
extern "C" {
#endif
-#include <rtems/types.h>
+#include <rtems/rtems/types.h>
#include <rtems/config.h>
-#include <rtems/intr.h>
+#include <rtems/rtems/intr.h>
+
+/*
+ * The following defines the default Multiprocessing Configuration
+ * Table. This table is used in a single processor system.
+ */
+
+extern const rtems_multiprocessing_table
+ _Initialization_Default_multiprocessing_table;
/*
* rtems_initialize_executive
diff --git a/cpukit/sapi/include/rtems/io.h b/cpukit/sapi/include/rtems/io.h
index ef9fc69d03..6f3afba53e 100644
--- a/cpukit/sapi/include/rtems/io.h
+++ b/cpukit/sapi/include/rtems/io.h
@@ -32,16 +32,40 @@
extern "C" {
#endif
-#include <rtems/config.h>
+#include <rtems/rtems/status.h>
/*
- * The following declare the data required to manage the Device Driver
- * Address Table.
+ *
+ * The following defines the types for:
+ *
+ * + major and minor numbers
+ * + the return type of a device driver entry
+ * + a pointer to a device driver entry
+ * + an entry in the the Device Driver Address Table. Each entry in this
+ * table corresponds to an application provided device driver and
+ * defines the entry points for that device driver.
*/
+
+typedef unsigned32 rtems_device_major_number;
+typedef unsigned32 rtems_device_minor_number;
+
+typedef rtems_status_code rtems_device_driver;
+
+typedef rtems_device_driver ( *rtems_device_driver_entry )(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+ );
-EXTERN unsigned32 _IO_Number_of_drivers;
-EXTERN rtems_driver_address_table *_IO_Driver_address_table;
-
+typedef struct {
+ rtems_device_driver_entry initialization; /* initialization procedure */
+ rtems_device_driver_entry open; /* open request procedure */
+ rtems_device_driver_entry close; /* close request procedure */
+ rtems_device_driver_entry read; /* read request procedure */
+ rtems_device_driver_entry write; /* write request procedure */
+ rtems_device_driver_entry control; /* special functions procedure */
+} rtems_driver_address_table;
+
/*
* Table for the io device names
*/
@@ -53,12 +77,19 @@ typedef struct {
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];
+/*
+ * This is the table of device names.
+ */
+
+/*
+ * The following declare the data required to manage the Driver
+ * Address Table and Device Name Table.
+ */
+EXTERN unsigned32 _IO_Number_of_drivers;
+EXTERN rtems_driver_address_table *_IO_Driver_address_table;
+EXTERN unsigned32 _IO_Number_of_devices;
+EXTERN rtems_driver_name_t *_IO_Driver_name_table;
/*
* _IO_Manager_initialization
@@ -70,7 +101,8 @@ EXTERN rtems_driver_name_t rtems_driver_name_table[RTEMS_MAX_DRIVER_NAMES];
STATIC INLINE void _IO_Manager_initialization(
rtems_driver_address_table *driver_table,
- unsigned32 number_of_drivers
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
);
/*
diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
index f85504b18d..4c9cb2e785 100644
--- a/cpukit/sapi/src/exinit.c
+++ b/cpukit/sapi/src/exinit.c
@@ -21,39 +21,31 @@
#include <rtems/system.h>
#include <rtems/config.h>
-#include <rtems/copyrt.h>
-#include <rtems/clock.h>
-#include <rtems/tasks.h>
#include <rtems/debug.h>
-#include <rtems/dpmem.h>
-#include <rtems/event.h>
#include <rtems/extension.h>
#include <rtems/fatal.h>
-#include <rtems/heap.h>
#include <rtems/init.h>
-#include <rtems/intthrd.h>
-#include <rtems/isr.h>
-#include <rtems/intr.h>
#include <rtems/io.h>
-#include <rtems/message.h>
-#include <rtems/mp.h>
-#include <rtems/mpci.h>
-#include <rtems/part.h>
-#include <rtems/priority.h>
-#include <rtems/ratemon.h>
-#include <rtems/region.h>
-#include <rtems/sem.h>
-#include <rtems/signal.h>
#include <rtems/sysstate.h>
-#include <rtems/thread.h>
-#include <rtems/timer.h>
-#include <rtems/tod.h>
-#include <rtems/userext.h>
-#include <rtems/watchdog.h>
-#include <rtems/wkspace.h>
+#include <rtems/core/copyrt.h>
+#include <rtems/core/heap.h>
+#include <rtems/core/interr.h>
+#include <rtems/core/intthrd.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/tod.h>
+#include <rtems/core/userext.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/core/wkspace.h>
+
+#include <rtems/directives.h>
#include <rtems/sptables.h>
+#include <rtems/rtems/rtemsapi.h>
+
/*PAGE
*
* rtems_initialize_executive
@@ -103,29 +95,54 @@ rtems_interrupt_level rtems_initialize_executive_early(
_ISR_Disable( bsp_level );
- _System_state_Set( SYSTEM_STATE_BEFORE_INITIALIZATION );
+ if ( cpu_table == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_NO_CONFIGURATION_TABLE
+ );
- _CPU_Initialize( cpu_table, _Thread_Dispatch );
+ /*
+ * Initialize the system state based on whether this is an MP system.
+ */
+
+ multiprocessing_table = configuration_table->User_multiprocessing_table;
+
+ _System_state_Handler_initialization(
+ (multiprocessing_table) ? TRUE : FALSE
+ );
/*
- * Do this as early as possible to insure no debugging output
- * is even attempted to be printed.
+ * Provided just for user convenience.
*/
- _Debug_Manager_initialization();
+ _Configuration_Table = configuration_table;
+ _Configuration_MP_table = multiprocessing_table;
+
+ /*
+ * Internally we view single processor systems as a very restricted
+ * multiprocessor system.
+ */
- multiprocessing_table = configuration_table->User_multiprocessing_table;
if ( multiprocessing_table == NULL )
- multiprocessing_table =
- (void *) &_Configuration_Default_multiprocessing_table;
+ multiprocessing_table =
+ (void *)&_Initialization_Default_multiprocessing_table;
- _Configuration_Handler_initialization(
- configuration_table,
- multiprocessing_table,
- multiprocessing_table->User_mpci_table
- );
+ if ( cpu_table == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_NO_CPU_TABLE
+ );
+
+ _CPU_Initialize( cpu_table, _Thread_Dispatch );
- _Attributes_Handler_initialization();
+ /*
+ * Do this as early as possible to insure no debugging output
+ * is even attempted to be printed.
+ */
+
+ _Debug_Manager_initialization();
_Thread_Dispatch_initialization();
@@ -142,6 +159,7 @@ rtems_interrupt_level rtems_initialize_executive_early(
_Objects_Handler_initialization(
multiprocessing_table->node,
+ multiprocessing_table->maximum_nodes,
multiprocessing_table->maximum_global_objects
);
@@ -153,57 +171,33 @@ rtems_interrupt_level rtems_initialize_executive_early(
_Thread_Handler_initialization(
configuration_table->ticks_per_timeslice,
+ configuration_table->maximum_extensions,
multiprocessing_table->maximum_proxies
);
- _MPCI_Handler_initialization();
-
-/* MANAGERS */
-
- _Interrupt_Manager_initialization();
-
- _Multiprocessing_Manager_initialization();
+ _MPCI_Handler_initialization(
+ multiprocessing_table->User_mpci_table
+ );
- _RTEMS_tasks_Manager_initialization( configuration_table->maximum_tasks );
+ _Internal_threads_Initialization();
- _Timer_Manager_initialization( configuration_table->maximum_timers );
+/* MANAGERS */
_Extension_Manager_initialization( configuration_table->maximum_extensions );
_IO_Manager_initialization(
configuration_table->Device_driver_table,
- configuration_table->number_of_device_drivers
+ configuration_table->number_of_device_drivers,
+ configuration_table->maximum_devices
);
- _Event_Manager_initialization();
-
- _Message_queue_Manager_initialization(
- configuration_table->maximum_message_queues
- );
-
- _Semaphore_Manager_initialization(
- configuration_table->maximum_semaphores
- );
-
- _Partition_Manager_initialization(
- configuration_table->maximum_partitions
- );
-
- _Region_Manager_initialization( configuration_table->maximum_regions );
-
- _Dual_ported_memory_Manager_initialization(
- configuration_table->maximum_ports
- );
-
- _Rate_monotonic_Manager_initialization(
- configuration_table->maximum_periods
- );
-
- _Internal_threads_Initialization();
+ _RTEMS_API_Initialize( configuration_table );
if ( cpu_table->pretasking_hook )
(*cpu_table->pretasking_hook)();
+ _Internal_threads_Start();
+
_System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
return bsp_level;
diff --git a/cpukit/sapi/src/extension.c b/cpukit/sapi/src/extension.c
index a962ad270e..4c1ac96ebd 100644
--- a/cpukit/sapi/src/extension.c
+++ b/cpukit/sapi/src/extension.c
@@ -14,9 +14,9 @@
*/
#include <rtems/system.h>
-#include <rtems/support.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
+#include <rtems/rtems/support.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
#include <rtems/extension.h>
/*PAGE
@@ -65,15 +65,15 @@ void _Extension_Manager_initialization(
*/
rtems_status_code rtems_extension_create(
- rtems_name name,
+ rtems_name name,
rtems_extensions_table *extension_table,
- Objects_Id *id
+ Objects_Id *id
)
{
Extension_Control *the_extension;
if ( !rtems_is_name_valid( name ) )
- return ( RTEMS_INVALID_NAME );
+ return RTEMS_INVALID_NAME;
_Thread_Disable_dispatch(); /* to prevent deletion */
@@ -81,7 +81,7 @@ rtems_status_code rtems_extension_create(
if ( !the_extension ) {
_Thread_Enable_dispatch();
- return( RTEMS_TOO_MANY );
+ return RTEMS_TOO_MANY;
}
_User_extensions_Add_set( &the_extension->Extension, extension_table );
@@ -90,7 +90,7 @@ rtems_status_code rtems_extension_create(
*id = the_extension->Object.id;
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
/*PAGE
@@ -115,12 +115,16 @@ rtems_status_code rtems_extension_ident(
Objects_Id *id
)
{
- return _Objects_Name_to_id(
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
&_Extension_Information,
&name,
- RTEMS_SEARCH_LOCAL_NODE,
+ OBJECTS_SEARCH_LOCAL_NODE,
id
);
+
+ return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
@@ -148,14 +152,14 @@ rtems_status_code rtems_extension_delete(
switch ( location ) {
case OBJECTS_ERROR:
case OBJECTS_REMOTE: /* should never return this */
- return( RTEMS_INVALID_ID );
+ return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
_User_extensions_Remove_set( &the_extension->Extension );
_Objects_Close( &_Extension_Information, &the_extension->Object );
_Extension_Free( the_extension );
_Thread_Enable_dispatch();
- return( RTEMS_SUCCESSFUL );
+ return RTEMS_SUCCESSFUL;
}
- return( RTEMS_INTERNAL_ERROR ); /* unreached - only to remove warnings */
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
diff --git a/cpukit/sapi/src/fatal.c b/cpukit/sapi/src/fatal.c
index 2ecc73ff3f..321eec1c00 100644
--- a/cpukit/sapi/src/fatal.c
+++ b/cpukit/sapi/src/fatal.c
@@ -13,42 +13,26 @@
*/
#include <rtems/system.h>
-#include <rtems/config.h>
#include <rtems/fatal.h>
-#include <rtems/sysstate.h>
-#include <rtems/userext.h>
+#include <rtems/core/interr.h>
/*PAGE
*
* rtems_fatal_error_occurred
*
- * This directive will invoke the fatal error handler supplied by the user
- * followed by the the default one provided by the executive. The default
- * error handler assumes no hardware is present to help inform the user
- * of the problem. Halt stores the error code in a known register,
- * disables interrupts, and halts the CPU. If the CPU does not have a
- * halt instruction, it will loop to itself.
+ * This directive will invoke the internal fatal error handler.
*
* Input parameters:
* the_error - fatal error status code
*
- * Output parameters:
- * the_error - on stack
- * status register - on stack
- *
- * NOTE: The the_error is not necessarily a directive status code.
+ * Output parameters: NONE
*/
void volatile rtems_fatal_error_occurred(
unsigned32 the_error
)
{
-
- _User_extensions_Fatal( the_error );
-
- _System_state_Set( SYSTEM_STATE_FAILED );
-
- _CPU_Fatal_halt( the_error );
+ _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, FALSE, the_error );
/* will not return from this routine */
}
diff --git a/cpukit/sapi/src/io.c b/cpukit/sapi/src/io.c
index 4ab45b33f5..cca390ea71 100644
--- a/cpukit/sapi/src/io.c
+++ b/cpukit/sapi/src/io.c
@@ -14,11 +14,9 @@
*/
#include <rtems/system.h>
-#include <rtems/config.h>
#include <rtems/io.h>
-#include <rtems/isr.h>
-#include <rtems/thread.h>
-#include <rtems/intr.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/thread.h>
#include <string.h>
@@ -38,7 +36,7 @@ void _IO_Initialize_all_drivers( void )
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
- (void) rtems_io_initialize( major, 0, _Configuration_Table);
+ (void) rtems_io_initialize( major, 0, NULL);
}
/*PAGE
@@ -60,22 +58,26 @@ rtems_status_code rtems_io_register_name(
{
rtems_driver_name_t *np;
unsigned32 level;
+ unsigned32 index;
/* find an empty slot */
- for (np = rtems_driver_name_table; np < &rtems_driver_name_table[RTEMS_MAX_DRIVER_NAMES]; np++)
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
{
- rtems_interrupt_disable(level);
+
+ _ISR_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);
+ _ISR_Enable(level);
return RTEMS_SUCCESSFUL;
}
- rtems_interrupt_enable(level);
+ _ISR_Enable(level);
}
return RTEMS_TOO_MANY;
@@ -93,13 +95,16 @@ rtems_status_code rtems_io_register_name(
*/
rtems_status_code rtems_io_lookup_name(
- const char *pathname,
+ const char *pathname,
rtems_driver_name_t **rnp
- )
+)
{
rtems_driver_name_t *np;
+ unsigned32 index;
- for (np = rtems_driver_name_table; np < &rtems_driver_name_table[RTEMS_MAX_DRIVER_NAMES]; np++)
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
if (np->device_name)
if (strncmp(np->device_name, pathname, np->device_name_length) == 0)
{
diff --git a/cpukit/sapi/src/rtemsapi.c b/cpukit/sapi/src/rtemsapi.c
new file mode 100644
index 0000000000..b6ecb6c37c
--- /dev/null
+++ b/cpukit/sapi/src/rtemsapi.c
@@ -0,0 +1,89 @@
+/*
+ * RTEMS API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/rtemsapi.h>
+
+#define INIT
+
+#include <rtems/rtems/intr.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/dpmem.h>
+#include <rtems/rtems/event.h>
+#include <rtems/rtems/message.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/rtems/part.h>
+#include <rtems/rtems/ratemon.h>
+#include <rtems/rtems/region.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/rtems/timer.h>
+
+/*PAGE
+ *
+ * _RTEMS_API_Initialize
+ *
+ * XXX
+ */
+
+void _RTEMS_API_Initialize(
+ rtems_configuration_table *configuration_table
+)
+{
+ _Attributes_Handler_initialization();
+
+ _Interrupt_Manager_initialization();
+
+ _Multiprocessing_Manager_initialization();
+
+ _RTEMS_tasks_Manager_initialization(
+ configuration_table->maximum_tasks,
+ configuration_table->number_of_initialization_tasks,
+ configuration_table->User_initialization_tasks_table
+ );
+
+ _Timer_Manager_initialization( configuration_table->maximum_timers );
+
+ _Signal_Manager_initialization();
+
+ _Event_Manager_initialization();
+
+ _Message_queue_Manager_initialization(
+ configuration_table->maximum_message_queues
+ );
+
+ _Semaphore_Manager_initialization(
+ configuration_table->maximum_semaphores
+ );
+
+ _Partition_Manager_initialization(
+ configuration_table->maximum_partitions
+ );
+
+ _Region_Manager_initialization( configuration_table->maximum_regions );
+
+ _Dual_ported_memory_Manager_initialization(
+ configuration_table->maximum_ports
+ );
+
+ _Rate_monotonic_Manager_initialization(
+ configuration_table->maximum_periods
+ );
+}
+
+/* end of file */
diff --git a/cpukit/score/cpu/hppa1.1/cpu.c b/cpukit/score/cpu/hppa1.1/cpu.c
index 437996a78d..6cb6347151 100644
--- a/cpukit/score/cpu/hppa1.1/cpu.c
+++ b/cpukit/score/cpu/hppa1.1/cpu.c
@@ -19,11 +19,10 @@
#include <rtems/system.h>
#include <rtems/fatal.h>
-#include <rtems/isr.h>
-#include <rtems/intr.h>
-#include <rtems/wkspace.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/wkspace.h>
-rtems_status_code hppa_external_interrupt_initialize(void);
+void hppa_external_interrupt_initialize(void);
void hppa_external_interrupt_enable(unsigned32);
void hppa_external_interrupt_disable(unsigned32);
void hppa_external_interrupt(unsigned32, CPU_Interrupt_frame *);
@@ -73,9 +72,6 @@ void _CPU_Initialize(
extern void IVA_Table(void);
- if ( cpu_table == NULL )
- rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED );
-
/*
* XXX; need to setup fpsr smarter perhaps
*/
@@ -194,7 +190,7 @@ void _CPU_ISR_install_vector(
* called by bsp_start()
*/
-rtems_status_code
+void
hppa_external_interrupt_initialize(void)
{
rtems_isr_entry ignore;
@@ -207,8 +203,6 @@ hppa_external_interrupt_initialize(void)
/* install the external interrupt handler */
rtems_interrupt_catch((rtems_isr_entry) hppa_external_interrupt,
HPPA_INTERRUPT_EXTERNAL_INTERRUPT, &ignore) ;
-
- return RTEMS_SUCCESSFUL;
}
/*
diff --git a/cpukit/score/cpu/i386/asm.h b/cpukit/score/cpu/i386/asm.h
index adf92f935a..aac1ba9dbe 100644
--- a/cpukit/score/cpu/i386/asm.h
+++ b/cpukit/score/cpu/i386/asm.h
@@ -31,7 +31,7 @@
*/
#define ASM
-#include <rtems/i386.h>
+#include <rtems/core/i386.h>
/*
* Recent versions of GNU cpp define variables which indicate the
diff --git a/cpukit/score/cpu/i386/cpu.c b/cpukit/score/cpu/i386/cpu.c
index d1ceaba88a..446515d6f9 100644
--- a/cpukit/score/cpu/i386/cpu.c
+++ b/cpukit/score/cpu/i386/cpu.c
@@ -15,8 +15,8 @@
#include <rtems/system.h>
#include <rtems/fatal.h>
-#include <rtems/isr.h>
-#include <rtems/wkspace.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/wkspace.h>
/* _CPU_Initialize
*
@@ -36,9 +36,6 @@ void _CPU_Initialize(
register unsigned16 fp_status asm ("ax");
register unsigned8 *fp_context;
- if ( cpu_table == NULL )
- rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED );
-
_CPU_Table = *cpu_table;
/*
@@ -69,6 +66,20 @@ void _CPU_Initialize(
/*PAGE
*
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 level;
+
+ i386_get_interrupt_level( level );
+
+ return level;
+}
+
+/*PAGE
+ *
* _CPU_ISR_install_raw_handler
*/
diff --git a/cpukit/score/cpu/i386/rtems/asm.h b/cpukit/score/cpu/i386/rtems/asm.h
index adf92f935a..aac1ba9dbe 100644
--- a/cpukit/score/cpu/i386/rtems/asm.h
+++ b/cpukit/score/cpu/i386/rtems/asm.h
@@ -31,7 +31,7 @@
*/
#define ASM
-#include <rtems/i386.h>
+#include <rtems/core/i386.h>
/*
* Recent versions of GNU cpp define variables which indicate the
diff --git a/cpukit/score/cpu/i960/asm.h b/cpukit/score/cpu/i960/asm.h
index e8fc986402..73a8b3a641 100644
--- a/cpukit/score/cpu/i960/asm.h
+++ b/cpukit/score/cpu/i960/asm.h
@@ -31,7 +31,7 @@
*/
#define ASM
-#include <rtems/i960.h>
+#include <rtems/core/i960.h>
/*
* Recent versions of GNU cpp define variables which indicate the
diff --git a/cpukit/score/cpu/i960/cpu.c b/cpukit/score/cpu/i960/cpu.c
index d5acebd225..ec4613c4cf 100644
--- a/cpukit/score/cpu/i960/cpu.c
+++ b/cpukit/score/cpu/i960/cpu.c
@@ -21,7 +21,7 @@
#include <rtems/system.h>
#include <rtems/fatal.h>
-#include <rtems/isr.h>
+#include <rtems/core/isr.h>
/* _CPU_Initialize
*
@@ -40,15 +40,26 @@ void _CPU_Initialize(
)
{
- if ( cpu_table == NULL )
- rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED );
-
_CPU_Table = *cpu_table;
}
/*PAGE
*
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 level;
+
+ i960_get_interrupt_level( level );
+
+ return level;
+}
+
+/*PAGE
+ *
* _CPU_ISR_install_raw_handler
*/
diff --git a/cpukit/score/cpu/m68k/asm.h b/cpukit/score/cpu/m68k/asm.h
index 58bb04bdf9..7a25b6c298 100644
--- a/cpukit/score/cpu/m68k/asm.h
+++ b/cpukit/score/cpu/m68k/asm.h
@@ -31,7 +31,7 @@
*/
#define ASM
-#include <rtems/m68k.h>
+#include <rtems/core/m68k.h>
/*
* Recent versions of GNU cpp define variables which indicate the
diff --git a/cpukit/score/cpu/m68k/cpu.c b/cpukit/score/cpu/m68k/cpu.c
index a97698372a..fdba64bffe 100644
--- a/cpukit/score/cpu/m68k/cpu.c
+++ b/cpukit/score/cpu/m68k/cpu.c
@@ -14,7 +14,7 @@
#include <rtems/system.h>
#include <rtems/fatal.h>
-#include <rtems/isr.h>
+#include <rtems/core/isr.h>
/* _CPU_Initialize
*
@@ -33,15 +33,26 @@ void _CPU_Initialize(
)
{
- if ( cpu_table == NULL )
- rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED );
-
_CPU_Table = *cpu_table;
}
/*PAGE
*
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 level;
+
+ m68k_get_interrupt_level( level );
+
+ return level;
+}
+
+/*PAGE
+ *
* _CPU_ISR_install_raw_handler
*/
diff --git a/cpukit/score/cpu/m68k/rtems/asm.h b/cpukit/score/cpu/m68k/rtems/asm.h
index 58bb04bdf9..7a25b6c298 100644
--- a/cpukit/score/cpu/m68k/rtems/asm.h
+++ b/cpukit/score/cpu/m68k/rtems/asm.h
@@ -31,7 +31,7 @@
*/
#define ASM
-#include <rtems/m68k.h>
+#include <rtems/core/m68k.h>
/*
* Recent versions of GNU cpp define variables which indicate the
diff --git a/cpukit/score/cpu/no_cpu/asm.h b/cpukit/score/cpu/no_cpu/asm.h
index 97464d5b3a..ca0ff95e35 100644
--- a/cpukit/score/cpu/no_cpu/asm.h
+++ b/cpukit/score/cpu/no_cpu/asm.h
@@ -31,7 +31,7 @@
*/
#define ASM
-#include <rtems/no_cpu.h>
+#include <rtems/core/no_cpu.h>
/*
* Recent versions of GNU cpp define variables which indicate the
diff --git a/cpukit/score/cpu/no_cpu/cpu.c b/cpukit/score/cpu/no_cpu/cpu.c
index f95c435eae..c7e7cbe693 100644
--- a/cpukit/score/cpu/no_cpu/cpu.c
+++ b/cpukit/score/cpu/no_cpu/cpu.c
@@ -15,8 +15,8 @@
#include <rtems/system.h>
#include <rtems/fatal.h>
-#include <rtems/isr.h>
-#include <rtems/wkspace.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/wkspace.h>
/* _CPU_Initialize
*
@@ -33,9 +33,6 @@ void _CPU_Initialize(
void (*thread_dispatch) /* ignored on this CPU */
)
{
- if ( cpu_table == NULL )
- rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED );
-
/*
* The thread_dispatch argument is the address of the entry point
* for the routine called at the end of an ISR once it has been
@@ -63,6 +60,18 @@ void _CPU_Initialize(
/*PAGE
*
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+
+/*PAGE
+ *
* _CPU_ISR_install_raw_handler
*/
diff --git a/cpukit/score/cpu/no_cpu/cpu_asm.c b/cpukit/score/cpu/no_cpu/cpu_asm.c
index c0cf3b5127..0d7622d15f 100644
--- a/cpukit/score/cpu/no_cpu/cpu_asm.c
+++ b/cpukit/score/cpu/no_cpu/cpu_asm.c
@@ -24,7 +24,7 @@
*/
#include <rtems/system.h>
-#include <rtems/cpu.h>
+#include <rtems/core/cpu.h>
/* #include "cpu_asm.h> */
/*
diff --git a/cpukit/score/cpu/no_cpu/rtems/asm.h b/cpukit/score/cpu/no_cpu/rtems/asm.h
index 97464d5b3a..ca0ff95e35 100644
--- a/cpukit/score/cpu/no_cpu/rtems/asm.h
+++ b/cpukit/score/cpu/no_cpu/rtems/asm.h
@@ -31,7 +31,7 @@
*/
#define ASM
-#include <rtems/no_cpu.h>
+#include <rtems/core/no_cpu.h>
/*
* Recent versions of GNU cpp define variables which indicate the
diff --git a/cpukit/score/cpu/unix/cpu.c b/cpukit/score/cpu/unix/cpu.c
index 736b7c4c7f..339bb2a3ce 100644
--- a/cpukit/score/cpu/unix/cpu.c
+++ b/cpukit/score/cpu/unix/cpu.c
@@ -17,7 +17,7 @@
*/
#include <rtems/system.h>
-#include <rtems/isr.h>
+#include <rtems/core/isr.h>
#include <stdio.h>
#include <stdlib.h>
@@ -186,6 +186,28 @@ void _CPU_Context_From_CPU_Init()
}
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ sigset_t sigset;
+
+ sigprocmask( 0, 0, &sigset );
+
+ /*
+ * This is an educated guess based on ONLY ONE of the signals we
+ * disable/enable to mask ISRs.
+ */
+
+ if ( sigismember( &sigset, SIGUSR1 ) )
+ return 1;
+ else
+ return 0;
+}
+
/* _CPU_Initialize
*
* This routine performs processor dependent initialization.
@@ -198,12 +220,9 @@ void _CPU_Context_From_CPU_Init()
void _CPU_Initialize(
rtems_cpu_table *cpu_table,
- void (*thread_dispatch) /* ignored on this CPU */
+ void (*thread_dispatch) /* ignored on this CPU */
)
{
- if ( cpu_table == NULL )
- _CPU_Fatal_halt( RTEMS_NOT_CONFIGURED );
-
/*
* The thread_dispatch argument is the address of the entry point
* for the routine called at the end of an ISR once it has been
diff --git a/cpukit/score/include/rtems/score/address.h b/cpukit/score/include/rtems/score/address.h
index 0abd113f63..4877206801 100644
--- a/cpukit/score/include/rtems/score/address.h
+++ b/cpukit/score/include/rtems/score/address.h
@@ -52,21 +52,6 @@ STATIC INLINE void *_Addresses_Subtract_offset(
);
/*
- * _Addresses_Add
- *
- * DESCRIPTION:
- *
- * This function is used to add two addresses. It returns the
- * resulting address. This address is typically converted to an
- * access type before being used further.
- */
-
-STATIC INLINE void *_Addresses_Add (
- void *left,
- void *right
-);
-
-/*
* _Addresses_Subtract
*
* DESCRIPTION:
@@ -112,7 +97,7 @@ STATIC INLINE boolean _Addresses_Is_in_range (
void *limit
);
-#include <rtems/address.inl>
+#include <rtems/core/address.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/chain.h b/cpukit/score/include/rtems/score/chain.h
index 06cc47cc65..35ac4dfa80 100644
--- a/cpukit/score/include/rtems/score/chain.h
+++ b/cpukit/score/include/rtems/score/chain.h
@@ -21,7 +21,7 @@
extern "C" {
#endif
-#include <rtems/address.h>
+#include <rtems/core/address.h>
/*
* This is used to manage each element (node) which is placed
@@ -422,7 +422,7 @@ STATIC INLINE boolean _Chain_Is_null_node(
Chain_Node *the_node
);
-#include <rtems/chain.inl>
+#include <rtems/core/chain.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/context.h b/cpukit/score/include/rtems/score/context.h
index 9b8ee92b04..58e497ae88 100644
--- a/cpukit/score/include/rtems/score/context.h
+++ b/cpukit/score/include/rtems/score/context.h
@@ -20,7 +20,7 @@
extern "C" {
#endif
-#include <rtems/cpu.h>
+#include <rtems/core/cpu.h>
/*
* The following constant defines the number of bytes required
diff --git a/cpukit/score/include/rtems/score/coremutex.h b/cpukit/score/include/rtems/score/coremutex.h
new file mode 100644
index 0000000000..0682bbc1ea
--- /dev/null
+++ b/cpukit/score/include/rtems/score/coremutex.h
@@ -0,0 +1,247 @@
+/* mutex.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Mutex Handler. A mutex is an enhanced version of the standard
+ * Dijkstra binary semaphore used to provide synchronization and mutual
+ * exclusion capabilities.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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_CORE_MUTEX_h
+#define __RTEMS_CORE_MUTEX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/watchdog.h>
+
+/*
+ * The following type defines the callout which the API provides
+ * to support global/multiprocessor operations on mutexes.
+ */
+
+typedef void ( *CORE_mutex_API_mp_support_callout )(
+ Thread_Control *,
+ Objects_Id
+ );
+
+/*
+ * Blocking disciplines for a mutex.
+ */
+
+typedef enum {
+ CORE_MUTEX_DISCIPLINES_FIFO,
+ CORE_MUTEX_DISCIPLINES_PRIORITY,
+ CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT,
+ CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING
+} CORE_mutex_Disciplines;
+
+/*
+ * Mutex handler return statuses.
+ */
+
+typedef enum {
+ CORE_MUTEX_STATUS_SUCCESSFUL,
+ CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT,
+ CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED,
+ CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE,
+ CORE_MUTEX_WAS_DELETED,
+ CORE_MUTEX_TIMEOUT
+} CORE_mutex_Status;
+
+/*
+ * Locked and unlocked values
+ */
+
+#define CORE_MUTEX_UNLOCKED 1
+#define CORE_MUTEX_LOCKED 0
+
+/*
+ * The following defines the control block used to manage the
+ * attributes of each mutex.
+ */
+
+typedef struct {
+ boolean allow_nesting;
+ CORE_mutex_Disciplines discipline;
+ Priority_Control priority_ceiling;
+} CORE_mutex_Attributes;
+
+/*
+ * The following defines the control block used to manage each mutex.
+ */
+
+typedef struct {
+ Thread_queue_Control Wait_queue;
+ CORE_mutex_Attributes Attributes;
+ unsigned32 lock;
+ unsigned32 nest_count;
+ Thread_Control *holder;
+ Objects_Id holder_id;
+} CORE_mutex_Control;
+
+/*
+ * _CORE_mutex_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the mutex based on the parameters passed.
+ */
+
+void _CORE_mutex_Initialize(
+ CORE_mutex_Control *the_mutex,
+ Objects_Classes the_class,
+ CORE_mutex_Attributes *the_mutex_attributes,
+ unsigned32 initial_lock,
+ Thread_queue_Extract_callout proxy_extract_callout
+);
+
+/*
+ * _CORE_mutex_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine attempts to receive a unit from the_mutex.
+ * If a unit is available or if the wait flag is FALSE, then the routine
+ * returns. Otherwise, the calling task is blocked until a unit becomes
+ * available.
+ */
+
+void _CORE_mutex_Seize(
+ CORE_mutex_Control *the_mutex,
+ Objects_Id id,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _CORE_mutex_Surrender
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a unit to the mutex. If a task was blocked waiting for
+ * a unit from this mutex, then that task will be readied and the unit
+ * given to that task. Otherwise, the unit will be returned to the mutex.
+ */
+
+CORE_mutex_Status _CORE_mutex_Surrender(
+ CORE_mutex_Control *the_mutex,
+ Objects_Id id,
+ CORE_mutex_API_mp_support_callout api_mutex_mp_support
+);
+
+/*
+ * _CORE_mutex_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine assists in the deletion of a mutex by flushing the associated
+ * wait queue.
+ */
+
+void _CORE_mutex_Flush(
+ CORE_mutex_Control *the_mutex,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ * _CORE_mutex_Is_locked
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex specified is locked and FALSE
+ * otherwise.
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_locked(
+ CORE_mutex_Control *the_mutex
+);
+
+/*
+ * _CORE_mutex_Is_fifo
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is FIFO and FALSE
+ * otherwise.
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_fifo(
+ CORE_mutex_Attributes *the_attribute
+);
+
+/*
+ * _CORE_mutex_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is PRIORITY and
+ * FALSE otherwise.
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_priority(
+ CORE_mutex_Attributes *the_attribute
+);
+
+/*
+ * _CORE_mutex_Is_inherit_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * INHERIT_PRIORITY and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_inherit_priority(
+ CORE_mutex_Attributes *the_attribute
+);
+
+/*
+ * _CORE_mutex_Is_priority_ceiling
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * PRIORITY_CEILING and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_priority_ceiling(
+ CORE_mutex_Attributes *the_attribute
+);
+
+/*
+ * _CORE_mutex_Is_nesting_allowed
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex allows a task to obtain a
+ * semaphore more than once and nest.
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_nesting_allowed(
+ CORE_mutex_Attributes *the_attribute
+);
+
+#include <rtems/core/coremutex.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/score/include/rtems/score/coresem.h b/cpukit/score/include/rtems/score/coresem.h
new file mode 100644
index 0000000000..0fcd8cd0b9
--- /dev/null
+++ b/cpukit/score/include/rtems/score/coresem.h
@@ -0,0 +1,179 @@
+/* core_sem.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Counting Semaphore Handler. A counting semaphore is the
+ * standard Dijkstra binary semaphore used to provide synchronization
+ * and mutual exclusion capabilities.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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_CORE_COUNTING_SEMAPHORE_h
+#define __RTEMS_CORE_COUNTING_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/watchdog.h>
+
+/*
+ * The following type defines the callout which the API provides
+ * to support global/multiprocessor operations on semaphores.
+ */
+
+typedef void ( *CORE_semaphore_API_mp_support_callout )(
+ Thread_Control *,
+ Objects_Id
+ );
+
+/*
+ * Blocking disciplines for a semaphore.
+ */
+
+typedef enum {
+ CORE_SEMAPHORE_DISCIPLINES_FIFO,
+ CORE_SEMAPHORE_DISCIPLINES_PRIORITY
+} CORE_semaphore_Disciplines;
+
+/*
+ * Core Semaphore handler return statuses.
+ */
+
+typedef enum {
+ CORE_SEMAPHORE_STATUS_SUCCESSFUL,
+ CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT,
+ CORE_SEMAPHORE_WAS_DELETED,
+ CORE_SEMAPHORE_TIMEOUT
+} CORE_semaphore_Status;
+
+/*
+ * The following defines the control block used to manage the
+ * attributes of each semaphore.
+ */
+
+typedef struct {
+ CORE_semaphore_Disciplines discipline;
+} CORE_semaphore_Attributes;
+
+/*
+ * The following defines the control block used to manage each
+ * counting semaphore.
+ */
+
+typedef struct {
+ Thread_queue_Control Wait_queue;
+ CORE_semaphore_Attributes Attributes;
+ unsigned32 count;
+} CORE_semaphore_Control;
+
+/*
+ * _CORE_semaphore_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the semaphore based on the parameters passed.
+ */
+
+void _CORE_semaphore_Initialize(
+ CORE_semaphore_Control *the_semaphore,
+ Objects_Classes the_class,
+ CORE_semaphore_Attributes *the_semaphore_attributes,
+ unsigned32 initial_value,
+ Thread_queue_Extract_callout proxy_extract_callout
+);
+
+/*
+ * _CORE_semaphore_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine attempts to receive a unit from the_semaphore.
+ * If a unit is available or if the wait flag is FALSE, then the routine
+ * returns. Otherwise, the calling task is blocked until a unit becomes
+ * available.
+ */
+
+void _CORE_semaphore_Seize(
+ CORE_semaphore_Control *the_semaphore,
+ Objects_Id id,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _CORE_semaphore_Surrender
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a unit to the semaphore. If a task was blocked waiting
+ * for a unit from this semaphore, then that task will be readied and the unit
+ * given to that task. Otherwise, the unit will be returned to the semaphore.
+ */
+
+CORE_semaphore_Status _CORE_semaphore_Surrender(
+ CORE_semaphore_Control *the_semaphore,
+ Objects_Id id,
+ CORE_semaphore_API_mp_support_callout api_semaphore_mp_support
+);
+
+/*
+ * _CORE_semaphore_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine assists in the deletion of a semaphore by flushing the
+ * associated wait queue.
+ */
+
+void _CORE_semaphore_Flush(
+ CORE_semaphore_Control *the_semaphore,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ * _CORE_semaphore_Get_count
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the current count associated with the semaphore.
+ */
+
+STATIC INLINE unsigned32 _CORE_semaphore_Get_count(
+ CORE_semaphore_Control *the_semaphore
+);
+
+/*
+ * _CORE_semaphore_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _CORE_semaphore_Is_priority(
+ CORE_semaphore_Attributes *the_attribute
+);
+
+#include <rtems/core/coresem.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/score/include/rtems/score/heap.h b/cpukit/score/include/rtems/score/heap.h
index 9eb348a760..bf4a8dde6e 100644
--- a/cpukit/score/include/rtems/score/heap.h
+++ b/cpukit/score/include/rtems/score/heap.h
@@ -386,7 +386,7 @@ STATIC INLINE unsigned32 _Heap_Build_flag (
unsigned32 in_use_flag
);
-#include <rtems/heap.inl>
+#include <rtems/core/heap.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/interr.h b/cpukit/score/include/rtems/score/interr.h
new file mode 100644
index 0000000000..c1088a9dff
--- /dev/null
+++ b/cpukit/score/include/rtems/score/interr.h
@@ -0,0 +1,93 @@
+/* interr.h
+ *
+ * This include file contains constants and prototypes related
+ * to the Internal Error Handler.
+ *
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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_INTERNAL_ERROR_h
+#define __RTEMS_INTERNAL_ERROR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This type lists the possible sources from which an error
+ * can be reported.
+ */
+
+typedef enum {
+ INTERNAL_ERROR_CORE,
+ INTERNAL_ERROR_RTEMS_API
+} Internal_errors_Source;
+
+/*
+ * A list of errors which are generated internally by the executive core.
+ */
+
+typedef enum {
+ INTERNAL_ERROR_NO_CONFIGURATION_TABLE,
+ INTERNAL_ERROR_NO_CPU_TABLE,
+ INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS,
+ INTERNAL_ERROR_TOO_LITTLE_WORKSPACE,
+ INTERNAL_ERROR_WORKSPACE_ALLOCATION,
+ INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL,
+ INTERNAL_ERROR_THREAD_EXITTED,
+ INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION,
+ INTERNAL_ERROR_INVALID_NODE,
+ INTERNAL_ERROR_NO_MPCI,
+ INTERNAL_ERROR_BAD_PACKET,
+ INTERNAL_ERROR_OUT_OF_PACKETS,
+ INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS,
+ INTERNAL_ERROR_OUT_OF_PROXIES,
+ INTERNAL_ERROR_INVALID_GLOBAL_ID
+} Internal_errors_Core_list;
+
+/*
+ * This type holds the fatal error information.
+ */
+
+typedef struct {
+ Internal_errors_Source the_source;
+ boolean is_internal;
+ unsigned32 the_error;
+} Internal_errors_Information;
+
+/*
+ * When a fatal error occurs, the error information is stored here.
+ */
+
+EXTERN Internal_errors_Information Internal_errors_What_happened;
+
+/*
+ * _Internal_error_Occurred
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when the application or the executive itself
+ * determines that a fatal error has occurred.
+ */
+
+void volatile _Internal_error_Occurred(
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ unsigned32 the_error
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/isr.h b/cpukit/score/include/rtems/score/isr.h
index 77c3f8663e..4bbc3c7aff 100644
--- a/cpukit/score/include/rtems/score/isr.h
+++ b/cpukit/score/include/rtems/score/isr.h
@@ -16,8 +16,8 @@
* $Id$
*/
-#ifndef __RTEMS_ISR_h
-#define __RTEMS_ISR_h
+#ifndef __ISR_h
+#define __ISR_h
#ifdef __cplusplus
extern "C" {
@@ -31,24 +31,23 @@ extern "C" {
typedef unsigned32 ISR_Level;
/*
- * The following type defines the control block used to manage
- * the vectors.
+ * The following type defines the type used to manage the vectors.
*/
-typedef unsigned32 rtems_vector_number;
+typedef unsigned32 ISR_Vector_number;
/*
* Return type for ISR Handler
*/
-typedef void rtems_isr;
+typedef void ISR_Handler;
/*
* Pointer to an ISR Handler
*/
-typedef rtems_isr ( *rtems_isr_entry )(
- rtems_vector_number
+typedef ISR_Handler ( *ISR_Handler_entry )(
+ ISR_Vector_number
);
/*
* The following is TRUE if signals have been sent to the currently
@@ -65,11 +64,11 @@ EXTERN boolean _ISR_Signals_to_thread_executing;
EXTERN unsigned32 _ISR_Nest_level;
/*
- * The following declares the RTEMS Vector Table. Application
- * interrupt service routines are vectored by RTEMS via this table.
+ * The following declares the Vector Table. Application
+ * interrupt service routines are vectored by the ISR Handler via this table.
*/
-EXTERN rtems_isr_entry _ISR_Vector_table[CPU_INTERRUPT_NUMBER_OF_VECTORS];
+EXTERN ISR_Handler_entry _ISR_Vector_table[CPU_INTERRUPT_NUMBER_OF_VECTORS];
/*
* _ISR_Handler_initialization
@@ -79,7 +78,7 @@ EXTERN rtems_isr_entry _ISR_Vector_table[CPU_INTERRUPT_NUMBER_OF_VECTORS];
* This routine performs the initialization necessary for this handler.
*/
-STATIC INLINE void _ISR_Handler_initialization ( void );
+void _ISR_Handler_initialization ( void );
/*
* _ISR_Disable
@@ -154,6 +153,17 @@ STATIC INLINE boolean _ISR_Is_in_progress( void );
_CPU_ISR_install_vector( _vector, _new_handler, _old_handler )
/*
+ * _ISR_Get_level
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the current interrupt level.
+ */
+
+#define _ISR_Get_level() \
+ _CPU_ISR_Get_level()
+
+/*
* _ISR_Set_level
*
* DESCRIPTION:
@@ -176,7 +186,7 @@ STATIC INLINE boolean _ISR_Is_in_progress( void );
*/
STATIC INLINE boolean _ISR_Is_vector_number_valid (
- rtems_vector_number vector
+ ISR_Vector_number vector
);
/*
@@ -197,7 +207,7 @@ STATIC INLINE boolean _ISR_Is_valid_user_handler (
*
* DESCRIPTION:
*
- * This routine is the RTEMS interrupt dispatcher. ALL interrupts
+ * This routine is the interrupt dispatcher. ALL interrupts
* are vectored to this routine so that minimal context can be saved
* and setup performed before the application's high-level language
* interrupt service routine is invoked. After the application's
@@ -229,7 +239,7 @@ void _ISR_Handler( void );
void _ISR_Dispatch( void );
-#include <rtems/isr.inl>
+#include <rtems/core/isr.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/mpci.h b/cpukit/score/include/rtems/score/mpci.h
index ca06dd243b..06dc0015d4 100644
--- a/cpukit/score/include/rtems/score/mpci.h
+++ b/cpukit/score/include/rtems/score/mpci.h
@@ -14,20 +14,20 @@
* $Id$
*/
-#ifndef __RTEMS_MPCI_h
-#define __RTEMS_MPCI_h
+#ifndef __MPCI_h
+#define __MPCI_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/mppkt.h>
-#include <rtems/states.h>
-#include <rtems/status.h>
-#include <rtems/thread.h>
-#include <rtems/threadq.h>
-#include <rtems/tqdata.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/tqdata.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/core/coresem.h>
/*
* The following defines the node number used when a broadcast is desired.
@@ -45,6 +45,85 @@ extern "C" {
#define MPCI_DEFAULT_TIMEOUT 0xFFFFFFFF
/*
+ * The following records define the Multiprocessor Communications
+ * Interface (MPCI) Table. This table defines the user-provided
+ * MPCI which is a required part of a multiprocessor system.
+ *
+ * For non-blocking local operations that become remote operations,
+ * we need a timeout. This is a per-driver timeout: default_timeout
+ */
+
+typedef void MPCI_Entry;
+
+typedef MPCI_Entry ( *MPCI_initialization_entry )( void );
+
+typedef MPCI_Entry ( *MPCI_get_packet_entry )(
+ MP_packet_Prefix **
+ );
+
+typedef MPCI_Entry ( *MPCI_return_packet_entry )(
+ MP_packet_Prefix *
+ );
+
+typedef MPCI_Entry ( *MPCI_send_entry )(
+ unsigned32,
+ MP_packet_Prefix *
+ );
+
+typedef MPCI_Entry ( *MPCI_receive_entry )(
+ MP_packet_Prefix **
+ );
+
+typedef struct {
+ unsigned32 default_timeout; /* in ticks */
+ unsigned32 maximum_packet_size;
+ MPCI_initialization_entry initialization;
+ MPCI_get_packet_entry get_packet;
+ MPCI_return_packet_entry return_packet;
+ MPCI_send_entry send_packet;
+ MPCI_receive_entry receive_packet;
+} MPCI_Control;
+
+/*
+ * The following defines the type for packet processing routines
+ * invoked by the MPCI Receive server.
+ */
+
+typedef void (*MPCI_Packet_processor)( MP_packet_Prefix * );
+
+/*
+ * This is the core semaphore which the MPCI Receive Server blocks on.
+ */
+
+EXTERN CORE_semaphore_Control _MPCI_Semaphore;
+/*
+ * The following thread queue is used to maintain a list of tasks
+ * which currently have outstanding remote requests.
+ */
+
+EXTERN Thread_queue_Control _MPCI_Remote_blocked_threads;
+
+/*
+ * The following define the internal pointers to the user's
+ * configuration information.
+ */
+
+EXTERN MPCI_Control *_MPCI_table;
+
+/*
+ * The following points to the MPCI Receive Server.
+ */
+
+EXTERN Thread_Control *_MPCI_Receive_server_tcb;
+
+/*
+ * The following table contains the process packet routines provided
+ * by each object that supports MP operations.
+ */
+
+EXTERN MPCI_Packet_processor _MPCI_Packet_processors[MP_PACKET_CLASSES_LAST+1];
+
+/*
* _MPCI_Handler_initialization
*
* DESCRIPTION:
@@ -52,7 +131,9 @@ extern "C" {
* This routine performs the initialization necessary for this handler.
*/
-void _MPCI_Handler_initialization ( void );
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table
+);
/*
* _MPCI_Initialization
@@ -66,6 +147,21 @@ void _MPCI_Handler_initialization ( void );
void _MPCI_Initialization ( void );
/*
+ * _MPCI_Register_packet_processor
+ *
+ * DESCRIPTION:
+ *
+ * This routine registers the MPCI packet processor for the
+ * designated object class.
+ */
+
+void _MPCI_Register_packet_processor(
+ MP_packet_Classes the_object,
+ MPCI_Packet_processor the_packet_processor
+
+);
+
+/*
* _MPCI_Get_packet
*
* DESCRIPTION:
@@ -74,7 +170,7 @@ void _MPCI_Initialization ( void );
* MPCI get packet callout.
*/
-rtems_packet_prefix *_MPCI_Get_packet ( void );
+MP_packet_Prefix *_MPCI_Get_packet ( void );
/*
* _MPCI_Return_packet
@@ -86,7 +182,7 @@ rtems_packet_prefix *_MPCI_Get_packet ( void );
*/
void _MPCI_Return_packet (
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
);
/*
@@ -100,7 +196,7 @@ void _MPCI_Return_packet (
void _MPCI_Send_process_packet (
unsigned32 destination,
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
);
/*
@@ -112,9 +208,9 @@ void _MPCI_Send_process_packet (
* MPCI send callout.
*/
-rtems_status_code _MPCI_Send_request_packet (
+unsigned32 _MPCI_Send_request_packet (
unsigned32 destination,
- rtems_packet_prefix *the_packet,
+ MP_packet_Prefix *the_packet,
States_Control extra_state
);
@@ -129,7 +225,7 @@ rtems_status_code _MPCI_Send_request_packet (
void _MPCI_Send_response_packet (
unsigned32 destination,
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
);
/*
@@ -141,7 +237,7 @@ void _MPCI_Send_response_packet (
* MPCI receive callout.
*/
-rtems_packet_prefix *_MPCI_Receive_packet ( void );
+MP_packet_Prefix *_MPCI_Receive_packet ( void );
/*
* _MPCI_Process_response
@@ -153,15 +249,27 @@ rtems_packet_prefix *_MPCI_Receive_packet ( void );
*/
Thread_Control *_MPCI_Process_response (
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
);
-/*
- * The following thread queue is used to maintain a list of tasks
- * which currently have outstanding remote requests.
+/*PAGE
+ *
+ * _MPCI_Receive_server
+ *
*/
+
+void _MPCI_Receive_server( void );
-EXTERN Thread_queue_Control _MPCI_Remote_blocked_threads;
+/*PAGE
+ *
+ * _MPCI_Announce
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _MPCI_Announce ( void );
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/mppkt.h b/cpukit/score/include/rtems/score/mppkt.h
index d63d587fca..32cbc7e0e9 100644
--- a/cpukit/score/include/rtems/score/mppkt.h
+++ b/cpukit/score/include/rtems/score/mppkt.h
@@ -1,8 +1,10 @@
/* mppkt.h
*
* This package is the specification for the Packet Handler.
- * This handler defines the basic RTEMS packet and provides
+ * This handler defines the basic packet and provides
* mechanisms to utilize packets based on this prefix.
+ * Packets are the fundamental basis for messages passed between
+ * nodes in an MP system.
*
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
@@ -16,20 +18,19 @@
* $Id$
*/
-#ifndef __RTEMS_MP_PACKET_h
-#define __RTEMS_MP_PACKET_h
+#ifndef __MP_PACKET_h
+#define __MP_PACKET_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/object.h>
-#include <rtems/priority.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/object.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/watchdog.h>
/*
- * The following enumerated type defines the packet classes
- * supported by RTEMS.
+ * The following enumerated type defines the packet classes.
*
* NOTE: In general, each class corresponds to a manager
* which supports global operations. Each manager
@@ -37,55 +38,55 @@ extern "C" {
*/
typedef enum {
- RTEMS_MP_PACKET_INTERNAL_THREADS = 0,
- RTEMS_MP_PACKET_TASKS = 1,
- RTEMS_MP_PACKET_MESSAGE_QUEUE = 2,
- RTEMS_MP_PACKET_SEMAPHORE = 3,
- RTEMS_MP_PACKET_PARTITION = 4,
- RTEMS_MP_PACKET_REGION = 5,
- RTEMS_MP_PACKET_EVENT = 6,
- RTEMS_MP_PACKET_SIGNAL = 7
-} rtems_mp_packet_classes;
-
-#define MP_PACKET_CLASSES_FIRST RTEMS_MP_PACKET_INTERNAL_THREADS
-#define MP_PACKET_CLASSES_LAST RTEMS_MP_PACKET_SIGNAL
+ MP_PACKET_INTERNAL_THREADS = 0,
+ MP_PACKET_TASKS = 1,
+ MP_PACKET_MESSAGE_QUEUE = 2,
+ MP_PACKET_SEMAPHORE = 3,
+ MP_PACKET_PARTITION = 4,
+ MP_PACKET_REGION = 5,
+ MP_PACKET_EVENT = 6,
+ MP_PACKET_SIGNAL = 7
+} MP_packet_Classes;
+
+#define MP_PACKET_CLASSES_FIRST MP_PACKET_INTERNAL_THREADS
+#define MP_PACKET_CLASSES_LAST MP_PACKET_SIGNAL
/*
* The following record contains the prefix for every packet
- * passed between RTEMS nodes.
+ * passed between nodes in an MP system.
*
* NOTE: This structure is padded to insure that anything
* following it is on a 16 byte boundary. This is
* the most stringent structure alignment rule
- * the RTEMS project has encountered yet (i960CA).
+ * encountered yet (i960CA).
*/
typedef struct {
- rtems_mp_packet_classes the_class;
+ MP_packet_Classes the_class;
Objects_Id id;
Objects_Id source_tid;
Priority_Control source_priority;
- rtems_status_code return_code;
+ unsigned32 return_code;
unsigned32 length;
unsigned32 to_convert;
- rtems_interval timeout;
-} rtems_packet_prefix;
+ Watchdog_Interval timeout;
+} MP_packet_Prefix;
/*
* An MPCI must support packets of at least this size.
*/
-#define RTEMS_MINIMUM_PACKET_SIZE 64
+#define MP_PACKET_MINIMUM_PACKET_SIZE 64
/*
* The following constant defines the number of unsigned32's
* in a packet which must be converted to native format in a
* heterogeneous system. In packets longer than
- * RTEMS_MINIMUN_HETERO_CONVERSION unsigned32's, some of the "extra" data
+ * MP_PACKET_MINIMUN_HETERO_CONVERSION unsigned32's, some of the "extra" data
* may a user message buffer which is not automatically endian swapped.
*/
-#define RTEMS_MINIMUN_HETERO_CONVERSION ( sizeof( rtems_packet_prefix ) / 4 )
+#define MP_PACKET_MINIMUN_HETERO_CONVERSION ( sizeof( MP_packet_Prefix ) / 4 )
/*
* _Mp_packet_Is_valid_packet_class
@@ -97,7 +98,7 @@ typedef struct {
*/
STATIC INLINE boolean _Mp_packet_Is_valid_packet_class (
- rtems_mp_packet_classes the_packet_class
+ MP_packet_Classes the_packet_class
);
/*
@@ -110,10 +111,10 @@ STATIC INLINE boolean _Mp_packet_Is_valid_packet_class (
*/
STATIC INLINE boolean _Mp_packet_Is_null (
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
);
-#include <rtems/mppkt.inl>
+#include <rtems/core/mppkt.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/object.h b/cpukit/score/include/rtems/score/object.h
index b1d422d3d4..3da299e95f 100644
--- a/cpukit/score/include/rtems/score/object.h
+++ b/cpukit/score/include/rtems/score/object.h
@@ -1,8 +1,9 @@
/* object.h
*
* This include file contains all the constants and structures associated
- * with the RTEMS Object Handler. This Handler provides mechanisms which
- * can be used to initialize and manipulate all RTEMS objects.
+ * with the Object Handler. This Handler provides mechanisms which
+ * can be used to initialize and manipulate all objects which have
+ * ids.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -15,14 +16,14 @@
* $Id$
*/
-#ifndef __RTEMS_OBJECTS_h
-#define __RTEMS_OBJECTS_h
+#ifndef __OBJECTS_h
+#define __OBJECTS_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/chain.h>
+#include <rtems/core/chain.h>
/*
* The following type defines the control block used to manage
@@ -142,6 +143,7 @@ typedef struct {
*/
EXTERN unsigned32 _Objects_Local_node;
+EXTERN unsigned32 _Objects_Maximum_nodes;
/*
* The following is the list of information blocks for each object
@@ -164,23 +166,23 @@ EXTERN Objects_Information
* The following define the constants which may be used in name searches.
*/
-#define RTEMS_SEARCH_ALL_NODES 0
-#define RTEMS_SEARCH_OTHER_NODES 0x7FFFFFFE
-#define RTEMS_SEARCH_LOCAL_NODE 0x7FFFFFFF
-#define RTEMS_WHO_AM_I 0
+#define OBJECTS_SEARCH_ALL_NODES 0
+#define OBJECTS_SEARCH_OTHER_NODES 0x7FFFFFFE
+#define OBJECTS_SEARCH_LOCAL_NODE 0x7FFFFFFF
+#define OBJECTS_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 OBJECTS_ID_INITIAL_INDEX (0)
+#define OBJECTS_ID_FINAL_INDEX (0xffff)
-#define RTEMS_OBJECT_ID_INITIAL(node) (_Objects_Build_id( \
- OBJECTS_NO_CLASS, \
- node, \
- RTEMS_OBJECT_ID_INITIAL_INDEX))
-#define RTEMS_OBJECT_ID_FINAL ((Objects_Id)~0)
+#define OBJECTS_ID_INITIAL(node) (_Objects_Build_id( \
+ OBJECTS_NO_CLASS, \
+ node, \
+ OBJECTS_ID_INITIAL_INDEX))
+#define OBJECTS_ID_FINAL ((Objects_Id)~0)
/*
* _Objects_Handler_initialization
@@ -193,6 +195,7 @@ EXTERN Objects_Information
void _Objects_Handler_initialization(
unsigned32 node,
+ unsigned32 maximum_nodes,
unsigned32 maximum_global_objects
);
@@ -303,7 +306,16 @@ boolean _Objects_Compare_name_raw(
*
*/
-rtems_status_code _Objects_Name_to_id(
+typedef enum {
+ OBJECTS_SUCCESSFUL,
+ OBJECTS_INVALID_NAME,
+ OBJECTS_INVALID_NODE
+} Objects_Name_to_id_errors;
+
+#define OBJECTS_NAME_ERRORS_FIRST OBJECTS_SUCCESSFUL
+#define OBJECTS_NAME_ERRORS_LAST OBJECTS_INVALID_NODE
+
+Objects_Name_to_id_errors _Objects_Name_to_id(
Objects_Information *information,
Objects_Name name,
unsigned32 node,
@@ -378,7 +390,7 @@ STATIC INLINE Objects_Id _Objects_Build_id(
);
/*
- * rtems_get_class
+ * _Objects_Get_class
*
* DESCRIPTION:
*
@@ -386,12 +398,12 @@ STATIC INLINE Objects_Id _Objects_Build_id(
*
*/
-STATIC INLINE Objects_Classes rtems_get_class(
+STATIC INLINE Objects_Classes _Objects_Get_class(
Objects_Id id
);
/*
- * rtems_get_node
+ * _Objects_Get_node
*
* DESCRIPTION:
*
@@ -399,12 +411,12 @@ STATIC INLINE Objects_Classes rtems_get_class(
*
*/
-STATIC INLINE unsigned32 rtems_get_node(
+STATIC INLINE unsigned32 _Objects_Get_node(
Objects_Id id
);
/*
- * rtems_get_index
+ * _Objects_Get_index
*
* DESCRIPTION:
*
@@ -412,7 +424,7 @@ STATIC INLINE unsigned32 rtems_get_node(
*
*/
-STATIC INLINE unsigned32 rtems_get_index(
+STATIC INLINE unsigned32 _Objects_Get_index(
Objects_Id id
);
@@ -532,7 +544,7 @@ STATIC INLINE void _Objects_Close(
Objects_Control *the_object
);
-#include <rtems/object.inl>
+#include <rtems/core/object.inl>
#include <rtems/objectmp.h>
#ifdef __cplusplus
diff --git a/cpukit/score/include/rtems/score/objectmp.h b/cpukit/score/include/rtems/score/objectmp.h
index b15d5cbb43..cef5c6879d 100644
--- a/cpukit/score/include/rtems/score/objectmp.h
+++ b/cpukit/score/include/rtems/score/objectmp.h
@@ -42,6 +42,8 @@ typedef struct {
*/
void _Objects_MP_Handler_initialization (
+ unsigned32 node,
+ unsigned32 maximum_nodes,
unsigned32 maximum_global_objects
);
@@ -140,7 +142,7 @@ void _Objects_MP_Close (
* object with that name if one is found.
*/
-rtems_status_code _Objects_MP_Global_name_search (
+Objects_Name_to_id_errors _Objects_MP_Global_name_search (
Objects_Information *information,
Objects_Name the_name,
unsigned32 nodes_to_search,
@@ -171,6 +173,7 @@ void _Objects_MP_Is_remote (
* inactive global object control blocks.
*/
+EXTERN unsigned32 _Objects_MP_Maximum_global_objects;
EXTERN Chain_Control _Objects_MP_Inactive_global_objects;
#include <rtems/objectmp.inl>
diff --git a/cpukit/score/include/rtems/score/priority.h b/cpukit/score/include/rtems/score/priority.h
index 44397e7a8a..8f681c0ce1 100644
--- a/cpukit/score/include/rtems/score/priority.h
+++ b/cpukit/score/include/rtems/score/priority.h
@@ -2,7 +2,7 @@
*
* This include file contains all thread priority manipulation routines.
* This Handler provides mechanisms which can be used to
- * initialize and manipulate RTEMS priorities.
+ * initialize and manipulate thread priorities.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -15,8 +15,8 @@
* $Id$
*/
-#ifndef __RTEMS_PRIORITY_h
-#define __RTEMS_PRIORITY_h
+#ifndef __PRIORITY_h
+#define __PRIORITY_h
#ifdef __cplusplus
extern "C" {
@@ -31,8 +31,8 @@ extern "C" {
typedef unsigned32 Priority_Control;
-#define RTEMS_MINIMUM_PRIORITY 1 /* highest thread priority */
-#define RTEMS_MAXIMUM_PRIORITY 255 /* lowest thread priority */
+#define PRIORITY_MINIMUM 0 /* highest thread priority */
+#define PRIORITY_MAXIMUM 255 /* lowest thread priority */
/*
* The following record defines the information associated with
@@ -62,12 +62,6 @@ EXTERN volatile Priority_Bit_map_control _Priority_Major_bit_map;
EXTERN Priority_Bit_map_control _Priority_Bit_map[16] CPU_STRUCTURE_ALIGNMENT;
/*
- * The following constants are useful when manipulating priority.
- */
-
-#define RTEMS_CURRENT_PRIORITY 0 /* obtain current priority */
-
-/*
* The definition of the Priority_Bit_map_control type is CPU dependent.
*
*/
@@ -185,7 +179,7 @@ STATIC INLINE boolean _Priority_Is_group_empty (
Priority_Control the_priority
);
-#include <rtems/priority.inl>
+#include <rtems/core/priority.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/stack.h b/cpukit/score/include/rtems/score/stack.h
index a0fce1ef04..2a41bcf89f 100644
--- a/cpukit/score/include/rtems/score/stack.h
+++ b/cpukit/score/include/rtems/score/stack.h
@@ -15,8 +15,8 @@
* $Id$
*/
-#ifndef __RTEMS_STACK_h
-#define __RTEMS_STACK_h
+#ifndef __STACK_h
+#define __STACK_h
#ifdef __cplusplus
extern "C" {
@@ -27,7 +27,7 @@ extern "C" {
* thread must exceed.
*/
-#define RTEMS_MINIMUM_STACK_SIZE CPU_STACK_MINIMUM_SIZE
+#define STACK_MINIMUM_SIZE CPU_STACK_MINIMUM_SIZE
/*
* The following defines the control block used to manage each stack.
@@ -85,7 +85,7 @@ STATIC INLINE unsigned32 _Stack_Adjust_size (
unsigned32 size
);
-#include <rtems/stack.inl>
+#include <rtems/core/stack.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/states.h b/cpukit/score/include/rtems/score/states.h
index 56f67ecc49..3f7c4a7e99 100644
--- a/cpukit/score/include/rtems/score/states.h
+++ b/cpukit/score/include/rtems/score/states.h
@@ -1,6 +1,6 @@
/* states.h
*
- * This include file contains all RTEMS state information.
+ * This include file contains thread execution state information.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -43,13 +43,15 @@ typedef unsigned32 States_Control;
#define STATES_WAITING_FOR_MESSAGE 0x0040 /* wait for message */
#define STATES_WAITING_FOR_EVENT 0x0080 /* wait for event */
#define STATES_WAITING_FOR_SEMAPHORE 0x0100 /* wait for semaphore */
-#define STATES_WAITING_FOR_TIME 0x0200 /* wait for specific TOD */
-#define STATES_WAITING_FOR_RPC_REPLY 0x0400 /* wait for rpc reply */
-#define STATES_WAITING_FOR_PERIOD 0x0800 /* rate monotonic delay */
+#define STATES_WAITING_FOR_MUTEX 0x0200 /* wait for mutex */
+#define STATES_WAITING_FOR_TIME 0x0400 /* wait for specific TOD */
+#define STATES_WAITING_FOR_RPC_REPLY 0x0800 /* wait for rpc reply */
+#define STATES_WAITING_FOR_PERIOD 0x1000 /* rate monotonic delay */
#define STATES_LOCALLY_BLOCKED ( STATES_WAITING_FOR_BUFFER | \
STATES_WAITING_FOR_SEGMENT | \
STATES_WAITING_FOR_MESSAGE | \
+ STATES_WAITING_FOR_MUTEX | \
STATES_WAITING_FOR_SEMAPHORE )
#define STATES_WAITING_ON_THREAD_QUEUE \
@@ -221,6 +223,19 @@ STATIC INLINE boolean _States_Is_waiting_for_event (
);
/*
+ * _States_Is_waiting_for_mutex
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_MUTEX state
+ * is set in the_states, and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _States_Is_waiting_for_mutex (
+ States_Control the_states
+);
+
+/*
* _States_Is_waiting_for_semaphore
*
* DESCRIPTION:
@@ -327,7 +342,7 @@ STATIC INLINE boolean _States_Are_set (
States_Control mask
);
-#include <rtems/states.inl>
+#include <rtems/core/states.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/sysstate.h b/cpukit/score/include/rtems/score/sysstate.h
index 511a26cefc..b0ace61f98 100644
--- a/cpukit/score/include/rtems/score/sysstate.h
+++ b/cpukit/score/include/rtems/score/sysstate.h
@@ -40,12 +40,31 @@ typedef enum {
#define SYSTEM_STATE_CODES_LAST SYSTEM_STATE_FAILED
/*
+ * The following variable indicates whether or not this is
+ * an multiprocessing system.
+ */
+
+EXTERN boolean _System_state_Is_multiprocessing;
+
+/*
* The following variable contains the current system state.
*/
EXTERN System_state_Codes _System_state_Current;
/*
+ * _System_state_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the system state handler.
+ */
+
+STATIC INLINE void _System_state_Handler_initialization (
+ boolean is_multiprocessing
+);
+
+/*
* _System_state_Set
*
* DESCRIPTION:
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h
index 37a5898d01..823a4e6760 100644
--- a/cpukit/score/include/rtems/score/thread.h
+++ b/cpukit/score/include/rtems/score/thread.h
@@ -14,77 +14,44 @@
* $Id$
*/
-#ifndef __RTEMS_THREAD_h
-#define __RTEMS_THREAD_h
+#ifndef __THREAD_h
+#define __THREAD_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/asr.h>
-#include <rtems/attr.h>
-#include <rtems/context.h>
-#include <rtems/cpu.h>
-#include <rtems/eventset.h>
-#include <rtems/modes.h>
-#include <rtems/mppkt.h>
-#include <rtems/object.h>
-#include <rtems/options.h>
-#include <rtems/priority.h>
-#include <rtems/stack.h>
-#include <rtems/states.h>
-#include <rtems/tod.h>
-#include <rtems/tqdata.h>
-#include <rtems/watchdog.h>
-
-/*
- * Notepads constants (indices into notepad array)
- */
-
-#define RTEMS_NOTEPAD_FIRST 0 /* lowest numbered notepad */
-#define RTEMS_NOTEPAD_0 0 /* notepad location 0 */
-#define RTEMS_NOTEPAD_1 1 /* notepad location 1 */
-#define RTEMS_NOTEPAD_2 2 /* notepad location 2 */
-#define RTEMS_NOTEPAD_3 3 /* notepad location 3 */
-#define RTEMS_NOTEPAD_4 4 /* notepad location 4 */
-#define RTEMS_NOTEPAD_5 5 /* notepad location 5 */
-#define RTEMS_NOTEPAD_6 6 /* notepad location 6 */
-#define RTEMS_NOTEPAD_7 7 /* notepad location 7 */
-#define RTEMS_NOTEPAD_8 8 /* notepad location 8 */
-#define RTEMS_NOTEPAD_9 9 /* notepad location 9 */
-#define RTEMS_NOTEPAD_10 10 /* notepad location 10 */
-#define RTEMS_NOTEPAD_11 11 /* notepad location 11 */
-#define RTEMS_NOTEPAD_12 12 /* notepad location 12 */
-#define RTEMS_NOTEPAD_13 13 /* notepad location 13 */
-#define RTEMS_NOTEPAD_14 14 /* notepad location 14 */
-#define RTEMS_NOTEPAD_15 15 /* notepad location 15 */
-#define RTEMS_NOTEPAD_LAST RTEMS_NOTEPAD_15 /* highest numbered notepad */
-
-#define RTEMS_NUMBER_NOTEPADS (RTEMS_NOTEPAD_LAST+1)
-
-/*
- * The following defines the "return type" of an RTEMS thread.
- *
- * NOTE: Keep both types for internal threads.
- */
-
-typedef void rtems_task;
-typedef void Thread;
+#include <rtems/core/context.h>
+#include <rtems/core/cpu.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/object.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/stack.h>
+#include <rtems/core/states.h>
+#include <rtems/core/tod.h>
+#include <rtems/core/tqdata.h>
+#include <rtems/core/watchdog.h>
/*
- * The following defines the argument to an RTEMS thread.
+ * The following defines the "return type" of a thread.
*/
-typedef unsigned32 rtems_task_argument;
-typedef unsigned32 Thread_Argument;
+typedef void Thread;
/*
- * The following defines the type for the entry point of an RTEMS thread.
+ * The following defines the ways in which the entry point for a
+ * thread can be invoked. Basically, it can be passed any
+ * combination/permutation of a pointer and an unsigned32 value.
+ *
+ * NOTE: For now, we are ignoring the return type.
*/
-typedef rtems_task ( *rtems_task_entry )(
- rtems_task_argument
- );
+typedef enum {
+ THREAD_START_NUMERIC,
+ THREAD_START_POINTER,
+ THREAD_START_BOTH_POINTER_FIRST,
+ THREAD_START_BOTH_NUMERIC_FIRST
+} Thread_Start_types;
typedef Thread ( *Thread_Entry )( );
@@ -93,19 +60,15 @@ typedef Thread ( *Thread_Entry )( );
* the starting state of a thread.
*/
-typedef enum {
- THREAD_START_NUMERIC,
- THREAD_START_POINTER,
- THREAD_START_BOTH_POINTER_FIRST,
- THREAD_START_BOTH_NUMERIC_FIRST
-} Thread_Start_types;
-
typedef struct {
Thread_Entry entry_point; /* starting thread address */
Thread_Start_types prototype; /* how task is invoked */
void *pointer_argument; /* pointer argument */
unsigned32 numeric_argument; /* numeric argument */
- Modes_Control initial_modes; /* initial mode */
+ /* initial execution modes */
+ boolean is_preemptible;
+ boolean is_timeslice;
+ unsigned32 isr_level;
Priority_Control initial_priority; /* initial priority */
Stack_Control Initial_stack; /* stack information */
void *fp_context; /* initial FP context area address */
@@ -117,16 +80,21 @@ typedef struct {
* a thread which it is waiting for a resource.
*/
+#define THREAD_STATUS_PROXY_BLOCKING 0x1111111
+
typedef struct {
Objects_Id id; /* waiting on this object */
- rtems_option option_set; /* wait mode */
- 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 */
+ unsigned32 count; /* "generic" fields to be used */
+ void *return_argument; /* when blocking */
+ void *return_argument_1;
+ unsigned32 option;
+
+ /*
+ * NOTE: The following assumes that all API return codes can be
+ * treated as an unsigned32.
+ */
+ unsigned32 return_code; /* status for thread awakened */
+
Chain_Control Block2n; /* 2 - n priority blocked chain */
Thread_queue_Control *queue; /* pointer to thread queue */
} Thread_Wait_information;
@@ -147,7 +115,7 @@ typedef struct {
unsigned32 resource_count;
Thread_Wait_information Wait;
Watchdog_Control Timer;
- rtems_packet_prefix *receive_packet;
+ MP_packet_Prefix *receive_packet;
/****************** end of common block ********************/
Chain_Node Active;
} Thread_Proxy_control;
@@ -161,15 +129,12 @@ typedef struct {
* memory images for the shared part.
*/
-/* XXX structure in wrong file .. API .. not core */
+typedef enum {
+ THREAD_API_RTEMS
+} Thread_APIs;
-typedef struct {
- boolean is_global;
- unsigned32 Notepads[ RTEMS_NUMBER_NOTEPADS ];
- rtems_event_set pending_events;
- rtems_event_set events_out;
- ASR_Information Signal;
-} RTEMS_API_Control;
+#define THREAD_API_FIRST THREAD_API_RTEMS
+#define THREAD_API_LAST THREAD_API_RTEMS
typedef struct {
Objects_Control Object;
@@ -179,24 +144,30 @@ typedef struct {
unsigned32 resource_count;
Thread_Wait_information Wait;
Watchdog_Control Timer;
- rtems_packet_prefix *receive_packet;
+ MP_packet_Prefix *receive_packet;
/****************** end of common block ********************/
+ boolean is_global;
Chain_Control *ready;
Priority_Information Priority_map;
Thread_Start_information Start;
- Modes_Control current_modes;
+ boolean is_preemptible;
+ boolean is_timeslice;
Context_Control Registers;
void *fp_context;
- RTEMS_API_Control *RTEMS_API;
- void *extension;
+ void *API_Extensions[ THREAD_API_LAST + 1 ];
+ void **extensions;
} Thread_Control;
/*
- * External API name for Thread_Control
+ * The following context area contains the context of the "thread"
+ * which invoked the start multitasking routine. This context is
+ * restored as the last action of the stop multitasking routine. Thus
+ * control of the processor can be returned to the environment
+ * which initiated the system.
*/
-
-typedef Thread_Control rtems_tcb;
-
+
+EXTERN Context_Control _Thread_BSP_context;
+
/*
* The following declares the dispatch critical section nesting
* counter which is used to prevent context switches at inopportune
@@ -206,6 +177,14 @@ typedef Thread_Control rtems_tcb;
EXTERN unsigned32 _Thread_Dispatch_disable_level;
/*
+ * The following holds how many user extensions are in the system. This
+ * is used to determine how many user extension data areas to allocate
+ * per thread.
+ */
+
+EXTERN unsigned32 _Thread_Maximum_extensions;
+
+/*
* The following data items are used to manage timeslicing.
*/
@@ -228,7 +207,7 @@ EXTERN Thread_Control *_Thread_Executing;
/*
* The following points to the highest priority ready thread
- * in the system. Unless the current thread is RTEMS_NO_PREEMPT,
+ * in the system. Unless the current thread is not preemptibl,
* then this thread will be context switched to when the next
* dispatch occurs.
*/
@@ -243,16 +222,6 @@ EXTERN Thread_Control *_Thread_Heir;
EXTERN Thread_Control *_Thread_Allocated_fp;
/*
- * The following context area contains the context of the "thread"
- * which invoked rtems_initialize_executive. This context is restored
- * as the last action of the rtems_shutdown_executive directive. Thus
- * control of the processor can be returned to the environment
- * which initiated RTEMS.
- */
-
-EXTERN Context_Control _Thread_BSP_context;
-
-/*
* _Thread_Handler_initialization
*
* DESCRIPTION:
@@ -261,8 +230,9 @@ EXTERN Context_Control _Thread_BSP_context;
*/
void _Thread_Handler_initialization (
- unsigned32 ticks_per_timeslice,
- unsigned32 maximum_proxies
+ unsigned32 ticks_per_timeslice,
+ unsigned32 maximum_extensions,
+ unsigned32 maximum_proxies
);
/*
@@ -272,7 +242,7 @@ void _Thread_Handler_initialization (
*
* This routine initiates multitasking. It is invoked only as
* part of initialization and its invocation is the last act of
- * the rtems_initialize_executive directive.
+ * the non-multitasking part of the system initialization.
*/
void _Thread_Start_multitasking (
@@ -286,8 +256,8 @@ void _Thread_Start_multitasking (
* DESCRIPTION:
*
* This routine halts multitasking and returns control to
- * the "thread" which initially invoked the rtems_initialize_executive
- * directive.
+ * the "thread" (i.e. the BSP) which initially invoked the
+ * routine which initialized the system.
*/
STATIC INLINE void _Thread_Stop_multitasking( void );
@@ -333,7 +303,9 @@ boolean _Thread_Initialize(
unsigned32 stack_size, /* insure it is >= min */
boolean is_fp, /* TRUE if thread uses FP */
Priority_Control priority,
- Modes_Control mode,
+ boolean is_preemptible,
+ boolean is_timeslice,
+ unsigned32 isr_level,
Objects_Name name
);
@@ -452,7 +424,7 @@ void _Thread_Set_transient(
* at the priority of the currently executing thread, then the
* executing thread's timeslice is reset. Otherwise, the
* currently executing thread is placed at the rear of the
- * RTEMS_FIFO for this priority and a new heir is selected.
+ * FIFO for this priority and a new heir is selected.
*/
void _Thread_Reset_timeslice( void );
@@ -551,8 +523,7 @@ void _Thread_Handler( void );
* DESCRIPTION:
*
* This routine is invoked when a thread must be unblocked at the
- * end of a delay such as the rtems_task_wake_after and rtems_task_wake_when
- * directives.
+ * end of a time based delay (i.e. wake after or wake when).
*/
void _Thread_Delay_ended(
@@ -590,23 +561,14 @@ void _Thread_Set_priority(
);
/*
- * _Thread_Change_mode
+ * _Thread_Evaluate_mode
*
* DESCRIPTION:
*
- * This routine changes the current values of the modes
- * indicated by mask of the calling thread are changed to that
- * indicated in mode_set. The former mode of the thread is
- * returned in mode_set. If the changes in the current mode
- * indicate that a thread dispatch operation may be necessary,
- * then need_dispatch is TRUE, otherwise it is FALSE.
+ * This routine XXX
*/
-boolean _Thread_Change_mode(
- Modes_Control new_mode_set,
- Modes_Control mask,
- Modes_Control *old_mode_set
-);
+boolean _Thread_Evaluate_mode( void );
/*
* _Thread_Resume
@@ -782,8 +744,21 @@ STATIC INLINE Thread_Control *_Thread_Get (
Objects_Locations *location
);
-#include <rtems/thread.inl>
-#include <rtems/threadmp.h>
+/*
+ * _Thread_Is_proxy_blocking
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the status code is equal to the
+ * status which indicates that a proxy is blocking, and FALSE otherwise.
+ */
+
+STATIC INLINE boolean _Thread_Is_proxy_blocking (
+ unsigned32 code
+);
+
+#include <rtems/core/thread.inl>
+#include <rtems/core/threadmp.h>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/threadmp.h b/cpukit/score/include/rtems/score/threadmp.h
index db94a65d78..89b8e3d597 100644
--- a/cpukit/score/include/rtems/score/threadmp.h
+++ b/cpukit/score/include/rtems/score/threadmp.h
@@ -104,7 +104,7 @@ EXTERN Thread_Control *_Thread_MP_Receive;
EXTERN Chain_Control _Thread_MP_Active_proxies;
EXTERN Chain_Control _Thread_MP_Inactive_proxies;
-#include <rtems/threadmp.inl>
+#include <rtems/core/threadmp.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/threadq.h b/cpukit/score/include/rtems/score/threadq.h
index 27a36ab63e..a9fb29bb57 100644
--- a/cpukit/score/include/rtems/score/threadq.h
+++ b/cpukit/score/include/rtems/score/threadq.h
@@ -14,18 +14,18 @@
* $Id$
*/
-#ifndef __RTEMS_THREAD_QUEUE_h
-#define __RTEMS_THREAD_QUEUE_h
+#ifndef __THREAD_QUEUE_h
+#define __THREAD_QUEUE_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/tqdata.h>
+#include <rtems/core/tqdata.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/watchdog.h>
/*
* The following type defines the callout used when a remote task
@@ -75,7 +75,7 @@ Thread_Control *_Thread_queue_Dequeue(
void _Thread_queue_Enqueue(
Thread_queue_Control *the_thread_queue,
- rtems_interval timeout
+ Watchdog_Interval timeout
);
/*
@@ -131,7 +131,8 @@ Thread_Control *_Thread_queue_First(
void _Thread_queue_Flush(
Thread_queue_Control *the_thread_queue,
- Thread_queue_Flush_callout remote_extract_callout
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
);
/*
@@ -149,7 +150,8 @@ void _Thread_queue_Initialize(
Objects_Classes the_class,
Thread_queue_Disciplines the_discipline,
States_Control state,
- Thread_queue_Extract_callout proxy_extract_callout
+ Thread_queue_Extract_callout proxy_extract_callout,
+ unsigned32 timeout_status
);
/*
@@ -179,7 +181,7 @@ Thread_Control *_Thread_queue_Dequeue_priority(
void _Thread_queue_Enqueue_priority(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
- rtems_interval timeout
+ Watchdog_Interval timeout
);
/*
@@ -231,13 +233,13 @@ Thread_Control *_Thread_queue_Dequeue_fifo(
*
* This routine enqueues the currently executing thread on
* the_thread_queue with an optional timeout using the
- * RTEMS_FIFO discipline.
+ * FIFO discipline.
*/
void _Thread_queue_Enqueue_fifo(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
- rtems_interval timeout
+ Watchdog_Interval timeout
);
/*
diff --git a/cpukit/score/include/rtems/score/tod.h b/cpukit/score/include/rtems/score/tod.h
index ae7e2b9747..6c2882a3c5 100644
--- a/cpukit/score/include/rtems/score/tod.h
+++ b/cpukit/score/include/rtems/score/tod.h
@@ -14,15 +14,15 @@
* $Id$
*/
-#ifndef __RTEMS_TIME_OF_DAY_h
-#define __RTEMS_TIME_OF_DAY_h
+#ifndef __TIME_OF_DAY_h
+#define __TIME_OF_DAY_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/object.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/object.h>
+#include <rtems/core/watchdog.h>
/*
* The following constants are related to the time of day.
@@ -42,7 +42,7 @@ extern "C" {
/*
* The following constant define the earliest year to which an
- * RTEMS time of day can be initialized. This is considered the
+ * time of day can be initialized. This is considered the
* epoch.
*/
@@ -61,27 +61,27 @@ typedef struct { /* RTEID style time/date */
unsigned32 minute; /* minute, 0 -> 59 */
unsigned32 second; /* second, 0 -> 59 */
unsigned32 ticks; /* elapsed ticks between secs */
-} rtems_time_of_day;
+} TOD_Control;
/*
* The following contains the current time of day.
*/
-EXTERN rtems_time_of_day _TOD_Current;
+EXTERN TOD_Control _TOD_Current;
/*
* The following contains the number of seconds from 00:00:00
* January 1, TOD_BASE_YEAR until the current time of day.
*/
-EXTERN rtems_interval _TOD_Seconds_since_epoch;
+EXTERN Watchdog_Interval _TOD_Seconds_since_epoch;
/*
* The following contains the number of ticks since the
* system was booted.
*/
-EXTERN rtems_interval _TOD_Ticks_since_boot;
+EXTERN Watchdog_Interval _TOD_Ticks_since_boot;
/*
* The following contains the number of microseconds per tick.
@@ -173,8 +173,8 @@ void _TOD_Handler_initialization(
*/
void _TOD_Set(
- rtems_time_of_day *the_tod,
- rtems_interval seconds_since_epoch
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
);
/*
@@ -182,12 +182,12 @@ void _TOD_Set(
*
* DESCRIPTION:
*
- * This function returns STATUS.RTEMS_SUCCESSFUL if THE_TOD contains
+ * This function returns TRUE if THE_TOD contains
* a valid time of day, and FALSE otherwise.
*/
-rtems_status_code _TOD_Validate(
- rtems_time_of_day *the_tod
+boolean _TOD_Validate(
+ TOD_Control *the_tod
);
/*
@@ -198,8 +198,8 @@ rtems_status_code _TOD_Validate(
* This function returns the number seconds between the epoch and THE_TOD.
*/
-rtems_interval _TOD_To_seconds(
- rtems_time_of_day *the_tod
+Watchdog_Interval _TOD_To_seconds(
+ TOD_Control *the_tod
);
/*
@@ -243,7 +243,7 @@ STATIC INLINE void _TOD_Deactivate( void );
*/
STATIC INLINE void _TOD_Activate(
- rtems_interval ticks
+ Watchdog_Interval ticks
);
/*
@@ -262,7 +262,7 @@ void _TOD_Tickle(
);
/*
- * RTEMS_MILLISECONDS_TO_MICROSECONDS
+ * TOD_MILLISECONDS_TO_MICROSECONDS
*
* DESCRIPTION:
*
@@ -273,10 +273,10 @@ void _TOD_Tickle(
* This must be a macro so it can be used in "static" tables.
*/
-#define RTEMS_MILLISECONDS_TO_MICROSECONDS(_ms) ((_ms) * 1000)
+#define TOD_MILLISECONDS_TO_MICROSECONDS(_ms) ((_ms) * 1000)
/*
- * RTEMS_MILLISECONDS_TO_TICKS
+ * TOD_MILLISECONDS_TO_TICKS
*
* DESCRIPTION:
*
@@ -287,10 +287,10 @@ void _TOD_Tickle(
* This must be a macro so it can be used in "static" tables.
*/
-#define RTEMS_MILLISECONDS_TO_TICKS(_ms) \
- (RTEMS_MILLISECONDS_TO_MICROSECONDS(_ms) / _TOD_Microseconds_per_tick)
+#define TOD_MILLISECONDS_TO_TICKS(_ms) \
+ (TOD_MILLISECONDS_TO_MICROSECONDS(_ms) / _TOD_Microseconds_per_tick)
-#include <rtems/tod.inl>
+#include <rtems/core/tod.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/tqdata.h b/cpukit/score/include/rtems/score/tqdata.h
index f962f409d2..128c4183a3 100644
--- a/cpukit/score/include/rtems/score/tqdata.h
+++ b/cpukit/score/include/rtems/score/tqdata.h
@@ -14,16 +14,16 @@
* $Id$
*/
-#ifndef __RTEMS_THREAD_QUEUE_DATA_h
-#define __RTEMS_THREAD_QUEUE_DATA_h
+#ifndef __THREAD_QUEUE_DATA_h
+#define __THREAD_QUEUE_DATA_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/chain.h>
-#include <rtems/priority.h>
-#include <rtems/states.h>
+#include <rtems/core/chain.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/states.h>
/*
* The following enumerated type details all of the disciplines
@@ -31,8 +31,8 @@ extern "C" {
*/
typedef enum {
- THREAD_QUEUE_DISCIPLINE_FIFO, /* RTEMS_FIFO queue discipline */
- THREAD_QUEUE_DISCIPLINE_PRIORITY /* RTEMS_PRIORITY queue discipline */
+ THREAD_QUEUE_DISCIPLINE_FIFO, /* FIFO queue discipline */
+ THREAD_QUEUE_DISCIPLINE_PRIORITY /* PRIORITY queue discipline */
} Thread_queue_Disciplines;
/*
@@ -51,6 +51,7 @@ typedef struct {
boolean sync; /* alloc/dealloc critical section */
Thread_queue_Disciplines discipline; /* queue discipline */
States_Control state; /* state of threads on Thread_q */
+ unsigned32 timeout_status;
} Thread_queue_Control;
/*
@@ -80,7 +81,7 @@ STATIC INLINE boolean _Thread_queue_Is_reverse_search (
Priority_Control the_priority
);
-#include <rtems/tqdata.inl>
+#include <rtems/core/tqdata.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/userext.h b/cpukit/score/include/rtems/score/userext.h
index 56fae9b7db..2808b3566e 100644
--- a/cpukit/score/include/rtems/score/userext.h
+++ b/cpukit/score/include/rtems/score/userext.h
@@ -2,7 +2,7 @@
*
* This include file contains all information about user extensions. This
* Handler provides mechanisms which can be used to initialize and manipulate
- * all RTEMS user extensions.
+ * all user extensions.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -15,23 +15,89 @@
* $Id$
*/
-#ifndef __RTEMS_USER_EXTENSIONS_h
-#define __RTEMS_USER_EXTENSIONS_h
+#ifndef __USER_EXTENSIONS_h
+#define __USER_EXTENSIONS_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/config.h>
-#include <rtems/thread.h>
+#include <rtems/core/interr.h>
+#include <rtems/core/chain.h>
+#include <rtems/core/thread.h>
+
+/*
+ * The following records defines the User Extension Table.
+ * This table defines the application dependent routines which
+ * are invoked at critical points in the life of each thread and
+ * the system as a whole.
+ */
+
+typedef void User_extensions_routine;
+
+typedef boolean ( *User_extensions_thread_create_extension )(
+ Thread_Control *,
+ Thread_Control *
+ );
+
+typedef User_extensions_routine ( *User_extensions_thread_delete_extension )(
+ Thread_Control *,
+ Thread_Control *
+ );
+
+typedef User_extensions_routine ( *User_extensions_thread_start_extension )(
+ Thread_Control *,
+ Thread_Control *
+ );
+
+typedef User_extensions_routine ( *User_extensions_thread_restart_extension )(
+ Thread_Control *,
+ Thread_Control *
+ );
+
+typedef User_extensions_routine ( *User_extensions_thread_switch_extension )(
+ Thread_Control *,
+ Thread_Control *
+ );
+
+typedef User_extensions_routine (*User_extensions_thread_post_switch_extension)(
+ Thread_Control *
+ );
+
+typedef User_extensions_routine ( *User_extensions_thread_begin_extension )(
+ Thread_Control *
+ );
+
+typedef User_extensions_routine ( *User_extensions_thread_exitted_extension )(
+ Thread_Control *
+ );
+
+typedef User_extensions_routine ( *User_extensions_fatal_extension )(
+ Internal_errors_Source /* the_source */,
+ boolean /* is_internal */,
+ unsigned32 /* the_error */
+ );
+
+
+typedef struct {
+ User_extensions_thread_create_extension thread_create;
+ User_extensions_thread_start_extension thread_start;
+ User_extensions_thread_restart_extension thread_restart;
+ User_extensions_thread_delete_extension thread_delete;
+ User_extensions_thread_switch_extension thread_switch;
+ User_extensions_thread_post_switch_extension thread_post_switch;
+ User_extensions_thread_begin_extension thread_begin;
+ User_extensions_thread_exitted_extension thread_exitted;
+ User_extensions_fatal_extension fatal;
+} User_extensions_Table;
/*
* The following is used to manage each user extension set.
*/
typedef struct {
- Chain_Node Node;
- rtems_extensions_table Callouts;
+ Chain_Node Node;
+ User_extensions_Table Callouts;
} User_extensions_Control;
/*
@@ -57,7 +123,7 @@ EXTERN Chain_Control _User_extensions_List;
*/
STATIC INLINE void _User_extensions_Handler_initialization (
- rtems_extensions_table *initial_extensions
+ User_extensions_Table *initial_extensions
);
/*
@@ -70,7 +136,19 @@ STATIC INLINE void _User_extensions_Handler_initialization (
STATIC INLINE void _User_extensions_Add_set (
User_extensions_Control *the_extension,
- rtems_extensions_table *extension_table
+ User_extensions_Table *extension_table
+);
+
+/*
+ * _User_extensions_Add_API_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to add an API extension set to the active list.
+ */
+
+STATIC INLINE void _User_extensions_Add_API_set (
+ User_extensions_Control *the_extension
);
/*
@@ -86,59 +164,59 @@ STATIC INLINE void _User_extensions_Remove_set (
);
/*
- * _User_extensions_Task_create
+ * _User_extensions_Thread_create
*
* DESCRIPTION:
*
* This routine is used to invoke the user extension for
- * the rtems_task_create directive.
+ * the thread creation operate.
*/
-STATIC INLINE void _User_extensions_Task_create (
+boolean _User_extensions_Thread_create (
Thread_Control *the_thread
);
/*
- * _User_extensions_Task_delete
+ * _User_extensions_Thread_delete
*
* DESCRIPTION:
*
* This routine is used to invoke the user extension for
- * the rtems_task_delete directive.
+ * the thread deletion operation.
*/
-STATIC INLINE void _User_extensions_Task_delete (
+void _User_extensions_Thread_delete (
Thread_Control *the_thread
);
/*
- * _User_extensions_Task_start
+ * _User_extensions_Thread_start
*
* DESCRIPTION:
*
* This routine is used to invoke the user extension for
- * the rtems_task_start directive.
+ * the thread start operation.
*/
-STATIC INLINE void _User_extensions_Task_start (
+void _User_extensions_Thread_start (
Thread_Control *the_thread
);
/*
- * _User_extensions_Task_restart
+ * _User_extensions_Thread_restart
*
* DESCRIPTION:
*
* This routine is used to invoke the user extension for
- * the rtems_task_restart directive.
+ * the thread restart operation.
*/
-STATIC INLINE void _User_extensions_Task_restart (
+void _User_extensions_Thread_restart (
Thread_Control *the_thread
);
/*
- * _User_extensions_Task_switch
+ * _User_extensions_Thread_switch
*
* DESCRIPTION:
*
@@ -146,47 +224,49 @@ STATIC INLINE void _User_extensions_Task_restart (
* is invoked when a context switch occurs.
*/
-STATIC INLINE void _User_extensions_Task_switch (
+STATIC INLINE void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
);
/*
- * _User_extensions_Task_begin
+ * _User_extensions_Thread_post_switch
*
* DESCRIPTION:
*
- * This routine is used to invoke the user extension which
- * is invoked when a task begins.
+ * This routine is used to invoke the user extension which is invoked
+ * after a context switch occurs (i.e. we are running in the context
+ * of the new thread).
*/
-
-STATIC INLINE void _User_extensions_Task_begin (
+
+STATIC INLINE void _User_extensions_Thread_post_switch (
Thread_Control *executing
);
+
/*
- * _User_extensions_Task_exitted
+ * _User_extensions_Thread_begin
*
* DESCRIPTION:
*
* This routine is used to invoke the user extension which
- * is invoked when a task exits.
+ * is invoked when a thread begins.
*/
-STATIC INLINE void _User_extensions_Task_exitted (
+void _User_extensions_Thread_begin (
Thread_Control *executing
);
/*
- * _User_extensions_Task_exitted
+ * _User_extensions_Thread_exitted
*
* DESCRIPTION:
*
* This routine is used to invoke the user extension which
- * is invoked when a task exits.
+ * is invoked when a thread exits.
*/
-STATIC INLINE void _User_extensions_Task_exitted (
+void _User_extensions_Thread_exitted (
Thread_Control *executing
);
@@ -195,15 +275,17 @@ STATIC INLINE void _User_extensions_Task_exitted (
*
* DESCRIPTION:
*
- * This routine is used to invoke the user extension for
- * the rtems_fatal_error_occurred directive.
+ * This routine is used to invoke the user extension invoked
+ * when a fatal error occurs.
*/
-STATIC INLINE void _User_extensions_Fatal (
- unsigned32 the_error
+void _User_extensions_Fatal (
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ unsigned32 the_error
);
-#include <rtems/userext.inl>
+#include <rtems/core/userext.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/watchdog.h b/cpukit/score/include/rtems/score/watchdog.h
index 70de7018dd..7e871c8881 100644
--- a/cpukit/score/include/rtems/score/watchdog.h
+++ b/cpukit/score/include/rtems/score/watchdog.h
@@ -15,29 +15,29 @@
* $Id$
*/
-#ifndef __RTEMS_WATCHDOG_h
-#define __RTEMS_WATCHDOG_h
+#ifndef __WATCHDOG_h
+#define __WATCHDOG_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/object.h>
+#include <rtems/core/object.h>
/*
* The following type defines the control block used to manage
* intervals.
*/
-typedef unsigned32 rtems_interval;
+typedef unsigned32 Watchdog_Interval;
/*
- * The following types define a pointer to a watchdog/timer service routine.
+ * The following types define a pointer to a watchdog service routine.
*/
-typedef void rtems_timer_service_routine;
+typedef void Watchdog_Service_routine;
-typedef rtems_timer_service_routine ( *rtems_timer_service_routine_entry )(
+typedef Watchdog_Service_routine ( *Watchdog_Service_routine_entry )(
Objects_Id,
void *
);
@@ -46,7 +46,7 @@ typedef rtems_timer_service_routine ( *rtems_timer_service_routine_entry )(
* Constant for indefinite wait. (actually an illegal interval)
*/
-#define RTEMS_NO_TIMEOUT 0
+#define WATCHDOG_NO_TIMEOUT 0
/*
* The following enumerated type details the modes in which the
@@ -92,9 +92,9 @@ typedef enum {
typedef struct {
Chain_Node Node;
Watchdog_States state;
- rtems_interval initial;
- rtems_interval delta_interval;
- rtems_timer_service_routine_entry routine;
+ Watchdog_Interval initial;
+ Watchdog_Interval delta_interval;
+ Watchdog_Service_routine_entry routine;
Objects_Id id;
void *user_data;
} Watchdog_Control;
@@ -140,7 +140,7 @@ void _Watchdog_Handler_initialization( void );
STATIC INLINE void _Watchdog_Initialize(
Watchdog_Control *the_watchdog,
- rtems_timer_service_routine_entry routine,
+ Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
);
@@ -238,7 +238,7 @@ STATIC INLINE void _Watchdog_Tickle_seconds( void );
STATIC INLINE void _Watchdog_Insert_ticks(
Watchdog_Control *the_watchdog,
- rtems_interval units,
+ Watchdog_Interval units,
Watchdog_Insert_modes insert_mode
);
@@ -256,7 +256,7 @@ STATIC INLINE void _Watchdog_Insert_ticks(
STATIC INLINE void _Watchdog_Insert_seconds(
Watchdog_Control *the_watchdog,
- rtems_interval units,
+ Watchdog_Interval units,
Watchdog_Insert_modes insert_mode
);
@@ -273,7 +273,7 @@ STATIC INLINE void _Watchdog_Insert_seconds(
STATIC INLINE void _Watchdog_Adjust_seconds(
Watchdog_Adjust_directions direction,
- rtems_interval units
+ Watchdog_Interval units
);
/*
@@ -288,7 +288,7 @@ STATIC INLINE void _Watchdog_Adjust_seconds(
STATIC INLINE void _Watchdog_Adjust_ticks(
Watchdog_Adjust_directions direction,
- rtems_interval units
+ Watchdog_Interval units
);
/*
@@ -374,7 +374,7 @@ STATIC INLINE Watchdog_Control *_Watchdog_Last(
void _Watchdog_Adjust (
Chain_Control *header,
Watchdog_Adjust_directions direction,
- rtems_interval units
+ Watchdog_Interval units
);
/*
@@ -408,7 +408,7 @@ void _Watchdog_Tickle (
Chain_Control *header
);
-#include <rtems/watchdog.inl>
+#include <rtems/core/watchdog.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/score/wkspace.h b/cpukit/score/include/rtems/score/wkspace.h
index 7050be6953..a262761d68 100644
--- a/cpukit/score/include/rtems/score/wkspace.h
+++ b/cpukit/score/include/rtems/score/wkspace.h
@@ -1,8 +1,8 @@
/* wkspace.h
*
- * This include file contains information related to the RTEMS
+ * This include file contains information related to the
* RAM Workspace. This Handler provides mechanisms which can be used to
- * define, initialize and manipulate the RTEMS workspace.
+ * define, initialize and manipulate the workspace.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -15,19 +15,18 @@
* $Id$
*/
-#ifndef __RTEMS_WORKSPACE_h
-#define __RTEMS_WORKSPACE_h
+#ifndef __WORKSPACE_h
+#define __WORKSPACE_h
#ifdef __cplusplus
extern "C" {
#endif
-#include <rtems/heap.h>
-#include <rtems/fatal.h>
-#include <rtems/status.h>
+#include <rtems/core/heap.h>
+#include <rtems/core/interr.h>
/*
- * The following is used to manage the RTEMS Workspace.
+ * The following is used to manage the Workspace.
*
*/
@@ -67,8 +66,7 @@ STATIC INLINE void *_Workspace_Allocate(
*
* This routine returns the address of a block of memory of size
* bytes. If a block of the appropriate size cannot be allocated
- * from the workspace, then the rtems_fatal_error_occurred directive
- * is invoked.
+ * from the workspace, then the internal error handler is invoked.
*/
void *_Workspace_Allocate_or_fatal_error(
@@ -89,7 +87,7 @@ STATIC INLINE boolean _Workspace_Free(
void *block
);
-#include <rtems/wkspace.inl>
+#include <rtems/core/wkspace.inl>
#ifdef __cplusplus
}
diff --git a/cpukit/score/include/rtems/system.h b/cpukit/score/include/rtems/system.h
index 5f627c1a7c..037fe93e66 100644
--- a/cpukit/score/include/rtems/system.h
+++ b/cpukit/score/include/rtems/system.h
@@ -76,9 +76,7 @@ extern "C" {
typedef void * proc_ptr;
-#include <rtems/cpu.h> /* processor specific information */
-#include <rtems/status.h> /* RTEMS status codes */
-#include <rtems/directives.h>
+#include <rtems/core/cpu.h> /* processor specific information */
/*
* Define NULL
@@ -116,12 +114,6 @@ extern const char _RTEMS_version[]; /* RTEMS version string */
extern const char _Copyright_Notice[]; /* RTEMS copyright string */
/*
- * The jump table of entry points into RTEMS directives.
- */
-
-extern const void * _Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ];
-
-/*
* The following defines the CPU dependent information table.
*/
diff --git a/cpukit/score/inline/rtems/score/address.inl b/cpukit/score/inline/rtems/score/address.inl
index f9189e625e..dd2a789b1e 100644
--- a/cpukit/score/inline/rtems/score/address.inl
+++ b/cpukit/score/inline/rtems/score/address.inl
@@ -28,7 +28,7 @@ STATIC INLINE void *_Addresses_Add_offset (
unsigned32 offset
)
{
- return (base + offset);
+ return (void *)((char *)base + offset);
}
/*PAGE
@@ -42,23 +42,7 @@ STATIC INLINE void *_Addresses_Subtract_offset (
unsigned32 offset
)
{
- return (base - offset);
-}
-
-/*PAGE
- *
- * _Addresses_Add
- *
- * NOTE: The cast of an address to an unsigned32 makes this code
- * dependent on an addresses being thirty two bits.
- */
-
-STATIC INLINE void *_Addresses_Add (
- void *left,
- void *right
-)
-{
- return (left + (unsigned32)right);
+ return (void *)((char *)base - offset);
}
/*PAGE
diff --git a/cpukit/score/inline/rtems/score/coremutex.inl b/cpukit/score/inline/rtems/score/coremutex.inl
new file mode 100644
index 0000000000..8681795085
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/coremutex.inl
@@ -0,0 +1,104 @@
+/* inline/coremutex.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE mutexes.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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 __INLINE_CORE_MUTEX_inl
+#define __INLINE_CORE_MUTEX_inl
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_locked
+ *
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_locked(
+ CORE_mutex_Control *the_mutex
+)
+{
+ return the_mutex->lock == CORE_MUTEX_LOCKED;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_fifo
+ *
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_fifo(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_FIFO;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_priority
+ *
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_priority(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_inherit_priority
+ *
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_inherit_priority(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_priority_ceiling
+ *
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_priority_ceiling(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_nesting_allowed
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex allows a task to obtain a
+ * semaphore more than once and nest.
+ */
+
+STATIC INLINE boolean _CORE_mutex_Is_nesting_allowed(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->allow_nesting == TRUE;
+
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/coresem.inl b/cpukit/score/inline/rtems/score/coresem.inl
new file mode 100644
index 0000000000..53f7d68595
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/coresem.inl
@@ -0,0 +1,47 @@
+/* inline/coresem.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE semaphore.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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 __INLINE_CORE_SEMAPHORE_inl
+#define __INLINE_CORE_SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _CORE_semaphore_Is_priority
+ *
+ */
+
+STATIC INLINE boolean _CORE_semaphore_Is_priority(
+ CORE_semaphore_Attributes *the_attribute
+)
+{
+ return ( the_attribute->discipline == CORE_SEMAPHORE_DISCIPLINES_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _CORE_semaphore_Get_count
+ *
+ */
+
+STATIC INLINE unsigned32 _CORE_semaphore_Get_count(
+ CORE_semaphore_Control *the_semaphore
+)
+{
+ return the_semaphore->count;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/heap.inl b/cpukit/score/inline/rtems/score/heap.inl
index 58be9b02af..c28f1a6067 100644
--- a/cpukit/score/inline/rtems/score/heap.inl
+++ b/cpukit/score/inline/rtems/score/heap.inl
@@ -17,7 +17,7 @@
#ifndef __HEAP_inl
#define __HEAP_inl
-#include <rtems/address.h>
+#include <rtems/core/address.h>
/*PAGE
*
diff --git a/cpukit/score/inline/rtems/score/isr.inl b/cpukit/score/inline/rtems/score/isr.inl
index f44880c3b6..222fcadb17 100644
--- a/cpukit/score/inline/rtems/score/isr.inl
+++ b/cpukit/score/inline/rtems/score/isr.inl
@@ -19,18 +19,6 @@
/*PAGE
*
- * _ISR_Handler_initialization
- *
- */
-
-STATIC INLINE void _ISR_Handler_initialization ( void )
-{
- _ISR_Signals_to_thread_executing = FALSE;
- _ISR_Nest_level = 0;
-}
-
-/*PAGE
- *
* _ISR_Is_in_progress
*
*/
diff --git a/cpukit/score/inline/rtems/score/mppkt.inl b/cpukit/score/inline/rtems/score/mppkt.inl
index 22ec30a28c..c23d756ec9 100644
--- a/cpukit/score/inline/rtems/score/mppkt.inl
+++ b/cpukit/score/inline/rtems/score/mppkt.inl
@@ -26,7 +26,7 @@
*/
STATIC INLINE boolean _Mp_packet_Is_valid_packet_class (
- rtems_mp_packet_classes the_packet_class
+ MP_packet_Classes the_packet_class
)
{
return ( the_packet_class <= MP_PACKET_CLASSES_LAST );
@@ -39,7 +39,7 @@ STATIC INLINE boolean _Mp_packet_Is_valid_packet_class (
*/
STATIC INLINE boolean _Mp_packet_Is_null (
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
)
{
return the_packet == NULL;
diff --git a/cpukit/score/inline/rtems/score/object.inl b/cpukit/score/inline/rtems/score/object.inl
index b6ae73a351..eb07a24890 100644
--- a/cpukit/score/inline/rtems/score/object.inl
+++ b/cpukit/score/inline/rtems/score/object.inl
@@ -36,10 +36,10 @@ STATIC INLINE Objects_Id _Objects_Build_id(
/*PAGE
*
- * rtems_get_class
+ * _Objects_Get_class
*/
-STATIC INLINE Objects_Classes rtems_get_class(
+STATIC INLINE Objects_Classes _Objects_Get_class(
Objects_Id id
)
{
@@ -50,11 +50,11 @@ STATIC INLINE Objects_Classes rtems_get_class(
/*PAGE
*
- * rtems_get_node
+ * _Objects_Get_node
*
*/
-STATIC INLINE unsigned32 rtems_get_node(
+STATIC INLINE unsigned32 _Objects_Get_node(
Objects_Id id
)
{
@@ -63,11 +63,11 @@ STATIC INLINE unsigned32 rtems_get_node(
/*PAGE
*
- * rtems_get_index
+ * _Objects_Get_index
*
*/
-STATIC INLINE unsigned32 rtems_get_index(
+STATIC INLINE unsigned32 _Objects_Get_index(
Objects_Id id
)
{
@@ -110,7 +110,7 @@ STATIC INLINE boolean _Objects_Is_local_id(
Objects_Id id
)
{
- return _Objects_Is_local_node( rtems_get_node(id) );
+ return _Objects_Is_local_node( _Objects_Get_node(id) );
}
/*PAGE
@@ -168,7 +168,7 @@ STATIC INLINE void _Objects_Open(
{
unsigned32 index;
- index = rtems_get_index( the_object->id );
+ index = _Objects_Get_index( the_object->id );
information->local_table[ index ] = the_object;
if ( information->is_string )
@@ -190,7 +190,7 @@ STATIC INLINE void _Objects_Close(
{
unsigned32 index;
- index = rtems_get_index( the_object->id );
+ index = _Objects_Get_index( the_object->id );
information->local_table[ index ] = NULL;
_Objects_Clear_name( the_object->name, information->name_length );
}
diff --git a/cpukit/score/inline/rtems/score/priority.inl b/cpukit/score/inline/rtems/score/priority.inl
index b2bc8535ff..0ecd3c64a4 100644
--- a/cpukit/score/inline/rtems/score/priority.inl
+++ b/cpukit/score/inline/rtems/score/priority.inl
@@ -17,7 +17,7 @@
#ifndef __PRIORITY_inl
#define __PRIORITY_inl
-#include <rtems/bitfield.h>
+#include <rtems/core/bitfield.h>
/*PAGE
*
@@ -44,8 +44,12 @@ STATIC INLINE boolean _Priority_Is_valid (
Priority_Control the_priority
)
{
- return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
- ( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
+ /*
+ * Since PRIORITY_MINIMUM is 0 and priorities are stored unsigned,
+ * then checking for less than 0 is unnecessary.
+ */
+
+ return ( the_priority <= PRIORITY_MAXIMUM );
}
/*PAGE
diff --git a/cpukit/score/inline/rtems/score/stack.inl b/cpukit/score/inline/rtems/score/stack.inl
index 24a6d9d873..7c6acf7cb3 100644
--- a/cpukit/score/inline/rtems/score/stack.inl
+++ b/cpukit/score/inline/rtems/score/stack.inl
@@ -43,7 +43,7 @@ STATIC INLINE boolean _Stack_Is_enough (
unsigned32 size
)
{
- return ( size >= RTEMS_MINIMUM_STACK_SIZE );
+ return ( size >= STACK_MINIMUM_SIZE );
}
/*PAGE
diff --git a/cpukit/score/inline/rtems/score/states.inl b/cpukit/score/inline/rtems/score/states.inl
index 316f40e4eb..23ee8cacbc 100644
--- a/cpukit/score/inline/rtems/score/states.inl
+++ b/cpukit/score/inline/rtems/score/states.inl
@@ -1,7 +1,7 @@
/* states.inl
*
* This file contains the macro implementation of the inlined
- * routines associated with RTEMS state information.
+ * routines associated with thread state information.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -177,6 +177,19 @@ STATIC INLINE boolean _States_Is_waiting_for_event (
/*PAGE
*
+ * _States_Is_waiting_for_mutex
+ *
+ */
+
+STATIC INLINE boolean _States_Is_waiting_for_mutex (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_MUTEX);
+}
+
+/*PAGE
+ *
* _States_Is_waiting_for_semaphore
*
*/
diff --git a/cpukit/score/inline/rtems/score/sysstate.inl b/cpukit/score/inline/rtems/score/sysstate.inl
index 14d838cb14..180e6abe54 100644
--- a/cpukit/score/inline/rtems/score/sysstate.inl
+++ b/cpukit/score/inline/rtems/score/sysstate.inl
@@ -19,6 +19,19 @@
/*PAGE
*
+ * _System_state_Handler_initialization
+ */
+
+STATIC INLINE void _System_state_Handler_initialization (
+ boolean is_multiprocessing
+)
+{
+ _System_state_Current = SYSTEM_STATE_BEFORE_INITIALIZATION;
+ _System_state_Is_multiprocessing = is_multiprocessing;
+}
+
+/*PAGE
+ *
* _System_state_Set
*/
diff --git a/cpukit/score/inline/rtems/score/thread.inl b/cpukit/score/inline/rtems/score/thread.inl
index 2a1049f241..e326410112 100644
--- a/cpukit/score/inline/rtems/score/thread.inl
+++ b/cpukit/score/inline/rtems/score/thread.inl
@@ -248,7 +248,7 @@ STATIC INLINE Thread_Control *_Thread_Get (
return( _Thread_Executing );
}
- the_class = rtems_get_class( id );
+ the_class = _Objects_Get_class( id );
if ( the_class > OBJECTS_CLASSES_LAST ) {
*location = OBJECTS_ERROR;
@@ -265,5 +265,17 @@ STATIC INLINE Thread_Control *_Thread_Get (
return (Thread_Control *) _Objects_Get( information, id, location );
}
+/*
+ * _Thread_Is_proxy_blocking
+ *
+ */
+
+STATIC INLINE boolean _Thread_Is_proxy_blocking (
+ unsigned32 code
+)
+{
+ return (code == THREAD_STATUS_PROXY_BLOCKING);
+}
+
#endif
/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/tod.inl b/cpukit/score/inline/rtems/score/tod.inl
index dadcdabcda..d2e26e2f2a 100644
--- a/cpukit/score/inline/rtems/score/tod.inl
+++ b/cpukit/score/inline/rtems/score/tod.inl
@@ -58,7 +58,7 @@ STATIC INLINE void _TOD_Deactivate( void )
*/
STATIC INLINE void _TOD_Activate(
- rtems_interval ticks
+ Watchdog_Interval ticks
)
{
_Watchdog_Insert_ticks(
diff --git a/cpukit/score/inline/rtems/score/userext.inl b/cpukit/score/inline/rtems/score/userext.inl
index fa5a31c37b..697a7eddd0 100644
--- a/cpukit/score/inline/rtems/score/userext.inl
+++ b/cpukit/score/inline/rtems/score/userext.inl
@@ -24,7 +24,7 @@
*/
STATIC INLINE void _User_extensions_Handler_initialization (
- rtems_extensions_table *initial_extensions
+ User_extensions_Table *initial_extensions
)
{
_Chain_Initialize_empty( &_User_extensions_List );
@@ -42,7 +42,7 @@ STATIC INLINE void _User_extensions_Handler_initialization (
STATIC INLINE void _User_extensions_Add_set (
User_extensions_Control *the_extension,
- rtems_extensions_table *extension_table
+ User_extensions_Table *extension_table
)
{
the_extension->Callouts = *extension_table;
@@ -52,130 +52,35 @@ STATIC INLINE void _User_extensions_Add_set (
/*PAGE
*
- * _User_extensions_Remove_set
- */
-
-STATIC INLINE void _User_extensions_Remove_set (
- User_extensions_Control *the_extension
-)
-{
- _Chain_Extract( &the_extension->Node );
-}
-
-/*PAGE
- *
- * _User_extensions_Task_create
- *
+ * _User_extensions_Add_API_set
*/
-
-STATIC INLINE void _User_extensions_Task_create (
- Thread_Control *the_thread
+
+STATIC INLINE void _User_extensions_Add_API_set (
+ User_extensions_Control *the_extension
)
{
- Chain_Node *the_node;
- User_extensions_Control *the_extension;
-
- for ( the_node = _User_extensions_List.first ;
- !_Chain_Is_tail( &_User_extensions_List, the_node ) ;
- the_node = the_node->next ) {
-
- the_extension = (User_extensions_Control *) the_node;
-
- if ( the_extension->Callouts.rtems_task_create != NULL )
- (*the_extension->Callouts.rtems_task_create)(
- _Thread_Executing,
- the_thread
- );
- }
+ _Chain_Prepend( &_User_extensions_List, &the_extension->Node );
}
-
+
/*PAGE
*
- * _User_extensions_Task_delete
- */
-
-STATIC INLINE void _User_extensions_Task_delete (
- Thread_Control *the_thread
-)
-{
- Chain_Node *the_node;
- User_extensions_Control *the_extension;
-
- for ( the_node = _User_extensions_List.last ;
- !_Chain_Is_head( &_User_extensions_List, the_node ) ;
- the_node = the_node->previous ) {
-
- the_extension = (User_extensions_Control *) the_node;
-
- if ( the_extension->Callouts.rtems_task_delete != NULL )
- (*the_extension->Callouts.rtems_task_delete)(
- _Thread_Executing,
- the_thread
- );
- }
-}
-
-/*PAGE
- *
- * _User_extensions_Task_start
- *
- */
-
-STATIC INLINE void _User_extensions_Task_start (
- Thread_Control *the_thread
-)
-{
- Chain_Node *the_node;
- User_extensions_Control *the_extension;
-
- for ( the_node = _User_extensions_List.first ;
- !_Chain_Is_tail( &_User_extensions_List, the_node ) ;
- the_node = the_node->next ) {
-
- the_extension = (User_extensions_Control *) the_node;
-
- if ( the_extension->Callouts.rtems_task_start != NULL )
- (*the_extension->Callouts.rtems_task_start)(
- _Thread_Executing,
- the_thread
- );
- }
-}
-
-/*PAGE
- *
- * _User_extensions_Task_restart
- *
+ * _User_extensions_Remove_set
*/
-STATIC INLINE void _User_extensions_Task_restart (
- Thread_Control *the_thread
+STATIC INLINE void _User_extensions_Remove_set (
+ User_extensions_Control *the_extension
)
{
- Chain_Node *the_node;
- User_extensions_Control *the_extension;
-
- for ( the_node = _User_extensions_List.first ;
- !_Chain_Is_tail( &_User_extensions_List, the_node ) ;
- the_node = the_node->next ) {
-
- the_extension = (User_extensions_Control *) the_node;
-
- if ( the_extension->Callouts.rtems_task_restart != NULL )
- (*the_extension->Callouts.rtems_task_restart)(
- _Thread_Executing,
- the_thread
- );
- }
+ _Chain_Extract( &the_extension->Node );
}
/*PAGE
*
- * _User_extensions_Task_switch
+ * _User_extensions_Thread_switch
*
*/
-STATIC INLINE void _User_extensions_Task_switch (
+STATIC INLINE void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
@@ -189,78 +94,32 @@ STATIC INLINE void _User_extensions_Task_switch (
the_extension = (User_extensions_Control *) the_node;
- if ( the_extension->Callouts.task_switch != NULL )
- (*the_extension->Callouts.task_switch)( executing, heir );
+ if ( the_extension->Callouts.thread_switch != NULL )
+ (*the_extension->Callouts.thread_switch)( executing, heir );
}
}
/*PAGE
*
- * _User_extensions_Task_begin
+ * _User_extensions_Thread_post_switch
*
*/
-
-STATIC INLINE void _User_extensions_Task_begin (
+
+STATIC INLINE void _User_extensions_Thread_post_switch (
Thread_Control *executing
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
-
+
for ( the_node = _User_extensions_List.first ;
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
-
- the_extension = (User_extensions_Control *) the_node;
-
- if ( the_extension->Callouts.task_begin != NULL )
- (*the_extension->Callouts.task_begin)( executing );
- }
-}
-
-/*PAGE
- *
- * _User_extensions_Task_exitted
- */
-
-STATIC INLINE void _User_extensions_Task_exitted (
- Thread_Control *executing
-)
-{
- Chain_Node *the_node;
- User_extensions_Control *the_extension;
-
- for ( the_node = _User_extensions_List.last ;
- !_Chain_Is_head( &_User_extensions_List, the_node ) ;
- the_node = the_node->previous ) {
-
+
the_extension = (User_extensions_Control *) the_node;
-
- if ( the_extension->Callouts.task_exitted != NULL )
- (*the_extension->Callouts.task_exitted)( executing );
- }
-}
-
-/*PAGE
- *
- * _User_extensions_Fatal
- */
-
-STATIC INLINE void _User_extensions_Fatal (
- unsigned32 the_error
-)
-{
- Chain_Node *the_node;
- User_extensions_Control *the_extension;
-
- for ( the_node = _User_extensions_List.last ;
- !_Chain_Is_head( &_User_extensions_List, the_node ) ;
- the_node = the_node->previous ) {
-
- the_extension = (User_extensions_Control *) the_node;
-
- if ( the_extension->Callouts.fatal != NULL )
- (*the_extension->Callouts.fatal)( the_error );
+
+ if ( the_extension->Callouts.thread_post_switch != NULL )
+ (*the_extension->Callouts.thread_post_switch)( executing );
}
}
diff --git a/cpukit/score/inline/rtems/score/watchdog.inl b/cpukit/score/inline/rtems/score/watchdog.inl
index 2e7dca0381..bb7edb82ed 100644
--- a/cpukit/score/inline/rtems/score/watchdog.inl
+++ b/cpukit/score/inline/rtems/score/watchdog.inl
@@ -24,10 +24,10 @@
*/
STATIC INLINE void _Watchdog_Initialize(
- Watchdog_Control *the_watchdog,
- rtems_timer_service_routine_entry routine,
- Objects_Id id,
- void *user_data
+ Watchdog_Control *the_watchdog,
+ Watchdog_Service_routine_entry routine,
+ Objects_Id id,
+ void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
@@ -115,7 +115,7 @@ STATIC INLINE void _Watchdog_Tickle_seconds( void )
STATIC INLINE void _Watchdog_Insert_ticks(
Watchdog_Control *the_watchdog,
- rtems_interval units,
+ Watchdog_Interval units,
Watchdog_Insert_modes insert_mode
)
{
@@ -134,7 +134,7 @@ STATIC INLINE void _Watchdog_Insert_ticks(
STATIC INLINE void _Watchdog_Insert_seconds(
Watchdog_Control *the_watchdog,
- rtems_interval units,
+ Watchdog_Interval units,
Watchdog_Insert_modes insert_mode
)
{
@@ -153,7 +153,7 @@ STATIC INLINE void _Watchdog_Insert_seconds(
STATIC INLINE void _Watchdog_Adjust_seconds(
Watchdog_Adjust_directions direction,
- rtems_interval units
+ Watchdog_Interval units
)
{
@@ -169,7 +169,7 @@ STATIC INLINE void _Watchdog_Adjust_seconds(
STATIC INLINE void _Watchdog_Adjust_ticks(
Watchdog_Adjust_directions direction,
- rtems_interval units
+ Watchdog_Interval units
)
{
diff --git a/cpukit/score/inline/rtems/score/wkspace.inl b/cpukit/score/inline/rtems/score/wkspace.inl
index 39d5ad8eb8..36ed61d565 100644
--- a/cpukit/score/inline/rtems/score/wkspace.inl
+++ b/cpukit/score/inline/rtems/score/wkspace.inl
@@ -1,7 +1,7 @@
/* wkspace.inl
*
* This include file contains the bodies of the routines which contains
- * information related to the RTEMS RAM Workspace.
+ * information related to the RAM Workspace.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -32,9 +32,12 @@ STATIC INLINE void _Workspace_Handler_initialization(
unsigned32 index;
unsigned32 memory_available;
- if ( (starting_address == NULL) ||
- !_Addresses_Is_aligned( starting_address ) )
- rtems_fatal_error_occurred( RTEMS_INVALID_ADDRESS );
+ if ( !starting_address || !_Addresses_Is_aligned( starting_address ) )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS
+ );
if ( _CPU_Table.do_zero_of_workspace ) {
for( zero_out_array = (unsigned32 *) starting_address, index = 0 ;
@@ -51,7 +54,11 @@ STATIC INLINE void _Workspace_Handler_initialization(
);
if ( memory_available == 0 )
- rtems_fatal_error_occurred( RTEMS_UNSATISFIED );
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
+ );
}
/*PAGE
diff --git a/cpukit/score/macros/rtems/score/address.inl b/cpukit/score/macros/rtems/score/address.inl
index f2672f2500..c0d45c3c6b 100644
--- a/cpukit/score/macros/rtems/score/address.inl
+++ b/cpukit/score/macros/rtems/score/address.inl
@@ -24,7 +24,7 @@
*/
#define _Addresses_Add_offset( _base, _offset ) \
- ((void *)(_base) + (_offset))
+ ((void *)((char *)(_base) + (_offset)))
/*PAGE
*
@@ -33,18 +33,7 @@
*/
#define _Addresses_Subtract_offset( _base, _offset ) \
- ((void *)(_base) - (_offset))
-
-/*PAGE
- *
- * _Addresses_Add
- *
- * NOTE: The cast of an address to an unsigned32 makes this code
- * dependent on an addresses being thirty two bits.
- */
-
-#define _Addresses_Add( _left, _right ) \
- ((void *)(_left) + (unsigned32)(_right))
+ ((void *)((char *)(_base) - (_offset)))
/*PAGE
*
diff --git a/cpukit/score/macros/rtems/score/coremutex.inl b/cpukit/score/macros/rtems/score/coremutex.inl
new file mode 100644
index 0000000000..e8dbc9322c
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/coremutex.inl
@@ -0,0 +1,77 @@
+/* macros/coremutex.h
+ *
+ * This include file contains all of the inlined routines associated
+ * with core mutexes.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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 __MACROS_CORE_MUTEX_h
+#define __MACROS_CORE_MUTEX_h
+
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_locked
+ *
+ */
+
+#define _CORE_mutex_Is_locked( _the_mutex ) \
+ ( (_the_mutex)->lock == CORE_MUTEX_LOCKED )
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_fifo
+ *
+ */
+
+#define _CORE_mutex_Is_fifo( _the_attribute ) \
+ ( (_the_attribute)->discipline == CORE_MUTEX_DISCIPLINES_FIFO )
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_priority
+ *
+ */
+
+#define _CORE_mutex_Is_priority( _the_attribute ) \
+ ( (_the_attribute)->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY )
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_inherit_priority
+ *
+ */
+
+#define _CORE_mutex_Is_inherit_priority( _the_attribute ) \
+ ( (_the_attribute)->discipline == \
+ CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT )
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_priority_ceiling
+ *
+ */
+
+#define _CORE_mutex_Is_priority_ceiling( _the_attribute )\
+ ( (_the_attribute)->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING )
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_nesting_allowed
+ *
+ */
+
+#define _CORE_mutex_Is_nesting_allowed( _the_attribute ) \
+ ( (_the_attribute)->allow_nesting == TRUE )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/coresem.inl b/cpukit/score/macros/rtems/score/coresem.inl
new file mode 100644
index 0000000000..499b4a1433
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/coresem.inl
@@ -0,0 +1,40 @@
+/* macros/coresem.h
+ *
+ * This include file contains all of the inlined routines associated
+ * with core semaphores.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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 __MACROS_CORE_SEMAPHORE_h
+#define __MACROS_CORE_SEMAPHORE_h
+
+/*PAGE
+ *
+ * _CORE_semaphore_Is_priority
+ *
+ */
+
+#define _CORE_semaphore_Is_priority( _the_attribute ) \
+ ( (_the_attribute)->discipline == CORE_SEMAPHORE_DISCIPLINES_PRIORITY )
+
+/*PAGE
+ *
+ * _Core_semaphore_Get_count
+ *
+ */
+
+#define _Core_semaphore_Get_count( _the_semaphore ) \
+ ( (_the_semaphore)->count )
+
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/heap.inl b/cpukit/score/macros/rtems/score/heap.inl
index 4966aab385..1023a77fc5 100644
--- a/cpukit/score/macros/rtems/score/heap.inl
+++ b/cpukit/score/macros/rtems/score/heap.inl
@@ -17,7 +17,7 @@
#ifndef __HEAP_inl
#define __HEAP_inl
-#include <rtems/address.h>
+#include <rtems/core/address.h>
/*PAGE
*
diff --git a/cpukit/score/macros/rtems/score/isr.inl b/cpukit/score/macros/rtems/score/isr.inl
index 93f234c7ff..975487c98b 100644
--- a/cpukit/score/macros/rtems/score/isr.inl
+++ b/cpukit/score/macros/rtems/score/isr.inl
@@ -19,18 +19,6 @@
/*PAGE
*
- * _ISR_Handler_initialization
- *
- */
-
-#define _ISR_Handler_initialization() \
- { \
- _ISR_Signals_to_thread_executing = FALSE; \
- _ISR_Nest_level = 0; \
- }
-
-/*PAGE
- *
* _ISR_Is_in_progress
*
*/
diff --git a/cpukit/score/macros/rtems/score/object.inl b/cpukit/score/macros/rtems/score/object.inl
index 7a346af720..8a5a0a3411 100644
--- a/cpukit/score/macros/rtems/score/object.inl
+++ b/cpukit/score/macros/rtems/score/object.inl
@@ -30,29 +30,29 @@
/*PAGE
*
- * rtems_get_class
+ * _Objects_Get_class
*/
-#define rtems_get_class( _id ) \
+#define _Objects_Get_class( _id ) \
(Objects_Classes) \
(((_id) >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS)
/*PAGE
*
- * rtems_get_node
+ * _Objects_Get_node
*
*/
-#define rtems_get_node( _id ) \
+#define _Objects_Get_node( _id ) \
(((_id) >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS)
/*PAGE
*
- * rtems_get_index
+ * _Objects_Get_index
*
*/
-#define rtems_get_index( _id ) \
+#define _Objects_Get_index( _id ) \
(((_id) >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS)
/*PAGE
@@ -80,7 +80,7 @@
*/
#define _Objects_Is_local_id( _id ) \
- _Objects_Is_local_node( rtems_get_node(_id) )
+ _Objects_Is_local_node( _Objects_Get_node(_id) )
/*PAGE
*
@@ -119,7 +119,7 @@
{ \
unsigned32 _index; \
\
- _index = rtems_get_index( (_the_object)->id ); \
+ _index = _Objects_Get_index( (_the_object)->id ); \
(_information)->local_table[ _index ] = (_the_object); \
\
if ( (_information)->is_string ) \
@@ -139,7 +139,7 @@
{ \
unsigned32 _index; \
\
- _index = rtems_get_index( (_the_object)->id ); \
+ _index = _Objects_Get_index( (_the_object)->id ); \
(_information)->local_table[ _index ] = NULL; \
_Objects_Clear_name( (_the_object)->name, (_information)->name_length ); \
}
diff --git a/cpukit/score/macros/rtems/score/priority.inl b/cpukit/score/macros/rtems/score/priority.inl
index 0efec0050e..d78e2a0628 100644
--- a/cpukit/score/macros/rtems/score/priority.inl
+++ b/cpukit/score/macros/rtems/score/priority.inl
@@ -17,7 +17,7 @@
#ifndef __PRIORITY_inl
#define __PRIORITY_inl
-#include <rtems/bitfield.h>
+#include <rtems/core/bitfield.h>
/*PAGE
*
@@ -40,9 +40,13 @@
*
*/
+ /*
+ * Since PRIORITY_MINIMUM is 0 and priorities are stored unsigned,
+ * then checking for less than 0 is unnecessary.
+ */
+
#define _Priority_Is_valid( _the_priority ) \
- ( ( (_the_priority) >= RTEMS_MINIMUM_PRIORITY ) && \
- ( (_the_priority) <= RTEMS_MAXIMUM_PRIORITY ) )
+ ( (_the_priority) <= PRIORITY_MAXIMUM )
/*PAGE
*
diff --git a/cpukit/score/macros/rtems/score/stack.inl b/cpukit/score/macros/rtems/score/stack.inl
index 208503b45f..d20eebd0b9 100644
--- a/cpukit/score/macros/rtems/score/stack.inl
+++ b/cpukit/score/macros/rtems/score/stack.inl
@@ -36,7 +36,7 @@
*/
#define _Stack_Is_enough( _size ) \
- ( (_size) >= RTEMS_MINIMUM_STACK_SIZE )
+ ( (_size) >= STACK_MINIMUM_SIZE )
/*PAGE
*
diff --git a/cpukit/score/macros/rtems/score/states.inl b/cpukit/score/macros/rtems/score/states.inl
index f69c4ba042..4fa138d107 100644
--- a/cpukit/score/macros/rtems/score/states.inl
+++ b/cpukit/score/macros/rtems/score/states.inl
@@ -1,7 +1,7 @@
/* states.inl
*
* This file contains the macro implementation of the inlined
- * routines associated with RTEMS state information.
+ * routines associated with thread state information.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -127,6 +127,15 @@
/*PAGE
*
+ * _States_Is_waiting_for_mutex
+ *
+ */
+
+#define _States_Is_waiting_for_mutex( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_MUTEX )
+
+/*PAGE
+ *
* _States_Is_waiting_for_semaphore
*
*/
diff --git a/cpukit/score/macros/rtems/score/sysstate.inl b/cpukit/score/macros/rtems/score/sysstate.inl
index ed13494d30..d0cb932924 100644
--- a/cpukit/score/macros/rtems/score/sysstate.inl
+++ b/cpukit/score/macros/rtems/score/sysstate.inl
@@ -19,11 +19,24 @@
/*PAGE
*
+ * _System_state_Handler_initialization
+ */
+
+#define _System_state_Handler_initialization( _is_multiprocessing ) \
+ do { \
+ _System_state_Current = SYSTEM_STATE_BEFORE_INITIALIZATION; \
+ _System_state_Is_multiprocessing = (_is_multiprocessing); \
+ } while ( 0 )
+
+/*PAGE
+ *
* _System_state_Set
*/
#define _System_state_Set( _state ) \
- _System_state_Current = (_state)
+ do { \
+ _System_state_Current = (_state); \
+ } while ( 0 )
/*PAGE
*
diff --git a/cpukit/score/macros/rtems/score/thread.inl b/cpukit/score/macros/rtems/score/thread.inl
index d7d37cb218..3f7afb054b 100644
--- a/cpukit/score/macros/rtems/score/thread.inl
+++ b/cpukit/score/macros/rtems/score/thread.inl
@@ -189,5 +189,13 @@ void _Thread_Enable_dispatch( void );
#define _Thread_Is_null( _the_thread ) \
( (_the_thread) == NULL )
+/*
+ * _Thread_Is_proxy_blocking
+ *
+ */
+
+#define _Thread_Is_proxy_blocking( _code ) \
+ ( (_code) == THREAD_STATUS_PROXY_BLOCKING )
+
#endif
/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/userext.inl b/cpukit/score/macros/rtems/score/userext.inl
index 781f30ad40..2daa37494d 100644
--- a/cpukit/score/macros/rtems/score/userext.inl
+++ b/cpukit/score/macros/rtems/score/userext.inl
@@ -40,11 +40,20 @@
*/
#define _User_extensions_Add_set( _the_extension, _extension_table ) \
- { \
+ do { \
(_the_extension)->Callouts = *(_extension_table); \
\
_Chain_Append( &_User_extensions_List, &(_the_extension)->Node ); \
- }
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _User_extensions_Add_API_set
+ */
+
+#define _User_extensions_Add_API_set( _the_extension ) \
+ _Chain_Prepend( &_User_extensions_List, &(_the_extension)->Node )
+
/*PAGE
*
@@ -106,79 +115,21 @@
/*PAGE
*
- * _User_extensions_Task_create
- *
- */
-
-#define _User_extensions_Task_create( _the_thread ) \
- _User_extensions_Run_list_forward(rtems_task_create, \
- (_Thread_Executing, _the_thread) )
-
-/*PAGE
- *
- * _User_extensions_Task_delete
- *
- */
-
-#define _User_extensions_Task_delete( _the_thread ) \
- _User_extensions_Run_list_backward(rtems_task_delete, \
- (_Thread_Executing, _the_thread) )
-
-/*PAGE
- *
- * _User_extensions_Task_start
- *
- */
-
-#define _User_extensions_Task_start( _the_thread ) \
- _User_extensions_Run_list_forward(rtems_task_start, \
- (_Thread_Executing, _the_thread) )
-
-/*PAGE
- *
- * _User_extensions_Task_restart
- *
- */
-
-#define _User_extensions_Task_restart( _the_thread ) \
- _User_extensions_Run_list_forward(rtems_task_restart,\
- (_Thread_Executing, _the_thread) )
-
-/*PAGE
- *
- * _User_extensions_Task_switch
- *
- */
-
-#define _User_extensions_Task_switch( _executing, _heir ) \
- _User_extensions_Run_list_forward(task_switch, (_executing, _heir) )
-
-/*PAGE
- *
- * _User_extensions_Task_begin
- *
- */
-
-#define _User_extensions_Task_begin( _executing ) \
- _User_extensions_Run_list_forward(task_begin, (_executing) )
-
-/*PAGE
- *
- * _User_extensions_Task_exitted
+ * _User_extensions_Thread_switch
*
*/
-#define _User_extensions_Task_exitted( _executing ) \
- _User_extensions_Run_list_backward(task_exitted, (_executing) )
+#define _User_extensions_Thread_switch( _executing, _heir ) \
+ _User_extensions_Run_list_forward(thread_switch, (_executing, _heir) )
/*PAGE
*
- * _User_extensions_Fatal
+ * _User_extensions_Thread_post_switch
*
*/
-#define _User_extensions_Fatal( _the_error ) \
- _User_extensions_Run_list_backward(fatal, (_the_error) )
+#define _User_extensions_Thread_post_switch( _executing ) \
+ _User_extensions_Run_list_forward(thread_post_switch, (_executing) )
#endif
/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/watchdog.inl b/cpukit/score/macros/rtems/score/watchdog.inl
index 4e965420ce..15023722c6 100644
--- a/cpukit/score/macros/rtems/score/watchdog.inl
+++ b/cpukit/score/macros/rtems/score/watchdog.inl
@@ -17,7 +17,7 @@
#ifndef __WATCHDOG_inl
#define __WATCHDOG_inl
-#include <rtems/object.h>
+#include <rtems/core/object.h>
/*PAGE
*
diff --git a/cpukit/score/macros/rtems/score/wkspace.inl b/cpukit/score/macros/rtems/score/wkspace.inl
index 1139e188db..aa6ccc0440 100644
--- a/cpukit/score/macros/rtems/score/wkspace.inl
+++ b/cpukit/score/macros/rtems/score/wkspace.inl
@@ -1,7 +1,7 @@
/* wkspace.inl
*
* This file contains the macro implementation of the inlined routines
- * from the RTEMS RAM Workspace Handler.
+ * from the RAM Workspace Handler.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -17,10 +17,6 @@
#ifndef __WORKSPACE_inl
#define __WORKSPACE_inl
-#include <rtems/heap.h>
-#include <rtems/fatal.h>
-#include <rtems/status.h>
-
/*PAGE
*
* _Workspace_Handler_initialization
@@ -33,9 +29,12 @@
unsigned32 index; \
unsigned32 memory_available; \
\
- if ( ((_starting_address) == NULL) || \
- !_Addresses_Is_aligned( (_starting_address) ) ) \
- rtems_fatal_error_occurred( RTEMS_INVALID_ADDRESS ); \
+ if ( !(_starting_address) || !_Addresses_Is_aligned( (_starting_address) ) ) \
+ _Internal_error_Occurred( \
+ INTERNAL_ERROR_CORE, \
+ TRUE, \
+ INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS \
+ ); \
\
if ( _CPU_Table.do_zero_of_workspace ) { \
for( zero_out_array = (unsigned32 *) (_starting_address), index = 0 ; \
@@ -52,7 +51,11 @@
); \
\
if ( memory_available == 0 ) \
- rtems_fatal_error_occurred( RTEMS_UNSATISFIED ); \
+ _Internal_error_Occurred( \
+ INTERNAL_ERROR_CORE, \
+ TRUE, \
+ INTERNAL_ERROR_TOO_LITTLE_WORKSPACE \
+ ); \
}
/*PAGE
diff --git a/cpukit/score/src/chain.c b/cpukit/score/src/chain.c
index 88f6759b0b..3cea8ea90f 100644
--- a/cpukit/score/src/chain.c
+++ b/cpukit/score/src/chain.c
@@ -18,9 +18,9 @@
*/
#include <rtems/system.h>
-#include <rtems/address.h>
-#include <rtems/chain.h>
-#include <rtems/isr.h>
+#include <rtems/core/address.h>
+#include <rtems/core/chain.h>
+#include <rtems/core/isr.h>
/*PAGE
*
diff --git a/cpukit/score/src/coremutex.c b/cpukit/score/src/coremutex.c
new file mode 100644
index 0000000000..ea2b5773e1
--- /dev/null
+++ b/cpukit/score/src/coremutex.c
@@ -0,0 +1,269 @@
+/*
+ * Mutex Handler
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the Mutex Handler.
+ * This handler provides synchronization and mutual exclusion capabilities.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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$
+ */
+
+#include <rtems/system.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/coremutex.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+
+/*PAGE
+ *
+ * _CORE_mutex_Initialize
+ *
+ * This routine initializes a mutex at create time and set the control
+ * structure according to the values passed.
+ *
+ * Input parameters:
+ * the_mutex - the mutex control block to initialize
+ * the_class - the API class of the object
+ * the_mutex_attributes - the mutex attributes specified at create time
+ * initial_lock - mutex initial lock or unlocked status
+ * proxy_extract_callout - MP specific extract callout
+ *
+ * Output parameters: NONE
+ */
+
+void _CORE_mutex_Initialize(
+ CORE_mutex_Control *the_mutex,
+ Objects_Classes the_class,
+ CORE_mutex_Attributes *the_mutex_attributes,
+ unsigned32 initial_lock,
+ Thread_queue_Extract_callout proxy_extract_callout
+)
+{
+
+/* Add this to the RTEMS environment later ?????????
+ rtems_assert( initial_lock == CORE_MUTEX_LOCKED ||
+ initial_lock == CORE_MUTEX_UNLOCKED );
+ */
+
+ the_mutex->Attributes = *the_mutex_attributes;
+ the_mutex->lock = initial_lock;
+
+ if ( initial_lock == CORE_MUTEX_LOCKED ) {
+ the_mutex->nest_count = 1;
+ the_mutex->holder = _Thread_Executing;
+ the_mutex->holder_id = _Thread_Executing->Object.id;
+ _Thread_Executing->resource_count++;
+ } else {
+ the_mutex->nest_count = 0;
+ the_mutex->holder = NULL;
+ the_mutex->holder_id = 0;
+ }
+
+ _Thread_queue_Initialize(
+ &the_mutex->Wait_queue,
+ the_class,
+ _CORE_mutex_Is_priority( the_mutex_attributes ) ?
+ THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_MUTEX,
+ proxy_extract_callout,
+ CORE_MUTEX_TIMEOUT
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Seize
+ *
+ * This routine attempts to allocate a mutex to the calling thread.
+ *
+ * Input parameters:
+ * the_mutex - pointer to mutex control block
+ * id - id of object to wait on
+ * wait - TRUE if wait is allowed, FALSE otherwise
+ * timeout - number of ticks to wait (0 means forever)
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * available
+ * wait
+ */
+
+void _CORE_mutex_Seize(
+ CORE_mutex_Control *the_mutex,
+ Objects_Id id,
+ boolean wait,
+ Watchdog_Interval timeout
+)
+{
+ Thread_Control *executing;
+ ISR_Level level;
+
+ executing = _Thread_Executing;
+ executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
+ _ISR_Disable( level );
+ if ( ! _CORE_mutex_Is_locked( the_mutex ) ) {
+ the_mutex->lock = CORE_MUTEX_LOCKED;
+ the_mutex->holder = executing;
+ the_mutex->holder_id = executing->Object.id;
+ the_mutex->nest_count = 1;
+ executing->resource_count++;
+ _ISR_Enable( level );
+ return;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ if ( _Objects_Are_ids_equal(
+ _Thread_Executing->Object.id, the_mutex->holder_id ) ) {
+ if ( _CORE_mutex_Is_nesting_allowed( &the_mutex->Attributes ) )
+ the_mutex->nest_count++;
+ else
+ executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
+
+ _ISR_Enable( level );
+ return;
+ }
+
+ the_mutex->Wait_queue.sync = TRUE;
+ executing->Wait.queue = &the_mutex->Wait_queue;
+ executing->Wait.id = id;
+ _ISR_Enable( level );
+
+ if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) &&
+ the_mutex->holder->current_priority >
+ _Thread_Executing->current_priority ) {
+ _Thread_Change_priority(
+ the_mutex->holder, _Thread_Executing->current_priority );
+ }
+
+ _Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout );
+}
+
+/*
+ * _CORE_mutex_Surrender
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a unit to the mutex. If a task was blocked waiting for
+ * a unit from this mutex, then that task will be readied and the unit
+ * given to that task. Otherwise, the unit will be returned to the mutex.
+ *
+ * Input parameters:
+ * the_mutex - the mutex to be flushed
+ * id - id of parent mutex
+ * api_mutex_mp_support - api dependent MP support actions
+ *
+ * Output parameters:
+ * CORE_MUTEX_STATUS_SUCCESSFUL - if successful
+ * core error code - if unsuccessful
+ */
+
+CORE_mutex_Status _CORE_mutex_Surrender(
+ CORE_mutex_Control *the_mutex,
+ Objects_Id id,
+ CORE_mutex_API_mp_support_callout api_mutex_mp_support
+)
+{
+ Thread_Control *the_thread;
+
+ if ( !_Objects_Are_ids_equal(
+ _Thread_Executing->Object.id, the_mutex->holder_id ) )
+ return( CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE );
+
+ the_mutex->nest_count--;
+
+ if ( the_mutex->nest_count != 0 )
+ return( CORE_MUTEX_STATUS_SUCCESSFUL );
+
+ _Thread_Executing->resource_count--;
+ the_mutex->holder = NULL;
+ the_mutex->holder_id = 0;
+
+ /*
+ * Whether or not someone is waiting for the mutex, an
+ * inherited priority must be lowered if this is the last
+ * mutex (i.e. resource) this task has.
+ */
+
+ if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) &&
+ _Thread_Executing->resource_count == 0 &&
+ _Thread_Executing->real_priority !=
+ _Thread_Executing->current_priority ) {
+ _Thread_Change_priority(
+ _Thread_Executing,
+ _Thread_Executing->real_priority
+ );
+ }
+
+ if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) {
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) ) {
+
+ the_mutex->holder = NULL;
+ the_mutex->holder_id = the_thread->Object.id;
+ the_mutex->nest_count = 1;
+
+ ( *api_mutex_mp_support)( the_thread, id );
+
+ } else {
+
+ the_mutex->holder = the_thread;
+ the_mutex->holder_id = the_thread->Object.id;
+ the_thread->resource_count++;
+ the_mutex->nest_count = 1;
+
+ /*
+ * No special action for priority inheritance because the_thread
+ * is guaranteed to be the highest priority thread waiting for
+ * the mutex.
+ */
+ }
+ } else
+ the_mutex->lock = CORE_MUTEX_UNLOCKED;
+
+ return( CORE_MUTEX_STATUS_SUCCESSFUL );
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Flush
+ *
+ * This function a flushes the mutex's task wait queue.
+ *
+ * Input parameters:
+ * the_mutex - the mutex to be flushed
+ * remote_extract_callout - function to invoke remotely
+ * status - status to pass to thread
+ *
+ * Output parameters: NONE
+ */
+
+void _CORE_mutex_Flush(
+ CORE_mutex_Control *the_mutex,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+)
+{
+
+ _Thread_queue_Flush(
+ &the_mutex->Wait_queue,
+ remote_extract_callout,
+ status
+ );
+
+}
diff --git a/cpukit/score/src/coresem.c b/cpukit/score/src/coresem.c
new file mode 100644
index 0000000000..e7e1705f3c
--- /dev/null
+++ b/cpukit/score/src/coresem.c
@@ -0,0 +1,185 @@
+/*
+ * CORE Semaphore Handler
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the CORE Semaphore Handler.
+ * This core object utilizes standard Dijkstra counting semaphores to provide
+ * synchronization and mutual exclusion capabilities.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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$
+ */
+
+#include <rtems/system.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/coresem.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/mpci.h>
+
+/*PAGE
+ *
+ * CORE_semaphore_Initialize
+ *
+ * This function initialize a semaphore and sets the initial value based
+ * on the given count.
+ *
+ * Input parameters:
+ * the_semaphore - the semaphore control block to initialize
+ * the_class - the API class of the object
+ * the_semaphore_attributes - the attributes specified at create time
+ * initial_value - semaphore's initial value
+ * proxy_extract_callout - MP specific extract callout
+ *
+ * Output parameters: NONE
+ */
+
+void _CORE_semaphore_Initialize(
+ CORE_semaphore_Control *the_semaphore,
+ Objects_Classes the_class,
+ CORE_semaphore_Attributes *the_semaphore_attributes,
+ unsigned32 initial_value,
+ Thread_queue_Extract_callout proxy_extract_callout
+)
+{
+
+ the_semaphore->Attributes = *the_semaphore_attributes;
+ the_semaphore->count = initial_value;
+
+ _Thread_queue_Initialize(
+ &the_semaphore->Wait_queue,
+ the_class,
+ _CORE_semaphore_Is_priority( the_semaphore_attributes ) ?
+ THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_SEMAPHORE,
+ proxy_extract_callout,
+ CORE_SEMAPHORE_TIMEOUT
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_semaphore_Surrender
+ *
+ * Input parameters:
+ * the_semaphore - the semaphore to be flushed
+ * id - id of parent semaphore
+ * api_semaphore_mp_support - api dependent MP support actions
+ *
+ * Output parameters:
+ * CORE_SEMAPHORE_STATUS_SUCCESSFUL - if successful
+ * core error code - if unsuccessful
+ *
+ * Output parameters:
+ */
+
+CORE_semaphore_Status _CORE_semaphore_Surrender(
+ CORE_semaphore_Control *the_semaphore,
+ Objects_Id id,
+ CORE_semaphore_API_mp_support_callout api_semaphore_mp_support
+)
+{
+ Thread_Control *the_thread;
+
+ if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ (*api_semaphore_mp_support) ( the_thread, id );
+
+ } else
+ the_semaphore->count += 1;
+
+ return( CORE_SEMAPHORE_STATUS_SUCCESSFUL );
+}
+
+/*PAGE
+ *
+ * _CORE_semaphore_Seize
+ *
+ * This routine attempts to allocate a core semaphore to the calling thread.
+ *
+ * Input parameters:
+ * the_semaphore - pointer to semaphore control block
+ * id - id of object to wait on
+ * wait - TRUE if wait is allowed, FALSE otherwise
+ * timeout - number of ticks to wait (0 means forever)
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * available
+ * wait
+ */
+
+void _CORE_semaphore_Seize(
+ CORE_semaphore_Control *the_semaphore,
+ Objects_Id id,
+ boolean wait,
+ Watchdog_Interval timeout
+)
+{
+ Thread_Control *executing;
+ ISR_Level level;
+
+ executing = _Thread_Executing;
+ executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
+ _ISR_Disable( level );
+ if ( the_semaphore->count != 0 ) {
+ the_semaphore->count -= 1;
+ executing->resource_count++;
+ _ISR_Enable( level );
+ return;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ the_semaphore->Wait_queue.sync = TRUE;
+ executing->Wait.queue = &the_semaphore->Wait_queue;
+ executing->Wait.id = id;
+ _ISR_Enable( level );
+
+ _Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
+}
+
+
+/*PAGE
+ *
+ * _CORE_semaphore_Flush
+ *
+ * This function a flushes the semaphore's task wait queue.
+ *
+ * Input parameters:
+ * the_semaphore - the semaphore to be flushed
+ * remote_extract_callout - function to invoke remotely
+ * status - status to pass to thread
+ *
+ * Output parameters: NONE
+ */
+
+void _CORE_semaphore_Flush(
+ CORE_semaphore_Control *the_semaphore,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+)
+{
+
+ _Thread_queue_Flush(
+ &the_semaphore->Wait_queue,
+ remote_extract_callout,
+ status
+ );
+
+}
diff --git a/cpukit/score/src/coretod.c b/cpukit/score/src/coretod.c
index 4689c637d7..ab464664f6 100644
--- a/cpukit/score/src/coretod.c
+++ b/cpukit/score/src/coretod.c
@@ -14,10 +14,10 @@
*/
#include <rtems/system.h>
-#include <rtems/object.h>
-#include <rtems/thread.h>
-#include <rtems/tod.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/object.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/tod.h>
+#include <rtems/core/watchdog.h>
/*PAGE
*
@@ -72,11 +72,11 @@ void _TOD_Handler_initialization(
*/
void _TOD_Set(
- rtems_time_of_day *the_tod,
- rtems_interval seconds_since_epoch
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
)
{
- rtems_interval ticks_until_next_second;
+ Watchdog_Interval ticks_until_next_second;
_Thread_Disable_dispatch();
_TOD_Deactivate();
@@ -109,14 +109,14 @@ void _TOD_Set(
* the_tod - pointer to a time and date structure
*
* Output parameters:
- * RTEMS_SUCCESSFUL - if the date, time, and tick are valid
- * RTEMS_INVALID_CLOCK - if the the_tod is invalid
+ * TRUE - if the date, time, and tick are valid
+ * FALSE - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
-rtems_status_code _TOD_Validate(
- rtems_time_of_day *the_tod
+boolean _TOD_Validate(
+ TOD_Control *the_tod
)
{
unsigned32 days_in_month;
@@ -129,7 +129,7 @@ rtems_status_code _TOD_Validate(
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
- return RTEMS_INVALID_CLOCK;
+ return FALSE;
if ( (the_tod->year % 4) == 0 )
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
@@ -137,9 +137,9 @@ rtems_status_code _TOD_Validate(
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
if ( the_tod->day > days_in_month )
- return RTEMS_INVALID_CLOCK;
+ return FALSE;
- return RTEMS_SUCCESSFUL;
+ return TRUE;
}
/*PAGE
@@ -157,7 +157,7 @@ rtems_status_code _TOD_Validate(
*/
unsigned32 _TOD_To_seconds(
- rtems_time_of_day *the_tod
+ TOD_Control *the_tod
)
{
unsigned32 time;
diff --git a/cpukit/score/src/heap.c b/cpukit/score/src/heap.c
index eb1c5d769e..b16cfde9de 100644
--- a/cpukit/score/src/heap.c
+++ b/cpukit/score/src/heap.c
@@ -14,7 +14,7 @@
#include <rtems/system.h>
-#include <rtems/heap.h>
+#include <rtems/core/heap.h>
#include <rtems/sysstate.h>
/*PAGE
@@ -30,7 +30,7 @@
* page_size - allocatable unit of memory
*
* Output parameters:
- * returns - maximum memory available if RTEMS_SUCCESSFUL
+ * returns - maximum memory available if successfully initialized
* 0 - otherwise
*
* This is what a heap looks like in memory immediately
diff --git a/cpukit/score/src/interr.c b/cpukit/score/src/interr.c
new file mode 100644
index 0000000000..3eb2bc1746
--- /dev/null
+++ b/cpukit/score/src/interr.c
@@ -0,0 +1,61 @@
+/*
+ * Internal Error Handler
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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$
+ */
+
+#include <rtems/system.h>
+#include <rtems/core/interr.h>
+#include <rtems/sysstate.h>
+#include <rtems/core/userext.h>
+
+/*PAGE
+ *
+ * _Internal_error_Occurred
+ *
+ * This routine will invoke the fatal error handler supplied by the user
+ * followed by the the default one provided by the executive. The default
+ * error handler assumes no hardware is present to help inform the user
+ * of the problem. Halt stores the error code in a known register,
+ * disables interrupts, and halts the CPU. If the CPU does not have a
+ * halt instruction, it will loop to itself.
+ *
+ * Input parameters:
+ * the_source - what subsystem the error originated in
+ * is_internal - if the error was internally generated
+ * the_error - fatal error status code
+ *
+ * Output parameters:
+ * As much information as possible is stored in a CPU dependent fashion.
+ * See the CPU dependent code for more information.
+ *
+ * NOTE: The the_error is not necessarily a directive status code.
+ */
+
+void volatile _Internal_error_Occurred(
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ unsigned32 the_error
+)
+{
+
+ Internal_errors_What_happened.the_source = the_source;
+ Internal_errors_What_happened.is_internal = is_internal;
+ Internal_errors_What_happened.the_error = the_error;
+
+ _User_extensions_Fatal( the_source, is_internal, the_error );
+
+ _System_state_Set( SYSTEM_STATE_FAILED );
+
+ _CPU_Fatal_halt( the_error );
+
+ /* will not return from this routine */
+}
diff --git a/cpukit/score/src/isr.c b/cpukit/score/src/isr.c
new file mode 100644
index 0000000000..b87bf9f249
--- /dev/null
+++ b/cpukit/score/src/isr.c
@@ -0,0 +1,60 @@
+/*
+ * ISR Handler
+ *
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
+ * On-Line Applications Research Corporation (OAR).
+ * All rights assigned to U.S. Government, 1994.
+ *
+ * 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$
+ */
+
+#include <rtems/system.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/stack.h>
+#include <rtems/core/interr.h>
+#include <rtems/core/wkspace.h>
+
+/* _ISR_Handler_initialization
+ *
+ * This routine initializes the ISR handler.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _ISR_Handler_initialization( void )
+{
+ _ISR_Signals_to_thread_executing = FALSE;
+
+ _ISR_Nest_level = 0;
+
+#if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
+
+ if ( _CPU_Table.interrupt_stack_size < STACK_MINIMUM_SIZE )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL
+ );
+
+ _CPU_Interrupt_stack_low =
+ _Workspace_Allocate_or_fatal_error( _CPU_Table.interrupt_stack_size );
+
+ _CPU_Interrupt_stack_high = _Addresses_Add_offset(
+ _CPU_Interrupt_stack_low,
+ _CPU_Table.interrupt_stack_size
+ );
+
+#endif
+
+#if ( CPU_HAS_HARDWARE_INTERRUPT_STACK == TRUE )
+ _CPU_Install_interrupt_stack();
+#endif
+
+}
diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c
index 26c27ae733..ee72d6c396 100644
--- a/cpukit/score/src/mpci.c
+++ b/cpukit/score/src/mpci.c
@@ -14,16 +14,20 @@
*/
#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/cpu.h>
-#include <rtems/fatal.h>
-#include <rtems/mpci.h>
-#include <rtems/mppkt.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
-#include <rtems/threadq.h>
-#include <rtems/tqdata.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/cpu.h>
+#include <rtems/core/interr.h>
+#include <rtems/core/mpci.h>
+#include <rtems/core/mppkt.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/tqdata.h>
+#include <rtems/core/watchdog.h>
+#include <rtems/sysstate.h>
+
+#include <rtems/core/coresem.h>
+
+#include <rtems/rtems/status.h> /* XXX for TIMEOUT */
/*PAGE
*
@@ -32,14 +36,38 @@
* This subprogram performs the initialization necessary for this handler.
*/
-void _MPCI_Handler_initialization ( void )
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table
+)
{
+ CORE_semaphore_Attributes attributes;
+
+ if ( _System_state_Is_multiprocessing && !users_mpci_table )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_NO_MPCI
+ );
+
+ _MPCI_table = users_mpci_table;
+
+ attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
+
+ _CORE_semaphore_Initialize(
+ &_MPCI_Semaphore,
+ OBJECTS_NO_CLASS, /* free floating semaphore */
+ &attributes, /* the_semaphore_attributes */
+ 0, /* initial_value */
+ NULL /* proxy_extract_callout */
+ );
+
_Thread_queue_Initialize(
&_MPCI_Remote_blocked_threads,
OBJECTS_NO_CLASS,
THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_RPC_REPLY,
- NULL
+ NULL,
+ RTEMS_TIMEOUT
);
}
@@ -53,11 +81,24 @@ void _MPCI_Handler_initialization ( void )
void _MPCI_Initialization ( void )
{
- (*_Configuration_MPCI_table->initialization)(
- _Configuration_Table,
- &_CPU_Table,
- _Configuration_MP_table
- );
+ (*_MPCI_table->initialization)();
+}
+
+/*PAGE
+ *
+ * _MPCI_Register_packet_processor
+ *
+ * This routine registers the MPCI packet processor for the
+ * designated object class.
+ */
+
+void _MPCI_Register_packet_processor(
+ Objects_Classes the_class,
+ MPCI_Packet_processor the_packet_processor
+
+)
+{
+ _MPCI_Packet_processors[ the_class ] = the_packet_processor;
}
/*PAGE
@@ -68,14 +109,18 @@ void _MPCI_Initialization ( void )
* MPCI get packet callout.
*/
-rtems_packet_prefix *_MPCI_Get_packet ( void )
+MP_packet_Prefix *_MPCI_Get_packet ( void )
{
- rtems_packet_prefix *the_packet;
+ MP_packet_Prefix *the_packet;
- (*_Configuration_MPCI_table->get_packet)( &the_packet );
+ (*_MPCI_table->get_packet)( &the_packet );
if ( the_packet == NULL )
- rtems_fatal_error_occurred( RTEMS_UNSATISFIED );
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_PACKETS
+ );
/*
* Put in a default timeout that will be used for
@@ -96,10 +141,10 @@ rtems_packet_prefix *_MPCI_Get_packet ( void )
*/
void _MPCI_Return_packet (
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
)
{
- (*_Configuration_MPCI_table->return_packet)( the_packet );
+ (*_MPCI_table->return_packet)( the_packet );
}
/*PAGE
@@ -112,15 +157,15 @@ void _MPCI_Return_packet (
void _MPCI_Send_process_packet (
unsigned32 destination,
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
)
{
the_packet->source_tid = _Thread_Executing->Object.id;
the_packet->to_convert =
- ( the_packet->to_convert - sizeof(rtems_packet_prefix) ) /
+ ( the_packet->to_convert - sizeof(MP_packet_Prefix) ) /
sizeof(unsigned32);
- (*_Configuration_MPCI_table->send_packet)( destination, the_packet );
+ (*_MPCI_table->send_packet)( destination, the_packet );
}
/*PAGE
@@ -131,16 +176,16 @@ void _MPCI_Send_process_packet (
* MPCI send callout.
*/
-rtems_status_code _MPCI_Send_request_packet (
+unsigned32 _MPCI_Send_request_packet (
unsigned32 destination,
- rtems_packet_prefix *the_packet,
+ MP_packet_Prefix *the_packet,
States_Control extra_state
)
{
the_packet->source_tid = _Thread_Executing->Object.id;
the_packet->source_priority = _Thread_Executing->current_priority;
the_packet->to_convert =
- ( the_packet->to_convert - sizeof(rtems_packet_prefix) ) /
+ ( the_packet->to_convert - sizeof(MP_packet_Prefix) ) /
sizeof(unsigned32);
_Thread_Executing->Wait.id = the_packet->id;
@@ -149,7 +194,7 @@ rtems_status_code _MPCI_Send_request_packet (
_Thread_Disable_dispatch();
- (*_Configuration_MPCI_table->send_packet)( destination, the_packet );
+ (*_MPCI_table->send_packet)( destination, the_packet );
_MPCI_Remote_blocked_threads.sync = TRUE;
@@ -158,7 +203,7 @@ rtems_status_code _MPCI_Send_request_packet (
*/
if (the_packet->timeout == MPCI_DEFAULT_TIMEOUT)
- the_packet->timeout = _Configuration_MPCI_table->default_timeout;
+ the_packet->timeout = _MPCI_table->default_timeout;
_Thread_queue_Enqueue( &_MPCI_Remote_blocked_threads, the_packet->timeout );
@@ -180,12 +225,12 @@ rtems_status_code _MPCI_Send_request_packet (
void _MPCI_Send_response_packet (
unsigned32 destination,
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
)
{
the_packet->source_tid = _Thread_Executing->Object.id;
- (*_Configuration_MPCI_table->send_packet)( destination, the_packet );
+ (*_MPCI_table->send_packet)( destination, the_packet );
}
/*PAGE
@@ -196,11 +241,11 @@ void _MPCI_Send_response_packet (
* MPCI receive callout.
*/
-rtems_packet_prefix *_MPCI_Receive_packet ( void )
+MP_packet_Prefix *_MPCI_Receive_packet ( void )
{
- rtems_packet_prefix *the_packet;
+ MP_packet_Prefix *the_packet;
- (*_Configuration_MPCI_table->receive_packet)( &the_packet );
+ (*_MPCI_table->receive_packet)( &the_packet );
return the_packet;
}
@@ -214,7 +259,7 @@ rtems_packet_prefix *_MPCI_Receive_packet ( void )
*/
Thread_Control *_MPCI_Process_response (
- rtems_packet_prefix *the_packet
+ MP_packet_Prefix *the_packet
)
{
Thread_Control *the_thread;
@@ -236,4 +281,66 @@ Thread_Control *_MPCI_Process_response (
return the_thread;
}
+/*PAGE
+ *
+ * _MPCI_Receive_server
+ *
+ */
+
+void _MPCI_Receive_server( void )
+{
+
+ MP_packet_Prefix *the_packet;
+ MPCI_Packet_processor the_function;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+ _MPCI_Receive_server_tcb = executing;
+
+ for ( ; ; ) {
+
+ executing->receive_packet = NULL;
+
+ _Thread_Disable_dispatch();
+ _CORE_semaphore_Seize( &_MPCI_Semaphore, 0, TRUE, WATCHDOG_NO_TIMEOUT );
+ _Thread_Enable_dispatch();
+
+ for ( ; ; ) {
+ the_packet = _MPCI_Receive_packet();
+
+ if ( !the_packet )
+ break;
+
+ executing->receive_packet = the_packet;
+
+ if ( !_Mp_packet_Is_valid_packet_class ( the_packet->the_class ) )
+ break;
+
+ the_function = _MPCI_Packet_processors[ the_packet->the_class ];
+
+ if ( !the_function )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_BAD_PACKET
+ );
+
+ (*the_function)( the_packet );
+ }
+ }
+}
+
+/*PAGE
+ *
+ * _MPCI_Announce
+ *
+ */
+
+void _MPCI_Announce ( void )
+{
+ _Thread_Disable_dispatch();
+ (void) _CORE_semaphore_Surrender( &_MPCI_Semaphore, 0, 0 );
+ _Thread_Enable_dispatch();
+}
+
/* end of file */
diff --git a/cpukit/score/src/object.c b/cpukit/score/src/object.c
index b274579736..7ff6aa5204 100644
--- a/cpukit/score/src/object.c
+++ b/cpukit/score/src/object.c
@@ -14,12 +14,12 @@
*/
#include <rtems/system.h>
-#include <rtems/chain.h>
-#include <rtems/config.h>
-#include <rtems/object.h>
+#include <rtems/core/chain.h>
+#include <rtems/core/object.h>
#include <rtems/objectmp.h>
-#include <rtems/thread.h>
-#include <rtems/wkspace.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/wkspace.h>
+#include <rtems/sysstate.h>
/*PAGE
*
@@ -29,6 +29,7 @@
*
* Input parameters:
* node - local node
+ * maximum_nodes - number of nodes in the system
* maximum_global_objects - number of configured global objects
*
* Output parameters: NONE
@@ -36,12 +37,25 @@
void _Objects_Handler_initialization(
unsigned32 node,
+ unsigned32 maximum_nodes,
unsigned32 maximum_global_objects
)
{
- _Objects_Local_node = node;
+ if ( node < 1 || node > maximum_nodes )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INVALID_NODE
+ );
+
+ _Objects_Local_node = node;
+ _Objects_Maximum_nodes = maximum_nodes;
- _Objects_MP_Handler_initialization( maximum_global_objects );
+ _Objects_MP_Handler_initialization(
+ node,
+ maximum_nodes,
+ maximum_global_objects
+ );
}
/*PAGE
@@ -166,15 +180,13 @@ void _Objects_Initialize_information(
* Take care of multiprocessing
*/
- if ( supports_global == TRUE && _Configuration_Is_multiprocessing() ) {
+ if ( supports_global == TRUE && _System_state_Is_multiprocessing ) {
information->global_table = _Workspace_Allocate_or_fatal_error(
- (_Configuration_MP_table->maximum_nodes + 1) * sizeof(Chain_Control)
+ (_Objects_Maximum_nodes + 1) * sizeof(Chain_Control)
);
- for ( index=1;
- index <= _Configuration_MP_table->maximum_nodes ;
- index++ )
+ for ( index=1; index <= _Objects_Maximum_nodes ; index++ )
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
@@ -308,12 +320,12 @@ boolean _Objects_Compare_name_raw(
* id - address of return ID
*
* Output parameters:
- * obj_id - object id
- * RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
+ * id - object id
+ * OBJECTS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
*/
-rtems_status_code _Objects_Name_to_id(
+Objects_Name_to_id_errors _Objects_Name_to_id(
Objects_Information *information,
Objects_Name name,
unsigned32 node,
@@ -328,12 +340,12 @@ rtems_status_code _Objects_Name_to_id(
Objects_Name_comparators compare_them;
if ( name == 0 )
- return( RTEMS_INVALID_NAME );
+ return OBJECTS_INVALID_NAME;
search_local_node = FALSE;
if ( information->maximum != 0 &&
- (node == RTEMS_SEARCH_ALL_NODES || node == RTEMS_SEARCH_LOCAL_NODE ||
+ (node == OBJECTS_SEARCH_ALL_NODES || node == OBJECTS_SEARCH_LOCAL_NODE ||
_Objects_Is_local_node( node ) ) )
search_local_node = TRUE;
@@ -354,13 +366,13 @@ rtems_status_code _Objects_Name_to_id(
if ( (*compare_them)( name, the_object->name, name_length ) ) {
*id = the_object->id;
- return( RTEMS_SUCCESSFUL );
+ return OBJECTS_SUCCESSFUL;
}
}
}
- if ( _Objects_Is_local_node( node ) || node == RTEMS_SEARCH_LOCAL_NODE )
- return( RTEMS_INVALID_NAME );
+ if ( _Objects_Is_local_node( node ) || node == OBJECTS_SEARCH_LOCAL_NODE )
+ return OBJECTS_INVALID_NAME;
return ( _Objects_MP_Global_name_search( information, name, node, id ) );
}
@@ -449,14 +461,14 @@ _Objects_Get_next(
Objects_Control *object;
Objects_Id next_id;
- if (rtems_get_index(id) == RTEMS_OBJECT_ID_INITIAL_INDEX)
+ if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
next_id = information->minimum_id;
else
next_id = id;
do {
/* walked off end of list? */
- if (rtems_get_index(next_id) > information->maximum)
+ if (_Objects_Get_index(next_id) > information->maximum)
{
*location_p = OBJECTS_ERROR;
goto final;
@@ -473,7 +485,7 @@ _Objects_Get_next(
return object;
final:
- *next_id_p = RTEMS_OBJECT_ID_FINAL;
+ *next_id_p = OBJECTS_ID_FINAL;
return 0;
}
@@ -490,7 +502,7 @@ Objects_Information *_Objects_Get_information(
{
Objects_Classes the_class;
- the_class = rtems_get_class( id );
+ the_class = _Objects_Get_class( id );
if ( !_Objects_Is_class_valid( the_class ) )
return NULL;
diff --git a/cpukit/score/src/objectmp.c b/cpukit/score/src/objectmp.c
index 9752aadbc6..a7c1eff58c 100644
--- a/cpukit/score/src/objectmp.c
+++ b/cpukit/score/src/objectmp.c
@@ -14,9 +14,10 @@
*/
#include <rtems/system.h>
-#include <rtems/object.h>
-#include <rtems/wkspace.h>
-#include <rtems/config.h>
+#include <rtems/core/interr.h>
+#include <rtems/core/object.h>
+#include <rtems/core/wkspace.h>
+#include <rtems/rtems/support.h>
/*PAGE
*
@@ -25,9 +26,12 @@
*/
void _Objects_MP_Handler_initialization (
- unsigned32 maximum_global_objects
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
)
{
+ _Objects_MP_Maximum_global_objects = maximum_global_objects;
if ( maximum_global_objects == 0 ) {
_Chain_Initialize_empty( &_Objects_MP_Inactive_global_objects );
@@ -62,7 +66,7 @@ void _Objects_MP_Open (
the_global_object->name = the_name;
_Chain_Prepend(
- &information->global_table[ rtems_get_node( the_id ) ],
+ &information->global_table[ _Objects_Get_node( the_id ) ],
&the_global_object->Object.Node
);
@@ -89,7 +93,11 @@ boolean _Objects_MP_Allocate_and_open (
if ( is_fatal_error == FALSE )
return FALSE;
- rtems_fatal_error_occurred( RTEMS_TOO_MANY );
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS
+ );
}
@@ -113,7 +121,7 @@ void _Objects_MP_Close (
Chain_Node *the_node;
Objects_MP_Control *the_object;
- the_chain = &information->global_table[ rtems_get_node( the_id ) ];
+ the_chain = &information->global_table[ _Objects_Get_node( the_id ) ];
for ( the_node = the_chain->first ;
!_Chain_Is_tail( the_chain, the_node ) ;
@@ -132,9 +140,11 @@ void _Objects_MP_Close (
}
- rtems_fatal_error_occurred( RTEMS_INVALID_ID );
-
-
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INVALID_GLOBAL_ID
+ );
}
/*PAGE
@@ -143,7 +153,7 @@ void _Objects_MP_Close (
*
*/
-rtems_status_code _Objects_MP_Global_name_search (
+Objects_Name_to_id_errors _Objects_MP_Global_name_search (
Objects_Information *information,
Objects_Name the_name,
unsigned32 nodes_to_search,
@@ -158,17 +168,16 @@ rtems_status_code _Objects_MP_Global_name_search (
Objects_MP_Control *the_object;
unsigned32 name_to_use = *(unsigned32 *)the_name; /* XXX variable */
-
- if ( nodes_to_search > _Configuration_MP_table->maximum_nodes )
- return ( RTEMS_INVALID_NODE );
+ if ( nodes_to_search > _Objects_Maximum_nodes )
+ return OBJECTS_INVALID_NODE;
if ( information->global_table == NULL )
- return ( RTEMS_INVALID_NAME );
+ return OBJECTS_INVALID_NAME;
- if ( nodes_to_search == RTEMS_SEARCH_ALL_NODES ||
- nodes_to_search == RTEMS_SEARCH_OTHER_NODES ) {
+ if ( nodes_to_search == OBJECTS_SEARCH_ALL_NODES ||
+ nodes_to_search == OBJECTS_SEARCH_OTHER_NODES ) {
low_node = 1;
- high_node = _Configuration_MP_table->maximum_nodes;
+ high_node = _Objects_Maximum_nodes;
} else {
low_node =
high_node = nodes_to_search;
@@ -195,14 +204,14 @@ rtems_status_code _Objects_MP_Global_name_search (
if ( the_object->name == name_to_use ) {
*the_id = the_object->Object.id;
_Thread_Enable_dispatch();
- return ( RTEMS_SUCCESSFUL );
+ return OBJECTS_SUCCESSFUL;
}
}
}
}
_Thread_Enable_dispatch();
- return ( RTEMS_INVALID_NAME );
+ return OBJECTS_INVALID_NAME;
}
/*PAGE
@@ -223,7 +232,7 @@ void _Objects_MP_Is_remote (
Chain_Node *the_node;
Objects_MP_Control *the_global_object;
- node = rtems_get_node( the_id );
+ node = _Objects_Get_node( the_id );
/*
* NOTE: The local node was search (if necessary) by
@@ -235,7 +244,7 @@ void _Objects_MP_Is_remote (
if ( node == 0 ||
_Objects_Is_local_node( node ) ||
- node > _Configuration_MP_table->maximum_nodes ||
+ node > _Objects_Maximum_nodes ||
information->global_table == NULL ) {
*location = OBJECTS_ERROR;
diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c
index dfc5324cb8..d507e8e075 100644
--- a/cpukit/score/src/thread.c
+++ b/cpukit/score/src/thread.c
@@ -14,19 +14,17 @@
*/
#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/context.h>
-#include <rtems/fatal.h>
-#include <rtems/init.h>
-#include <rtems/intthrd.h>
-#include <rtems/isr.h>
-#include <rtems/modes.h>
-#include <rtems/object.h>
-#include <rtems/priority.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
-#include <rtems/userext.h>
-#include <rtems/wkspace.h>
+#include <rtems/core/context.h>
+#include <rtems/core/interr.h>
+#include <rtems/core/intthrd.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/object.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/userext.h>
+#include <rtems/core/wkspace.h>
/*PAGE
*
@@ -43,6 +41,7 @@
void _Thread_Handler_initialization(
unsigned32 ticks_per_timeslice,
+ unsigned32 maximum_extensions,
unsigned32 maximum_proxies
)
{
@@ -53,14 +52,16 @@ void _Thread_Handler_initialization(
_Thread_Heir = NULL;
_Thread_Allocated_fp = NULL;
+ _Thread_Maximum_extensions = maximum_extensions;
+
_Thread_Ticks_remaining_in_timeslice = ticks_per_timeslice;
_Thread_Ticks_per_timeslice = ticks_per_timeslice;
_Thread_Ready_chain = _Workspace_Allocate_or_fatal_error(
- (RTEMS_MAXIMUM_PRIORITY + 1) * sizeof(Chain_Control)
+ (PRIORITY_MAXIMUM + 1) * sizeof(Chain_Control)
);
- for ( index=0; index <= RTEMS_MAXIMUM_PRIORITY ; index++ )
+ for ( index=0; index <= PRIORITY_MAXIMUM ; index++ )
_Chain_Initialize_empty( &_Thread_Ready_chain[ index ] );
_Thread_MP_Handler_initialization( maximum_proxies );
@@ -145,8 +146,6 @@ void _Thread_Dispatch( void )
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
- rtems_signal_set signal_set;
- Modes_Control previous_mode;
executing = _Thread_Executing;
_ISR_Disable( level );
@@ -157,7 +156,7 @@ void _Thread_Dispatch( void )
_Thread_Executing = heir;
_ISR_Enable( level );
- _User_extensions_Task_switch( executing, heir );
+ _User_extensions_Thread_switch( executing, heir );
_Thread_Ticks_remaining_in_timeslice = _Thread_Ticks_per_timeslice;
@@ -194,30 +193,16 @@ void _Thread_Dispatch( void )
_Context_Switch( &executing->Registers, &heir->Registers );
executing = _Thread_Executing;
+
_ISR_Disable( level );
}
_Thread_Dispatch_disable_level = 0;
- if ( _ASR_Are_signals_pending( &executing->RTEMS_API->Signal ) ) {
- signal_set = executing->RTEMS_API->Signal.signals_posted;
- executing->RTEMS_API->Signal.signals_posted = 0;
- _ISR_Enable( level );
-
- executing->RTEMS_API->Signal.nest_level += 1;
- if (_Thread_Change_mode( executing->RTEMS_API->Signal.mode_set,
- RTEMS_ALL_MODE_MASKS, &previous_mode ))
- _Thread_Dispatch();
-
- (*executing->RTEMS_API->Signal.handler)( signal_set );
+ _ISR_Enable( level );
- executing->RTEMS_API->Signal.nest_level -= 1;
- if (_Thread_Change_mode( previous_mode,
- RTEMS_ALL_MODE_MASKS, &previous_mode ))
- _Thread_Dispatch();
- }
- else
- _ISR_Enable( level );
+ _User_extensions_Thread_post_switch( executing );
+
}
/*PAGE
@@ -234,7 +219,9 @@ boolean _Thread_Initialize(
unsigned32 stack_size, /* insure it is >= min */
boolean is_fp, /* TRUE if thread uses FP */
Priority_Control priority,
- Modes_Control mode,
+ boolean is_preemptible,
+ boolean is_timeslice,
+ unsigned32 isr_level,
Objects_Name name
)
@@ -242,13 +229,14 @@ boolean _Thread_Initialize(
unsigned32 actual_stack_size;
void *stack;
void *fp_area;
+ void *extensions_area;
/*
* Allocate and Initialize the stack for this thread.
*/
if ( !_Stack_Is_enough( stack_size ) )
- actual_stack_size = RTEMS_MINIMUM_STACK_SIZE;
+ actual_stack_size = STACK_MINIMUM_SIZE;
else
actual_stack_size = stack_size;
@@ -279,7 +267,8 @@ boolean _Thread_Initialize(
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
if ( !fp_area ) {
- (void) _Workspace_Free( stack );
+ if ( the_thread->Start.stack )
+ (void) _Workspace_Free( the_thread->Start.stack );
return FALSE;
}
fp_area = _Context_Fp_start( fp_area, 0 );
@@ -290,45 +279,42 @@ boolean _Thread_Initialize(
the_thread->fp_context = fp_area;
the_thread->Start.fp_context = fp_area;
-/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
+
/*
- * Allocate and initialize the RTEMS API specific information
+ * Allocate the floating point area for this thread
*/
-
- the_thread->RTEMS_API = _Workspace_Allocate( sizeof( RTEMS_API_Control ) );
-
- if ( !the_thread->RTEMS_API ) {
-/* XXX when in task_create
- _RTEMS_tasks_Free( the_thread );
- _Objects_MP_Free_global_object( the_global_object );
-
- _Thread_Enable_dispatch();
- return( RTEMS_UNSATISFIED );
-*/
- (void) _Workspace_Free( stack );
- (void) _Workspace_Free( fp_area );
- return FALSE;
-
- }
-
- the_thread->RTEMS_API->is_global = FALSE;
- the_thread->RTEMS_API->pending_events = EVENT_SETS_NONE_PENDING;
- _ASR_Initialize( &the_thread->RTEMS_API->Signal );
- /* XXX should not be here .... */
-
-/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
+ if ( _Thread_Maximum_extensions ) {
+ extensions_area = _Workspace_Allocate(
+ (_Thread_Maximum_extensions + 1) * sizeof( void * )
+ );
+
+ if ( !extensions_area ) {
+ if ( fp_area )
+ (void) _Workspace_Free( fp_area );
+
+ if ( the_thread->Start.stack )
+ (void) _Workspace_Free( the_thread->Start.stack );
+
+ return FALSE;
+ }
+ } else
+ extensions_area = NULL;
+
+ the_thread->extensions = extensions_area;
/*
* General initialization
*/
+ the_thread->Start.is_preemptible = is_preemptible;
+ the_thread->Start.is_timeslice = is_timeslice;
+ the_thread->Start.isr_level = isr_level;
+
the_thread->current_state = STATES_DORMANT;
- the_thread->current_modes = mode;
the_thread->resource_count = 0;
the_thread->real_priority = priority;
the_thread->Start.initial_priority = priority;
- the_thread->Start.initial_modes = mode;
_Thread_Set_priority( the_thread, priority );
@@ -342,10 +328,22 @@ boolean _Thread_Initialize(
* Invoke create extensions
*/
- _User_extensions_Task_create( the_thread );
- /* XXX if this fails ... */
+ if ( !_User_extensions_Thread_create( the_thread ) ) {
+
+ if ( extensions_area )
+ (void) _Workspace_Free( extensions_area );
+
+ if ( fp_area )
+ (void) _Workspace_Free( fp_area );
+
+ if ( the_thread->Start.stack )
+ (void) _Workspace_Free( the_thread->Start.stack );
+
+ return FALSE;
+ }
return TRUE;
+
}
/*
@@ -376,7 +374,7 @@ boolean _Thread_Start(
_Thread_Ready( the_thread );
- _User_extensions_Task_start( the_thread );
+ _User_extensions_Thread_start( the_thread );
return TRUE;
}
@@ -403,7 +401,8 @@ boolean _Thread_Restart(
_Thread_Set_transient( the_thread );
the_thread->resource_count = 0;
- the_thread->current_modes = the_thread->Start.initial_modes;
+ the_thread->is_preemptible = the_thread->Start.is_preemptible;
+ the_thread->is_timeslice = the_thread->Start.is_timeslice;
the_thread->Start.pointer_argument = pointer_argument;
the_thread->Start.numeric_argument = numeric_argument;
@@ -423,7 +422,7 @@ boolean _Thread_Restart(
_Thread_Ready( the_thread );
- _User_extensions_Task_restart( the_thread );
+ _User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
_Thread_Restart_self();
@@ -457,7 +456,7 @@ void _Thread_Close(
(void) _Watchdog_Remove( &the_thread->Timer );
}
- _User_extensions_Task_delete( the_thread );
+ _User_extensions_Thread_delete( the_thread );
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( _Thread_Is_allocated_fp( the_thread ) )
@@ -469,6 +468,9 @@ void _Thread_Close(
if ( the_thread->Start.stack )
(void) _Workspace_Free( the_thread->Start.stack );
+
+ if ( the_thread->extensions )
+ (void) _Workspace_Free( the_thread->extensions );
}
/*PAGE
@@ -512,8 +514,7 @@ void _Thread_Ready(
heir = _Thread_Heir;
- if ( !_Thread_Is_executing( heir ) &&
- _Modes_Is_preempt( _Thread_Executing->current_modes ) )
+ if ( !_Thread_Is_executing( heir ) && _Thread_Executing->is_preemptible )
_Context_Switch_necessary = TRUE;
_ISR_Enable( level );
@@ -559,7 +560,7 @@ void _Thread_Clear_state(
if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
_Thread_Heir = the_thread;
- if ( _Modes_Is_preempt( _Thread_Executing->current_modes ) ||
+ if ( _Thread_Executing->is_preemptible ||
the_thread->current_priority == 0 )
_Context_Switch_necessary = TRUE;
}
@@ -729,9 +730,12 @@ void _Thread_Reset_timeslice( void )
void _Thread_Tickle_timeslice( void )
{
- if ( ( _Modes_Is_timeslice(_Thread_Executing->current_modes) ) &&
- ( _States_Is_ready( _Thread_Executing->current_state ) ) &&
- ( --_Thread_Ticks_remaining_in_timeslice == 0 ) ) {
+ if ( !_Thread_Executing->is_timeslice ||
+ !_Thread_Executing->is_preemptible ||
+ !_States_Is_ready( _Thread_Executing->current_state ) )
+ return;
+
+ if ( --_Thread_Ticks_remaining_in_timeslice == 0 ) {
_Thread_Reset_timeslice();
}
}
@@ -803,11 +807,14 @@ void _Thread_Load_environment(
_Context_Initialize_fp( &the_thread->fp_context );
}
+ the_thread->is_preemptible = the_thread->Start.is_preemptible;
+ the_thread->is_timeslice = the_thread->Start.is_timeslice;
+
_Context_Initialize(
&the_thread->Registers,
the_thread->Start.Initial_stack.area,
the_thread->Start.Initial_stack.size,
- _Modes_Get_interrupt_level( the_thread->Start.initial_modes ),
+ the_thread->Start.isr_level,
_Thread_Handler
);
@@ -838,7 +845,7 @@ void _Thread_Handler( void )
* disabled until all 'begin' extensions complete.
*/
- _User_extensions_Task_begin( executing );
+ _User_extensions_Thread_begin( executing );
/*
* At this point, the dispatch disable level BETTER be 1.
@@ -846,7 +853,7 @@ void _Thread_Handler( void )
_Thread_Enable_dispatch();
- switch ( executing->Start.prototype ) {
+ switch ( executing->Start.prototype ) {
case THREAD_START_NUMERIC:
(*executing->Start.entry_point)( executing->Start.numeric_argument );
break;
@@ -867,9 +874,13 @@ void _Thread_Handler( void )
break;
}
- _User_extensions_Task_exitted( executing );
+ _User_extensions_Thread_exitted( executing );
- rtems_fatal_error_occurred( RTEMS_TASK_EXITTED );
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_THREAD_EXITTED
+ );
}
/*PAGE
@@ -953,7 +964,7 @@ void _Thread_Change_priority(
_Thread_Calculate_heir();
if ( !_Thread_Is_executing_also_the_heir() &&
- _Modes_Is_preempt(_Thread_Executing->current_modes) )
+ _Thread_Executing->is_preemptible )
_Context_Switch_necessary = TRUE;
_ISR_Enable( level );
@@ -986,60 +997,24 @@ void _Thread_Set_priority(
/*PAGE
*
- * _Thread_Change_mode
- *
- * This routine enables and disables several modes of
- * execution for the requesting thread.
- *
- * Input parameters:
- * mode - new mode
- * mask - mask
- * old_mode_set - address of previous mode
+ * _Thread_Evaluate_mode
*
- * Output:
- * *old_mode_set - previous mode
- * returns TRUE if scheduling necessary
- *
- * INTERRUPT LATENCY:
- * only one case
+ * XXX
*/
-boolean _Thread_Change_mode(
- Modes_Control new_mode_set,
- Modes_Control mask,
- Modes_Control *old_mode_set
-)
+boolean _Thread_Evaluate_mode( void )
{
- Modes_Control changed;
- Modes_Control threads_new_mode_set;
- Thread_Control *executing;
- boolean need_dispatch;
-
- executing = _Thread_Executing;
- *old_mode_set = executing->current_modes;
-
- _Modes_Change( executing->current_modes,
- new_mode_set, mask, &threads_new_mode_set, &changed );
+ Thread_Control *executing;
- _Modes_Set_interrupt_level( threads_new_mode_set );
-
- if ( _Modes_Mask_changed( changed, RTEMS_ASR_MASK ) )
- _ASR_Swap_signals( &executing->RTEMS_API->Signal );
-
- executing->current_modes = threads_new_mode_set;
- need_dispatch = TRUE;
+ executing = _Thread_Executing;
if ( !_States_Is_ready( executing->current_state ) ||
- ( !_Thread_Is_heir( executing ) &&
- _Modes_Is_preempt(threads_new_mode_set) ) )
-
- _Context_Switch_necessary = TRUE;
-
- else if ( !_ASR_Are_signals_pending( &executing->RTEMS_API->Signal ) )
-
- need_dispatch = FALSE;
+ ( !_Thread_Is_heir( executing ) && executing->is_preemptible ) ) {
+ _Context_Switch_necessary = TRUE;
+ return TRUE;
+ }
- return need_dispatch;
+ return FALSE;
}
/*PAGE
@@ -1068,7 +1043,7 @@ STATIC INLINE Thread_Control *_Thread_Get (
return( _Thread_Executing );
}
- the_class = rtems_get_class( id );
+ the_class = _Objects_Get_class( id );
if ( the_class > OBJECTS_CLASSES_LAST ) {
*location = OBJECTS_ERROR;
diff --git a/cpukit/score/src/threadmp.c b/cpukit/score/src/threadmp.c
index f2b78cd8cd..fe346c0b9c 100644
--- a/cpukit/score/src/threadmp.c
+++ b/cpukit/score/src/threadmp.c
@@ -14,9 +14,10 @@
*/
#include <rtems/system.h>
-#include <rtems/priority.h>
-#include <rtems/thread.h>
-#include <rtems/wkspace.h>
+#include <rtems/core/priority.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/wkspace.h>
+#include <rtems/core/isr.h>
/*PAGE
*
@@ -67,7 +68,7 @@ Thread_Control *_Thread_MP_Allocate_proxy (
the_proxy = (Thread_Proxy_control *) the_thread;
- _Thread_Executing->Wait.return_code = RTEMS_PROXY_BLOCKING;
+ _Thread_Executing->Wait.return_code = THREAD_STATUS_PROXY_BLOCKING;
the_proxy->receive_packet = _Thread_MP_Receive->receive_packet;
@@ -85,7 +86,11 @@ Thread_Control *_Thread_MP_Allocate_proxy (
return the_thread;
}
- rtems_fatal_error_occurred( RTEMS_TOO_MANY );
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_PROXIES
+ );
/*
* NOTE: The following return insures that the compiler will
diff --git a/cpukit/score/src/threadq.c b/cpukit/score/src/threadq.c
index 7b4647bb7f..ec6f8cc242 100644
--- a/cpukit/score/src/threadq.c
+++ b/cpukit/score/src/threadq.c
@@ -14,13 +14,15 @@
*/
#include <rtems/system.h>
-#include <rtems/chain.h>
-#include <rtems/isr.h>
-#include <rtems/object.h>
-#include <rtems/states.h>
-#include <rtems/thread.h>
-#include <rtems/threadq.h>
-#include <rtems/tqdata.h>
+#include <rtems/core/chain.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/object.h>
+#include <rtems/core/states.h>
+#include <rtems/core/thread.h>
+#include <rtems/core/threadq.h>
+#include <rtems/core/tqdata.h>
+
+#include <rtems/rtems/status.h>
/*PAGE
*
@@ -29,10 +31,12 @@
* This routine initializes the specified threadq.
*
* Input parameters:
- * the_thread_queue - pointer to a threadq header
- * the_class - class of the object to which this belongs
- * discipline - queueing discipline
- * state - state of waiting threads
+ * the_thread_queue - pointer to a threadq header
+ * the_class - class of the object to which this belongs
+ * discipline - queueing discipline
+ * state - state of waiting threads
+ * proxy_extract_callout - MP specific callout
+ * timeout_status - return on a timeout
*
* Output parameters: NONE
*/
@@ -42,15 +46,17 @@ void _Thread_queue_Initialize(
Objects_Classes the_class,
Thread_queue_Disciplines the_discipline,
States_Control state,
- Thread_queue_Extract_callout proxy_extract_callout
+ Thread_queue_Extract_callout proxy_extract_callout,
+ unsigned32 timeout_status
)
{
unsigned32 index;
_Thread_queue_Extract_table[ the_class ] = proxy_extract_callout;
- the_thread_queue->state = state;
- the_thread_queue->discipline = the_discipline;
+ the_thread_queue->state = state;
+ the_thread_queue->discipline = the_discipline;
+ the_thread_queue->timeout_status = timeout_status;
switch ( the_discipline ) {
case THREAD_QUEUE_DISCIPLINE_FIFO:
@@ -85,14 +91,14 @@ void _Thread_queue_Initialize(
void _Thread_queue_Enqueue(
Thread_queue_Control *the_thread_queue,
- rtems_interval timeout
+ Watchdog_Interval timeout
)
{
Thread_Control *the_thread;
the_thread = _Thread_Executing;
- if ( _Thread_MP_Is_receive( the_thread ) )
+ if ( _Thread_MP_Is_receive( the_thread ) && the_thread->receive_packet )
the_thread = _Thread_MP_Allocate_proxy( the_thread_queue->state );
else
_Thread_Set_state( the_thread, the_thread_queue->state );
@@ -128,7 +134,7 @@ void _Thread_queue_Enqueue(
* _Thread_queue_Dequeue
*
* This routine removes a thread from the specified threadq. If the
- * threadq discipline is RTEMS_FIFO, it unblocks a thread, and cancels its
+ * threadq discipline is FIFO, it unblocks a thread, and cancels its
* timeout timer. Priority discipline is processed elsewhere.
*
* Input parameters:
@@ -139,7 +145,6 @@ void _Thread_queue_Enqueue(
*
* INTERRUPT LATENCY:
* check sync
- * RTEMS_FIFO
*/
Thread_Control *_Thread_queue_Dequeue(
@@ -200,7 +205,7 @@ boolean _Thread_queue_Extract_with_proxy(
if ( _States_Is_waiting_for_rpc_reply( state ) &&
_States_Is_locally_blocked( state ) ) {
- the_class = rtems_get_class( the_thread->Wait.id );
+ the_class = _Objects_Get_class( the_thread->Wait.id );
proxy_extract_callout = _Thread_queue_Extract_table[ the_class ];
@@ -252,21 +257,24 @@ void _Thread_queue_Extract(
* This kernel routine flushes the given thread queue.
*
* Input parameters:
- * the_thread_queue - pointer to threadq to be flushed
+ * the_thread_queue - pointer to threadq to be flushed
+ * remote_extract_callout - pointer to routine which extracts a remote thread
+ * status - status to return to the thread
*
* Output parameters: NONE
*/
void _Thread_queue_Flush(
Thread_queue_Control *the_thread_queue,
- Thread_queue_Flush_callout remote_extract_callout
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
)
{
Thread_Control *the_thread;
while ( (the_thread = _Thread_queue_Dequeue( the_thread_queue )) ) {
if ( _Objects_Is_local_id( the_thread->Object.id ) )
- the_thread->Wait.return_code = RTEMS_OBJECT_WAS_DELETED;
+ the_thread->Wait.return_code = status;
else
( *remote_extract_callout )( the_thread );
}
@@ -334,7 +342,7 @@ void _Thread_queue_Timeout(
case OBJECTS_REMOTE: /* impossible */
break;
case OBJECTS_LOCAL:
- the_thread->Wait.return_code = RTEMS_TIMEOUT;
+ the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
_Thread_Unnest_dispatch();
break;
@@ -362,7 +370,7 @@ void _Thread_queue_Timeout(
void _Thread_queue_Enqueue_fifo (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
- rtems_interval timeout
+ Watchdog_Interval timeout
)
{
ISR_Level level;
@@ -376,7 +384,7 @@ void _Thread_queue_Enqueue_fifo (
&the_thread->Object.Node
);
- if ( timeout != RTEMS_NO_TIMEOUT )
+ if ( timeout != WATCHDOG_NO_TIMEOUT )
_Watchdog_Activate( &the_thread->Timer );
_ISR_Enable( level );
@@ -412,7 +420,7 @@ void _Thread_queue_Enqueue_fifo (
*
* INTERRUPT LATENCY:
* check sync
- * RTEMS_FIFO
+ * FIFO
*/
Thread_Control *_Thread_queue_Dequeue_fifo(
@@ -541,7 +549,7 @@ Thread_Control *_Thread_queue_First_fifo(
void _Thread_queue_Enqueue_priority(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
- rtems_interval timeout
+ Watchdog_Interval timeout
)
{
Priority_Control search_priority;
@@ -567,7 +575,7 @@ void _Thread_queue_Enqueue_priority(
goto restart_reverse_search;
restart_forward_search:
- search_priority = RTEMS_MINIMUM_PRIORITY - 1;
+ search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) header->first;
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
@@ -595,7 +603,7 @@ restart_forward_search:
goto syncronize;
the_thread_queue->sync = FALSE;
- if ( timeout != RTEMS_NO_TIMEOUT )
+ if ( timeout != WATCHDOG_NO_TIMEOUT )
_Watchdog_Activate( &the_thread->Timer );
if ( priority == search_priority )
@@ -613,7 +621,7 @@ restart_forward_search:
return;
restart_reverse_search:
- search_priority = RTEMS_MAXIMUM_PRIORITY + 1;
+ search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) header->last;
@@ -641,7 +649,7 @@ restart_reverse_search:
goto syncronize;
the_thread_queue->sync = FALSE;
- if ( timeout != RTEMS_NO_TIMEOUT )
+ if ( timeout != WATCHDOG_NO_TIMEOUT )
_Watchdog_Activate( &the_thread->Timer );
if ( priority == search_priority )
@@ -688,7 +696,7 @@ syncronize:
*
* _Thread_queue_Dequeue_priority
*
- * This routine removes a thread from the specified RTEMS_PRIORITY based
+ * This routine removes a thread from the specified PRIORITY based
* threadq, unblocks it, and cancels its timeout timer.
*
* Input parameters:
diff --git a/cpukit/score/src/userext.c b/cpukit/score/src/userext.c
index 7886dbd900..6730e81219 100644
--- a/cpukit/score/src/userext.c
+++ b/cpukit/score/src/userext.c
@@ -15,14 +15,14 @@
*/
#include <rtems/system.h>
-#include <rtems/userext.h>
+#include <rtems/core/userext.h>
/*PAGE
*
- * _User_extensions_Task_create
+ * _User_extensions_Thread_create
*/
-boolean _User_extensions_Task_create (
+boolean _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
@@ -36,8 +36,8 @@ boolean _User_extensions_Task_create (
the_extension = (User_extensions_Control *) the_node;
- if ( the_extension->Callouts.rtems_task_create != NULL ) {
- status = (*the_extension->Callouts.rtems_task_create)(
+ if ( the_extension->Callouts.thread_create != NULL ) {
+ status = (*the_extension->Callouts.thread_create)(
_Thread_Executing,
the_thread
);
@@ -51,10 +51,10 @@ boolean _User_extensions_Task_create (
/*PAGE
*
- * _User_extensions_Task_delete
+ * _User_extensions_Thread_delete
*/
-void _User_extensions_Task_delete (
+void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
@@ -67,8 +67,8 @@ void _User_extensions_Task_delete (
the_extension = (User_extensions_Control *) the_node;
- if ( the_extension->Callouts.rtems_task_delete != NULL )
- (*the_extension->Callouts.rtems_task_delete)(
+ if ( the_extension->Callouts.thread_delete != NULL )
+ (*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
@@ -77,11 +77,11 @@ void _User_extensions_Task_delete (
/*PAGE
*
- * _User_extensions_Task_start
+ * _User_extensions_Thread_start
*
*/
-void _User_extensions_Task_start (
+void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
@@ -94,8 +94,8 @@ void _User_extensions_Task_start (
the_extension = (User_extensions_Control *) the_node;
- if ( the_extension->Callouts.rtems_task_start != NULL )
- (*the_extension->Callouts.rtems_task_start)(
+ if ( the_extension->Callouts.thread_start != NULL )
+ (*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
@@ -104,11 +104,11 @@ void _User_extensions_Task_start (
/*PAGE
*
- * _User_extensions_Task_restart
+ * _User_extensions_Thread_restart
*
*/
-void _User_extensions_Task_restart (
+void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
@@ -121,8 +121,8 @@ void _User_extensions_Task_restart (
the_extension = (User_extensions_Control *) the_node;
- if ( the_extension->Callouts.rtems_task_restart != NULL )
- (*the_extension->Callouts.rtems_task_restart)(
+ if ( the_extension->Callouts.thread_restart != NULL )
+ (*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
@@ -131,11 +131,11 @@ void _User_extensions_Task_restart (
/*PAGE
*
- * _User_extensions_Task_begin
+ * _User_extensions_Thread_begin
*
*/
-void _User_extensions_Task_begin (
+void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
@@ -148,17 +148,17 @@ void _User_extensions_Task_begin (
the_extension = (User_extensions_Control *) the_node;
- if ( the_extension->Callouts.task_begin != NULL )
- (*the_extension->Callouts.task_begin)( executing );
+ if ( the_extension->Callouts.thread_begin != NULL )
+ (*the_extension->Callouts.thread_begin)( executing );
}
}
/*PAGE
*
- * _User_extensions_Task_exitted
+ * _User_extensions_Thread_exitted
*/
-void _User_extensions_Task_exitted (
+void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
@@ -171,8 +171,8 @@ void _User_extensions_Task_exitted (
the_extension = (User_extensions_Control *) the_node;
- if ( the_extension->Callouts.task_exitted != NULL )
- (*the_extension->Callouts.task_exitted)( executing );
+ if ( the_extension->Callouts.thread_exitted != NULL )
+ (*the_extension->Callouts.thread_exitted)( executing );
}
}
@@ -182,7 +182,9 @@ void _User_extensions_Task_exitted (
*/
void _User_extensions_Fatal (
- unsigned32 the_error
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ unsigned32 the_error
)
{
Chain_Node *the_node;
@@ -195,7 +197,7 @@ void _User_extensions_Fatal (
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
- (*the_extension->Callouts.fatal)( the_error );
+ (*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
diff --git a/cpukit/score/src/watchdog.c b/cpukit/score/src/watchdog.c
index 3c46f9b535..53a405d725 100644
--- a/cpukit/score/src/watchdog.c
+++ b/cpukit/score/src/watchdog.c
@@ -14,8 +14,8 @@
*/
#include <rtems/system.h>
-#include <rtems/isr.h>
-#include <rtems/watchdog.h>
+#include <rtems/core/isr.h>
+#include <rtems/core/watchdog.h>
/*PAGE
*
@@ -104,7 +104,7 @@ Watchdog_States _Watchdog_Remove(
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
- rtems_interval units
+ Watchdog_Interval units
)
{
if ( !_Chain_Is_empty( header ) ) {
@@ -144,10 +144,10 @@ void _Watchdog_Insert(
Watchdog_Insert_modes insert_mode
)
{
- ISR_Level level;
- Watchdog_Control *after;
- unsigned32 insert_isr_nest_level;
- rtems_interval delta_interval;
+ ISR_Level level;
+ Watchdog_Control *after;
+ unsigned32 insert_isr_nest_level;
+ Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
diff --git a/cpukit/score/src/wkspace.c b/cpukit/score/src/wkspace.c
index 97299540f8..f4be68651c 100644
--- a/cpukit/score/src/wkspace.c
+++ b/cpukit/score/src/wkspace.c
@@ -17,8 +17,8 @@
*/
#include <rtems/system.h>
-#include <rtems/wkspace.h>
-#include <rtems/fatal.h>
+#include <rtems/core/wkspace.h>
+#include <rtems/core/interr.h>
/*PAGE
*
@@ -35,7 +35,11 @@ void *_Workspace_Allocate_or_fatal_error(
memory = _Workspace_Allocate( size );
if ( memory == NULL )
- rtems_fatal_error_occurred( RTEMS_UNSATISFIED );
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_WORKSPACE_ALLOCATION
+ );
return memory;
}